olio ohjelmoinnin perusteet luento 1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Olio-ohjelmoinnin perusteet luento 1 PowerPoint Presentation
Download Presentation
Olio-ohjelmoinnin perusteet luento 1

Loading in 2 Seconds...

play fullscreen
1 / 50

Olio-ohjelmoinnin perusteet luento 1 - PowerPoint PPT Presentation


  • 88 Views
  • Uploaded on

Olio-ohjelmoinnin perusteet luento 1. Päivi Ovaska LTKK/Tietotekniikan osasto. Sisältö. Johdanto oliomaailmaan C++ -ohjelmien yleisrakenne ja moduularisuus C++-kielen erityispiirteitä Kommentit Tyyppimuunnokset (type casting) Syöttö ja tulostus Muuttujien näkyvyys

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Olio-ohjelmoinnin perusteet luento 1' - thelma


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
olio ohjelmoinnin perusteet luento 1

Olio-ohjelmoinnin perusteetluento 1

Päivi Ovaska

LTKK/Tietotekniikan osasto

sis lt
Sisältö
  • Johdanto oliomaailmaan
  • C++ -ohjelmien yleisrakenne ja moduularisuus
  • C++-kielen erityispiirteitä
    • Kommentit
    • Tyyppimuunnokset (type casting)
    • Syöttö ja tulostus
    • Muuttujien näkyvyys
    • Aliohjelman esittely (function prototypes)
    • Vakiomuuttujat (constant variables)
    • Viittausmuuttujat (reference variables)
    • Dynaaminen muistinvaraus
    • Inline aliohjelmat
    • Merkkijonojen käsittely
johdanto
Johdanto
  • Oliolähestymistapa (object-oriented approach) on ajattelutapa, systeemityön lähestymistapa ja ohjelmointitekniikka
  • Ensimmäinen olio-ohjelmointitekniikoita sisältävä ohjelmointikieli Simula otettiin käyttöön vuonna 1967
  • Seuraavalla vuosikymmenellä varsinaisen lähtölaukauksen olio-ohjelmointiin antoi Smalltalk, joka oli 1980-luvulla suosittu olio-ohjelmointikieli
  • 1990-luvulla suosituimmaksi olio-ohjelmointikieleksi nousi C++-kieli
  • Uusimpana kielenä Internetin suosion myötä on noussut Java-kieli
  • Toteutusvälineiden kirjo on nykyisin monipuolinen ohjelmointikielineen ja kehittimineen
miksi olioita
Miksi olioita?
  • Ohjelmistokriisi:
    • Ohjelmistotyön kustannuksista noin 80 % johtuu ylläpitotyöstä. Tästä noin 30% kuluu virheiden korjaukseen ja noin 70% ohjelmistojen saattamiseksi muutuneita vaatimuksia vastaaviksi
    • Käytössä olevan ohjelmiston ylläpito on vaikea tehtävä
    • Ylläpito johtaa usein siihen, että ohjelmisto kasvaa ja monimutkaistuu, minkä jälkeen ylläpito on entistä vaikeampaa
  • Ohjelmistokriisin helpottamiseksi on kehitetty lukuisia systeemityömalleja, menetelmiä, työvälineitä jne
  • Ohjelmistojen kehittämiseen on pyritty luomaan järjestelmällisyyttä, on syntynyt kokonaisvaltaisia lähestymistapoja, jotka raamittavat ohjelmistojen suunnittelu- toteutus- ja ylläpitotyötä
  • Lähestymistavoista uusin on oliolähestymistapa, jossa keskeisessä asemassa on ylläpidettävyys ja uudelleenkäytettävyys.
