/* kerho.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 ** ** ** 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 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) { /* Seuraava toimii mm. Turbo C:ss„: */ #ifdef GETCH char c; while ( 1 ) { /* Korjataan funktion„pp„in-vika */ c = getch(); if ( c != 0 ) return c; c = 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 isot) { char painettu; do { while ( !(painettu=lue_merkki()) ); if (isot) painettu = isoksi(painettu); if ( oletus && ((painettu=='\n') || (painettu=='\r')) ) return oletus; } while ( kelpaavat && !strchr(kelpaavat,painettu) ); 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; 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 *cKerho::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 cKerho::poista_jasentaulukko() { if ( max_jasenia > 0 ) free(jasenet); max_jasenia = 0; } const char *cKerho::lue_tiedostosta(const char *tied) { // Pahasti kesken kerhon_nimi = tied; tiedoston_nimi = tied; return luo_jasentaulukko(); } const char *cKerho::talleta() { // Pahasti kesken return NULL; } //---------------------------------------------------------------------------- // 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(); 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->Tiedoston_nimi() << TARKENNIN << endl; cout << "Vanhat tiedot tiedostossa " << kerho->Tiedoston_nimi() << VANHATARK << endl; cout << "\n\nTosin talletus ei viel„ toimi!" << endl; return 0; } void cNaytto::lisaa_uusi_jasen(char valinta) { cJasen jasen; otsikko(valinta,"Uuden j„senen lis„ys"); cout << "Toistaiseksi osaan lis„t„ vain Aku Ankan" << endl; jasen.vastaa_aku_ankka(); cout << "Lis„t„„nk”" << endl; jasen.tulosta(cout); cout << ":"; if ( kylla_vastaus() ) ilmoitus(kerho->lisaa(jasen)); } 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->anna(i); jasen.tulosta(cout); 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; }