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.