erilaisia l hestymistapoja ohjelmistokehitykseen ja ohjelmointiin
Erilaisia lähestymistapoja ohjelmistokehitykseen ja ohjelmointiin
  • Tietojenkäsittelyn ongelmiin erilaisia lähestymistapoja on toimintokeskeinen, tietokeskeinen ja oliokeskeinen lähestymistapa
  • Toimintokeskeisessä lähestymistavassa keskeisiä käsitteitä ovat toiminnot, tehtävät, toimenpiteet ja niiden käsittelysäännöt. Toimintokeskeiseen lähestymistapaan liittyy proseduraalinen ohjelmointityyli, jossa ohjelman kontrolli muodostuu peräkkäin suoritettavista toimenpitestä
    • Prosedulaarinen ohjelma on yksi ohjelma, joka on jaettu pienempiin palasiin, joita kutsutaan proseduureiksi
    • Modulaarinen ohjelma on jaettu useampaan moduuliin, jolla on omat muuttujansa. Jokaisella modulilla on näin oma tilansa, jota muutetaan proseduurien avulla
  • Tietokeskeisessä lähestymistavassa keskeisiä käsitteitä ovat käsiteltävät kohteet ja niihin liittyvät tiedot. Tietokeskeiseen lähestymistapaan liittyvät relaatiotietokannat ja kohdemalli
  • Oliokeskeisessä lähestymistavassa keskeistä on tietojen ja toimintojen yhdistäminen yhdeksi kokonaisuudeksi, olioksi
c ohjelmien yleisrakenne
C++ -ohjelmien yleisrakenne
  • esittelytiedostot (header files) .h, .hpp
    • sisältävät ohjelmayksikön rajapintainformaation, kuten funktioiden otsakkeet ja tyyppien määrittelyt
  • toteutustiedostot (source files) .cc, .cpp
  • esittelytiedostot sisällytetään (include) kaikkiin niihin toteutustiedostoihin, joissa niiden sisältämiä esittelyjä tarvitaan
  • yleensä esitettelytiedostossa olevat esittelyt tulee kirjoittaa ehdollisen käännöksen sisään käyttämällä #ifnder-#endif –kääntäjäkomentoja
  • jako esittely- ja toteutustiedostot toteuttavat modulaarisuuden periaatteen
    • moduulin julkisen rajapinnan määrittely esittelytiedostossa
  • Moduuli= tietorakenne, käsittelyfunktiot (rajapinta) ja niiden toteutus samassa paketissa
p iv ysmoduulin rajapinta c ll
Päiväysmoduulin rajapinta C:llä

#ifndef C_MODUULI_H

#define C_MODUULI_H

typedef struct paivays data {

int p , k , v ;

}paivays_PVM;

paivays_PVM paivays_luo( int paiva, int kuukausi, int vuosi );

paivays_tulosta( paivays_PVM kohde );

#endif /* C_MODUULI_H */

slide13
C++
  • Varsinkin teollisuudessa yleistynyt oliokieli
  • C-kielestä lähinnä laajentamalla johdettu
  • Suurin osa ANSI C -ohjelmista laillisia C++-ohjelmia
  • Tuloskoodi usein varsin tehokasta
  • Luokkakäsite & olio-ajattelu ->korkean tason abstraktio
  • Mahdollisuus myös matalan tason ohjelmointiin
  • Helpohko oppia C:tä osaaville
  • Helppo yhdistää C-kirjastoja C++:aan
  • Kieli ei rajoita ohjelman toteutustapaa
  • Staattinen (käännösaikainen) tyypitys
  • ISO C++ -standardi tarjoaa työkaluja C:n puutteiden kiertämiseen
c haittoja
C++ haittoja
  • C:stä periytyvä turvattomuus
  • Yhteensopivuus C:n kanssa ->ikäviä kompromisseja oliopiirteissä
  • Vaatii myös C-tuntemusta
  • Runsaasti ansoja ohjelmoijalle
  • Helppo kirjoittaa C++:aa C-mäisesti
  • Kielessä ei kaikkialla pakollisia automaattisia virhetarkastuksia->ohjelmien sekoamiset yleisiä
  • C:n matalatasoisuus paistaa kielestä läpi myös oliotasolla
  • Periytymismekanismia käytettäessä sallii toteutukset, jotka itse asiassa olioajattelun vastaisia
  • Ei pakota olioajatteluun
