Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

Esimerkit

Anchor
esim1
esim1

Esimerkki 1:

Aiheet: Luokka, olion luonti sekä jäsenmuuttujien ja metodien käsittely.

Tietokone.h:

Code Block

class Tietokone
{
private:
    int ProsessoriLkm;
    int Muisti;

public:
    void TulostaTiedot();
    void AsetaProsessoriLkm(int);
};

Tietokone.cpp:

Code Block

#include <stdio.h>
#include "Tietokone.h"

void Tietokone::TulostaTiedot()
{
    printf("Tietokoneessa on %d prosessoria ja %d muistia\n", ProsessoriLkm, Muisti);
}

void Tietokone::AsetaProsessoriLkm(int p)
{
    ProsessoriLkm = p;
}

main.cpp:

Code Block

#include "Tietokone.h"

int main()
{
    Tietokone pc; // Tietokone = luokka, pc = olio

    pc.AsetaProsessoriLkm(2);

    pc.TulostaTiedot();
}

Harjoitus 1:

Aiheet: Luokka, olion luonti sekä jäsenmuuttujien ja metodien käsittely.

Elain.h:

Code Block

class CElain
{
private:   // privaatti, vain luokan sisällä voidaan muuttaa
    char m_Nimi[100];      // Eläimen nimi
    float m_Massa;         // Eläimen massa, paino
    void TulostaNimi();    // Tulostaa ruudulle eläimen nimen
    void TulostaMassa();   // Tulostaa ruudulle eläimen massan

public:   // julkinen, kaikki voi kutsua
    CElain(char Nimi[], float Massa);   // Muodostin, parametreina Nimi ja Massa
    bool AsetaNimi(char Nimi[]);        // Asettaa eläimen nimen
    bool AsetaMassa(float Massa);       // Asettaa eläimen massan
    void Tulosta();
};

Elain.cpp:

Code Block

#include "Elain.h"    // CElain-luokan headeri

