/****************************************************************************/ /* ** S A R J A R A K . C ** ** Sarjan rakenteeseen oleellisesti liittyvi„ joukkueiden k„sittely ** aliohjelmia ** ** Aliohjelmat: ** j_poista_NULL - poistaa osoitintaulukosta NULL-osoittimet ** tulosta_jkenttalista - tulostaa valittavaksi kaikki joukkuetietueen ** kent„t ** vastaa_jypht - sijoitaa vakiojoukkueen JypHT (testej„ varten) ** tulosta_sarjatilanne - tulostaa joukkueiden sarjatilanteen ** tulosta_joukkue - tulostaa joukkueen valittuun tiedostoon ** tulosta_joukkueet - tulostaa sarjan kaikki joukkueet ** kysy_joukkueen_kentta - kysyy joukkueen valitun kent„n tiedot ** kysy_joukkueen_tiedot - kysyy joukkueen kaikkien kenttien tiedot ** lisaa_joukkue - lis„„ uuden joukkueen rakenteeseen ** lisaa_uusi_joukkue - kysyy joukkueen tiedot ja lis„„ joukkueen sarjaan ** poista_joukkue - varmistaa ja poistaa valitun joukkueen ** etsi_joukkue - etsii nimell„ annetun joukkueen indeksin ** muuta_jtunnukset - muuttaa korjatun joukkuetunnuksen pelaaja- ja ** ottelutietoihin ** joukkueen_tietojen_korjailu -korjataan tai poistetaan joukkueiden tietoja ** luo_joukkueisto - luo joukkueosoitintaulukon ** ** ** ** ** Yleinen joukkuetietorakenne on seuraava: ** ** ** Sarjatyyppi Joukkuetyyppi ** ------ ** | | ------ ** | | | | ** | 7 | |---->| | ** | 3 | joukkueet | | | ------ ** | |------>|-----| | ------ | | ** ------ | o--+-----| | | ** |-----| |----->| | ** | o--+------------| ------ ------ ** |-----| | | ** | o--+--------------------------->| | ** |-----| | | ** | o--+--? ------ ** |-----| ** | o--+--? ** |-----| ** | o--+--? ** |-----| ** | o--+--? ** |-----| ** ** ** Tekij„t: Vesa Lappalainen ** Ohjelmointikurssi 1991 ** Tehty: 13.11.1991 ** Muutettu: 17.12.1991/jaa ** Mit„ muutettu: Muuttujat ja muuttujien tyypit vastaamaan omaa ** harjoitusty”t„ ** */ #include #include #include #include #include "mjonot.h" #include "sarja.h" #define J_K_A(nimi) sizeof(((Joukkue_tyyppi *)JKENTTIA)->nimi),\ offsetof(Joukkue_tyyppi,nimi) /* ** J_K_A(nimi) ** Makro muuttaa Joukkuetyyppisen tietueen kent„n nimen ** kent„n kooksi ja alkupaikaksi tietueen alusta lukien. */ /* ** Taulukko, johon on ker„tty 'intiimit' tiedot kustakin Joukkuetietueen ** kent„st„. T„m„n taulukon avulla tietueen kaikkia kentti„ pystyt„„n ** sitten k„ytt„m„„n silmukassa: */ J_kentta_tyyppi JKENTAT[] = { {"Joukkueen nimi" ,"nimi" ,J_K_A(nimi) ,1,20}, {"Joukkueen tunnus" ,"jtunnus" ,J_K_A(jtunnus) ,1,10}, {"Kotipaikka" ,"kotipaikka" ,J_K_A(kotipaikka) ,0,20}, {"Pisteet" ,"pisteet" ,J_K_A(pisteet) ,0,10}, {"Tehdyt maalit" ,"tehdyt_maalit" ,J_K_A(tehdyt_maalit) ,0,10}, {"P„„stetyt maalit" ,"paastetyt_maalit" ,J_K_A(paastetyt_maalit) ,0,10} }; int JKENTTIA = (sizeof(JKENTAT)/sizeof(J_kentta_tyyppi)); int JNIMIKENTTA = 0; int JTUNNUSKENTTA = 1; char JKENTTAVALINNAT[50] = "123456789ABCDEFGHIJ ?+-" KORJ_POISTO JA_TAI; /****************************************************************************/ /* A L I O H J E L M A T */ /****************************************************************************/ int /* */ j_poista_NULL( /* 0 = poisto onnistui, 1 = ep„onnistui */ Sarja_tyyppi *sarja /* s sarja josta NULL-osoittimet poistetaan. */ ) /* ** Funktiolla poistetaan NULL osoittimet listasta. ** ** Algoritmi: Lukuosoitin ja kirjoitusosoitin, joiden v„limatkaa ** kasvatetaan aina kun l”ytyy poistettava. ** Esimerkki: ----------------------------------------------------------------------------*/ { int l,k=0; for (l=0; ljoukkueita; l++) if ( sarja->joukkueet[l] ) sarja->joukkueet[k++] = sarja->joukkueet[l]; sarja->joukkueita = k; sarja->nykyjoukkue = 0; return 0; } /****************************************************************************/ void /* */ tulosta_jkenttalista( /* */ char *lista /* s Kent„t, jotka tulostetaan n„ytt””n. */ ) /* ** Aliohjelmalla tulostetaan kentt„lista n„ytt””n. Vain ne kent„t ** tulostetaan, joiden valintakirjain on mukana listassa. ** ** Globaalit: JKENTAT ** JKENTTAVALINNAT ** Tulostus: N„ytt””n ** Kutsuu: ----------------------------------------------------------------------------*/ { int i; printf("Valitse kentt„ jonka mukaan etsit„„n:\n"); for (i=0; inimi,"Jyp Hokey Team"); strcpy(joukkue->jtunnus,"JypHT"); strcpy(joukkue->kotipaikka,"Jyv„skyl„"); strcpy(joukkue->pisteet,"46"); strcpy(joukkue->tehdyt_maalit,"87"); strcpy(joukkue->paastetyt_maalit,"23"); } /****************************************************************************/ void tulosta_sarjatilanne( Sarja_tyyppi *sarja /* t Sarja jonka joukkueita tulostetaan */ ) /* Aliohjelmalla tulostetaan sarjan joukkueiden sarjatilanne siten, ett„ saman pistem„„r„n joukkueet tulevat siin„ j„rjestyksess„ kuin ne ovat tiedostossa. Tulostus: N„ytt””n Tekij„: Juha Ala-Aho Pvm: 09.12.1991 Algoritmi: Etsit„„n suurin pistem„„r„. Toistetaan seuraavaa: tulostetaan ne joukkueet, joilla on se pistem„„r„ ja v„hennet„„n pistem„„r„„ yhdell„. Lopetetaan kun pistem„„r„st„ tulee negatiivinen. ---------------------------------------------------------------------------*/ { int i=0,max=0; if ( sarja->joukkueita<=0 ) { printf("\n"); printf("Joukkueita ei ole!\n\n"); return; } max = atoi(sarja->joukkueet[0]->pisteet); /*alkuarvaus*/ /* etsit„„n maksimi */ for(i=1;ijoukkueita;i++) if ( atoi(sarja->joukkueet[i]->pisteet) > max ) max=atoi(sarja->joukkueet[i]->pisteet); printf("\n\n"); printf("Joukkueiden sarjatilanne\n"); printf("========================\n"); printf("-----------------------------------------------------------\n"); /* tulostetaan joukkueet */ while( max>=0 ) { for(i=0;ijoukkueita;i++) if ( atoi(sarja->joukkueet[i]->pisteet)==max ) fprintf(stdout,"%-10s %2s -%2s %3d\n", sarja->joukkueet[i]->jtunnus, sarja->joukkueet[i]->tehdyt_maalit, sarja->joukkueet[i]->paastetyt_maalit, max); max--; } printf("-----------------------------------------------------------\n"); printf("Siin„ kaikki!\n"); odota_jotakin(); } /****************************************************************************/ void tulosta_joukkue( FILE *f, /* Tiedosto josta tulostetaan */ Joukkue_tyyppi *joukkue /* Joukkue jonka tietoja tulostetaan */ ) /* Aliohjelmalla tulostetaan joukkueen tiedot. ** ** Tulostus: n„ytt””n ** Tekij„: Juha Ala-Aho ** Pvm: 05.12.1991 ----------------------------------------------------------------------------*/ { fprintf(f," %s, %s\n", joukkue->nimi, joukkue->kotipaikka); fprintf(f," tunnus: %s\n", joukkue->jtunnus); fprintf(f," maalisuhde: %s - %s pisteet: %s\n", joukkue->tehdyt_maalit, joukkue->paastetyt_maalit, joukkue->pisteet); } /****************************************************************************/ void tulosta_joukkueet( Sarja_tyyppi *sarja /* t Sarja jonka joukkueita tulostetaan. */ ) /* Aliohjelmalla tulostetaan sarjan joukkueet. ** ** Tulostus: n„ytt””n ** Kutsuu: tulosta_joukkue ** Tekij„: Juha Ala-Aho ** Pvm: 05.12.1991 ----------------------------------------------------------------------------*/ { int i; printf("\n\n"); printf("Tulostetaan joukkueet\n"); printf("=====================\n"); printf("-----------------------------------------------------------\n"); for (i=0; ijoukkueita; i++) { tulosta_joukkue(stdout,sarja->joukkueet[i]); printf("\n"); } printf("-----------------------------------------------------------\n"); printf("Siin„ kaikki!\n"); odota_jotakin(); } /****************************************************************************/ char /* NULL = halutaan poistua */ *kysy_joukkueen_kentta( /* muuten vastattu kent„n arvo */ Joukkue_tyyppi *joukkue ,/* s,t T„ytett„v„n joukkueen tiedot */ int nro ,/* s Kysytt„v„ kentt„ */ int kysymys_tyyppi /* s Sy”tt”, p„ivitys, lis„ys? */ ) /* ** Funktiolla kysyt„„n kent„n tiedot. Oletusarvoina k„ytet„„n ** joukkueen alkuper„isi„ tietoja. ** Mik„li kentt„„n vastataan q, lopetetaan kysymykset ja ** palautetaan NULL ** ** Globaalit: JKENTAT ** POIS (jono, jolla sy”tt” katkaistaan) ** Sy”tt”: p„„tteelt„ ** Tulostus: n„ytt””n ** Kutsuu: lue_jono_oletus ** Tekij„: Vesa Lappalainen ** Pvm: 10.11.1991 ----------------------------------------------------------------------------*/ { #define OLET_ALKU 19 /* Oletuksen alkusarake */ #define VAKANEN 33 /* V„k„sen alkusarake */ int paluu; char *p, jono[80]; p = JKENTTA(nro,joukkue); paluu=lue_jono_oletus(JKENTAT[nro].hopute,OLET_ALKU,VAKANEN,p,J_N_S(jono)); /* Vain kunnes saadaan paremmat tarkistukset */ if ( kysymys_tyyppi!=SYOTTO && nro==JNIMIKENTTA && !jono[0] ) return NULL; if ( paluu < OLETUS ) return NULL; if ( strcmp(jono,POIS)==0 ) return NULL; poista_tyhjat(jono); kopioi_jono(p,JKENTAT[nro].koko,jono); return p; } /****************************************************************************/ int /* 0 = hommat OK */ kysy_joukkueen_tiedot( /* 1 = halutaan pois kysymyksest„ */ Joukkue_tyyppi *joukkue ,/* s,t T„ytett„v„n joukkueen tiedot */ int kysymys_tyyppi /* s Sy”tt”, p„ivitys, lis„ys? */ ) /* ** Funktiolla kysell„„n joukkueen tiedot. Oletusarvoina k„ytet„„n ** joukkueen alkuper„isi„ tietoja. Mik„li kyseess„ on lis„ys tai ** p„ivitys, ei nimikentt„„n voi vastata tyhj„ll„, siis palautetaan 1. ** Mik„li johonkin kentt„„n vastataan q, lopetetaan kysymykset ja ** palautetaan q. ** ** Globaalit: JKENTAT ** POIS (jono, jolla sy”tt” katkaistaan) ** Sy”tt”: p„„tteelt„ ** Tulostus: n„ytt””n ** Kutsuu: kysy_joukkueen_kentta ** Tekij„: Vesa Lappalainen ** Pvm: 10.11.1991 ----------------------------------------------------------------------------*/ { int k; Joukkue_tyyppi apu_joukkue; apu_joukkue=*joukkue; for (k=0; kjoukkueita >= sarja->max_joukkueita ) { uusi_koko = 3*(sarja->max_joukkueita)/2; uusi_tila = realloc(sarja->joukkueet,uusi_koko*sizeof(Joukkue_tyyppi *)); if ( !uusi_tila ) return 1; sarja->joukkueet=uusi_tila; sarja->max_joukkueita=uusi_koko; } uusi_joukkue = malloc(sizeof(Joukkue_tyyppi)); if ( uusi_joukkue==NULL ) return 1; *uusi_joukkue = *joukkue; sarja->joukkueet[sarja->joukkueita]=uusi_joukkue; sarja->nykyjoukkue=sarja->joukkueita; sarja->joukkueita++; return 0; } /****************************************************************************/ void /* */ lisaa_uusi_joukkue( /* */ Sarja_tyyppi *sarja /* s,t Sarja johon lis„t„„n */ ) /* ** Aliohjelmalla kysell„„n uusia joukkueita kunnes nimeksi annetaan [RET] ** ** Globaalit: JKENTAT (lista kenttien koosta ja alkukohdista) ** Sy”tt”: P„„tteelt„ ** Tulostus: N„ytt””n ** Kutsuu: kysy_joukkueen_tiedot ** tulosta_joukkue ** kylla_vastaus ** lisaa_joukkue ** Tekij„: Vesa Lappalainen ** Pvm: 10.11.1991 ----------------------------------------------------------------------------*/ { Joukkue_tyyppi joukkue; int i,tyhjenna_kaikki=0; printf("\n\n\n"); printf("Uuden joukkueen lis„ys\n"); printf("======================\n"); while (1) { /* Tyhjennet„„n tarvittavat kent„t oletusarvosta */ if (sarja->nykyjoukkue >= sarja->joukkueita) tyhjenna_kaikki=1; else joukkue = *sarja->joukkueet[sarja->nykyjoukkue]; for (i=0; ijoukkueita); printf("Anna uusi joukkueen nimi\n"); do { /* vastaa_jypht(&joukkue); */ if (kysy_joukkueen_tiedot(&joukkue,LISAYS)) return; printf("Lis„t„„nk”(K/e)\n"); tulosta_joukkue(stdout,&joukkue); printf(":"); } while ( !kylla_vastaus() ); if ( lisaa_joukkue(sarja,&joukkue) ) { printf("\nLis„ys ei onnistunut!\n"); odota_jotakin(); } } } /****************************************************************************/ int /* */ poista_joukkue( /* 0 = onnistui, 1 = ep„onnistui */ Sarja_tyyppi *sarja ,/* s,t sarja josta poistetaan. */ int poistettava /* s Poistettavan joukueen numero */ ) /* ** Funktiolla poistetaan joukkue listasta. Poisto varmistetaan k„ytt„j„lt„. ** Listaan laitetaan joukkueen paikalle NULL ja itse joukkue h„vitet„„n. ** ** Sy”tt”: P„„tteelt„ ** Tulostus: N„yt”lle ** Kutsuu: odota_nappain ----------------------------------------------------------------------------*/ { char vastaus; printf("Haluatko todellakin poistaa joukkueen %s (k/E):", JKENTTA(JTUNNUSKENTTA,sarja->joukkueet[poistettava])); vastaus=odota_nappain("KE",'E',VAIN_ISOT); printf("\n"); if ( vastaus=='E' ) return 1; free(sarja->joukkueet[poistettava]); sarja->joukkueet[poistettava]=NULL; printf("Joukkue poistettu!\n"); return 0; } /****************************************************************************/ int etsi_joukkue( /* Tiedostosta l”ytyneiden joukkueiden m„„r„ */ Sarja_tyyppi *sarja, /* s Sarja josta etsit„„n */ int *ind /* t L”ytyneen joukkueen indeksi tiedostossa */ ) /* ** Kutsuu: lue_jono ** wildmat ** Tekij„: Juha Ala-Aho ** Pvm: 07.01.1992 ** Algoritmi: K„yd„„n l„pi kaikki joukkueiden tunnukset ja etsit„„n isot ja ** pienet kirjaimet samaistamalla joukkueen indeksi. ----------------------------------------------------------------------------*/ { int i=0, loytyi=0; char maski[10]; /* joukkueen tunnus jolle etsit„„n indeksi tiedostosta */ char itunnus[10]; /* joukkueen tiedostossa oleva tunnus isoksi muutettuna*/ lue_jono(J_N_S(maski)); for(i=0;ijoukkueita;i++) { kopioi_jono(J_N_S(itunnus),sarja->joukkueet[i]->jtunnus); if ( !wildmat(jono_isoksi(itunnus),jono_isoksi(maski)) ) { loytyi++; *ind=i; } } return loytyi; } /****************************************************************************/ void muuta_jtunnukset( char *vanha_jtunnus, /* s vanha joukkueen tunnus */ char *uusi_jtunnus, /* s,t uusi joukkueen tunnus */ Pelaajarekisteri_tyyppi *sarja_pelaajat, /* s,t muutetaan tunnus pelaajil*/ Ottelurekisteri_tyyppi *sarja_pelit /* s,t muutetaan tunnus otteluil*/ ) /* ** Aliohjelmalla etsit„„n joukkueet, joilla on vanha tunnus ja muutetaan sen ** tilalle uusi tunnus. ** ** Kutsuu: kopioi_jono ** Tekij„: Juha Ala-Aho ** Pvm: 13.01.1992 ----------------------------------------------------------------------------*/ { int i=0; /* muutetaan pelaajien tunnukset */ for (i=0; ipelaajia; i++) if ( strcmp(vanha_jtunnus,sarja_pelaajat->pelaajat[i]->jtunnus) == 0 ) kopioi_jono(J_N_S(sarja_pelaajat->pelaajat[i]->jtunnus),uusi_jtunnus); /* muutetaan otteluiden tunnukset */ for (i=0; iotteluita; i++) { if ( strcmp(vanha_jtunnus,sarja_pelit->ottelut[i]->kotijtunnus) == 0 ) kopioi_jono(J_N_S(sarja_pelit->ottelut[i]->kotijtunnus),uusi_jtunnus); if ( strcmp(vanha_jtunnus,sarja_pelit->ottelut[i]->vierasjtunnus) == 0 ) kopioi_jono(J_N_S(sarja_pelit->ottelut[i]->vierasjtunnus),uusi_jtunnus); } } /****************************************************************************/ void joukkueen_tietojen_korjailu( Sarja_tyyppi *sarja, /* s,t Sarja jota korjaillaan */ Pelaajarekisteri_tyyppi *sarja_pelaajat, /* s,t Pelaajarek jota korjaill */ Ottelurekisteri_tyyppi *sarja_pelit /* s,t Ottelurek jota korjaillaa*/ ) /* ** Aliohjelmalla korjataan joukkueen tietoja tai poistetaan joukkue. ** ** Kutsuu: etsi_joukkue ** kysy_joukkueen_tiedot ** poista_joukkue ** j_poista_NULL ** Tekij„: Juha Ala-Aho ** Pvm: 09.12.1991 ----------------------------------------------------------------------------*/ { int ind=0, /* korjattavan/poistettavan joukkueen indeksi */ poistettuja=0, /* poistettujen joukkueiden m„„r„ */ loytyi=0; /* maskiin t„sm„„vien m„„r„ */ char vanha_jtunnus[10]; /* apumja jossa joukkueen tunnus ennen korjausta */ printf("\n\n"); printf("Joukkueen tietojen korjaus\n"); printf("==========================\n"); printf("\n"); printf("Valitse tietojen korjaus tai poisto(K/p):"); if ( odota_nappain("KP",'K',VAIN_ISOT) =='K') { printf("\n"); printf("Anna korjattavan joukkueen tunnus\n"); printf("(voidaan k„ytt„„ my”s * ja ?) >"); loytyi=etsi_joukkue(sarja,&ind); if (loytyi>1) printf("T„sm„„ %d joukkuetta\n",loytyi); else if (loytyi==1) { printf("\n"); printf("Korjaa tietoja tarvittaessa!\n"); kopioi_jono(J_N_S(vanha_jtunnus),sarja->joukkueet[ind]->jtunnus); kysy_joukkueen_tiedot(sarja->joukkueet[ind],PAIVITYS); if ( strcmp(vanha_jtunnus,sarja->joukkueet[ind]->jtunnus) != 0 ) muuta_jtunnukset(vanha_jtunnus,sarja->joukkueet[ind]->jtunnus, sarja_pelaajat,sarja_pelit); } else printf("Joukkuetta ei l”ytynyt!\n"); } else { printf("\n"); printf("Anna poistettavan joukkueen tunnus\n"); printf("(voidaan k„ytt„„ my”s * ja ?) >"); loytyi=etsi_joukkue(sarja,&ind); if (loytyi>1) printf("T„sm„„ %d joukkuetta\n",loytyi); else if (loytyi==1) { printf("\n"); if ( !poista_joukkue(sarja,ind) ) poistettuja++; if ( poistettuja ) j_poista_NULL(sarja); } else printf("Joukkuetta ei l”ytynyt!\n"); } } static char *J_EI_VOI_LUODA = "Joukkueistolle ei saada varattua tilaa muistista!"; /****************************************************************************/ char /* NULL =onnistui */ *luo_joukkueisto( /* muut = virheilmoitus merkkijonona */ Sarja_tyyppi *sarja ,/* t K„sitelt„v„ sarja */ int koko /* s Sarjan maksimijoukkuem„„r„. */ ) /* ** Funktiolla luodaan sarjan osoitintaulukko joukkueistoon. Mik„li joukkueistoa ** ei voida luoda, palautetaan 1. ----------------------------------------------------------------------------*/ { sarja->joukkueet = malloc(koko*(sizeof(Joukkue_tyyppi *))); sarja->max_joukkueita=koko; sarja->joukkueita=0; if (sarja->joukkueet) return NULL; else return J_EI_VOI_LUODA; }