c kielen ominaisuuksia
C++ kielen ominaisuuksia
  • perustana on C-kieli, johon on tehty joitakin lisäyksiä ja olio-ohjelmointimekanismit sisältävät laajennus
  • C-kielen laajennukset:
    • Kommentit
    • Tyyppimuunnokset (type casting)
    • Syöttö ja tulostus
    • Muuttujien näkyvyys
    • Nimiavaruudet (namespace)
    • Aliohjelman esittely (function prototypes)
    • Vakiomuuttujat (constant variables)
    • Viittausmuuttujat (reference variables)
    • Dynaaminen muistinvaraus
    • Inline aliohjelmat
    • Merkkijonojen käsittely
c kommentit
C++ kommentit
  • C-kielen /* … */kommenttien lisäksi käytössä
  • yhden rivin kommentti, joka on rivin alussa //
c muuttujien n kyvyys
C++ muuttujien näkyvyys
  • C-kielisessä ohjelmassa muuttujien määrittelyjen tulee olla funktion alussa tai lohkon alussa:

void f()

{

int x;

/* ... */

while (x){

int y;

/* ... */

}

}

  • C++-kielessä muuttujien määrittely voi sijaita missä kohtaa ohjelmaa tahansa
  • Muuttujien näkyvyys alkaa kohdasta, jossa määrittely tapahtuu ja päättyy sen lohkon loppuun

int x; // globaali x

void f ()

{

int x; //peittää globaalin x:n

x=1; //paikallinen x

{

int x; //peittää ensimmäisen paikallisen x:n

X=2; //toinen paikallinen x

}

x=3; //ensimmäinen paikallinen x

}

int* p = &x; //ottaa globaalin x:n osoitteen

c muuttujien n kyvyys1
C++ muuttujien näkyvyys
  • :: näkyvyysoperaattorin avulla mahdollisuus käyttää peitettyä globaalia muuttujaa

int x;

void f2();

{

int x=1; //peitää globaalin x:n

::x=2; //sijoitus globaaliin x:ään

}

c nimiavaruudet
C++ -nimiavaruudet
  • C:n moduulien ongelmat:
    • Moduulin nimet (funktiot ja globaalit muuttujat) ovat näkyvissä kaikkialla ohjelmassa.
    • Käytössä vain yksi (globaali) näkyvyysalue ->nimiavaruuden roskaantuminen ja nimitörmäykset
  • ISO C++ standardi (ISO 1998) tarjoaa nimiavaruuksien (namespace) avulla tapahtuva hierarkkisen nimeämiskäytännön
  • avainsanalla namespace ohjelmoija voi koota yhteen samaan kokonaisuuteen liittyviä ohjelmakokonaisuuksia, jotka voivat olla nimetyn lohkon sisällä mitä tahansa C++-ohjelmakoodia
c nimiavaruudella toteutettu rajapinta
C++ nimiavaruudella toteutettu rajapinta

1 // Päiväys-moduulin rajapinnan esittely (tiedosto: paivays.hh)

2 #ifndef PAIVAYS_HH

3 #define PAIVAYS_HH

4

5 namespace Paivays {

6

7 // Päiväyksien tietorakenne:

8 struct PVM { int p , k , v ; };

9

10 // Rajapinnan funktiot:

11 PVM Luo( int paiva, int kuukausi, int vuosi );

12 // Palauttaa uuden alustetun päiväyksen.

13 void Tulosta( PVM kohde );

14 // Tulostetaan päiväys järjestelmän oletuslaitteelle.

15 }

16 #endif

c moduulin rajapintafunktioiden toteutus erillisess tiedostossa
C++ -moduulin rajapintafunktioiden toteutus erillisessä tiedostossa

1 // Päiväys-moduulin toteutus (tiedosto: paivays.cc)

2 #include "paivays.hh" /* rajapinnan esittely */

