Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Pieni selaus kanta

ZcMander [12.12.2004 12:08:38]

#

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;
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta