/* 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 ** Muutettu 26.12.1996/vl ** Mitä muutettu: lisätty tunnusnumeron ylläpito ** jotkut nimet muutettu yleisimmiksi ** ** ** Tehtäviä: 1) Luodaanko pääohjelman kerholle mitään jäsentaulukkoa ** ennenkuin 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 #include using namespace std; #include "dosout.h" #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) { #ifdef GETCH /* Seuraava toimii mm. Turbo C:ssä: */ return (char)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 (char)(c-('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; i= max_jasenia ) return LIIKAA_JASENIA; #if 0 uusi_jasen = new(nothrow) cJasen(jasen); if ( uusi_jasen == NULL ) return EI_SAA_JASENTA; #else try { uusi_jasen = new cJasen(jasen); } catch (std::bad_alloc) { return EI_SAA_JASENTA; } #endif jasenet[jasenia] = uusi_jasen; jasenia++; return ""; } string cKerho::luo_taulukko(int koko) { poista_kaikki(); if ( koko <= 0 ) return ""; jasenet = (cJasen **)malloc( koko * (sizeof(cJasen *)) ); jasenia = 0; max_jasenia = 0; if ( jasenet == NULL ) return EI_VOI_LUODA; max_jasenia = koko; return ""; } void cKerho::poista_taulukko() { if ( max_jasenia > 0 ) free(jasenet); max_jasenia = 0; } string cKerho::lue_tiedostosta(const string &tied) { // Pahasti kesken kerhon_nimi = tied; tiedoston_nimi = tied; return luo_taulukko(); } string cKerho::talleta() { // Pahasti kesken return ""; } //---------------------------------------------------------------------------- // 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.rekisteroi(); 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; }