3

4 namespace Paivays {

5 PVM Luo( int paiva, int kuukausi, int vuosi )

6 {

7 PVM paluuarvo;

……

8 return paluuarvo;

9 }

10

11 void Tulosta( PVM p )

12 {

……

13 }

14}

c nimiavaruuden rakenteiden k ytt minen
C++ nimiavaruuden rakenteiden käyttäminen

1 #include "paivays.hh"

2

3 int main() {

4 Paivays::PVM vappu;

5 vappu = Paivays::Luo( 1,5,2001 );

6 Paivays::Tulosta( vappu);

7}

c sy tt ja tulostus
C++ syöttö ja tulostus
  • Oma luokkakirjasto iostream
  • Tulostaminen cout-olion avulla
  • cout-olio edustaa standarditulostevirtaa, joka vastaa C-kielen stdout-standarditulostevirtaa

cout<<parametri1<<parametri2<<...;

  • parametri= vakio,muuttuja tai lauseke
  • cout-olio tunnistaa itse parametrin tyypin ja tulostaa sen oletusasetustensa mukaisessa muodossa
  • esim. Tulostaminen cout-olion avulla

#include <iostream>

int main(void)

{

int ika = 20;

char nimi[11] = "Maija";

cout<<"\nNimi on: "<<nimi;

cout<<" ja ikä on "<<ika;

return 0;

}

c sy tt ja tulostus jatkuu
C++ syöttö ja tulostus (jatkuu)
  • tulostusta voi muodoilla kirjaston aliohjelmien ja ns. manipulaattoreiden avulla

#include <iostream>

int main(void)

{

char jono[10] ;

cin>>ws>>jono;

cout<<”Teksti: “<<endl<<jono<<endl;

return 0;

}

  • manipulaattoreita:

endl lisää ‘\n’-merkin ja tyhjentää tulostuspuskurin

ends lisää ‘\0’-merkin ja tyhjentää tulostuspuskurin

flush tyhjentää tulostuspuskurin

ws lukee tyhjät syöttöpuskurista

c sy tt ja tulostus jatkuu1
C++ syöttö ja tulostus (jatkuu)
  • Tiedon lukeminen cin-olion avulla
  • cin-olio edustaa standardisyötevirtaa (C-kielessä stdin)

cin>>parametri1>>parametri2>>...;

#include <iostream>

using namespace std;

int main(void)

{

int ika;

char nimi[11] ;

cout<<”Syötä ikä ja nimi: “;

cin>>ika>>nimi;

cout<<”\nNimi oli siis: “<<nimi;

cout<<”ja ikä “<<ika;

return 0;

}

c sy tt ja tulostus jatkuu2
C++ syöttö ja tulostus (jatkuu)
  • Syötteiden välissä oleva merkki voidaan lukea get-aliohjelmalla

get();

get(merkki);

  • Välilyöntejä sisältävä merkkijono voidaan lukea get-aliohjelmalla

get(merkkijono, maksimipituus);

get(merkkijono,maksimipituus,lopetusmerkki);

#include <iostream>

using namespace std;

void main()

{

int ika;

char kokonimi[30];

char osoite[30];

cout<<"\nIkä? ";

cin>>ika;

cout<<"Nimi? ";

cin.get();

cin.get(kokonimi, 30);

cout<<"Osoite? ";

cin.get();

cin.get(osoite, 30);

cout<<"\nIkä : "<<ika;

cout<<"\nNimi: "<<kokonimi;

cout<<"\nOsoite: "<<osoite;

}

c sy tt ja tulostus jatkuu3
C++ syöttö ja tulostus (jatkuu)
  • Tyhjiä välejä sisältäviä merkkijonoja voidaan lukea getline-ohjelmalla

getline(merkkijono, maksimipituus)

getline(merkkijono, maksimipituus,lopetusmerkki)

#include <iostream>

using namespace std;

void main()

