/****************************************************************************/ /* ** O T T E L R A K . C ** ** Sarjan rakenteeseen oleellisesti liittyvi„ otteluiden k„sittely ** aliohjelmia ** ** Aliohjelmat: ** o_poista_NULL - poistaa osoitintaulukosta NULL-osoittimet ** tulosta_okenttalista - tulostaa valittavaksi kaikki ottelutietueen ** kent„t ** tulosta_ottelu - tulostaa ottelun valittuun tiedostoon ** tulosta_ottelut - tulostaa sarjan kaikki ottelut ** kysy_ottelun_kentta - kysyy ottelun valitun kent„n tiedot ** kysy_ottelun_tiedot - kysyy ottelun kaikkien kenttien tiedot ** lisaa_ottelu - lis„„ uuden ottelun rakenteeseen ** lisaa_maalit - lis„„ ottelussa tehdyt maalit aikaisempiin ** paivitetaan - p„ivitt„„ pisteit„ ja maalitietoja ottelulla ** lisaa_uusi_ottelu - kysyy ottelun tiedot ja lis„„ ottelun sarjaan ** poista_ottelu - varmistaa ja poistaa valitun ottelun ** vahenna_maalit - v„hent„„ ottelussa tehdyt maalit aikaisemmista ** poista_paivitys - poistaa ottelun p„ivityksen pisteist„ ja maaleista ** ottelun_tietojen_korjailu -korjataan tai poistetaan otteluiden tietoja ** luo_ottelusto - luo otteluosoitintaulukon ** ** ** ** ** Yleinen ottelutietorakenne on seuraava: ** ** ** Ottelurekisterityyppi Ottelutyyppi ** ------ ** | | ------ ** | | | | ** | 7 | |---->| | ** | 3 | ottelut | | | ------ ** | |------>|-----| | ------ | | ** ------ | o--+-----| | | ** |-----| |----->| | ** | o--+------------| ------ ------ ** |-----| | | ** | o--+--------------------------->| | ** |-----| | | ** | o--+--? ------ ** |-----| ** | o--+--? ** |-----| ** | o--+--? ** |-----| ** | o--+--? ** |-----| ** ** ** Tekij„t: Vesa Lappalainen ** Ohjelmointikurssi 1991 ** Tehty: 13.11.1991 ** Muutettu: 18.12.1991/jaa ** Mit„ muutettu: Muuttujat ja muuttujien tyypit vastaamaan omaa ** harjoitusty”t„ ** */ #include #include #include #include #include "mjonot.h" #include "sarja.h" #define O_K_A(nimi) sizeof(((Ottelu_tyyppi *)OKENTTIA)->nimi),\ offsetof(Ottelu_tyyppi,nimi) /* ** O_K_A(nimi) ** Makro muuttaa Ottelutyyppisen tietueen kent„n nimen ** kent„n kooksi ja alkupaikaksi tietueen alusta lukien. */ /* ** Taulukko, johon on ker„tty 'intiimit' tiedot kustakin Ottelutietueen ** kent„st„. T„m„n taulukon avulla tietueen kaikkia kentti„ pystyt„„n ** sitten k„ytt„m„„n silmukassa: */ O_kentta_tyyppi OKENTAT[] = { {"Kotijtunnus" ,"kotijtunnus" ,O_K_A(kotijtunnus) ,1,10}, {"Vierasjtunnus" ,"vierasjtunnus" ,O_K_A(vierasjtunnus) ,1,10}, {"Kotij. maalit" ,"koti_maalit" ,O_K_A(koti_maalit) ,1,03}, {"Vierasj. maalit" ,"vieras_maalit" ,O_K_A(vieras_maalit) ,1,03} }; int OKENTTIA = (sizeof(OKENTAT)/sizeof(O_kentta_tyyppi)); int ONIMIKENTTA = 0; char OKENTTAVALINNAT[50] = "123456789ABCDEFGHIJ ?+-" KORJ_POISTO JA_TAI; /****************************************************************************/ /* A L I O H J E L M A T */ /****************************************************************************/ int /* */ o_poista_NULL( /* 0 = poisto onnistui, 1 = ep„onnistui */ Ottelurekisteri_tyyppi *sarja_pelit /* s ottelurek josta NULL-osoitt poist*/ ) /* ** 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; lotteluita; l++) if ( sarja_pelit->ottelut[l] ) sarja_pelit->ottelut[k++] = sarja_pelit->ottelut[l]; sarja_pelit->otteluita = k; sarja_pelit->nykyottelu = 0; return 0; } /****************************************************************************/ void /* */ tulosta_okenttalista( /* */ 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: OKENTAT ** OKENTTAVALINNAT ** Tulostus: N„ytt””n ** Kutsuu: ----------------------------------------------------------------------------*/ { int i; printf("Valitse kentt„ jonka mukaan etsit„„n:\n"); for (i=0; ikotijtunnus, ottelu->vierasjtunnus, ottelu->koti_maalit, ottelu->vieras_maalit); } /****************************************************************************/ void tulosta_ottelut( Ottelurekisteri_tyyppi *sarja_pelit /* t Ottelurek jonka otteluita tulost*/ ) /* Aliohjelmalla tulostetaan ottelurekisterin ottelut. ** ** Tulostus: n„ytt””n ** Kutsuu: tulosta_ottelu ** Tekij„: Juha Ala-Aho ** Pvm: 18.12.1991 ----------------------------------------------------------------------------*/ { int i; printf("\n\n"); printf("Tulostetaan ottelut\n"); printf("=====================\n"); printf("-----------------------------------------------------------\n"); for (i=0; iotteluita; i++) { tulosta_ottelu(stdout,sarja_pelit->ottelut[i]); printf("\n"); } printf("-----------------------------------------------------------\n"); printf("Siin„ kaikki!\n"); odota_jotakin(); } /****************************************************************************/ char /* NULL = halutaan poistua */ *kysy_ottelun_kentta( /* muuten vastattu kent„n arvo */ Ottelu_tyyppi *ottelu ,/* s,t T„ytett„v„n ottelun 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 ** ottelun alkuper„isi„ tietoja. ** Mik„li kentt„„n vastataan q, lopetetaan kysymykset ja ** palautetaan NULL ** ** Globaalit: OKENTAT ** 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 = OKENTTA(nro,ottelu); paluu=lue_jono_oletus(OKENTAT[nro].hopute,OLET_ALKU,VAKANEN,p,O_N_S(jono)); /* Vain kunnes saadaan paremmat tarkistukset */ if ( kysymys_tyyppi!=SYOTTO && nro==ONIMIKENTTA && !jono[0] ) return NULL; if ( paluu < OLETUS ) return NULL; if ( strcmp(jono,POIS)==0 ) return NULL; poista_tyhjat(jono); kopioi_jono(p,OKENTAT[nro].koko,jono); return p; } /****************************************************************************/ int /* 0 = hommat OK */ kysy_ottelun_tiedot( /* 1 = halutaan pois kysymyksest„ */ Ottelu_tyyppi *ottelu ,/* s,t T„ytett„v„n ottelun tiedot */ int kysymys_tyyppi /* s Sy”tt”, p„ivitys, lis„ys? */ ) /* ** Funktiolla kysell„„n ottelun tiedot. Oletusarvoina k„ytet„„n ** ottelun 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: OKENTAT ** POIS (jono, jolla sy”tt” katkaistaan) ** Sy”tt”: p„„tteelt„ ** Tulostus: n„ytt””n ** Kutsuu: kysy_ottelun_kentta ** Tekij„: Vesa Lappalainen ** Pvm: 10.11.1991 ----------------------------------------------------------------------------*/ { int k; Ottelu_tyyppi apu_ottelu; apu_ottelu=*ottelu; for (k=0; kotteluita >= sarja_pelit->max_otteluita ) { uusi_koko = 3*(sarja_pelit->max_otteluita)/2; uusi_tila = realloc(sarja_pelit->ottelut,uusi_koko*sizeof(Ottelu_tyyppi *)); if ( !uusi_tila ) return 1; sarja_pelit->ottelut=uusi_tila; sarja_pelit->max_otteluita=uusi_koko; } uusi_ottelu = malloc(sizeof(Ottelu_tyyppi)); if ( uusi_ottelu==NULL ) return 1; *uusi_ottelu = *ottelu; sarja_pelit->ottelut[sarja_pelit->otteluita]=uusi_ottelu; sarja_pelit->nykyottelu=sarja_pelit->otteluita; sarja_pelit->otteluita++; return 0; } /****************************************************************************/ void lisaa_maalit( int lisays, /* s ottelumaalit jotka lis„t„„n */ char *maalit /* s,t joukkueen maalit johon lis„t„„n */ ) /* ** Aliohjelmalla p„ivitet„„n joukkueiden maalitietoja lis„„m„ll„ ottelun ** maalit joukkueen maalitietoihin. ** ** Tekij„: Juha Ala-Aho ** Pvm: 19.12.1991 ----------------------------------------------------------------------------*/ { itoa(lisays+atoi(maalit),maalit,10); } /****************************************************************************/ void paivitetaan( Sarja_tyyppi *sarja, /* Joukkueet joita p„ivitet„„n */ Ottelu_tyyppi *paivitys_peli /* Ottelu jolla p„ivitet„„n */ ) /* ** Aliohjelmalla p„ivitet„„n ottelutiedoilla joukkueiden piste- ja maalitietoja. ** ** Kutsuu: lisaa_maalit ** Tekij„: Juha Ala-Aho ** Pvm: 19.12.1991 ** Algoritmi: K„yd„„n l„pi ottelut, jos koti- ja vieras joukkue l”ytyv„t ** tiedostosta, niin p„ivitet„„n joukkueiden piste- ja maalitietoja ----------------------------------------------------------------------------*/ { int j=0, kjloytyi=0,vjloytyi=0, /* 1 = joukkue l”ytyi tiedostosta */ kj=0,vj=0, /* joukkueen indeksi tiedostossa */ km,vm; /* apumuuttujia joissa koti ja vieras maalit */ for(j=0;jjoukkueita;j++) { if ( !strcmp(paivitys_peli->kotijtunnus, sarja->joukkueet[j]->jtunnus) ) { kjloytyi=1; kj=j; } if ( !strcmp(paivitys_peli->vierasjtunnus, sarja->joukkueet[j]->jtunnus) ) { vjloytyi=1; vj=j; } } if ( kjloytyi && vjloytyi ) { km = atoi(paivitys_peli->koti_maalit); vm = atoi(paivitys_peli->vieras_maalit); /* P„ivitet„„n pistetietoja */ if ( km > vm ) /* kotivoitto */ itoa( (atoi(sarja->joukkueet[kj]->pisteet)+2), sarja->joukkueet[kj]->pisteet,10); else if ( km < vm ) /* vierasvoitto */ itoa( (atoi(sarja->joukkueet[vj]->pisteet)+2), sarja->joukkueet[vj]->pisteet,10); else { /* tasapeli */ itoa( (atoi(sarja->joukkueet[kj]->pisteet)+1), sarja->joukkueet[kj]->pisteet,10); itoa( (atoi(sarja->joukkueet[vj]->pisteet)+1), sarja->joukkueet[vj]->pisteet,10); } /* P„ivitet„„n maalitietoja */ lisaa_maalit(km,sarja->joukkueet[kj]->tehdyt_maalit); lisaa_maalit(vm,sarja->joukkueet[kj]->paastetyt_maalit); lisaa_maalit(vm,sarja->joukkueet[vj]->tehdyt_maalit); lisaa_maalit(km,sarja->joukkueet[vj]->paastetyt_maalit); } if (!kjloytyi) printf("%s ei ole joukkuetiedostossa\n", paivitys_peli->kotijtunnus); if (!vjloytyi) printf("%s ei ole joukkuetiedostossa\n", paivitys_peli->vierasjtunnus); if ( !(kjloytyi && vjloytyi) ) { printf("Ei p„ivityst„!\n"); odota_jotakin(); } } /****************************************************************************/ void /* */ lisaa_uusi_ottelu( /* */ Ottelurekisteri_tyyppi *sarja_pelit, /* s,t Ottelurekisteri johon lis„t„„n*/ Sarja_tyyppi *sarja /* s Sarja jota p„ivitet„„n */ ) /* ** Aliohjelmalla kysell„„n uusia otteluita kunnes kotijoukkueeksi ** annetaan [RET]. ** ** Globaalit: OKENTAT (lista kenttien koosta ja alkukohdista) ** Sy”tt”: P„„tteelt„ ** Tulostus: N„ytt””n ** Kutsuu: kysy_ottelun_tiedot ** tulosta_ottelu ** kylla_vastaus ** lisaa_ottelu ** paivitetaan ** Tekij„: Vesa Lappalainen ** Pvm: 10.11.1991 ----------------------------------------------------------------------------*/ { Ottelu_tyyppi ottelu; int i,tyhjenna_kaikki=0; printf("\n\n\n"); printf("Uuden ottelun lis„ys\n"); printf("====================\n"); while (1) { /* Tyhjennet„„n tarvittavat kent„t oletusarvosta */ if (sarja_pelit->nykyottelu >= sarja_pelit->otteluita) tyhjenna_kaikki=1; else ottelu = *sarja_pelit->ottelut[sarja_pelit->nykyottelu]; for (i=0; iotteluita); printf("Anna uusi ottelu k„ytt„en joukkueiden tunnuksia\n"); do { if (kysy_ottelun_tiedot(&ottelu,LISAYS)) return; printf("Lis„t„„nk”(K/e)\n"); tulosta_ottelu(stdout,&ottelu); printf(":"); } while ( !kylla_vastaus() ); if ( lisaa_ottelu(sarja_pelit,&ottelu) ) { printf("\nLis„ys ei onnistunut!\n"); odota_jotakin(); } paivitetaan(sarja,sarja_pelit->ottelut[sarja_pelit->nykyottelu]); } } /****************************************************************************/ void vahenna_maalit( int vahennys, /* s ottelumaalit jotka v„hennet„„n */ char *maalit /* s,t joukkueen maalit johon lis„t„„n */ ) /* ** Aliohjelmalla poistetaan joukkueiden maalitietojen p„ivitys v„hent„m„ll„ ** joukkueen maalitiedoista ottelun maalit. ** ** Tekij„: Juha Ala-Aho ** Pvm: 07.01.1992 ----------------------------------------------------------------------------*/ { itoa(atoi(maalit)-vahennys,maalit,10); } /****************************************************************************/ void poista_paivitys( Sarja_tyyppi *sarja, /* Joukkueet joilta poistetaan p„ivitys */ Ottelu_tyyppi *paivitys_peli /* Ottelu jonka p„ivitys poistetaan */ ) /* ** Aliohjelmalla poistetaan ottelutietojen p„ivitys joukkueiden piste- ja ** maalitiedoista. ** ** Kutsuu: vahenna_maalit ** Tekij„: Juha Ala-Aho ** Pvm: 07.01.1992 ** Algoritmi: K„yd„„n l„pi ottelut, jos koti- ja vieras joukkue l”ytyv„t ** tiedostosta, niin poistetaan joukkueiden piste- ja maalitietojen ** p„ivitys. ----------------------------------------------------------------------------*/ { int i=0, kjloytyi=0,vjloytyi=0, /* 1 = joukkue l”ytyi tiedostosta */ kj=0,vj=0, /* joukkueen indeksi tiedostossa */ km,vm; /* apumuuttujia joissa koti ja vieras maalit */ for(i=0;ijoukkueita;i++) { if ( !strcmp(paivitys_peli->kotijtunnus, sarja->joukkueet[i]->jtunnus) ) { kjloytyi=1; kj=i; } if ( !strcmp(paivitys_peli->vierasjtunnus, sarja->joukkueet[i]->jtunnus) ) { vjloytyi=1; vj=i; } } if ( kjloytyi && vjloytyi ) { km = atoi(paivitys_peli->koti_maalit); vm = atoi(paivitys_peli->vieras_maalit); /* Poistetaan pistetietojen p„ivitys */ if ( km > vm ) /* kotivoitto */ itoa( (atoi(sarja->joukkueet[kj]->pisteet)-2), sarja->joukkueet[kj]->pisteet,10); else if ( km < vm ) /* vierasvoitto */ itoa( (atoi(sarja->joukkueet[vj]->pisteet)-2), sarja->joukkueet[vj]->pisteet,10); else { /* tasapeli */ itoa( (atoi(sarja->joukkueet[kj]->pisteet)-1), sarja->joukkueet[kj]->pisteet,10); itoa( (atoi(sarja->joukkueet[vj]->pisteet)-1), sarja->joukkueet[vj]->pisteet,10); } /* Poistetaan maalitietojen p„ivitys */ vahenna_maalit(km,sarja->joukkueet[kj]->tehdyt_maalit); vahenna_maalit(vm,sarja->joukkueet[kj]->paastetyt_maalit); vahenna_maalit(vm,sarja->joukkueet[vj]->tehdyt_maalit); vahenna_maalit(km,sarja->joukkueet[vj]->paastetyt_maalit); } if (!kjloytyi) printf("%s ei ole joukkuetiedostossa\n", paivitys_peli->kotijtunnus); if (!vjloytyi) printf("%s ei ole joukkuetiedostossa\n", paivitys_peli->vierasjtunnus); if ( !(kjloytyi && vjloytyi) ) { printf("Ei p„ivityksen poistoa!\n"); odota_jotakin(); } } /****************************************************************************/ int /* */ poista_ottelu( /* 0 = onnistui, 1 = ep„onnistui */ Sarja_tyyppi *sarja, /* s,t sarja josta poistet p„ivitys */ Ottelurekisteri_tyyppi *sarja_pelit ,/* s,t ottelurek josta poistetaan. */ int poistettava /* s Poistettavan ottelun numero */ ) /* ** Funktiolla poistetaan ottelu listasta. Poisto varmistetaan k„ytt„j„lt„. ** Listaan laitetaan ottelun paikalle NULL ja itse ottelu h„vitet„„n. ** ** Sy”tt”: P„„tteelt„ ** Tulostus: N„yt”lle ** Kutsuu: odota_nappain ----------------------------------------------------------------------------*/ { char vastaus; printf("Haluatko todellakin poistaa ottelun %s-%s (k/E):", OKENTTA(ONIMIKENTTA,sarja_pelit->ottelut[poistettava]), OKENTTA((ONIMIKENTTA+1),sarja_pelit->ottelut[poistettava])); vastaus=odota_nappain("KE",'E',VAIN_ISOT); printf("\n"); if ( vastaus=='E' ) return 1; poista_paivitys(sarja,sarja_pelit->ottelut[poistettava]); free(sarja_pelit->ottelut[poistettava]); sarja_pelit->ottelut[poistettava]=NULL; printf("Ottelu poistettu!\n"); return 0; } /****************************************************************************/ void ottelun_tietojen_korjailu( Ottelurekisteri_tyyppi *sarja_pelit, /* s,t Ottelurek jota korjaillaan */ Sarja_tyyppi *sarja /* s Sarja jota p„ivitet„„n */ ) /* ** Aliohjelmalla korjataan ottelun tietoja tai poistetaan ottelu. ** ** Kutsuu: poista_paivitys ** kysy_ottelun_tiedot ** paivitetaan ** poista_ottelu ** o_poista_NULL ** Tekij„: Juha Ala-Aho ** Pvm: 19.12.1991 ----------------------------------------------------------------------------*/ { int ind,poistettuja=0; printf("\n\n"); printf("Ottelun tietojen korjaus\n"); printf("========================\n"); printf("\n"); printf("Valitse tietojen korjaus tai poisto(K/p):"); if ( odota_nappain("KP",'K',VAIN_ISOT) == 'K' ) { do { printf("\n"); printf("Anna korjattavan ottelun indeksi"); printf("(luvut v„lilt„ 0-%d) >",sarja_pelit->otteluita-1); scanf("%d",&ind); } while ( ind >= sarja_pelit->otteluita ); printf("\n"); poista_paivitys(sarja,sarja_pelit->ottelut[ind]); printf("Korjaa tietoja tarvittaessa!\n"); kysy_ottelun_tiedot(sarja_pelit->ottelut[ind],PAIVITYS); paivitetaan(sarja,sarja_pelit->ottelut[ind]); } else { do { printf("\n"); printf("Anna poistettavan ottelun indeksi"); printf("(luvut v„lilt„ 0-%d) >",sarja_pelit->otteluita-1); scanf("%d",&ind); } while ( ind >= sarja_pelit->otteluita ); printf("\n"); if ( !poista_ottelu(sarja,sarja_pelit,ind) ) poistettuja++; if ( poistettuja ) o_poista_NULL(sarja_pelit); } } static char *O_EI_VOI_LUODA = "Ottelustolle ei saada varattua tilaa muistista!"; /****************************************************************************/ char /* NULL =onnistui */ *luo_ottelusto( /* muut = virheilmoitus merkkijonona*/ Ottelurekisteri_tyyppi *sarja_pelit ,/* t K„sitelt„v„ ottelurekisteri */ int koko /* s Sarjan maksimiottelum„„r„. */ ) /* ** Funktiolla luodaan ottelurekisterin osoitintaulukko ottelustoon. Mik„li ** ottelustoa ei voida luoda, palautetaan 1. ----------------------------------------------------------------------------*/ { sarja_pelit->ottelut = malloc(koko*(sizeof(Ottelu_tyyppi *))); sarja_pelit->max_otteluita=koko; sarja_pelit->otteluita=0; if (sarja_pelit->ottelut) return NULL; else return O_EI_VOI_LUODA; }