/****************************************************************************/ /* ** K E R H O . H ** ** ** Tiedosto sis„lt„„ kerho-ohjelman tarvitsemat yleiset ** vakiot ** tietotyypit ** globaalit vakiotyyliset muuttujat ** makrot ** aliohjelmien otsikot ** ** Tekij„t: Vesa Lappalainen ** Ohjelmointikurssi 1991 ** Tehty: 20.12.1991 ** Muutettu: 21.12.1991 ** Mit„ muutettu: Lis„tty j„senen p„„tteelt„ lukemisessa ** tarvittavia osia ** Muutettu: 21.12.1991/vl ** Mit„ muutettu Tietojen oikeellisuustarkistukset ** kysy_jasenen_tiedot 2 uutta parametria ** Muutettu: 24.12.1991/vl ** Mit„ muutettu: Lis„tty etsimisess„ ja lajittelussa tarvittavia osia ** Rakenteesta riippuvat vain tiedostot ** kerho.h ja kerhorak.h ** Muutettu: 18.12.1992/vl ** Mit„ muutettu: vaihdettu Jarjestystyypin tietueen nimi„ ** kenttia -> indekseja ** kentat -> indeksit ** Muutettu 19.12.1993/vl ** Mit„ muutettu: avustus ** */ /****************************************************************************/ /* ** V a k i o t */ #define MAX_JASENIA 4 /* J„senist”n maksimi (oletus)koko. */ #define TARKENNIN ".dat" /* Tiedostonimen tarkennin. */ #define VANHATARK ".bak" /* Tarkennin kun .dat -> .bak */ #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 NAP_KORJ 'K' /* N„pp„in jolla valitaan korjailu. */ #define NAP_POISTO 'P' /* N„pp„in jolla valitaan poisto. */ #define NAP_JA '&' /* N„pp„in jolla valitaan AND-etsiminen. */ #define NAP_TAI '|' /* N„pp„in jolla valitaan OR-etsiminen. */ #define NAP_KORJ_POISTO "KP" /* Edelliset merkkijonoksi. */ #define NAP_JA_TAI "&|" /* -"- */ #define NAP_RET '\n' /* N„pp„in joka vastaa RET-n„pp„int„. */ #define NAP_SEURAAVA '+' /* N„pp„in jolla seuraava selauksessa */ #define NAP_EDELLINEN '-' /* N„pp„in jolla edellinen selauksessa */ #define NAP_SEUR_LOPPU "+*" /* N„pp„in jolla seuraava selauksessa */ #define NAP_EDEL_ALKU "-/" /* N„pp„in jolla edellinen selauksessa */ #define NAP_ALKUUN '/' /* N„pp„in jolla alkuun selauksessa */ #define NAP_LOPPUUN '*' /* N„pp„in jolla loppuun selauksessa */ #define NAP_RET '\n' /* N„pp„in joka vastaa RET-n„pp„int„. */ #define ETSI_AND -1 /* Kent„n numerona AND tarkoittaa AND-ets. */ #define ETSI_OR -2 /* Kent„n numerona OR tarkoittaa OR -ets. */ #define KORJAILU 1 /* Selatessa saa korjailla! */ #define EI_KORJAILUA 0 /* Selatessa EI saa korjailla! */ #define TYHJA_ARVO -1 /* Arvo joka kuvastaa tyhj„„ num. kentt„„ */ #define TYHJENNA_ARVO -2 /* Arvo joka kuvastaa kent„n tyhjennyst„ */ #define TYHJENNA_JONO "==" /* Jono, joka pakottaa kent„n tyhj„ksi */ #define AVAIMEN_KOKO 40 /* Lajitteluavaimelle varattu pituus */ #define PUH_MERKIT "0123456789- ()"/* Puhelinnumeroon sallitut merkit. */ /****************************************************************************/ /* ** T i e t o t y y p i t ** ** Tietorakenteen kuva ks. kerhorak.c */ typedef struct { /* Yhden j„senen tyyppi: */ char nimi[40]; /* Nimi muodossa: Virtanen Ville Veikko */ char sotu[12]; /* Sotu muodossa: 121212-123K */ char katuosoite[40]; /* Katuosoite muodossa: Matinpolku 6 */ char postinumero[6]; /* Postinumero muodossa: 40100 */ char postiosoite[30]; /* Postiosoite muodossa: JYVŽSKYLŽ */ char kotipuhelin[15]; /* Puhelinnumerot muodossa: 941-123123 */ char tyopuhelin[15]; /* */ char autopuhelin[15]; /* */ int liittymisvuosi; /* Liittymisvuosi muodossa: 1979 */ double jmaksu; /* J„senmaksu, esim: 10 */ double maksu; /* Paljonko jmaksua maksettu : 10 */ char lisatietoja[80]; /* Vapaasti teksti„. */ char avain[AVAIMEN_KOKO]; /* Lajittelussa k„ytett„v„ avain */ } Jasen_tyyppi; /* */ typedef enum { NIMIKENTTA, SOTUKENTTA, KATUKENTTA, POSTINROKENTTA, POSTIOSKENTTA, KOTIPUHKENTTA, TYOPUHKENTTA, AUTOPUHKENTTA, LIITTYMISKENTTA, JMAKSUKENTTA, MAKSUKENTTA, LISATIETOJAKENTTA } Kentta_nrot; #define KENTTIA (LISATIETOJAKENTTA+1) typedef enum { /* Kentill„ k„ytett„v„t tietotyypit: */ Tjono, /* Tyyppi string */ Tsotu, /* Tyyppi sotulle */ Tint, /* Tyyppi int */ Tdouble /* Tyyppi double */ } Tyypit; typedef char Haku_tyyppi[40]; typedef struct { /* Kerhon yleiset tiedot: */ char kerhon_nimi[40]; /* Kerhon t„ydellinen nimi. */ char tiedoston_nimi[8]; /* Nimi talletuksessa. */ int max_jasenia; /* Maksimi j„senm„„r„. */ int jasenia; /* J„seni„ t„ll„ hetkell„. */ int nykyjasen; /* Indeksi nyt k„sitelt„v„„n j„seneen. */ Haku_tyyppi *haku; /* Maski,jolla viimeksi haettu tiedostosta. */ Jasen_tyyppi **jasenet; /* Osoitin j„senosoitintaulukon(dyn.) alkuun*/ } Kerho_tyyppi; /* */ typedef struct { /* Tietue jonka avulla voidaan pit„„ eri j„rjestyksi„. */ int max_koko; /* Indeksitaulukon maksimikoko. */ int indekseja; /* Taulukosta nyt k„ytetty indeksej„ */ int jarjesta; /* J„rjestet„„nk” vai ei. */ int *indeksit; /* Osoitin indeksitaulukkoon (dynaaminen). */ } Jarjestys_tyyppi; /* */ typedef struct { /* Selauksessa apuna k„ytett„v„ tietue. */ char viesti[400]; /* N„yt”lle selausta varten tuleva viesti. */ char vali; /* V„limerkki, mik„li viesti joud. jatkam. */ char sallitut[80]; /* Kentt„listan sallitut valintakirjaimet. */ int kohdalla; /* selattavat-taulukon nyt kohd oleva alkio.*/ Jarjestys_tyyppi *selattavat; /* Taulukko jossa selattavat indeksit. */ } Selaus_tyyppi; typedef struct { /* Tietue, jolla v„litet„„n tietoa tarkistusaliohjelmalle*/ Kerho_tyyppi *kerho; /* Kerho, jonka tietoja tarkistetaan. */ Jasen_tyyppi *jasen; /* J„sen, jonka tietoja tarkistetaan. */ Kentta_nrot kentta; /* Kentt„, jonka tietoja nyt tutkitaan. */ Kentta_nrot seuraava_kentta; /* Kentt„, jonka tietoja tutkitaan seuraav. */ int syotto_tyyppi; /* Onko lis„ys vai p„ivitys? */ int muutettu; /* Onko muutettu sis„lt”„? */ } Tarkistus_tyyppi; typedef enum { /* Tyyppi, jonka tarkistusaliohjelma palauttaa */ TARK_LOPETUS = -1, /* Tarkistus haluaa lopettaa koko kyselyn */ TARK_OK, /* Tarkistus on kunnossa */ TARK_TOISTA, /* Kysymys pit„„ toistaa */ TARK_PAL_OLET /* Kysymys pit„„ toistaa k„ytt„en olet.arvoa*/ } Tarkistus_tulos_tyyppi; /* Funktio-osoitin tarkistusfunktioon: */ typedef Tarkistus_tulos_tyyppi (*Tarkistus_funktio)(Tarkistus_tyyppi *, char *); /****************************************************************************/ /* ** G l o b a a l i t (vakio!) muuttujat */ extern char TYHJA_JONO[]; /* Tyhj„ merkkijono apuosoittimeksi.*/ extern char KENTTAVALINNAT[]; /* Kenttien valintakirjaimet 012..AB*/ extern char *VERSIO; /* Ohjelman versionumero */ /****************************************************************************/ /* ** M A K R O T */ /****************************************************************************/ /* ** A L I O H J E L M A T ** ** Aliohjelmia on seuraavissa tiedostoissa: ** kerhoali.c - yleisi„ aliohjelmia rekisteri„ varten ** onko_tyhjenna_jono - 1 = jos tutkittava jono on == ** erikoisarvo - muuttaa reaaliluvun merkkijonoksi jos ** kyseess„ on jokin erikoisarvoa kuvaava arvo ** erikoisjono - muuttaa jonon reaaliluvuksi, jos jono jokin ** erikoisjono (kuten "" tai "==") ** int_jonoksi - muuttaa kokonaisluvun mjonoksi, -1 -> "" ** double_jonoksi - muuttaa reaaliluvun mjonoksi, -1 -> "" ** jono_intiksi - muuttaa jonon kokonaisluvuksi, "" -> -1 ** jono_doubleksi - muuttaa jonon reaaliluvuksi, "" -> -1 ** 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 - tulostaa viestin "Ei toimi" ja odottaa ** n„pp„imen painallusta. ** viiva - piirt„„ koko ruudun levyisen viivan ** ** kerhorak.c - kerhon rakennetta kovasti k„ytt„vi„ aliohjelmia ** kentan_tyyppi - palauttaa kent„n tyypin ** kentan_osoite - palauttaa kent„n osoitteen ** kentan_koko - palauttaa kent„n koon tavuina ** kentta_jonoksi - palauttaa valitun kent„n merkkijonona ** jono_kentaksi - muuttaa merkkijonon kent„ksi ** tulosta_jasen - tulostaa j„senen valittuun tiedostoon ** poista_NULL - poistaa osoitintaulukosta NULL-osoittimet ** tulosta_kenttalista - tulostaa valittavaksi kaikki j„sentietueen ** kent„t ** lisaa_jasen - lis„„ uuden j„senen rakenteeseen ** luo_jasentaulukko - luo j„senosoitintaulukon ** kysy_kentta - kysyy j„senen valitun kent„n tiedot ** kysy_jasenen_tiedot - kysyy j„senen kaikkien kenttien tiedot ** poista_jasen - varmistaa ja poistaa valitun j„senen ** kysy_haku - kysyy yhden hakukent„n arvon ** kysy_hakutiedot - kysyy koko hakutaulukon tiedot ** ** kerhotal.c - kerhon lukeminen ja tallettaminen tiedostoon ** luo_kerho - kysyy kerhon t„ydellisen nimen ja alustaa ** ja luo tarvittavat rakenteet. ** lisaa_jasen_rivi - lis„„ uuden j„sen joka annettu muodossa ** Ankka Aku|12234-34|... ** lue_kerho - kysyy kerhon nimen ja lukee tiedot levylt„ ** mik„li kerhoa ei l”ydy, annetaan mahdollisuus ** uuden luomiseen ** jasen_riviksi - muuttuu j„sentietueen tiedot muotoon ** Ankka Aku|12234-34|... ** talleta_kerho - tallettaa kerhon tiedot levylle ** ja muuttaa vanhan tiedoston nimelle .BAK ** ** kerhoets.c - j„senist”st„ etsimiseen liittyvi„ aliohjelmia ** lajittele - tekee permutaatiotaulukon valitun kent„n ** mukaisesti ** etsi_kentat - etsii annetun maskin ehdon t„ytt„vi„ j„seni„ ** kysy_kentat_ja_etsi - interraktiivinen kysyminen, etsiminen, ** selaaminen, korjailu ja poisto ** laske_montako_muuta - etsii onko muita kuin valittua j„sent„ ** ** kerhotar.c - oikeellisuustarkistukset ** tarkistus_nimi - palauttaa funktion nimen (avustusten tek.) ** tarkistus_fun - palauttaa funktion nimen perusteella ** ** t_ok - palauttaa aina 0 ** t_nimi - tarkistetaan l”ytyyk” nime„ ennest„„n ** t_sotu - hyv„ksyt„„n muodot ** tyhj„ ** ppkkvv (jos oikein) ** ppkkvv-nnnT (jos oikein) ** ppkkvv+nnnT (jos oikein) ** ennest„„n l”ytyv„„ sotua EI hyv„ksyt„! ** t_katu - pit„isi hoitaa c/o-toiminto ja ** saman osoitteen etsiminen ja t„ydent„minen ** muttei toistaiseksi tee muuta kuin ** muuttaa alkuisoiksi ** t_isoksi - muutaa jonon isoksi ** t_alku_isoksi - muuttaa jonon muotoon Aaaa Bbbb ** t_numeerinen - tarkistaa, ett„ jokainen jonon merkki on numero ** t_vuosi_1900 - tarkistaa sy”t”n olevan muotoa ** xx -xx 19xx ja muuttaa muotoon 19xx ** t_puh - sallii kaikki puhelinnumeroon sallitut merkit ** t_arvo - sallii sy”t”t 5 5.25 5+ 5.5 5« 5.75 6- ** */ /*--------------------------------------------------------------------------*/ /* kerhoali.c: */ char lue_merkki(void); char odota_nappain(char *, char, int); void odota_jotakin(void); int kylla_vastaus(void); void ei_toimi(Kerho_tyyppi *); void logo(void); char *int_jonoksi(char *,int,int,char *); char *double_jonoksi(char *,int,double,char *); int jono_intiksi(char *,char *); double jono_doubleksi(char *,char *); /*--------------------------------------------------------------------------*/ /* kerhorak.c: */ Tyypit kentan_tyyppi(int ,Jasen_tyyppi *); void *kentan_osoite(int ,Jasen_tyyppi *); int kentan_koko(int ,Jasen_tyyppi *); char *kentta_jonoksi(int, Jasen_tyyppi *); void jono_kentaksi(int ,Jasen_tyyppi *,char *); void tulosta_jasen(FILE *, Jasen_tyyppi *); int poista_NULL(Kerho_tyyppi *); void tulosta_kenttalista(char *); void alusta_jasen(Kerho_tyyppi *,Jasen_tyyppi *jasen); int lisaa_jasen(Kerho_tyyppi *, Jasen_tyyppi *); char *luo_jasentaulukko(Kerho_tyyppi *, int); int kysy_jasenen_tiedot(Kerho_tyyppi *, Jasen_tyyppi *, int); int poista_jasen(Kerho_tyyppi *, int); int kysy_haku(Haku_tyyppi *, int); int kysy_hakutiedot(Haku_tyyppi *); /*--------------------------------------------------------------------------*/ /* kerhotal.c: */ char *lue_kerho(Kerho_tyyppi *); char *talleta_kerho(Kerho_tyyppi *); /*--------------------------------------------------------------------------*/ /* kerhoets.c: */ int etsi_kentat(Kerho_tyyppi *, int, Haku_tyyppi *, Jarjestys_tyyppi *); int kysy_kentat_ja_etsi(Kerho_tyyppi *kerho, int); int laske_montako_muuta(Kerho_tyyppi *, int, char *, int , int *, int *); /*--------------------------------------------------------------------------*/ /* kerhotar.c: */ Tarkistus_tulos_tyyppi t_ok(Tarkistus_tyyppi *tarkistus, char *jono); Tarkistus_tulos_tyyppi t_nimi(Tarkistus_tyyppi *tarkistus, char *jono); Tarkistus_tulos_tyyppi t_sotu(Tarkistus_tyyppi *tarkistus, char *jono); Tarkistus_tulos_tyyppi t_katu(Tarkistus_tyyppi *tarkistus, char *jono); Tarkistus_tulos_tyyppi t_isoksi(Tarkistus_tyyppi *tark, char *jono); Tarkistus_tulos_tyyppi t_alku_isoksi(Tarkistus_tyyppi *tark, char *jono); Tarkistus_tulos_tyyppi t_numeerinen(Tarkistus_tyyppi *tark, char *jono); Tarkistus_tulos_tyyppi t_vuosi_1900(Tarkistus_tyyppi *tark, char *jono); Tarkistus_tulos_tyyppi t_puh(Tarkistus_tyyppi *tark, char *jono); Tarkistus_tulos_tyyppi t_arvo(Tarkistus_tyyppi *tark, char *jono);