{

int ika;

char kokonimi[30];

char osoite[30];

cout<<"\nIkä? ";

cin>>ika;

cout<<"Nimi? ";

cin.get();

cin.getline(kokonimi, 30);

cout<<"Osoite? ";

cin.getline(osoite, 30);

cout<<"\nIkä : "<<ika;

cout<<"\nNimi: "<<kokonimi;

cout<<"\nOsoite: "<<osoite;

}

  • Tyhjämerkkien ohitus syötteesta

cin>>ws

c kielen tiedon k sittely ja v litt minen
C-kielen tiedon käsittely ja välittäminen
  • Muuttujat ja osoittimet
  • C-kielessä käytetään usein osoittimia funktion parametrien välitykseen, miksi?

void swap (int *i, int *j)

{

int t = *i;

*i = *j;

*j=t;

}

main()

{

int a=10,b=5;

swap(&a,&b)

cout<<a<<b<<endl;

}

osoittimet
Osoittimet
  • Osoitin on muuttuja, joka voi sisältää keskusmuistiosoitteen
  • Osoitinmuuttujan sisältämän keskusmuistiosoitteen kautta voidaan viitata keskusmuistiosoitteeseen talletettuun tietoon
  • Osoittimia käytetään dynaamisessa muistinhallinnassa (kun varattavan tilan koko vaihtelee ohjelman eri suorituskerroilla) ja aliohjelmien muuttujaparametreissa (kun aliohjelman tietoon tekemän muutoksen tulee näkyä kutsuvassa aliohjelmassa)
osoitinesimerkkej
Osoitinesimerkkejä

int* osoitin1 = NULL; //osoitin 1 määritelty tyhjäksi

int luku = 2;

int * osoitin2=&luku, *osoitin3= NULL;// osoitin2-niminen //muuttuja on

//alustettu int-tyyppisen luku-muuttujan keskusmuistiosoitteella, //osoitin3 on

//määritelty tyhjäksi

Keskusmuisti näyttää muuttujien varauksen jälkeen seuraavalta:

2

NULL

11

10

11

12

osoitin1

luku

osoitin2

osoitinoperaattori ja sis lt operaattori
Osoitinoperaattori& ja sisältöoperaattori*
  • Osoitinoperaattori muuttujan nimen edessä palauttaa muuttujan keskusmuistiosoitteen
    • käytetään kun osoitinmuuttujaan sijoitetaan toisen muuttujan keskusmuistiosoite tai kun muuttujan tunnuksen keskusmuistiosoitteeseen halutaan viitata
  • Sisältöoperaattori osoitinmuuttujan nimen edessä viittaa osoitinmuuttujan osoittaman muuttujan sisältöön
osoittimien k ytt funktion parametrien k sittelyyn
Osoittimien käyttö funktion parametrien käsittelyyn

#include <iostream>

using namespace std;

void Korota(int *); //esittely

int main()

{

int luku;

cout<<"\nSyötä jokin kokonaisluku: ";

cin>>luku;

Korota(&luku);

cout<<"\nLuku *luku: "<<luku;

return 0;

}

void Korota(int *p_luku) //määrittely

{

*p_luku = (*p_luku) * (*p_luku);

}

c kielen viittausmuuttujat reference variables
C++ kielen viittausmuuttujat (reference variables)
  • C++ tarjoaa viittausmuuttujan:

void swap(int& i, int& j)

{

int t=i;

i=j;

j=t;

}

main()

{

int a=10,b=5;

swap(a,b);

cout<<a<<b<<end;

}

  • int & viittaus kokonaislukuun
  • Kun viittaus osoittaa johonkin muuttujaan, se on ikäänkuin toinen nimi tai alias tälle muuttujalle
  • Esim.

int a;

int &b=a;

a=0;

b=5;

cout<<a<<endl;

  • Mitä ohjelma tulostaa ?
