Jooh, tätä koodivinkkiä tein suunnilleen 24h. Tässä koodivinkissä ei ole tallennusta, vaikka eka meinasin, tosin se jääköön jokaisen kotitehtäväksi. Main ohjelman olisi voinut tehdä aika paljon paremmin, joten saattaa olla joillekki hankala hahmottaa. Perimmäisenä tarkoituksena mulle oli, että oppisin jotain Olio Ohjelmoinnista ja onnistuinkin siinä, patsi että tämä koodivinkki vähän paisui. Kommenteissa saatta olla kirjoitus virheitä.
#include <iostream> #include <string> #include <ncurses.h> /* Tämä huikea koodivinkkin oon tehnyt itselle lähinnä oppimis tarkoituksena. Tätä koodivinkkiä on aika paljon kommentoitu, että aloitteliakkin saa selvää, tämä on myös suurin ohjelma, mitä olen tehnyt, huikeat 501 riviä. Main ohjelma on aika huonosti toteutettu, koska oli "kiire" saada tollainen selaus valmiiksi. Tästä tuli loppuen lopuksi minusta hyvä esimerkki olio-ohjelmoinnista. Valitettavasti tämä kääntyy vai linuxsilla Ncurses kirjastolla. Saatta myös toimia PDcurses kirjastolla KIITOKSET: Päivi Hietanen - C++ ja Olio Ohjelmointi (loistava kirja, opin mm. stringgien käytön) arcata - IRC helppi, auttoin, miten palautetaan C merkkitaulukko Gwaur - GWaste kun Mureakuha on kaatunut. */ //moternia using namespace std; //maksimimäärä työssä käyviä const unsigned int max_tyontekijat = 10; //Ihminen olio, turha, mutta halusin tehdä perillisen ohjelman, opiskelun vuoksi, //mutta hyvä jos aikoo kehittää lisää luokkia class Ihminen { private: //kapselointi string etunimi; string sukunimi; string sivi; unsigned int syntyma_vuosi; public: //PROTOTYYPIT //nimen, iän ja sivin laitto funktiot void SetNimi(string etunimi,string sukunimi); void SetIka(unsigned int ika); void SetSivi(string sivi); void SetSyntymavuosi(int syntyma_vuosi); //etunimen, sukunimen, kokonimen, iän ja sivin hakeminen string GetNimi(); int GetIka(); string GetSivi(); string GetEtunimi(); string GetSukunimi(); const char *cGetEtunimi(); const char *cGetSukunimi(); const char *cGetSivi(); //tietojen näyttö void ShowTiedot(); }; //etunimen hakeminen string Ihminen::GetEtunimi() { return this->etunimi; } //sukunimen hakeminen string Ihminen::GetSukunimi() { return this->sukunimi; } //sivin hakeminen c merkkitaulukkona const char *Ihminen::cGetSivi() { return this->sivi.c_str(); } //etunimen hakeminen c merkkitaulukkona const char *Ihminen::cGetEtunimi() { return this->etunimi.c_str(); } //sukunimen hakeminen c merkki talukkona const char *Ihminen::cGetSukunimi() { return this->sukunimi.c_str(); } //sivin laitto void Ihminen::SetSivi(string sivi) { this->sivi = sivi; } //sivin haku string Ihminen::GetSivi() { return this->sivi; } //kokonimen laitto void Ihminen::SetNimi(string etunimi,string sukunimi) { //this osoittimen hurjaa käyttöä this->etunimi = etunimi; this->sukunimi = sukunimi; } //iän laitto void Ihminen::SetIka(unsigned int ika) { //vuoden vois ottaa jostain? time.h? vähän huono tälleen, 2005 koska kohta on uusivuosi this->syntyma_vuosi = 2005- ika; } //vuosiluvun laitto void Ihminen::SetSyntymavuosi(int syntyma_vuosi) { this->syntyma_vuosi = syntyma_vuosi; } //kokonimen hakeminen string Ihminen::GetNimi() { string nimi; nimi = this->etunimi + " " + this->sukunimi; return nimi; } //iän hakeminen int Ihminen::GetIka() { return 2005-this->syntyma_vuosi; } //näytetaan tavallisen tallustajan tiedot void Ihminen::ShowTiedot() { printw("Nimi: %s %s \n",this->etunimi.c_str(), this->sukunimi.c_str()); printw("Ika: %s \n",this->GetIka()); printw("Sivi: %s \n",this->sivi.c_str()); } //Periydetty luokka, julkinen periytyminen class Tyontekija : public Ihminen { private: //kapselointi string osasto; public: //PROTOTYYPIT //muodostin funktio Tyontekija(); //osaston laittaminen void SetOsasto(string osasto); //osaston hakeminen string GetOsasto(); //ylikirjoitetty Show tiedot luokka, näytetään tietoja void ShowTiedot(); }; //muodostin Tyontekija::Tyontekija() { this->SetSivi("Työllinen"); } //osaston laitto void Tyontekija::SetOsasto(string osasto) { this->osasto = osasto; } //osastonlaitto string Tyontekija::GetOsasto() { return this->osasto; } //ylikirjotetaan(tms.) ShowTiedot metodi void Tyontekija::ShowTiedot() { printw("Nimi: %s %s \n",this->cGetEtunimi(), this->cGetSukunimi()); printw("Ika: %i \n",this->GetIka()); printw("Sivi: %s \n",this->cGetSivi()); printw("Osasto: %s \n", this->osasto.c_str()); } //pääohjelma int main() { // :O kyllä, tämän ois voinut (siis koko main) tehdä paremmin //näppäimen numero int nappain = 0; //nykeisen id, tyontekijoitten selaamiseen int nykyinen = 0; //lopetetaanko ohjelma bool pois = false; //onko muokkaustila bool muokkaustila = false; //näppäinmen toinenkorvike, nimen muokkausta varten int valinta = 0; //AAH, ihanaa, muokkaus tilan c merkkijonona ja stringeinä, ikä tietenkin inttinä //uus ikä, numeroilla int uusika = 0; //uus ikä, c merkkitaulukossa, syötteen lukua varten char cuusika[2] = ""; //etunimen c merkkitaulukko char etunimi[20] = ""; //etunimi stringginä string etunimi2; //sukunimi c merkkitaulukossa char sukunimi[25] = ""; //sukunimi stringginä string sukunimi2; //osasto c merkkitauluna char osasto[20] = ""; //osasto stringginä string osasto2; //työntekijät, jostain syystä ei anna näyttää viimisiä tietoja, vaan kaatuu (selitys?) Tyontekija tyontekijat[max_tyontekijat+1]; //alustetaan ruutu initscr(); //nuolinäppäimet päälle, ei saa olla numlock päällä keypad(stdscr, TRUE); //muutama malli työntekijä tyontekijat[0].SetNimi("Pertti","Isojärvi"); tyontekijat[0].SetIka(20); tyontekijat[0].SetOsasto("ATK-vastaava"); tyontekijat[1].SetNimi("Pasi","Järvinen"); tyontekijat[1].SetSyntymavuosi(1924); tyontekijat[1].SetOsasto("Kehittäjä"); //pääsilmukka while (pois==false) { //jos ei ole muokkaus tila päällä if (muokkaustila == false) { //tyhjennetään näyttö clear(); //printw("Nykyinen id: %i \n", nykyinen); //Virheen korjausta varten //näytetään nykyisten tiedot tyontekijat[nykyinen].ShowTiedot(); //näytetään ohjeet printw("\nYlös: Pois \n"); printw("Alas: Muokkaustila \n"); printw("Oikea: Seuraava \n"); printw("Vasen: Edellinen \n"); //päivitetään ruutu refresh(); //odotetaan näppäin painallusta nappain = getch(); switch (nappain) { case KEY_UP: //jos oli ylös, pois pois = true; break; case KEY_LEFT: //jos oli vasemmalle, menne taaksepäin if (nykyinen == 0) //nollatarkistus, jos on nolla niin jäädään nollaan nykyinen = 0; else nykyinen--; break; case KEY_RIGHT: //jos oli oikealle, mennään eteempäin if (nykyinen == max_tyontekijat) //tarkistetaan ettei mennä yli nykyinen = max_tyontekijat; else nykyinen++; break; case KEY_DOWN: //jos oli alas, niin laitetaan muokkaus tila päälle muokkaustila = true; }//switch } else//muokkaus tila { //jos muokkaus tila on päällä //tyhjennetään ruutu clear(); //näytetään nykyiset tiedot tyontekijat[nykyinen].ShowTiedot(); //ohjeet printw("\nYlös: Pois\n"); printw("Alas: Muokkaa ikää\n"); printw("Oikea: Muokkaa nimeä\n"); printw("Vasen: Muokkaa osastoa\n"); //päivitys refresh(); //odotetaan näppäin painallusta nappain = getch(); //tulkitaan näppäin... switch(nappain) { case KEY_UP: //jos on ylöspäin, mennään pois muokkaustilasta muokkaustila = false; break; case KEY_DOWN: //jos alaspäin, muokataan ikää //tyhjennetään näyttö clear(); //näytetään nykyisen tiedot tyontekijat[nykyinen].ShowTiedot(); //rivin vaihto printw("\n"); //ja kirjoitetaan kysymys printw("Kirjoita uusi ikä: "); //odotetaan merkkijonon kirjoittamista getstr(cuusika); //muutetaan ikä numeroiksi uusika = atoi(cuusika); //jos annettu oli kirjain niin numeroksi tulee 0 if (uusika != 0) { //jos ei ollut nolla niin laitetaan uusi ikä tyontekijat[nykyinen].SetIka(uusika); } else { //jos oli, niin näytetään virhe ilmo printw("\nVIRHE: Antamasi merkki ei ollut numero tai numero oli 0"); //odotetaan näppäin painallusta, //ettei heti virhe ilmo lähe näkyvistä getch(); } break; case KEY_RIGHT: //Muokataan nimeä //tyhjennetään näyttö clear(); //näytetään nykyisen tiedot tyontekijat[nykyinen].ShowTiedot(); //rivinvaihto printw("\n"); //ohjeet printw("Ylös: Pois\n"); printw("Alas: Muokkaa koko nimeä\n"); printw("Oikea: Muokkaa sukunimeä\n"); printw("Vasen: Muokkaa etunimeä\n"); //päivitetään ruutu refresh(); //odotetaan näppäinpainallusta valinta = getch(); switch(valinta) { case KEY_UP: //jos on ylös, niin ei muokatakkaan nimeä break; case KEY_LEFT: //jos oli vasen, muokataan etunimeä //tyhjennetään näyttö clear(); //näytetään nykyisen tiedot tyontekijat[nykyinen].ShowTiedot(); //kirjoitetaan kysymys printw("\nKirjoita etunimi: "); //päivitetään ruutu refresh(); //otetaan etunimi getstr(etunimi); //muutetaan etunimi stringiksi etunimi2 = etunimi; //jos stringgi ei ole tyhjä if (etunimi2.empty() == false) { //laitetaan etunimi tyontekijat[nykyinen].SetNimi(etunimi2, tyontekijat[nykyinen].GetSukunimi()); } break; case KEY_DOWN: //Muokataan kokonimeä //tyhjennetään näyttö clear(); //näytetään nykyisen tiedot tyontekijat[nykyinen].ShowTiedot(); //etunimen kysymys printw("\nKirjoita etunimi: "); //päivitetään ruutu refresh(); //itse merkkijonon ottaminen näppiksestä getstr(etunimi); //muutetaan stringiksi etunimi2 = etunimi; //sukunimen kysymys printw("\nKirjoita sukunimi: "); //päivitetään ruutu refresh(); //itse merkkijonon ottaminen getstr(sukunimi); //muutetaan stringiksi sukunimi2 = sukunimi; //jos kumpikaan ei ole tyhjiä if (etunimi2.empty() == false and sukunimi2.empty() == false) { //niin muokataan kumpiaki nimiä tyontekijat[nykyinen].SetNimi(etunimi2,sukunimi2); } break; case KEY_RIGHT: //muokataan sukunimeä //tyhjennetään näyttö clear(); //näytetään nykyisen tiedot tyontekijat[nykyinen].ShowTiedot(); //kysytään sukunimeä printw("\nKirjoita sukunimi: "); //päivitetään, että tulee tulostukset näkyviin. refresh(); //otetaan sukunimi näppäimistä syötteenä getstr(sukunimi); //muutetaan stringgiksi sukunimi2 = sukunimi; //jos ei ole tyhjä if (etunimi2.empty() == false) { //niin muutetaan sukunimi tyontekijat[nykyinen].SetNimi(tyontekijat[nykyinen].GetEtunimi(), sukunimi2); } } //päässään vihdoin pois nimen muokkauksesta break; case KEY_LEFT: //tyhjennetään ruutu clear(); //näytetään ruutu tyontekijat[nykyinen].ShowTiedot(); //kirjoitetaan kysymys printw("\nKirjoita osasto: "); //päivitetään, että kirjoitukset tulee näkyviin refresh(); //otetaan merkkijono getstr(osasto); //muutetaan stringgiksi osasto2 = osasto; //jos ei ole tyhjä if (osasto2.empty() == false) { //niin laitetaan osasto tyontekijat[nykyinen].SetOsasto(osasto2); } break; }//switch }//if, muokkaustila }//while //lopeteaan Ncurses tila endwin(); //pois, muttei varmaan oikeaoppisesti? return 0; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.