/* kerhohar.cpp */ /* Kerho-ohjelman runko ja alustavat luokat. ** Tekij„t: Vesa Lappalainen ** Ohjelmointikurssi 1996 ** Tehty: 20.12.1991 ** Muutettu 19.12.1993/vl ** 06.12.1995/vl - C++ versio ** Mit„ muutettu: avustus ** Muutettu 06.12.1995/vl ** Mit„ muutettu: tehty C++ versio ** Muutettu 07.12.1995/vl ** Mit„ muutettu: tehty document/view C++ versio ** Muutettu 11.03.1996/vl ** Mit„ muutettu: lis„tty harrasteet ** ** ** ** Teht„vi„: 1) Luodaanko p„„ohjelman kerholle mit„„n j„sentaulukkoa ** ennekuin tehd„„n naytto.lue()? ** 2) Poistetaanko jotakin p„„ohjelman kerhosta p„„ohjelman ** alkaessa? ** 3) Miksi metodissa "int cKerho::lisaa(const cJasen &jasen)" ** luodaan uusi j„sen, eik„ tyydyt„ laittamaan osoitinta ** parametrina tuotuun j„seneen? ** */ #include #include #include #include "string" #ifdef __TURBOC__ /* Sy”tt” Turbo-C:n mukaisesti. */ # define GETCH # include #endif //---------------------------------------------------------------------------- // Vakiota //---------------------------------------------------------------------------- const char *TARKENNIN = ".dat"; const char *VANHATARK = ".bak"; const int MAX_JASENIA = 5; const int MAX_HARRASTUKSIA = 10; const int MERKKI_ISOKSI = 1; const int MYOS_PIENET = 0; const char *KAIKKI_KELPAA = NULL; const char EI_OLETUSTA = 0; const char *RIVINVAIHTO = "\r\n"; //---------------------------------------------------------------------------- // Yleisk„ytt”isi„ apualiohjelmia: //---------------------------------------------------------------------------- char lue_merkki(void) { #ifdef GETCH /* Seuraava toimii mm. Turbo C:ss„: */ return getch(); #else /* Seuraava on standardin mukainen: */ char s[50]; fgets(s,50,stdin); return s[0]; #endif } char isoksi(char c) { if ( c<'a' ) return c; if ( c>'z' ) return c; return c-(char)('a'-'A'); } char odota_nappain(const char *kelpaavat, char oletus, int merkki_isoksi) { char painettu; do { painettu = lue_merkki(); if ( merkki_isoksi ) painettu = isoksi(painettu); if ( oletus != EI_OLETUSTA && strchr(RIVINVAIHTO,painettu) ) return oletus; } while ( kelpaavat != NULL && strchr(kelpaavat,painettu) == NULL ); return painettu; } void odota_jotakin(void) { cout << "Paina jotakin!" << endl; odota_nappain(KAIKKI_KELPAA,EI_OLETUSTA,MERKKI_ISOKSI); } int kylla_vastaus(void) { return ( odota_nappain("KE",'K',MERKKI_ISOKSI) == 'K' ); } void ei_toimi(void) { cout << "Ei toimi viel„!" << endl; odota_jotakin(); } void viiva(int pit, char merkki) { for (int i = 0; iJasen_nro() == nro ) { kohdalla = i; return harrastukset[i]; } } return NULL; } const cHarrastus *cHarrastukset::eka(int nro) { kohdalla = -1; return seuraava(nro); } void cHarrastukset::poista_harrasteet() { for (int i=0; i= max_harrastuksia ) return LIIKAA_HARRASTUKSIA; uusi_harrastus = new cHarrastus(harrastus); if ( uusi_harrastus == NULL ) return EI_SAA_HARRASTUSTA; harrastukset[harrastuksia] = uusi_harrastus; harrastuksia++; return NULL; } const char *cHarrastukset::luo_harrastustaulukko(int koko) { poista_harrasteet(); if ( koko <= 0 ) return NULL; harrastukset = (cHarrastus **)malloc( koko * (sizeof(cHarrastus *)) ); harrastuksia = 0; max_harrastuksia = 0; if ( harrastukset == NULL ) return EI_VOI_LUODA_H; max_harrastuksia = koko; return NULL; } void cHarrastukset::poista_harrastustaulukko() { if ( max_harrastuksia > 0 ) free(harrastukset); max_harrastuksia = 0; } const char *cHarrastukset::lue_tiedostosta(const char *tied) { // Pahasti kesken tiedoston_nimi = tied; return luo_harrastustaulukko(); } const char *cHarrastukset::talleta() { // Pahasti kesken return NULL; } //---------------------------------------------------------------------------- // J„senist”n m„„rittely: //---------------------------------------------------------------------------- class cJasenet { int max_jasenia; int jasenia; int muutettu; string tiedoston_nimi; string kerhon_nimi; cJasen **jasenet; void poista_jasenisto() { poista_jasenet(); poista_jasentaulukko(); } void poista_jasenet(); void poista_jasentaulukko(); const char *luo_jasentaulukko(int koko=MAX_JASENIA); void alusta_jasenisto() { kerhon_nimi = ""; tiedoston_nimi = ""; max_jasenia = 0; jasenia = 0; muutettu = 0; } int rajoihin(int i) const { if ( i<0 || max_jasenia <= i ) i = 0; return i;} public: cJasenet(int koko=0) { alusta_jasenisto(); luo_jasentaulukko(koko); } ~cJasenet() { if ( muutettu ) talleta(); poista_jasenisto(); } const char *lisaa(const cJasen &jasen); const cJasen &anna(int i) const { return *jasenet[rajoihin(i)]; } const char *lue_tiedostosta(const char *tied); const char *talleta(); const string &Kerhon_nimi() const { return kerhon_nimi; } int Jasenia() const { return jasenia; } const string &Tiedoston_nimi() const { return tiedoston_nimi; } }; //---------------------------------------------------------------------------- // J„senist”n toteutus: //---------------------------------------------------------------------------- const char *EI_VOI_LUODA = "J„senist”lle ei saada varattua tilaa muistista!"; const char *LIIKAA_JASENIA = "Liikaa j„seni„, ei voi lis„t„!"; const char *EI_SAA_JASENTA = "Ei saada tilaa uudelle j„senelle!"; void cJasenet::poista_jasenet() { for (int i=0; i= max_jasenia ) return LIIKAA_JASENIA; uusi_jasen = new cJasen(jasen); if ( uusi_jasen == NULL ) return EI_SAA_JASENTA; jasenet[jasenia] = uusi_jasen; jasenia++; return NULL; } const char *cJasenet::luo_jasentaulukko(int koko) { poista_jasenisto(); if ( koko <= 0 ) return NULL; jasenet = (cJasen **)malloc( koko * (sizeof(cJasen *)) ); jasenia = 0; max_jasenia = 0; if ( jasenet == NULL ) return EI_VOI_LUODA; max_jasenia = koko; return NULL; } void cJasenet::poista_jasentaulukko() { if ( max_jasenia > 0 ) free(jasenet); max_jasenia = 0; } const char *cJasenet::lue_tiedostosta(const char *tied) { // Pahasti kesken tiedoston_nimi = tied; return luo_jasentaulukko(); } const char *cJasenet::talleta() { // Pahasti kesken return NULL; } //---------------------------------------------------------------------------- // Kerhon m„„rittely: //---------------------------------------------------------------------------- class cNaytto; class cKerho { friend cNaytto; string kerhon_nimi; cJasenet jasenet; cHarrastukset harrastukset; void alusta() { kerhon_nimi = ""; } public: cKerho(int koko=0):jasenet(),harrastukset() { alusta(); } ~cKerho() { talleta(); } const char *lue_tiedostosta(const char *tied); const char *talleta() { jasenet.talleta(); return harrastukset.talleta(); } const string &Kerhon_nimi() const { return kerhon_nimi; } int Jasenia() const { return jasenet.Jasenia(); } // poista poistaa j„senist”st„ ja harrasteista ne joilla on nro - tee int poista(int nro) { return 0; } }; const char *cKerho::lue_tiedostosta(const char *tied) { // Pahasti kesken kerhon_nimi = tied; const char *virhe = jasenet.lue_tiedostosta(tied); if ( virhe ) return virhe; return harrastukset.lue_tiedostosta(tied); } //---------------------------------------------------------------------------- // N„yt”n m„„rittely //---------------------------------------------------------------------------- class cNaytto { cKerho *kerho; // Osoitin kerhoon => voi olla sama kerho monessa n„yt”ss„ void logo(void); void avustus(char valinta); void lisaa_uusi_jasen(char valinta); void etsi_jasenen_tiedot(char valinta); void tulosteet(char valinta); void tietojen_korjailu(char valinta); void paivita_jasenmaksuja(char valinta); void paamenu(); void tulosta(ostream &os,const cJasen &jasen); void kysy_tiedot(cJasen &jasen); public: cNaytto(cKerho *p) : kerho(p) {;} ~cNaytto() { talleta(); } void ohjeet(void); void kiitokset(void); int lue_tiedosto(); int talleta(); int paavalinta(); }; void cNaytto::logo(void) { cout << endl; cout << " ###################################" << endl; cout << " # J Ž S E N R E K I S T E R I #" << endl; cout << " # versio 9.95 #" << endl; cout << " # Hannu Hanhi #" << endl; cout << " ###################################" << endl; } void cNaytto::ohjeet(void) { logo(); cout << endl; cout << "T„ll„ ohjelmalla yll„pidet„„n kerhon j„senrekisteri„." << endl; } void cNaytto::kiitokset(void) { cout << endl; cout << "KIITOS KŽYT™STŽ JA TERVETULOA UUDELLEEN" << endl; cout << "\n\n" << endl; } int cNaytto::lue_tiedosto() { cout << "Anna kerhon nimi>" << endl; ei_toimi(); return ilmoitus(kerho->lue_tiedostosta("KELMIT")); } int cNaytto::talleta() { logo(); if ( ilmoitus(kerho->talleta()) ) return 1; cout << endl; cout << "Tiedot talletettu tiedostoon " << kerho->jasenet.Tiedoston_nimi() << TARKENNIN << endl; cout << "Vanhat tiedot tiedostossa " << kerho->jasenet.Tiedoston_nimi() << VANHATARK << endl; cout << "\n\nTosin talletus ei viel„ toimi!" << endl; return 0; } void cNaytto::tulosta(ostream &os,const cJasen &jasen) { const cHarrastus *har; int nro = jasen.Jasen_nro(); jasen.tulosta(os); har = kerho->harrastukset.eka(nro); while ( har ) { har->tulosta(os); har = kerho->harrastukset.seuraava(nro); } } void cNaytto::kysy_tiedot(cJasen &jasen) { cHarrastus har; int nro = jasen.Jasen_nro(); cout << "Toistaiseksi osaan lis„t„ vain Aku Ankan" << endl; jasen.vastaa_aku_ankka(); int lkm = rand()%5; for (int i=0; iharrastukset.lisaa(har)) ) break; } } void cNaytto::lisaa_uusi_jasen(char valinta) { cJasen jasen; otsikko(valinta,"Uuden j„senen lis„ys"); jasen.rekisteroi(); kysy_tiedot(jasen); cout << "Lis„t„„nk”" << endl; tulosta(cout,jasen); cout << ":"; int pois = 1; if ( kylla_vastaus() ) pois = ilmoitus(kerho->jasenet.lisaa(jasen)); if ( pois ) kerho->poista(jasen.Jasen_nro()); } void cNaytto::etsi_jasenen_tiedot(char valinta) { otsikko(valinta,"Etsi j„senen tiedot"); ei_toimi(); } void cNaytto::tulosteet(char valinta) { otsikko(valinta,"Tulosteet"); cout << "Toimii toistaiseksi vain n„yt”lle\n" << endl; cout << "---------------------------------------------------------" << endl; for (int i=0; iJasenia(); i++) { const cJasen &jasen = kerho->jasenet.anna(i); tulosta(cout,jasen); cout << endl; } cout << "---------------------------------------------------------" << endl; odota_jotakin(); } void cNaytto::tietojen_korjailu(char valinta) { otsikko(valinta,"Tietojen korjailu"); ei_toimi(); } void cNaytto::paivita_jasenmaksuja(char valinta) { otsikko(valinta,"P„ivit„ j„senmaksuja"); ei_toimi(); } void cNaytto::avustus(char valinta) { otsikko(valinta,"Avustus"); ei_toimi(); } void cNaytto::paamenu() { cout << "\n\n\n\n" << endl; cout << "J„senrekisteri" << endl; cout << "==============" << endl; cout << endl; cout << "Kerhossa " << kerho->Kerhon_nimi() << " on " << kerho->Jasenia() << " j„sent„." << endl; cout << endl; cout << "Valitse:" << endl; cout << " ? = avustus" << endl; cout << " 0 = lopetus" << endl; cout << " 1 = lis„„ uusi j„sen" << endl; cout << " 2 = etsi j„senen tiedot" << endl; cout << " 3 = tulosteet" << endl; cout << " 4 = tietojen korjailu" << endl; cout << " 5 = p„ivit„ j„senmaksuja" << endl; cout << " :"; } int cNaytto::paavalinta() { char nappain; while (1) { paamenu(); nappain = odota_nappain("?012345",EI_OLETUSTA,MERKKI_ISOKSI); switch (nappain) { case '?': avustus(nappain); break; case '0': return 0; case '1': lisaa_uusi_jasen(nappain); break; case '2': etsi_jasenen_tiedot(nappain); break; case '3': tulosteet(nappain); break; case '4': tietojen_korjailu(nappain); break; case '5': paivita_jasenmaksuja(nappain); break; default : cout << "N„in ei voi k„yd„!" << endl; return 1; } } } int main(void) { cKerho kerho; cNaytto naytto(&kerho); naytto.ohjeet(); if ( naytto.lue_tiedosto() ) return 1; naytto.paavalinta(); if ( naytto.talleta() ) return 2; naytto.kiitokset(); return 0; }