viittauksien k ytt funktion parametrien k sittelyyn
Viittauksien käyttö funktion parametrien käsittelyyn
  • #include <iostream>
  • using namespace std; //käyttää std nimiavaruutta kaikkialla
  • void Korota(int &); //esittely
  • int main()
  • {
  • int luku;
  • cout<<"\nSyötä jokin kokonaisluku: ";
  • cin>>luku;
  • Korota(luku);
  • cout<<"\nLuku * luku: "<<luku;
  • return 0;
  • }
  • void Korota(int &p_luku) /määrittely
  • {
  • p_luku = p_luku * p_luku;
  • }
c kielen viittausmuuttujat reference variables1
C++ kielen viittausmuuttujat (reference variables)
  • Rajoitukset:
    • Viittausta ei voi määritellä toiseen viittausmuuttujaan
    • Viittausmuuttujista ei voi määritellä taulukkoa
    • Viittaukseen ei voi määritellä osoitinta
    • Bittikenttään ei voi määritellä viittausta
    • Viittausmuuttuja viittaa aina samaan alustuksessa määrättyyn kohteeseen, kohdetta ei voi vaihtaa
  • Esimerkki:

int i=0;

int& ir=i;

ir=-19; //ok

const int& irc=47;

irc=-37 //ei sallittu, koska viittausmuuttuja on

// on määritelty vakioksi

c kielen viittausmuuttujat reference variables2
C++ kielen viittausmuuttujat (reference variables)
  • Hyödyt:
    • Helpottaa osoittimien käytöstä johtuvaa monimutkaisuutta
    • Ei tapahdu yhtä helposti virheitä kuin osoittimien käytössä, NULL-vertailua ei tarvitse tehdä viittausmuuttujalle
viittaus tietueeseen
Viittaus tietueeseen

#include <iostream>

using namespace std;

struct PVM

{

int pp, kk, vv;

};

int main()

{

PVM tietue = {1, 1, 1996};

PVM &viittaus = tietue; //viittaus-muuttuja on alustettava

// määrittelyn yhteydessä

cout<<"\nVuosi viittauksen kautta tulostettuna: ";

cout<<viittaus.vv;

return 0;

}

viittaus osoittimeen
Viittaus osoittimeen

#include <iostream>

using namespace std;

struct PVM

{

int pp, kk, vv;

};

int main()

{

PVM paiva = {1, 2, 96};

PVM *osoitin1 = &paiva; // osoitinmuuttuja on alustettu paiva-

// tietueen keskusmuistiosoitteella

PVM *&osoitin2 = osoitin1; //viittaus PVM-tyyppiseen tietueeseen

// osoittavaan osotitinmuuttujaan

cout<<"\nKuukausi: "<<osoitin1->kk;

cout<<"\nKuukausi: "<<osoitin2->kk;

return 0;

}

c kielen vakiomuuttujat
C++-kielen vakiomuuttujat
  • C-kieli

#define MAX 100

  • C++:

const int MAX_MJONON_KOKO=100;

const douple pi=3.14159265;

const int raja=annaRaja();

char mjono[MAX_MJONON_KOKO];

const char* mjono; //vakio-osoitin

const int& luku; //vakio-viite

  • Parametrin arvo voidaan tehdä muuttumattomaksi const-määreellä. Käyttökelpoinen silloin, kun muttuujan arvon vaihtuminen aliohjelmassa viittauksen tai osoittimen kautta halutaan estää

#include <iostream>

using namespace std;

void Aliohjelma(const int &luku);

int main(void)

{

int luku = 5;

Aliohjelma(luku);

return 0;

}

void Aliohjelma(const int &luku)

{

cout<<"Luvun voi tulostaa: "<<luku;

cout<<"\nMutta sitä ei voi muuttaa.";

//luku = 10;

}

c kielen vakiomuuttujat1
C++ -kielen vakiomuuttujat
  • Esimerkkejä vakiomuuttujan käytöstä:

void func1(const int i)

{

i=5; //ei voida muuttaa vakiota

}

void func2(char * const s) vakio-osoitin merkkijonoon