CElain::CElain(char Nimi[], float Massa)
{
    strcpy(m_Nimi, Nimi);&nbsp;  // Kopioidaan nimi luokkaan
    m_Massa = Massa
Wiki Markup
h3. Esimerkit

Harjoitus 1:

Aiheet: Luokka, olion  luonti sekä jäsenmuuttujien ja  metodien käsittely.

Elain.h:
class CElain
\{
private:   // privaatti, vain luokan sisällä voidaan muuttaa
&nbsp;&nbsp; &nbsp;char m_Nimi\[100\]; &nbsp; &nbsp;  // Eläimen nimi
&nbsp;&nbsp; &nbsp;float m_Massa; &nbsp; &nbsp; &nbsp;   // Eläimen massa, paino

&nbsp;&nbsp; &nbsp;void TulostaNimi();   &nbsp;// Tulostaa ruudulle eläimen nimen
&nbsp;&nbsp; &nbsp;void TulostaMassa();   // Tulostaa ruudulle eläimen massan

public:   // julkinen, kaikki voi kutsua
&nbsp;&nbsp; &nbsp;CElain(char Nimi\[\], float Massa);   // Muodostin, parametreina Nimi ja Massa
&nbsp;&nbsp; &nbsp;bool AsetaNimi(char Nimi\[\]);   &nbsp; &nbsp; &nbsp;// Asettaa eläimen nimen
&nbsp;&nbsp; &nbsp;bool AsetaMassa(float Massa); &nbsp; &nbsp;   // Asettaa eläimen massan
&nbsp;&nbsp;&nbsp; void Tulosta();
};

Elain.cpp:
\#include "stdafx.h"   // Ei tarvita, jos&nbsp;tekee Empty Project:in
\#include "Elain.h"&nbsp;   // CElain-luokan headeri

CElain::CElain(char Nimi\[\], float Massa)
\{
&nbsp;&nbsp; &nbsp;strcpy(m_Nimi, Nimi);&nbsp;  // Kopioidaan nimi luokkaan
&nbsp;&nbsp; &nbsp;m_Massa = Massa;
}

bool CElain::AsetaNimi(char Nimi\[\])
\{
&nbsp;&nbsp; &nbsp;strcpy(m_Nimi, Nimi);   // Kopioidaan nimi luokkaan
&nbsp;&nbsp; &nbsp;return true;
}

void CElain::TulostaNimi()
\{
&nbsp;&nbsp; &nbsp;printf("Eläimen nimi on %s\n", m_Nimi);
}

bool CElain::AsetaMassaAsetaNimi(floatchar MassaNimi[])
\{
&nbsp;&nbsp; &nbsp;m_Massa = Massa;
&nbsp;&nbsp; &nbsp;    strcpy(m_Nimi, Nimi);   // Kopioidaan nimi luokkaan
    return true;
}

void CElain::TulostaMassaTulostaNimi()
\{
&nbsp;&nbsp; &nbsp;    printf("Eläimen massanimi on %.2f kiloa%s\n",&nbsp; m_MassaNimi);
}

voidbool CElain::TulostaAsetaMassa(float Massa)
\{
&nbsp;&nbsp; &nbsp;    m_Massa = Massa;
    return true;
}

void CElain::TulostaMassa()
{
    printf("Eläimen massa on %.2f kiloa\n", m_Massa);
}

void CElain::Tulosta()
{
    TulostaNimi();
&nbsp;&nbsp;&nbsp;    TulostaMassa();
}

main.cpp:

Code Block


\#include "stdafx.h"
\#include "Elain.h"

int&nbsp; main(int argc, char\* argv\[\])
\{
&nbsp;&nbsp; &nbsp;    CElain kissa("miuku", 2.4);   // Luodaan olio CElain luokasta ja annetaan nimi ja massa parametreina

&nbsp;&nbsp; &nbsp;    kissa.Tulosta();

&nbsp;&nbsp; &nbsp;    return 0;
}

Harjoitus 

Anchor
harj2
harj2

Harjoitus 2:

...

Aiheet:

...

Periytyminen.

...

Elain.h:

Code Block

#include <stdio.h>
\#include <string.h>

class CElain
\{
private: // privaatti, vain luokan sisällä voidaan muuttaa
&nbsp;&nbsp;&nbsp;    char m_Nimi\[100\];    // Eläimen nimi
&nbsp;&nbsp;&nbsp;    float m_Massa;       // Eläimen massa, paino

&nbsp;&nbsp;&nbsp;    void TulostaNimi();  // Tulostaa ruudulle eläimen nimen
&nbsp;&nbsp;&nbsp;    void TulostaMassa(); // Tulostaa ruudulle eläimen massan

public: // julkinen, kaikki voi kutsua
&nbsp;&nbsp;&nbsp;    bool AsetaNimi(char Nimi\[\]);  // Asettaa eläimen nimen
&nbsp;&nbsp;&nbsp;    bool AsetaMassa(float Massa); // Asettaa eläimen massan
&nbsp;&nbsp;&nbsp;    void Tulosta();
};

Elain.cpp:

Code Block

#include "Elain.h"     //  CElain-luokan headeri

bool CElain::AsetaNimi(char Nimi\[\])
\{
&nbsp;&nbsp;&nbsp;    strcpy(m_Nimi, Nimi); // Kopioidaan nimi luokkaan
&nbsp;&nbsp;&nbsp; return     return true;
}

void CElain::TulostaNimi()
\{
&nbsp;&nbsp;&nbsp;    printf("Eläimen nimi on %s\n", m_Nimi);
}

bool CElain::AsetaMassa(float Massa)
\{
&nbsp;&nbsp;&nbsp;    m_Massa = Massa;
&nbsp;&nbsp;&nbsp;    return true;
}

void CElain::TulostaMassa()
\{
&nbsp;&nbsp;&nbsp;    printf("Eläimen massa on %.2f kiloa\n", m_Massa);
}

void CElain::Tulosta()
\{
&nbsp;&nbsp;&nbsp;    TulostaNimi();
&nbsp;&nbsp;&nbsp;    TulostaMassa();
}

Kissa.h:

Code Block

#include "Elain.h"

class CKissa :
&nbsp;&nbsp;&nbsp;    public CElain
\{
public:
&nbsp;&nbsp;&nbsp;    CKissa(void);
&nbsp;&nbsp;&nbsp; \    ~CKissa(void);
&nbsp;&nbsp;&nbsp;    void Kehraa();
};

Kissa.cpp:

Code Block

#include "Kissa.h"

CKissa::CKissa(void)
\{
}

CKissa::~CKissa(void)
\{
}

void CKissa::Kehraa()
\{
&nbsp;&nbsp;&nbsp;    printf("Kehraa...");
}

main.cpp:

Code Block

#include <stdio.h>
\#include <conio.h>
\#include "Kissa.h"

int main()
\{
&nbsp;&nbsp;&nbsp;    CKissa kissa;

&nbsp;&nbsp;&nbsp;    kissa.AsetaNimi("Miuku");
&nbsp;&nbsp;&nbsp;     kissa.AsetaMassa(1.2);
&nbsp;&nbsp;&nbsp;    kissa.Tulosta();
&nbsp;&nbsp;&nbsp;    kissa.Kehraa();

&nbsp;&nbsp;&nbsp;    getch();

&nbsp;&nbsp;&nbsp;    return 0;
}

Anchor
harj3
harj3

Harjoitus

...

3:

...

Aiheet:

...

Tulostaminen

...

cin ja cout

...

ja

...

käyttäjän

...

syötteen

...

lukeminen

...

cin

...

ja cout -olioilla.

...

main.cpp:

Code Block

#include <iostream>
\#include <string>

using namespace std;

int main()
\{
&nbsp;&nbsp;&nbsp;    int Luku1, Luku2;
&nbsp;&nbsp;&nbsp;    char Operaattori;
&nbsp;&nbsp;&nbsp;    char Nimi\[100\];

&nbsp;&nbsp;&nbsp;    cout << "Anna nimesi: ";
&nbsp;&nbsp;&nbsp;    cin >> Nimi;

&nbsp;&nbsp;&nbsp;    cout << "Anna 1. luku: ";
&nbsp;&nbsp;&nbsp;    cin >> Luku1;

&nbsp;&nbsp;&nbsp;    cout << "Anna 2. luku: ";
&nbsp;&nbsp;&nbsp;    cin >> Luku2;

&nbsp;&nbsp;&nbsp;    cout << "Anna operaattori: + - * / ";
&nbsp;&nbsp;&nbsp;    cin >> Operaattori;

&nbsp;&nbsp;&nbsp;    cout << "Hei " << Nimi << ", annoit laskutoimituksen: " <<  Luku1 << " " << Operaattori << " " << Luku2 << endl;

&nbsp;&nbsp;&nbsp;    return 0;
}

Anchor
harj4
harj4

Harjoitus

...

4:

...

Aiheet:

...

Const-määritteet.

...

main.cpp:

Code Block


\#include "Luokka.h"

int main()
\{
&nbsp;&nbsp;&nbsp;    const CLuokka luokka;
&nbsp;&nbsp;&nbsp;    luokka.YmpyranKeha(1.2467);

&nbsp;&nbsp;&nbsp;     CLuokka luokka2;
&nbsp;&nbsp;&nbsp;    luokka2.YmpyranKeha(283947);
&nbsp;&nbsp;&nbsp;    luokka2.TeeJotain();
}

Luokka.h:

Code Block

class CLuokka
\{
private:
&nbsp;&nbsp;&nbsp;    const float m_Pii; // const tarkoittaa vakiota. Arvo ei voi  muuttua ohjelman ajon aikana
&nbsp;&nbsp;&nbsp;    int m_Luku;

public:
&nbsp;&nbsp;&nbsp;    CLuokka();
&nbsp;&nbsp;&nbsp;    float YmpyranKeha(const float r) const; // Parametri on const,  arvo ei voi muuttua funktion sisällä
&nbsp;&nbsp;&nbsp; void     void TeeJotain();
};

Luokka.cpp:

Code Block

\#include "Luokka.h"

CLuokka::CLuokka() :
&nbsp;&nbsp;&nbsp;    m_Pii(3.14)
\{
&nbsp;&nbsp;&nbsp;    m_Luku = 0;
}

float CLuokka::YmpyranKeha(const float r) const
\{
&nbsp;&nbsp;&nbsp;    return&nbsp;2*m_Pii*r;
}

void CLuokka::TeeJotain()
\{
&nbsp;&nbsp;&nbsp;    m_Luku = 2;
}

Harjoitus

...

5:

...

Aiheet:

...

Funktioiden

...

ylikuormitus.

...

main.cpp:

...

#include

...

<cstdio>

...


#include

...

<cstring>

Wiki Markup
class CElain
\{
private: // saatavissa vain luokan metodeilla
&nbsp;&nbsp;&nbsp; char m_Nimi\[100\];
&nbsp;&nbsp;&nbsp; float m_Massa;

...

Wiki Markup
public: // voidaan käyttää luokan ulkopuolelta
&nbsp;&nbsp;&nbsp; bool AsetaTiedot(char Nimi\[\], float Massa); // 'Alkuperäinen  metodi'
&nbsp;&nbsp;&nbsp; bool AsetaTiedot(char Nimi\[\]); // 1. Ylikirjoitettu metodi
&nbsp;&nbsp;&nbsp; bool AsetaTiedot(float Massa); // 2. ylikirjoitettu metodi
};

...

Wiki Markup
bool CElain::AsetaTiedot(char Nimi\[\], float Massa)
\{
&nbsp;&nbsp;&nbsp; printf("AsetaTiedot(char\[\], float)\n");
&nbsp;&nbsp;&nbsp; AsetaTiedot(Nimi);
&nbsp;&nbsp;&nbsp; AsetaTiedot(Massa);
&nbsp;&nbsp;&nbsp; return true;
}

...

Wiki Markup
bool CElain::AsetaTiedot(char Nimi\[\])
\{
&nbsp;&nbsp;&nbsp; printf("AsetaTiedot(char\[\])\n");
&nbsp;&nbsp;&nbsp; strcpy(m_Nimi, Nimi);
&nbsp;&nbsp;&nbsp; return true;
}

...

bool

...

CElain::AsetaTiedot(float

...

Massa)

...


{
    printf("AsetaTiedot(float)\n");

...


    m_Massa

...

=

...

Massa;

...


    return true;

...


}

...

int

...

main()

...


{
    CElain kissa;

Wiki Markup
&nbsp;&nbsp;&nbsp;

...

 kissa.AsetaTiedot("Miuku", 2.4); // kutsuu metodia  AsetaTiedot(char Nimi\[\], float Massa)
&nbsp;&nbsp;&nbsp; kissa.AsetaTiedot("Mauku");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // kutsuu metodia  AsetaTiedot(char Nimi\[\])
&nbsp;&nbsp;&nbsp; kissa.AsetaTiedot(2.4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // kutsuu metodia  AsetaTiedot(float Massa)
}

...

Harjoitus

...

6,

...

7,

...

8:

...

Aihe:

...

osoittimet

...

.

...


float-tyyppisen

...

muuttujan

...

tulostaminen

...

osoittimen

...

avulla.#include

...

<iostream>

...

using

...

namespace

...

std;

...

int

...

main()

...


{
    float a = 3.1475;

...


    float b = 0.001;

...


    float* p;

    p = &a;
    cout << "*p = " << (*p)

...

<<

...

endl;

...

    p = &b;
    cout << "*p = " << (*p)

...

<<

...

endl;

...


}

...


Merkkijonon

...

tulostaminen

...

osoittimien

...

avulla.

...


1.

...

tapa

...

on

...

'normaali'

...

merkkijonon

...

tulostaminen.

...


2.

...

tapa

...

tulostaa

...

merkin

...

kerrallaan

...

hakasulkujen

...

avulla.

...


3.

...

tapa

...

tulostaa

...

merkkijonon

...

osoitinta

...

kasvattamalla.

...


#include

...

<iostream>

...

using

...

namespace

...

std;

...

Wiki Markup
int main()
\{
&nbsp;&nbsp;&nbsp; char mjono\[\]="Tämä on merkkijono";

...

    //

...

1.

...

tapa

...

tulostaa

...

merkkijono
    cout << "mjono = " << mjono << endl;

Wiki Markup
&nbsp;&nbsp;&nbsp; // 2. tapa tulostaa merkkijono
&nbsp;&nbsp;&nbsp; cout << "mjono = ";
&nbsp;&nbsp;&nbsp; for (int i=0; i<strlen(mjono); i++)
\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout << mjono\[i\]; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; cout << endl;
&nbsp;&nbsp;&nbsp; // 3. tapa tulostaa merkkijono
&nbsp;&nbsp;&nbsp; cout << "mjono = ";
&nbsp;&nbsp;&nbsp; for (char\* p = mjono; p < mjono+strlen(mjono); p++)
\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout << (*p); &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; cout << endl;
}
Osoitin funktion parametrina.
f():ssä tehdyt muutokset eivät näy main():iin.
f2():ssa tehdyt taas näkyvät.
\#include <iostream>
using namespace std;

...

void

...

f(int

...

a)

...


{
    a = -7;

...


}

...

void

...

f2(int

...

*

...

p)

...


{
    *p

...

=

...

-7;

...


}

...

int

...

main()

...


{
    int muut = 5;

    f(muut);

...


    cout << "muut

...

=

...

"

...

<<

...

muut

...

<<

...

endl;

...

    f2(&muut);

...


    cout << "muut

...

=

...

"

...

<<

...

muut

...

<<

...

endl;

...


}

...


Kertaustehtävä

...

1

...

-Tehkää

...

luokka,

...

jossa

...

on

...

pari

...

muuttujaa,

...

asetus

...

-

...

ja

...

tulostusfunktiot.

...


-Luokaa

...

luokasta

...

olio

...

main():ssa,

...

sekä

...

vakio-osoitin,

...

jonka

...

pistätte

...

osoittamaan

...

luotuun

...

olioon.

...


-Kutsukaa

...

luokan

...

funktioita

...

osoittimen

...

kautta.

...

Kertaustehtävä

...

2

...

-Luokaa

...

luokka,

...

jossa

...

on

...

vakio

...

jäsenmuuttuja.

...


-Alustakaa

...

jäsenmuuttuja

...

muodostimen

...

initialisointilistassa,

...

mutta

...

tuokaa

...

alustettava

...

arvo

...

muodostimen

...

parametrina.

...


-Varmistakaa

...

että

...

annettu

...

arvo

...

tosiaan

...

välittyy

...

vakiomuuttujalle.

...

Kertaustehtävä

...

3

...

-Luokaa

...

luokka,

...

joka

...

koostuu

...

toisesta

...

luokasta.

...


-Tehkää

...

molempiin

...

luokkiin

...

parametrillinen

...

muodostin.

...


-Viekää

...

main():sta

...

arvo

...

koostavalle

...

luokalle,

...

joka

...

puolestaan

...

välitetään

...

koostettavalle

...

luokalle.

...


-Huom.

...

koostettavan

...

luokan

...

muodostinta

...

pitää

...

kutsua

...

koostavan

...

luokan

...

initialisointilistassa

...

!

...

Kertaustehtävä

...

4

...

-Luokaa

...

kaksi

...

luokkaa

...

joista

...

toinen

...

perii

...

toisen.

...


-Luokaa

...

vanhempaan

...

vakio

...

aito

...

virtuaalifunktio.

...


-Toteuttakaa

...

perillisessä

...

tämä

...

funktio.

...


-Luokaa

...

main():ssa

...

olio

...

perillisestä.

...


-Luokaa

...

main():ssa

...

vanhempi

...

luokan

...

tyyppinen

...

vakio-osoitin,

...

jonka

...

kautta

...

kutsutte

...

virtuaalifunktiota.

...

...

Linkitetty lista (Linked list)

Linkitetty lista on yksi perustietorakenteista. Se koostuu joukosta solmuja, joista jokainen koostuu linkitettävästä tiedosta ja viitteistä seuraavaan (ja mahdollisesti edelliseen) solmuun listassa. Yhden viitteen listaa kutsutaan  yksisuuntaiseksi ja jälkimmäistä kaksisuuntaiseksi. Haluttaessa löytää tietty solmu, tulee aloittaa listan alusta, juurisolmusta (root node), ja käydä listaa läpi, kunnes haluttu solmu on löytynyt. Linkitetyn listan etuna on rajoittamaton kasvu (ei staattisesti määriteltyä maksimikokoa) ja O(1)-tason

...

lisäys

...

ja

...

poisto-operaatiot

...

(kun

...

käytetään

...

kaksisuuntaista

...

linkitettyä

...

listaa).

...

Indeksointi

...

on

...

O

...

(thumbs down) .

Esimerkki 1.

...

Solmun

...

koodirunko.

...


class

...

CSolmu

...

{

...

public:

...

    CSolmu* Seuraava();

...

    void AsetaSeuraava();

...

protected:

...

    CSolmu* m_Seuraava;

...

  //

...

Osoitin

...

seuraavaan

...

solmuun.

...

    CSolmu* m_Edellinen;

...

//

...

Osoitin

...

edelliseen

...

solmuun.

...

    

    CData* m_Data;

...

      //

...

Osoitin

...

listan

...

'dataan'

...

eli

...

siihen

...

mitä

...

listaan

...

tallennetaan.

...

}

...

;

...

Varoitus:

...

Koodit

...

toimivat

...

vain

...

Windows-ympäristössä

...

!

...


//

...

Solmu.h:

...

interface

...

for

...

the

...

Solmu

...

class.

...


//

...

Solmu-luokka

...

huolehtii

...

tiedon

...

järjestyksestä

...


//

...

sekä

...

tiedon

...

hausta

...

tiedostosta

...

ja

...

talletuksesta

...

tiedostoon

...


//////////////////////////////////////////////////////////////////////

...


#include

...

"Tyontekija.h"

...


#ifndef

...

h_Solmu

...


#define

...

h_Solmu

...

class

...

CSolmu

...

{

...

public:

...

    int HaeTiedostosta();

   void Talleta();           // tiedon talletus levylle

   void Tulosta();           // tulostus ruudulle

   void Lisaa(CSolmu*);      // solmun lisäys oikeaan kohtaan

Wiki Markup
&nbsp;&nbsp; void 

...

Poista(char Nimi\[\]); &nbsp;

...

&nbsp;

...

&nbsp;

...

   CTyontekija* AnnaTyontekija() const;

   CSolmu* AnnaSeuraava() const;

   void AsetaSeuraava(CSolmu*);

   CSolmu(CTyontekija*);

  ~CSolmu(); private:

   CSolmu* m_pSeuraava;

   CTyontekija* m_pTyontekija;

};
#endif
Lähdetiedosto solmulle on seuraava: // Solmu.cpp: implementation of the Solmu class.
//
//////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include "Tyontekija.h"
#include "Solmu.h"
void Menu(void);
int Debug=1;

// CSolmun muodostin
CSolmu::CSolmu(CTyontekija* Tt)
{     m_pTyontekija=Tt;     m_pSeuraava=NULL;

}

// CSolmun tuhoajafunktio
CSolmu::~CSolmu()
{     printf("\nPoistetaan tyontekija");

    getch();

    delete m_pTyontekija;

    m_pTyontekija=0;

    printf("\nAion poistaa solmun");   

  //delete m_pSeuraava;     //m_pSeuraava=0;

}

// Laitetaan seuraavaksi solmuksi listaan

Wiki Markup
void CSolmu::AsetaSeuraava(CSolmu\* solmu)
\{ &nbsp;&nbsp;&nbsp; m_pSeuraava=solmu; }
CSolmu\* CSolmu::AnnaSeuraava() const
\{ &nbsp;&nbsp;&nbsp; 

...

return m_pSeuraava; }
CTyontekija\* CSolmu::AnnaTyontekija() const
\{ &nbsp;&nbsp;&nbsp; return m_pTyontekija; }
// Uuden solmun lisäys listaan
void CSolmu::Lisaa(CSolmu\* UusiSolmu)
\{
&nbsp;&nbsp;&nbsp; char UusiNimi\[100\];
&nbsp;&nbsp;&nbsp; char\* pUusiNimi;
&nbsp;&nbsp;&

...

nbsp; char TamanNimi\[100\];
&nbsp;&nbsp;&nbsp; 

...

char\* pTamanNimi;
&nbsp;&nbsp;&nbsp;

...

 

...

char 

...

SeuraavanNimi\[100\]

...

;

...

&nbsp;&nbsp;&nbsp; char

...

\* pSeuraavanNimi;
&nbsp;&nbsp;&nbsp;

...

 char Nimi\[100\];
&nbsp;&nbsp;&nbsp; if (\!m_pSeuraava) \{
&nbsp;

...

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;

...

 

...

m_pSeuraava

...

=UusiSolmu;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if

...

 (

...

Debug==1)
\{printf("\nLaitan viimeideksi %s",  m_pSeuraava->AnnaTyontekija()->KysyNimi(

...

Nimi))

...

;}
&nbsp;&nbsp;&nbsp; }

else {
        pSeuraavanNimi=m_pSeuraava->AnnaTyontekija()->KysyNimi(SeuraavanNimi);
        pUusiNimi=UusiSolmu->AnnaTyontekija()->KysyNimi(UusiNimi);
        pTamanNimi=m_pTyontekija->KysyNimi(TamanNimi); // Tarkistetaanko, sopiiko solmu nykyisen ja seuraavan väliin
        if (strcmp(pUusiNimi,pTamanNimi)>0 && strcmp(pSeuraavanNimi,pUusiNimi)>0)
{             UusiSolmu->AsetaSeuraava(m_pSeuraava);

            m_pSeuraava=UusiSolmu;

            if (Debug==1)

{                 printf("\nTama %s Uusi %s Seuraava %s",

                pTamanNimi,pUusiNimi,pSeuraavanNimi);             

Wiki Markup
}
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 

...

} else
\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp

...

;

...

 

...

m_pSeuraava

...

->Lisaa(UusiSolmu); 

...

 

...

//rekursiivinen 

...

kutsu 

...

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }
}
void 

...

CSolmu::Poista(char Nimi\[\])
\{ &nbsp; char seNimi\[100\];

    CSolmu* pTemp;

    CSolmu* pTemp2;

    if (m_pSeuraava)

{         if (strcmp(Nimi,m_pSeuraava->AnnaTyontekija()>KysyNimi(seNimi))==0)
{             printf("Loytyi");
            getch();
            pTemp=m_pSeuraava;
            pTemp2=m_pSeuraava->m_pSeuraava;
            if (Debug==1)
{ printf("\n%s",pTemp>AnnaTyontekija()>KysyNimi(seNimi));// Tarkistetaan onko poistettavaa seuraava olemassa
if (pTemp2)                    
printf("\n%s",pTemp2->AnnaTyontekija()->KysyNimi(seNimi));
                }
                delete m_pSeuraava;
                if (pTemp2)
{m_pSeuraava=pTemp2; //hypätään yli

                }
else
{m_pSeuraava=0;

                }

return;
                }
        if (m_pSeuraava)
{m_pSeuraava->Poista(Nimi);

...

   

...

   

...

}
    }

else
{printf("\nNimea

...

ei

...

loydy

...

tietokannasta

...

Paina

...

enter");

...

getch();

...

Wiki Markup
&nbsp;&nbsp;&nbsp; }
}
// Solmun tulostus näytölle
void CSolmu::Tulosta()
\

...

{ &nbsp;&nbsp;&nbsp; char Nimi\[100\];

...

   

...

if

...

(m_pTyontekija->KysyNimi(Nimi)

...

>

...

0)

...

{printf("\nTyontekija

...

%s",

...

m_pTyontekija->KysyNimi(Nimi));

...

   

...

}

    if (m_pSeuraava)

...


{m_pSeuraava->Tulosta();

...

//

...

Rekursiivinen

...

kutsu

...

   

...

}

...


}

...


/**********************************************************

...

*

...


Tietokannan

...

talletus

...

tiedostoon

...


************************************************************/

...


void

...

CSolmu::Talleta()

...


{

...

   

...

FILE

...

*

...

pTiedosto;

...

   

...

int

...

iLukum;

...

   

...

CSolmu *pTemp=0;

Wiki Markup
&nbsp;&nbsp;&nbsp; char SeuraavanNimi\[100\];

...

   

...

char

...

*

...

pSeuraavanNimi;

...

   

...

pTemp=this;

...

    pTiedosto=fopen("Tiedot.oma","wb");

...

   

...

if

...

(pTiedosto==NULL)

...

{printf("\nTiedosto

...

ei

...

aukea");

...

   

...

   

...

getch();

...

   

...

}
    do
{         if (pTemp->m_pSeuraava)

...

{

...

   

...

   

...

   

...

iLukum=fwrite(pTemp->m_pSeuraava->m_pTyontekija,

...

sizeof(CTyontekija),1,pTiedosto);

...

          

...

if(Debug)

...

{

...

   

...

   

...

   

...

   

...

pSeuraavanNimi=pTemp->m_pSeuraava->AnnaTyontekija()->KysyNimi(SeuraavanNimi);

...

           

...

   

...

printf("\nTalletettava

...

%s",pSeuraavanNimi)

...

;    

        }
        }
        // Siirrytään tietokannassa seuraavaan kohtaan
        pTemp=pTemp->m_pSeuraava;

...


    }

while(pTemp);

...


    fclose(pTiedosto);

...


}

...


/*******************************************************

...

*

...


Tietokannan

...

haku

...

tiedostosta

...


**********************************************************/

...


int

...

CSolmu::HaeTiedostosta()

...


{

...

   

...

FILE

...

*

...

pTiedosto;

...

 

...

 //

...

Esitellään

...

osoitin

...

tiedostoon

...

   

...

CSolmu

...

*

...

pSolmu=0;

...

   

...

int

...

iLukum;

...

   

...

CTyontekija

...

*

...

pTemp;

...

//

...

pointteri

...

tilavaraukselle

...

   

...

CTyontekija

...

Temp;

...

 

...

//

...

tilapäisvarasto

...

tiedostohaulle    

    //

...

Avataan

...

tiedosto

...

    pTiedosto=fopen("Tiedot.oma","rb");

...

    if

...

(pTiedosto==NULL)

...

{

...

   

...

   

...

printf("\nTiedosto

...

ei

...

aukea");

...

   

...

   

...

getch();

...

   

...

   

...

return

...

0;

...

   

...

}
    do
iLukum=fread(&Temp,

...

sizeof(CTyontekija),1,pTiedosto);

...

// luetaan tiedostoa yksi työntekijä kerrallaan muuttujaan Temp       

        if (iLukum)

...

{

...

//

...

onnistuiko

...

luku

...

tiedostosta

...

   

...

   

...

   

pTemp=new CTyontekija(); //

...

varataan

...

työntekijälle

...

tila

...

keosta

...

   

...

   

...

          

...

  

*pTemp=

...

Temp;   //

...

*:llä

...

haetaan

...

osoitteessa

...

pTemp

...

oleva

...

muuttuja

...

ja

...

talletetaan

...

siihen

...

tiedostosta

...

haettu

...

tieto

...

   

...

   

...

            

pSolmu=new

...

CSolmu

...

(pTemp);

...

   // Varataan solmulle tilaa                        

this->Lisaa(pSolmu);

...

   // lisätään solmu tietokantaan                    

}
    } while(iLukum);

...

//

...

luetaan

...

niin

...

kauan,

...

kun

...

löytyy
    fclose(pTiedosto);

...


    return 1;

...


}

...


Työntekijälle

...

yksinkertainen

...

luokka:

...


//

...

Tyontekija.h:

...

interface

...

for

...

the

...

CTyontekija

...

class.

...


//

...


#ifndef

...

h_Tyontekija

...


#define

...

h_Tyontekija

...


class

...

CTyontekija

...


{

...

public:

...

   

...

void

...

AsetaNimi();

...

Wiki Markup
&nbsp;&nbsp;&nbsp; void AsetaNimi(char Nimi\[\])

...

;

Wiki Markup
&nbsp;&nbsp;&nbsp; char\* KysyNimi(char Nimi\[\]);

...

   

...

CTyontekija();

...

   

...

~CTyontekija();

...

   

...

CTyontekija

...

operator=(CTyontekija

...

T);

...

Wiki Markup
private: 

...

&nbsp;&nbsp;&nbsp; char m_Nimi\[100\];

...

}

...


;

...


#endif

...


Tyontekijäluokka,

...

joka

...

liittyy

...

linkitettyyn

...

listaan

...

on

...

esitetty

...

seuraavassa:

...


//

...

Tyontekija.cpp:

...

implementation

...

of

...

the

...

CTyontekija

...

class.

...


//

...


//////////////////////////////////////////////////////////////////////

...


#include

...

<stdio.h>

...


#include

...

<stdlib.h>

...


#include

...

<conio.h>

...


#include

...

<string.h>

...


#include

...

"Tyontekija.h"

...


Wiki Markup
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CTyontekija::CTyontekija()
\{ 

...

&nbsp;&nbsp;&nbsp; //printf("\nAnna nimi: "); 

...

&nbsp;&nbsp;&nbsp; //gets(m_Nimi); }
CTyontekija::~CTyontekija()
\{ }  void CTyontekija::AsetaNimi(char Nimi\[\])

...

Wiki Markup
\{ 

...

&nbsp;&nbsp;&nbsp; strcpy(m_Nimi,Nimi); }
char\* CTyontekija::KysyNimi(char Nimi\[\])
\{ 

...

&nbsp;&nbsp;&nbsp; strcpy(Nimi,m_Nimi);

...

   

...

return

...

Nimi;

...

}

...


void

...

CTyontekija::AsetaNimi()

...


{

...

   

...

printf("Anna

...

nimi

...

");

...

   

...

gets(m_Nimi);

...

}

...


CTyontekija

...

CTyontekija::operator=(CTyontekija

...

T)

...


{

...

   

...

strcpy(m_Nimi,T.m_Nimi);

...

   

...

//strcpy(m_Osasto,T.m_Osasto);

...

   

...

return

...

*this;

...

}

...

Linkitetylle

...

listalle

...

on

...

seuraavassa

...

esitetty

...

pääohjelma:

...


/***********************************************************

...

*

...


Työntekijätietokanta

...


Tietokanta

...

on

...

toteutettu

...

linkitettynä

...

listana

...


Tietokanta

...

muodostuu

...

solmuista,

...

jotka

...

on

...

likitetty

...

osoittimilla

...

toisiinsa

...


*************************************************************/

...


#include

...

<stdio.h>

...


#include

...

<stdlib.h>

...


#include

...

<conio.h>

...


#include

...

<string.h>

...


#include

...

"Tyontekija.h"

...


#include

...

"Solmu.h"

...


void

...

Menu();

...

int

...

main()

...


{     int Valitsin;

Wiki Markup
&nbsp;&nbsp;&nbsp; char Nimi\[100\];

...

    CSolmu* pSolmu=0;

...

    int Tiedosto=0;

...

    //

...

Varataan

...

tietokannalle

...

alkukohta

    CTyontekija* pTyontekija = new CTyontekija();

    pTyontekija->AsetaNimi("aaa");

...

    CSolmu* pJuuri = new CSolmu(pTyontekija);

...

    Tiedosto = pJuuri->HaeTiedostosta(); // Haetaan tiedostosta alkukohtaa seuraavat tiedot    

while(1)

{         Menu(); Valitsin=getch();

...

 

       switch (Valitsin)

...

{

...

   

...

   

...

   

...

case

...

'0':

...

   

...

   

...

   

...

   

...

exit(1);

...

//

...

lisäys

...

   

...

   

...

   

...

case

...

'1':

...

   

...

   

...

   

...

   

...

               

pTyontekija=new

...

CTyontekija();

...

   

...

   

...

   

...

   

...

pTyontekija->AsetaNimi();

...

   

...

   

...

   

...

   

...

pSolmu=new

...

CSolmu(pTyontekija);

...

   

...

   

...

   

...

   

...

pJuuri->Lisaa(pSolmu);

...

//

...

lisätään

...

duunari

...

listaan

...

   

...

   

...

   

...

   

...

               

pJuuri->Talleta();

...

   

...

   

...

   

...

break;

...

   

...

   

...

   

...

//

...

Tulostus

...

   

...

   

...

   

...

case

...

'2':

...

   

...

   

...

   

...

   

...

                pJuuri->Tulosta();

...

   

...

   

...

   

...

break;

...

//

...

Poisto

...

   

...

   

...

   

...

case

...

'3':

...

   

...

   

...

   

...

   

...

printf("Anna

...

nimi:

...

");

...

   

...

   

...

   

...

   

...

gets(Nimi);

...

   

...

   

...

   

...

   

...

pJuuri->Poista(Nimi);

...

                  pJuuri->Talleta();

...

   

...

            break;

                default:

            break;

        }
    }
}
void Menu()
{     printf("\n\n0=ohjelman

...

lopetus");

...

   

...

printf("\n1=Duunarin

...

lisays

...

tietokantaan");

...

   

...

printf("\n2=Kaikkien

...

duunarien

...

tulostus");

...

   

...

printf("\n3=Duunarin

...

poisto

...

tietokannasta\n\n");

...

}

...

Merkkijonot

C:n

...

merkkijonot

...

C++-kieli

...

tarjoaa string-luokan,

...

jota

...

voidaan

...

käyttää

...

merkkijonojen

...

käsittelyyn.

...

Sen

...

etu

...

C:n

...

merkkijonoihin

...

on,

...

että

...

sille

...

ei

...

tarvitse

...

määritellä

...

kokoa

...

ja

...

se

...

osaa

...

kasvaa

...

tarvittaessa.

...

Esimerkki

...

1.

...

string-luokan

...

peruskäyttö:

...

#include

...

<string>    //

...

Täällä

...

esitellään

...

string-luokka

...


#include <iostream>  //

...

Täällä

...

esitellään

...

cout.

...

using

...

namespace

...

std;

...

//

...

Otetaan

...

std

...

namespace

...

käyttöön.

...

int

...

main()

...


{

...

   

...

string

...

MJono

...

=

...

"";

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

//

...

Tyhjä

...

merkkijono.

...

   

...

MJono =

...

"Tämä

...

on

...

merkkijono";

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

  

...

 

...

//

...

Tekstin

...

sijoitus.

...

   

...

cout

...

<<

...

"MJono:

...

"

...

<<

...

MJono

...

<<

...

endl;

...

 

...

 

...

 

...

 

...

 

...

 

...

//

...

Tekstin

...

tulostus

...

cout:lla.

...

   

...

return

...

0;

...

}

...

Tämän

...

lisäksi

...

string-luokka

...

tarjoaa

...

paljon

...

muutakin:

...

Tekstin

...

lisääminen

...

merkkijonoon:

...

    MJono +=

...

",

...

johon

...

on

...

lisätty

...

tekstiä...";

...

      //

...

Tekstin

...

lisääminen

...

loppuun.

...


Tekstin

...

tulostus

...

printf()-funktiolla:

...

    printf("MJono:

...

%s\n",

...

MJono.c_str());

...

          // Tekstin tulostus printf():llä.

...


Tekstin

...

tulostaminen

...

merkki

...

kerrallaan:

...

    for (int

...

i=0;

...

i<MJono.length();

...

i++)

...


{          

...

//

...

length()

...

palauttaa

...

merkkijonon

...

pituuden.

...

       

Wiki Markup
cout << "MJono\[" << i << "\]: " << MJono\[i\] << endl;   // \[indeksi\] palauttaa indeksin osoittaman merkin, esim. MJono\[1\]  toisen merkin, jne.

...

 

...

&nbsp;&nbsp;&nbsp; 

...

}

Tekstin vertaaminen toiseen tekstiin:
    Ei ole sama -vertailu:
    if (MJono != "kerkko")

...


{

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

//

...

Testataan

...

eroaako

...

merkkijonot.

...

   

...

   

...

cout

...

<<

...

"MJono

...

ei

...

ole

...

sama

...

kuin

...

\"kerkko\""

...

<<

...

endl;

...

   

...

}
    Onko sama -vertailu:
    if (MJono == "Tämä on merkkijono, johon on lisätty tekstiä...")

...


{

...

//

...

Testataan

...

onko

...

merkkijonot

...

samat.

...

   

...

   

...

cout

...

<<

...

"MJono

...

on

...

sama

...

kuin

...

\"Tämä

...

on

...

merkkijono,

...

johon

...

on

...

lisätty

...

tekstiä...\""

...

<<

...

endl;

...

   

...

}