/* naytto.cpp */ /****************************************************************************/ /* ** N A Y T T O . C P P ** ** N„ytt”-luokan toteutus ** ** Tekij„t: Vesa Lappalainen ** Ohjelmointikurssi 1991- ** Tehty: 20.12.1991 ** Muutettu: 10.12.1995/vl ** Mit„ muutettu: Muutettu C++ luokaksi ** Muutettu: 28.12.1995/vl ** Mit„ muutettu: Laitettu uuden j„senen lukeminen toimivaksi ** ** ** Tietorakenne on seuraava: ** ** ** cNaytto cKerho ** ------ ** | o-----> |---| ** | | | | ** | | | | ** | | | | ** | | |---| ** ------ ** ** K„yt”ss„ voi olla monta n„ytt”„, joista jokainen voi osoittaa samaan ** tai eri kerhoon. N„ytt” huolehtii kaikesta k„ytt”liittym„„n ** liittyv„st„. N„ytt” ei tied„ kerhon rakenteesta muuta kuin, ett„ ** kerhon voi lukea levylt„ ja kirjoittaa levylle sek„ siihen voi ** lis„t„ ja etsi„ j„seni„. N„ytt” tiet„„ ett„ on olemassa j„sen, ** muttei se tied„ j„senen yksityiskohtia. ** ** N„ytt”luokka voidaan kirjoittaa uusiksi esimerkiksi Windows- ** toteuteusta varten. T„m„ n„ytt”luokka on ANSI C++:n mukainen, ** standardi-p„„tett„ k„ytt„v„ versio. ** ** Public-metodeja: ** ================ ** cNaytto(cKerho *p) ** - alustetaan naytto kayttaen naytossa kerhoa johon p osoittaa ** ** ~cNaytto() ** - h„vitet„„n n„ytt”. Talletetaan jollei ole viel„ tehty ** ** void ohjeet(void); ** - lyhyt tiedotus ohjelmasta ** ** void kiitokset(void); ** - poistumiskiitokset ** ** int lue_tiedostosta(); ** - luetaan kerhon nimi ja sitten luetaan kerho tiedostosta ** Luodaan uusi, jollei kerhoa l”ydy levylt„. ** ** int talleta(); ** - talletaan kerho levylle (jos siin„ on muutoksia). ** vanha kerho j„„ .bak -nimelle ** ** int paavalinta(); ** - tulostetaan p„„menu ja odotetaan valintaa sek„ suoritetaan ** valittu toimenpide. Toistetaan silmukassa kunnes valitaan ** poistuminen. ** Toistaiseksi vasta lis„„minen toimii Aku Ankalla ja ** tulostus alkeellisesti n„ytt””n ** ** */ #include #include #include #include "naytto.h" #include "ioali.h" #include "mjonotpp.h" #include "mjonot.h" //============================================================================ // Vakiota //============================================================================ static const char *TARKENNIN = ".dat"; static const char *VANHATARK = ".bak"; static const char *POIS = "q"; static const int OLET_ALKU = 19; static const int VAKANEN = 33; //============================================================================ // N„yt”n yleinen k„sittely: //============================================================================ 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 << endl << endl << endl; } //============================================================================ // N„yt”n kerhon tunteva osuus: //============================================================================ //---------------------------------------------------------------------------- int cNaytto::lue_tiedosto() /* ** Luetaan kerho levylt„. ** Ensin kysyt„„n kerhon nimi. Jos kerhoa ei ole, utellaan ** lis„tietoja ja luodaan se. ----------------------------------------------------------------------------*/ { string tied,nimi; int maksimi; do { // Kysell„„n kunnes tiedosto aukeaa tai luodaan uusi cout << endl; cout << "Anna kerhon nimi>"; lue_rivi(cin,tied); if ( tied == "" ) return ilmoitus("Tiedoston nime„ ei annettu"); laita_tarkennin(tied,TARKENNIN); if ( onko_tiedostoa(tied) ) return ilmoitus(kerho->lue_tiedostosta(tied)); cout << "Tiedostoa " << tied << " ei ole!" << endl; } while ( kylla_kysymys("Luodaanko uusi tiedosto?") == 0 ); cout << endl; cout << "Anna kerhon koko nimi >"; lue_rivi(cin,nimi); cout << "Anna kerhon maksimi koko >"; lue_rivi(cin,maksimi); return ilmoitus(kerho->luo(tied,nimi,maksimi)); } //---------------------------------------------------------------------------- int cNaytto::talleta() /* ** Jos kerhossa muutoksia, niin ** Nimet„„n vanha tiedosto .bak -nimelle ja talletetaan ** nykyinen tiedosto vanhan tilalle. ----------------------------------------------------------------------------*/ { logo(); if ( !kerho->Muutettu() ) return 0; string tied_nimi(kerho->Tiedoston_nimi()); string bak_nimi(kerho->Tiedoston_nimi()); vaihda_tarkennin(bak_nimi,VANHATARK); remove(bak_nimi); /* Vanha .BAK t„ytyy poistaa jotta rename toimii */ int vanhat_tallessa = !rename(tied_nimi,bak_nimi); if ( ilmoitus(kerho->talleta(tied_nimi)) ) return 1; cout << endl; cout << "Tiedot talletettu tiedostoon " << tied_nimi << endl; if ( vanhat_tallessa ) cout << "Vanhat tiedot tiedostossa " << bak_nimi << endl; return 0; } //---------------------------------------------------------------------------- int cNaytto::kysy_talleta() { if ( !kerho->Muutettu() ) return 0; if ( kylla_kysymys("Talletetaanko tiedot") ) return talleta(); return 0; } /****************************************************************************/ static int /* */ kysy_kentta( /* */ const char *viesti ,/* s Viesti joka tulee n„yt”lle */ string &jono /* t Jono johon kent„n vastaus luetaan. */ ) /* ** Funktiolla luetaan vastaus kentt„„n. ** ** Globaalit: POIS (jono, jolla sy”tt” katkaistaan) ** Sy”tt”: p„„tteelt„ ** Tulostus: n„ytt””n ** Kutsuu: lue_jono_oletus ----------------------------------------------------------------------------*/ { char apu[80]; int paluu; kopioi_jono(N_S(apu),jono.c_str()); paluu = lue_jono_oletus(viesti,OLET_ALKU,VAKANEN,apu,N_S(apu)); if ( paluu < OLETUS ) return 1; if ( strcmp(apu,POIS) == 0 ) return 1; poista_tyhjat(apu); jono = apu; return 0; } //---------------------------------------------------------------------------- int cNaytto::kysy_tiedot(cJasen &jasen) /* ** Kysyt„„n yhden j„senen tiedot. Mik„li kysely lopetetaan kesken, ** palautetaan 1, muutoin 0. ** 1. kysymyksest„ p„„see pois pelk„ll„ RETURNin painamisella. ----------------------------------------------------------------------------*/ { cJasen apujasen(jasen); string jono; int k,kenttia = apujasen.kenttia(); for (k=0; kJasenia() << "." << endl; cout << "Anna uusi nimi muodossa sukunimi etunimi" << endl; do { if ( kysy_tiedot(jasen) ) return; cout << "Lis„t„„nk”" << endl; jasen.tulosta(cout); } while ( kylla_kysymys("") == 0 ); if ( ilmoitus(kerho->lisaa(jasen)) ) return; } } //---------------------------------------------------------------------------- void cNaytto::etsi_jasenen_tiedot(char valinta) { otsikko(valinta,"Etsi j„senen tiedot"); ei_toimi(); } //---------------------------------------------------------------------------- void cNaytto::tulosteet(char valinta) /* ** Tulostetaan kaikki j„senet n„yt”lle. ----------------------------------------------------------------------------*/ { otsikko(valinta,"Tulosteet"); cout << "Toimii toistaiseksi vain n„yt”lle" << endl; viivarivi(78,'-'); for (int i=0; iJasenia(); i++) { const cJasen &jasen = kerho->anna(i); jasen.tulosta(cout); cout << endl; } viivarivi(78,'-'); 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 << endl << endl << endl << endl << endl << 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; } } }