{

s=”hello”; //ei voida muuttaa osoitinta

}

void func3(const char *s) osoitin vakiomerkkijonoon

{

s=”hello”; //Ok, voidaan muutta osoitinta

*s=’A’; //ei voida muuttaa vakiomerkkijonoa

}

  • C++sisältää automaattiset tyyppimuunnokset ei-vakio-osoittimista vakio-osoittimiksi (sama viitteille), mutta ei toiseen suuntaan:

char * mjono= ”Käytä String-luokkaa char*:n sijaan”;

const char* vakiomjono=mjono; //ok ei-vakio->vakio

char* mjono=vakiomjono; //KÄÄNNÖSVIRHE: vakio->ei-vakio

c aliohjelman esittely function prototype
C++ aliohjelman esittely (Function prototype)
  • C++-kielessä aliohjelmat täytyy esitellä ohjelman alussa
  • liittää aliohjelman nimeen aliohjelman ja parametrien tyypit
  • esittely muotoa:

tyyppi aliohjelman_nimi(parametrilista)

#include <iostream>

using namespace std;

void Korota(int); //esittely

int main(void)

{

int luku;

cout<<"\nSyötä jokin kokonaisluku: ";

cin>>luku;

Korota(luku);

cout<<"\nPääohjelman luku on: "<<luku;

return 0;

}

void Korota(int p_luku)

{

p_luku = p_luku * p_luku;

cout<<"\nLuku * luku: "<<p_luku;

}

inline aliohjelmat
Inline-aliohjelmat
  • Inline-aliohjelmalla optimoidaan aliohjelman suoritusnopeutta, jolloin kuitenkin ohjelmakoodin koko kasvaa
  • Varattu sana inline on käsky kääntäjälle korvata aliohjelmakutsu aliohjelman rungolla
  • Kannattaa käyttää lyhyissä aliohjelmissa
  • Turvallisempi, kuin käyttää makroja (parametrien tarkistus)
  • esittely:

inline tyyppi Aliohjelma();

inline aliohjelma esimerkki
Inline aliohjelma, esimerkki
  • Muuntaa kirjaimet suuriksi

#include <iostream>

using namespace std;

#include <cctype>

inline char MuutaIsoksi(char merkki)

{

return (toupper(merkki));

}

int main()

{

char merkki = 'a';

merkki = MuutaIsoksi(merkki);

cout<<"\nMuutettuna: "<<merkki;

return 0;

}

tyyppimuunnokset type casting
Tyyppimuunnokset (Type casting)
  • C-kielessä:

int i;

float f;

f = (float) i;

  • C++ myös:

int i;

float f;

f = float(i);

dynaaminen muistink sittely
C-kielessä malloc ja free:

int *ip;

ip=(int*)malloc sizeof(int)*100);

.....

free((void*)ip);

C++-kielessä new ja delete:

int *p;

p=new int;

*p=12;

cout << *p;

delete p;

int* ip;

ip=new int100;

...

delete  ip;

typedef node

{

int data;

node *next;

}node;

main()

{

node *p;

p=new node;

p->data=10;

delete p;

}

Dynaaminen muistinkäsittely
osoittimien k ytt dynaamisen muistin hallintaan
Osoittimien käyttö dynaamisen muistin hallintaan
  • Muuttujien tarvitseman keskusmuistitilan varausta ja vapautusta ajonaikaisesti
  • esim. tietueen tilanvaraus ja –vapautus ajonaikaisesti

#include <iostream>

using namespace std;

#include "pvm.h"

int main()

{

PVM *pvm = NULL; // pvm osoitinmuuttujan esittely ja alustus Null-arvolla

pvm = new PVM; // muistitilan varaus PVM tyyppiselle tietueelle

if (pvm) // jos tilanvaraus on onnistunut

{

cout<<"Syötä pp kk vv ";

cin>>pvm->pp>>pvm->kk>>pvm->vv; //viittaus tietueen kenttiin osoitin-

cout<<"Pvm on: "<<pvm->pp<<"/"; // muuttujan kautta

cout<<pvm->kk<<"/"<<pvm->vv;

}

else

cout<<"Tilanvaraus epäonnistui";

delete pvm; // tietueen tilanvapautus

return 0;

}

