/****************************************************************************/ /* ** S A R J A . H ** ** ** Tiedosto sis„lt„„ sarja-ohjelman tarvitsemat yleiset ** vakiot ** tietotyypit ** globaalit vakiotyyliset muuttujat ** makrot ** aliohjelmien otsikot ** ** Tekij„t: Vesa Lappalainen ** Ohjelmointikurssi 1991 ** Tehty: 13.11.1991 ** Muutettu: 16.11.1991/vl ** Mit„ muutettu: Lis„tty Selaus_tyyppi ** logo-aliohjelma siirretty tiedostoon sarjaali.c ** etsimisaliohjelmia siistitty ** VERSIO muutettu merkkijonoksi (ennen #define) ** Muutettu: 17.12.1991/jaa ** Vastaamaan omaa harjoitusty”t„ ** */ /****************************************************************************/ /* ** V a k i o t */ #define TURBO_C /* Sy”tt” Turbo-C:n mukaisesti. */ #define TARKENNIN ".dat" /* Tiedostonimen tarkennin. */ #define VANHATARK ".bak" /* Tarkennin kun .dat -> .bak */ #define MAX_JOUKKUEITA 4 /* Joukkueiden maksimi m„„r„. */ #define MAX_PELAAJIA 4 /* Pelaajien maksimi m„„r„. */ #define MAX_OTTELUITA 12 /* Otteluiden maksimi m„„r„. */ #define VAIN_ISOT 1 /* Muutetaan isot ja pienet isoiksi. */ #define MYOS_PIENET 0 /* Pienet ja isot kirjaimet on eri asia. */ #define EROTTIMET "|" /* Tiedostossa kent„t eroteltu n„ill„. */ #define POIS "q" /* Mill„ merkkijonolla sy”tt” katkaistaan. */ #define SYOTTO 0 /* Vakiot eri tyyppisille sy”t”ille */ #define LISAYS 1 /* */ #define PAIVITYS 2 /* */ #define KORJ 'K' /* N„pp„in jolla valitaan korjailu. */ #define POISTO 'P' /* N„pp„in jolla valitaan poisto. */ #define JA '&' /* N„pp„in jolla valitaan AND-etsiminen. */ #define TAI '|' /* N„pp„in jolla valitaan OR-etsiminen. */ #define KORJ_POISTO "KP" /* Edelliset merkkijonoksi. */ #define JA_TAI "&|" /* -"- */ #define RET '\n' /* N„pp„in joka vastaa RET-n„pp„int„. */ #define AND -1 /* Kent„n numerona AND tarkoittaa AND-ets. */ #define OR -2 /* Kent„n numerona OR tarkoittaa OR -ets. */ #define MIN_KENTTIA 2 /* Tiedostosta l”ydytt„v„ v„hint„„n n„in */ /* monta kentt„„, jotta rivi hyv„ksyt„„n */ /* tietueeksi. */ /****************************************************************************/ /* ** T i e t o t y y p i t ** ** Tietorakenteen kuva ks. sarjarak.c, pelaarak.c ja ottelrak.c */ typedef struct { /* Yhden joukkueen tyyppi: */ char nimi[25]; /* Joukkueen nimi */ char kotipaikka[25]; /* Joukkueen kotipaikka */ char pisteet[4]; /* Joukkueen pistem„„r„ sarjassa */ char tehdyt_maalit[4]; /* Joukkueen sarjassa tekem„t maalit */ char paastetyt_maalit[4]; /* Joukkueelle sarjassa tehdyt maalit */ char jtunnus[11]; /* Joukkueen tunnus jolla joukkue liitet„„n pelaajiin */ } Joukkue_tyyppi; typedef struct { /* Sarjan yleiset tiedot: */ char sarjan_nimi[40]; /* Sarjan t„ydellinen nimi */ char tiedoston_nimi[8]; /* Nimi talletuksessa */ int max_joukkueita; /* Joukkueiden maksimi m„„r„ */ int joukkueita; /* Joukkueita t„ll„ hetkell„ */ int nykyjoukkue; /* Indeksi nyt k„sitelt„v„„n joukkueeseen */ char *mallirivi; /* Osoitin riviin jossa talletusmalli nimi|*/ Joukkue_tyyppi *haku; /* Maski, jolla viimeksi haettu tiedostosta*/ Joukkue_tyyppi **joukkueet; /* Osoitin joukkueosoitintaulukon alkuun */ } Sarja_tyyppi; typedef struct { /* Yhden pelaajan tyyppi: */ char sukunimi[30]; /* Pelaajan sukunimi */ char etunimi[30]; /* Pelaajan etunimi */ char syntyma_aika[7]; /* Syntym„aika muodossa: 121212 */ char pelipaikka[20]; /* Pelaajan yleisin pelipaikka */ char jtunnus[11]; /* Tunnus joukkueelle johon pelaaja kuuluu*/ char numero[3]; /* Pelaajan numero joukkueessa */ /* char maalit[4]; Pelaajan tekem„t maalit */ /* char syotot[4]; Pelaajan antamat maalisy”t”t */ /* char pisteet[5]; maalit + sy”t”t */ } Pelaaja_tyyppi; typedef struct { /* Pelaajarekisterin yleiset tiedot: */ char pelaajarekisterin_nimi[40]; /* Pelaajarekisterin t„ydellinen nimi */ char tiedoston_nimi[8]; /* Nimi talletuksessa */ int max_pelaajia; /* Pelaajien maksimim„„r„ */ int pelaajia; /* Pelaajia t„ll„ hetkell„ */ int nykypelaaja; /* Indeksi nyt k„sitelt„v„„n pelaajaan */ char *mallirivi; /* Osoitin riviin jossa talletusmalli nimi|*/ Pelaaja_tyyppi *haku; /* Maski, jolla viimeksi haettu tiedostosta*/ Pelaaja_tyyppi **pelaajat; /* Osoitin pelaajaosoitintaulukon alkuun */ } Pelaajarekisteri_tyyppi; typedef struct { /* Yhden ottelun tyyppi: */ char kotijtunnus[11]; /* Kotijoukkueen tunnus */ char vierasjtunnus[11]; /* Vierasjoukkueen tunnus */ char koti_maalit[3]; /* Kotijoukkueen tekem„t maalit */ char vieras_maalit[3]; /* Vierasjoukkueen tekem„t maalit */ } Ottelu_tyyppi; typedef struct { /* Ottelurekisterin yleiset tiedot: */ char ottelurekisterin_nimi[40]; /* Ottelurekisterin t„ydellinen nimi */ char tiedoston_nimi[8]; /* Nimi talletuksessa */ int max_otteluita; /* Otteluiden maksimim„„r„ */ int otteluita; /* Otteluita t„ll„ hetkell„ */ int nykyottelu; /* Indeksi nyt k„sitelt„v„„n otteluun */ char *mallirivi; /* Osoitin riviin jossa talletusmalli */ Ottelu_tyyppi *haku; /* Maski, jolla viimeksi haettu tiedostosta*/ Ottelu_tyyppi **ottelut; /* Osoitin otteluosoitintaulukon alkuun */ } Ottelurekisteri_tyyppi; typedef struct { /* Tietue jonka avulla voidaan pit„„ eri j„rjestyksi„. */ int max_koko; /* Indeksitaulukon maksimikoko: */ int kenttia; /* Taulukosta nyt k„ytetty kentti„. */ int *kentat; /* Osoitin indeksitaulukkoon. */ } J_jarjestys_tyyppi; typedef struct { /* Tietorakenteen taulukointi, yhden kentan tiedot: */ char *hopute; /* Mik„ kysymys kent„n tietojen sy”t”ss„. */ char *nimi; /* Kent„n nimi kentt„listassa. */ int koko; /* Kent„n maksimikoko */ int alku; /* Kent„n alkupaikan et„isyys tietueen alus*/ char tyhjenna_lisayksessa; /* K„ytet„„nk” lis„yk. oletusta vai "" */ int mpit; /* Kent„n oletuspituus talletuksessa. */ } J_kentta_tyyppi; typedef struct { /* Tietue jonka avulla voidaan pit„„ eri j„rjestyksi„. */ int max_koko; /* Indeksitaulukon maksimikoko: */ int kenttia; /* Taulukosta nyt k„ytetty kentti„. */ int *kentat; /* Osoitin indeksitaulukkoon. */ } P_jarjestys_tyyppi; typedef struct { /* Tietorakenteen taulukointi, yhden kentan tiedot: */ char *hopute; /* Mik„ kysymys kent„n tietojen sy”t”ss„. */ char *nimi; /* Kent„n nimi kentt„listassa. */ int koko; /* Kent„n maksimikoko */ int alku; /* Kent„n alkupaikan et„isyys tietueen alus*/ char tyhjenna_lisayksessa; /* K„ytet„„nk” lis„yk. oletusta vai "" */ int mpit; /* Kent„n oletuspituus talletuksessa. */ } P_kentta_tyyppi; typedef struct { /* Tietue jonka avulla voidaan pit„„ eri j„rjestyksi„. */ int max_koko; /* Indeksitaulukon maksimikoko: */ int kenttia; /* Taulukosta nyt k„ytetty kentti„. */ int *kentat; /* Osoitin indeksitaulukkoon. */ } O_jarjestys_tyyppi; typedef struct { /* Tietorakenteen taulukointi, yhden kentan tiedot: */ char *hopute; /* Mik„ kysymys kent„n tietojen sy”t”ss„. */ char *nimi; /* Kent„n nimi kentt„listassa. */ int koko; /* Kent„n maksimikoko */ int alku; /* Kent„n alkupaikan et„isyys tietueen alus*/ char tyhjenna_lisayksessa; /* K„ytet„„nk” lis„yk. oletusta vai "" */ int mpit; /* Kent„n oletuspituus talletuksessa. */ } O_kentta_tyyppi; /****************************************************************************/ /* ** G l o b a a l i t (vakio!) muuttujat */ extern char TYHJA_JONO[]; /* Tyhj„ merkkijono apuosoittimeksi*/ extern J_kentta_tyyppi JKENTAT[]; /* Joukkuerakenne taulukoituna. */ extern int JKENTTIA; /* Montako kentt„„ joukkuetyypiss„.*/ extern int JNIMIKENTTA; /* Mik„ on jouk nimikent„n indeksi.*/ extern char JKENTTAVALINNAT[];/* Kenttien valintakirjaimet 012..A*/ extern P_kentta_tyyppi PKENTAT[]; /* Pelaajarakenne taulukoituna. */ extern int PKENTTIA; /* Montako kentt„„ pelaajatyypiss„.*/ extern int PNIMIKENTTA; /* Mik„ on pel nimikent„n indeksi. */ extern char PKENTTAVALINNAT[];/* Kenttien valintakirjaimet 012..A*/ extern O_kentta_tyyppi OKENTAT[]; /* Ottelurakenne taulukoituna. */ extern int OKENTTIA; /* Montako kentt„„ ottelutyypiss„. */ extern int ONIMIKENTTA; /* Mik„ on ottel nimikent„n indeksi*/ extern char OKENTTAVALINNAT[];/* Kenttien valintakirjaimet 012..A*/ extern char *VERSIO; /* Ohjelman versionumero */ /****************************************************************************/ /* ** M A K R O T */ #define JKENTTA(nro,muuttuja) ( ((char *)muuttuja) + JKENTAT[nro].alku ) #define PKENTTA(nro,muuttuja) ( ((char *)muuttuja) + PKENTAT[nro].alku ) #define OKENTTA(nro,muuttuja) ( ((char *)muuttuja) + OKENTAT[nro].alku ) /* ** JKENTTA(nro,muuttuja) ** Makrolla otetaan joukkue muuttujasta nro osoittama kentt„. ** PKENTTA(nro,muuttuja) ** Makrolla otetaan pelaaja muuttujasta nro osoittama kentt„. ** OKENTTA(nro,muuttuja) ** Makrolla otetaan ottelu muuttujasta nro osoittama kentt„. ** Muuttujan t„ytyy olla osoite! */ /****************************************************************************/ /* ** A L I O H J E L M A T ** ** Aliohjelmia on seuraavissa tiedostoissa: ** sarja_a.c - yleisi„ aliohjelmia rekisteri„ varten ** lue_merkki - lukee yhden merkin n„pp„imist”lt„ ** (laiteriippuva) ** odota_nappain - odottaa yhden vain sallitussa joukossa olevan ** n„pp„imen painallusta ** odota_jotakin - odottaa mink„ tahansa n„pp„imen painamista ** kylla_vastaus - odottaa K tai E n„pp„imen painallusta ** ei_toimi_j - tulostaa viestin "Ei toimi" ja odottaa ** n„pp„imen painallusta. ** ei_toimi_p - kuten ei_toimi_j ** logo - tulostaa ohjelman logo-tekstin ** ** sarjarak.c - sarjan rakennetta kovasti k„ytt„vi„ joukkueiden k„sittely ** aliohjelmia ** 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 ** ** pelaarak.c - sarjan rakennetta kovasti k„ytt„vi„ pelaajien k„sittely ** aliohjelmia ** p_poista_NULL - poistaa osoitintaulukosta NULL-osoittimet ** tulosta_pkenttalista - tulostaa valittavaksi kaikki pelaajatietueen ** kent„t ** vastaa_esa_tikkanen - sijoitaa vakiopelaajan Esa Tikkanen ** (testej„ varten) ** tulosta_pelaaja - tulostaa pelaajan valittuun tiedostoon ** tulosta_pelaajat - tulostaa sarjan kaikki pelaajat ** kysy_pelaajan_kentta - kysyy pelaajan valitun kent„n tiedot ** kysy_pelaajan_tiedot - kysyy pelaajan kaikkien kenttien tiedot ** lisaa_pelaaja - lis„„ uuden pelaajan rakenteeseen ** lisaa_uusi_pelaaja - kysyy pelaajan tiedot ja lis„„ pelaajan sarjaan ** poista_pelaaja - varmistaa ja poistaa valitun pelaajan ** pelaajan_tietojen_korjailu -korjataan tai poistetaan pelaajan tietoja ** pelaajat - kysyy lis„t„„nk” vai korjataanko pelaajia ** luo_pelaajisto - luo pelaajaosoitintaulukon ** ** ** ottelrak.c - sarjan rakennetta kovasti k„ytt„vi„ otteluiden k„sittely ** aliohjelmia ** 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 ** ** sarjatal.c - sarjan joukkueiden lukeminen ja tallettaminen tiedostoon. ** luo_sarja - kysyy sarjan t„ydellisen nimen ja alustaa ** ja luo tarvittavat rakenteet. ** lisaa_joukkue_rivi - lis„„ uuden joukkueen joka on annettu muodossa ** JypHT|Jyv„skyl„|... ** lue_sarja - kysyy sarjan nimen ja lukee tiedot levylt„ ** mik„li sarjaa ei l”ydy, annetaan mahdollisuus ** uuden luomiseen ** joukkue_riviksi - muuttaa joukkuetietueen tiedot muotoon ** JypHT|Jyv„skyl„|... ** talleta_sarja - tallettaa sarjan tiedot levylle ** ja muuttaa vanhan tiedoston nimelle .BAK ** ** pelaatal.c - sarjan pelaajien lukeminen ja tallettaminen tiedostoon. ** luo_pelaajarekisteri - kysyy pelaajarekisterin t„ydellisen nimen ja ** alustaa ja luo tarvittavat rakenteet. ** lisaa_pelaaja_rivi - lis„„ uuden pelaajan joka annettu muodossa ** Tikkanen|Esa|121264|hyokkaaja|56|70|126 ** lue_pelaajarekisteri - kysyy pelaajarekisterin nimen ja lukee tiedot ** levylt„ mik„li pelaajarekisteri„ ei l”ydy, ** annetaan mahdollisuus uuden luomiseen ** pelaaja_riviksi - muuttaa pelaajatietueen tiedot muotoon ** Tikkanen|Esa|121264|hyokkaaja|56|70|126 ** talleta_pelaajarekisteri - tallettaa pelaajarekisterin tiedot levylle ** ja muuttaa vanhan tiedoston nimelle .BAK ** ** otteltal.c - sarjan otteluiden lukeminen ja tallettaminen tiedostoon ** luo_ottelurekisteri - kysyy ottelurekisterin t„ydellisen nimen ja ** alustaa ja luo tarvittavat rakenteet. ** lisaa_ottelu_rivi - lis„„ uuden ottelun joka on annettu muodossa ** JypHT|KalPa|6|0| ** lue_ottelurekisteri - kysyy ottelurekisterin nimen ja lukee tiedot ** levylt„ mik„li ottelurekisteri„ ei l”ydy, ** annetaan mahdollisuus uuden luomiseen ** ottelu_riviksi - muuttaa ottelutietueen tiedot muotoon ** JypHT|KalPa|6|0| ** talleta_ottelurekisteri -tallettaa ottelurekisterin tiedot levylle ** ja muuttaa vanhan tiedoston nimelle .BAK ** ** */ /*--------------------------------------------------------------------------*/ /* sarja_a.c: */ char lue_merkki(void); char odota_nappain(char *, char, int); void odota_jotakin(void); int kylla_vastaus(void); void ei_toimi_j(Sarja_tyyppi *); void ei_toimi_p(Pelaajarekisteri_tyyppi *); void logo(void); /*--------------------------------------------------------------------------*/ /* sarjarak.c: */ int j_poista_NULL(Sarja_tyyppi *); void tulosta_kenttalista(char *); void vastaa_jypht(Joukkue_tyyppi *); void tulosta_sarjatilanne(Sarja_tyyppi *); void tulosta_joukkue(FILE *, Joukkue_tyyppi *); void tulosta_joukkueet(Sarja_tyyppi *); char *kysy_joukkueen_kentta(Joukkue_tyyppi *, int, int); int kysy_joukkueen_tiedot(Joukkue_tyyppi *, int); int lisaa_joukkue(Sarja_tyyppi *, Joukkue_tyyppi *); void lisaa_uusi_joukkue(Sarja_tyyppi *); int poista_joukkue(Sarja_tyyppi *, int); int etsi_joukkue(Sarja_tyyppi *, int *); void muuta_jtunnukset(char *, char *, Pelaajarekisteri_tyyppi *, Ottelurekisteri_tyyppi *); void joukkueen_tietojen_korjailu(Sarja_tyyppi *, Pelaajarekisteri_tyyppi *, Ottelurekisteri_tyyppi *); char *luo_joukkueisto(Sarja_tyyppi *, int); /*--------------------------------------------------------------------------*/ /* pelaarak.c */ int p_poista_NULL(Pelaajarekisteri_tyyppi *); void tulosta_pkenttalista(char *); void vastaa_esa_tikkanen(Pelaaja_tyyppi *); void tulosta_pelaaja(FILE *, Pelaaja_tyyppi *); void tulosta_pelaajat(Pelaajarekisteri_tyyppi *); char *kysy_pelaajan_kentta(Pelaaja_tyyppi *, int, int); int kysy_pelaajan_tiedot(Pelaaja_tyyppi *, int); int lisaa_pelaaja(Pelaajarekisteri_tyyppi *, Pelaaja_tyyppi *); void lisaa_uusi_pelaaja(Pelaajarekisteri_tyyppi *); int poista_pelaaja(Pelaajarekisteri_tyyppi *, int); void pelaajan_tietojen_korjailu(Pelaajarekisteri_tyyppi *); char *luo_pelaajisto(Pelaajarekisteri_tyyppi *, int); void pelaajat(Pelaajarekisteri_tyyppi *); /*--------------------------------------------------------------------------*/ /* ottelrak.c */ int o_poista_NULL(Ottelurekisteri_tyyppi *); void tulosta_okenttalista(char *); void tulosta_ottelu(FILE *, Ottelu_tyyppi *); void tulosta_ottelut(Ottelurekisteri_tyyppi *); char *kysy_ottelun_kentta(Ottelu_tyyppi *, int, int); int kysy_ottelun_tiedot(Ottelu_tyyppi *, int); int lisaa_ottelu(Ottelurekisteri_tyyppi *, Ottelu_tyyppi *); void lisaa_maalit(int, char *); void paivitetaan(Sarja_tyyppi *, Ottelu_tyyppi *); void lisaa_uusi_ottelu(Ottelurekisteri_tyyppi *, Sarja_tyyppi *); void vahenna_maalit(int, char *); void poista_paivitys(Sarja_tyyppi *, Ottelu_tyyppi *); int poista_ottelu(Sarja_tyyppi *,Ottelurekisteri_tyyppi *,int); void ottelun_tietojen_korjailu(Ottelurekisteri_tyyppi *, Sarja_tyyppi *); char *luo_ottelusto(Ottelurekisteri_tyyppi *,int); /*--------------------------------------------------------------------------*/ /* sarjatal.c: */ char *lue_sarja(Sarja_tyyppi *); char *talleta_sarja(Sarja_tyyppi *); /*--------------------------------------------------------------------------*/ /* pelaatal.c: */ char *lue_pelaajarekisteri(Pelaajarekisteri_tyyppi *); char *talleta_pelaajarekisteri(Pelaajarekisteri_tyyppi *); /*--------------------------------------------------------------------------*/ /* otteltal.c: */ char *lue_ottelurekisteri(Ottelurekisteri_tyyppi *); char *talleta_ottelurekisteri(Ottelurekisteri_tyyppi *);