osoittimien k ytt dynaamisen muistin hallintaan taulukko
Osoittimien käyttö dynaamisen muistin hallintaan: taulukko
  • Yksiulotteisen taulukon tilanvaraus ja –vapautus

#include <iostream>

using namespace std;

int main()

{

int *luku_osoitin1 = NULL;

int vastaus, laskuri = 0;

cout<<"\nMontako lukua varataan ? ";

cin>>vastaus;

luku_osoitin1 = new int[vastaus]; // varataan käyttäjän ilmoittama määrä kokonaislukuja

if (luku_osoitin1)

{

for (laskuri = 0; laskuri < vastaus; laskuri++)

{

cout<<"\nLuku ?";

cin>>luku_osoitin1[laskuri]; //viittaus taulukon alkioihin

}

for (laskuri = 0; laskuri < vastaus; laskuri++)

{

cout<<"\nLuku: "<<luku_osoitin1[laskuri];

cout<<" osoitteessa: "<<&luku_osoitin1[laskuri]; //tulostaa taulukon alkion

//keskusmuistiosoitteen

}

}

else

cout<<"\nTilanvaraus epäonnistui";

delete [] luku_osoitin1; //taulukon muistitilan vapautus

return 0;

}

osoittimien k ytt dynaamisen muistin hallintaan kaksiulotteinen taulukko
Osoittimien käyttö dynaamisen muistin hallintaan: kaksiulotteinen taulukko
  • Kaksiulotteisen taulukon tilanvaraus ja –vapautus

#include <iostream>

using namespace std;

int main()

{

int **osoitin; //osoitinmuuttuja kaksiulotteiselle taulukolle

int rivit, sarakkeet;

int rind, sind;

cout<<"Montako riviä? ";

cin>>rivit;

cout<<"Montako saraketta? ";

cin>>sarakkeet;

osoitin = new int*[rivit]; //riviosoittimien tilanvaraus. Yksiulotteinen taulukko, jonka osoite on // sijoitettu osoitinmuuttujaan osoitin

for (rind = 0; rind < rivit; rind++)

osoitin[rind] = new int[sarakkeet]; //tilanvaraus kunkin rivin sarakkeita varten

for (rind = 0; rind < rivit; rind++)

for (sind = 0; sind < sarakkeet; sind++)

{

osoitin[rind][sind] = rind; //mitä tulee taulukon alkion arvoiksi?

}

for (rind = 0; rind < rivit; rind++)

{

for (sind = 0; sind < sarakkeet; sind++)

{

cout<<osoitin[rind][sind]<<"("<<&osoitin[rind][sind]<<") ";

}

cout<<endl;

}

for (rind = 0; rind < rivit; rind++)

delete [] osoitin[rind]; //riviosoittimien tilan vapautus

delete [] osoitin; //osoitinmuuttujan tilan vapautus

return 0;

}

c kielen merkkijonojen k sittely
C-kielen merkkijonojen käsittely
  • C-kielessä merkkijono on merkkitaulukko, jonka kukin alkio on char-tyyppinen ja viimeisen alkion sisältö on ’\0’

char vuosi[14+1]=”1995”;

char kieli[15]=”C++-kieli”;

char muukieli[]=”C-kieli”

c kielen merkkijonojen k sittely1
C++-kielen merkkijonojen käsittely
  • string-luokka

#include <iostream>

using namespace std;

#include <string>

int main()

{

String etunimi = "Maija";

String sukunimi("Meikäläinen");

cout<<endl<<etunimi;

cout<<endl<<sukunimi;

return 0;

}

tästä myöhemmin lisää valmiiden luokkien käytön yhteydessä