Muuttujien roolit Kiintoarvo cin >> r;



Samankaltaiset tiedostot
Tietuetyypin määrittely toteutetaan C-kielessä struct-rakenteena seuraavalla tavalla:

Ohjelmoinnin peruskurssi Y1

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmointi 1 Taulukot ja merkkijonot

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Kirjoita, tallenna, käännä ja suorita alla esitelty ohjelma, joka tervehtii käyttäjäänsä.

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Osoittimet. Mikä on osoitin?

Plagioinnin tunnistaminen lähdekielisistä ohjelmista

Java-kielen perusteet

ITKP102 Ohjelmointi 1 (6 op)

Osa. Toimintojen toteuttaminen ohjelmissa vaatii usein haarautumisia ja silmukoita. Tässä luvussa tutustummekin seuraaviin asioihin:

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Ohjelmoinnin perusteet Y Python

Listarakenne (ArrayList-luokka)

Ohjelmoinnin perusteet Y Python

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

#include <stdio.h> // io-toiminnot. //#define KM_MAILISSA int main( ){

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Osoitin ja viittaus C++:ssa

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

Luento 5. Timo Savola. 28. huhtikuuta 2006

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Table of Contents. T Olio-ohjelmointi C/C++ perusteita Jukka Jauhiainen OAMK Tekniikan yksikkö 2010, 2011

Ohjelmoinnin perusteet Y Python

Ohjelmointiharjoituksia Arduino-ympäristössä

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Ohjelmoinnin peruskurssi Y1

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Algoritmit 1. Demot Timo Männikkö

Ohjelmoinnin peruskurssi Y1

// // whiledemov1.c // #include <stdio.h> int main(void){ int luku1 = -1; int luku2 = -1;

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

11. Javan toistorakenteet 11.1

Ohjelmoinnin perusteet Y Python

Lyhyt kertaus osoittimista

Harjoitustyö: virtuaalikone

13 Operaattoreiden ylimäärittelyjä

Olio-ohjelmointi 2. välikoe HYV5SN

Osa. Erikoisaiheet. Oppitunnit 20 Erikoisluokat ja -funktiot 21 Esikäsittelijä

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Algoritmit 2. Demot Timo Männikkö

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Tietotyypit ja operaattorit

12. Javan toistorakenteet 12.1

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Algoritmit 2. Luento 7 Ti Timo Männikkö

12. Javan toistorakenteet 12.1

Tietueet. Tietueiden määrittely

Ohjelmoinnin perusteet Y Python

Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

1. luento. Ohjelmointi (C) T0004 Syksy luento. 1. luento. 1. luento. 1. luento. kurssin sisältö ja tavoitteet työmuodot.

Java-kielen perusteita

Ohjelmoinnin perusteet Y Python

Johdatus Ohjelmointiin

TAITAJA 2007 ELEKTRONIIKKAFINAALI KILPAILIJAN TEHTÄVÄT. Kilpailijan nimi / Nro:

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

Algoritmit 1. Demot Timo Männikkö

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

Ohjelmoinnin perusteet Y Python

Rakenteiset tietotyypit Moniulotteiset taulukot

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu:

Tietorakenteita 163. Yhteen suuntaan linkitetyn listan rakenne on siis seuraavan kuvan kaltainen:

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Muuttujat ja kontrolli. Ville Sundberg

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

Olio-ohjelmointi Syntaksikokoelma

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

Ohjelmoinnin peruskurssi Y1

TIETORAKENTEET JA ALGORITMIT

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Algoritmit 2. Demot Timo Männikkö

Luennon sisältö Tyypit int, char, float, double signed, unsigned short, long Vakiot const Rakenteet if, for, while, switch, do-while Syöttö ja tulostu

Ohjausrakenteet. Valinta:

Taulukoiden käsittely Javalla

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

11. Javan valintarakenteet 11.1

11. Javan valintarakenteet 11.1

C-kurssi kevät Luennon sisältö

Luennon sisältö. C-kurssi kevät Tasokokeen kohta 1: Taulukon järjestäminen. Tasokokeen kohta 2. Tasokokeen kohta 2. Tasokokeen kohta 3

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmoinnin perusteet Y Python

C-kurssi syksy ltö. Luennon sisält. Luento 2: tyypit, rakenteet, makrot Tyypit. signed, unsigned short,, long Vakiot const Rakenteet

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

Esimerkki 1: Kahviautomaatti.

Luku 1. Ohjelmointitekniikka. 1.1 Kielen valinta

Ohjelmoinnin peruskurssi Y1

Transkriptio:

Muuttujien roolit Muuttujilla on ohjelmissa eräitä tyypillisiä käyttötapoja, joita kutsutaan muuttujien rooleiksi. Esimerkiksi muuttuja, jonka arvoa ei muuteta enää kertaakaan muuttujan alustamisen jälkeen, kutsutaan kiintoarvoksi. Muuttujien rooleja ei pidä sekoittaa muuttujien perustietotyyppeihin (C++:ssa esimerkiksi int, char, double jne.), vaan kyseessä on jaottelu, joka ilmaisee millainen tehtävä muuttujalla kyseisessä ohjelmassa on. Seuraavassa kuvattavat yksitoista eri roolia riittävät kattamaan lähes kaikki yksinkertaisissa ohjelmissa esiintyvät muuttujat. Useimmiten esiintyvät roolit ovat kiintoarvo, askeltaja ja tuoreimman säilyttäjä, jotka kattavat noin 70 % kaikista muuttujista. Toisaalta on huomattava, että kaikilla muuttujilla ei välttämättä ole mitään alla esitellyistä rooleista. Muuttujien roolit, jotka on esitelty tarkemmin alla, ovat kiintoarvo askeltaja tuoreimman säilyttäjä sopivimman säilyttäjä kokooja seuraaja yksisuuntainen lippu tilapäissäilö järjestelijä säiliö kulkija Esimerkkiohjelmien yhteydessä olevan rivinumeroinnin tarkoitus on helpottaa riveihin viittaamista. Ohjelmien suorituksen kannalta rivinumeroinnilla ei ole mitään merkitystä, koska ne ovat muodoltaan C-kielen kommentteja. Kiintoarvo Muuttujan rooli on kiintoarvo, jos sen arvoa ei muuteta ohjelman suorituksen aikana. Esimerkkiohjelma kysyy käyttäjältä ympyrän säteen ja ilmoittaa sitten ympyrän alan. Muuttuja r on kiintoarvo. Kyseinen muuttuja saa ohjelman suorituksen aikana käytettävän arvon yhden kerran (rivillä 8), joka ei sen jälkeen muutu. Kiintoarvoa voidaan käyttää ohjelman eri kohdissa - esimerkissä kahdesti rivillä 9. /* 2 */ #include <iostream /* 4 */ const int PII = 3.1415; /* 5 */ int main() { /* 6 */ double r = 0; /* 7 */ cout << "Anna ympyrän säde: "; /* 8 */ cin >> r; /* 9 */ cout << "Ympyrän ala on " << PII * r * r << endl; /* 10 */ return EXIT_SUCCESS; /* 11 */ }

Askeltaja Askeltaja käy läpi arvoja jollain systemaattisella tavalla. Alla on esimerkki silmukkarakenteesta, jossa käytetään muuttujaa kertoja askeltajana. Esimerkkiohjelma tulostaa kolmosen kertotaulun askeltajan käydessä läpi arvot yhdestä kymmeneen. /* 5 */ int kertoja = 0; /* 6 */ for( kertoja = 1; kertoja <= 10; ++kertoja ) { /* 7 */ cout << kertoja << * 3 = << kertoja * 3 << endl; /* 8 */ } /* 9 */ return EXIT_SUCCESS; /* 10 */ } Askeltajaa voidaan käyttää myös esimerkiksi lukumäärän laskemiseen ja taulukon indeksien läpikäymiseen. Tuoreimman säilyttäjä Muuttuja on tuoreimman säilyttäjä, jos sen arvo on viimeisin jostakin tietystä joukosta läpikäyty arvo tai yksinkertaisesti vain arvo, joka on syötetty viimeksi. Esimerkkiohjelma pyytää käyttäjältä syötettä toistuvasti (rivillä 8) kunnes syöte on kelvollinen. Tässä ohjelmassa muuttuja s on tuoreimman säilyttäjä, koska siitä löytyy kulloinkin viimeksi syötetty arvo. /* 5 */ double s = 0; /* 6 */ while( s <= 0 ) { /* 7 */ cout << "Anna neliön sivu: ; /* 8 */ cin >> s; /* 9 */ } /* 10 */ cout << "Neliön ala on " << s * s << endl; /* 11 */ return EXIT_SUCCESS; /* 12 */ }

Sopivimman säilyttäjä Sopivimman säilyttäjän arvo on "paras" tai jollain muulla tavoin halutuin siihen asti läpikäydyistä arvoista. Arvojen paremmuuden mittamisessa ei ole mitään rajoituksia: halutuin voi tarkoittaa esimerkiksi pienintä tai suurinta lukua tai sellaista lukua, joka on lähinnä jotain tiettyä arvoa. Esimerkkiohjelma selvittää, mikä käyttäjän syöttämistä kymmenestä kokonaisluvusta on pienin. Muuttuja pienin on sopivimman säilyttäjä, koska siihen sijoitetaan (rivillä 13) tuorein arvo, mikäli se on pienempi kuin pienin tähän mennessä läpikäydyistä. /* 5 */ int i = 0; /* 6 */ int pienin = 0; /* 7 */ int luku = 0; /* 8 */ cout << "Anna 1. luku: "; cin >> pienin; /* 9 */ for( i = 2; i <= 10; ++i ) { /* 10 */ cout << "Anna << i <<. luku: "; /* 11 */ cin >> luku; /* 12 */ if( luku < pienin ) { /* 13 */ pienin = luku; /* 14 */ } /* 15 */ } /* 16 */ cout << "Pienin luku oli " << pienin << endl; /* 17 */ return EXIT_SUCCESS; /* 18 */ } (Muuttuja i on askeltaja ja luku on tuoreimman säilyttäjä.) Kokooja Kokoojan arvo kerääntyy kaikista siihen mennessä läpikäydyistä arvoista. Esimerkkiohjelma ottaa vastaan yksi kerrallaan käyttäjän syöttämiä kokonaislukuja, kunnes käyttäjä syöttää luvun -999, jonka jälkeen ohjelma laskee syötteiden keskiarvon. Muuttuja summa on kokooja: siihen kootaan (rivillä 11) syötteiden kokonaissummaa. /* 5 */ int lkm = 0; /* 6 */ double summa = 0; /* 7 */ double luku = 0; /* 8 */ while( luku!= -999 ) { /* 9 */ cout << "Anna luku, -999 lopettaa: "; /* 10 */ cin >> luku; /* 11 */ if( luku!= -999 ) { summa += luku; lkm++; } /* 10 */ } /* 11 */ if( lkm!= 0 ) { /* 12 */ cout << "Keskiarvo on " << summa / lkm << endl; /* 12 */ } /* 12 */ return EXIT_SUCCESS; /* 13 */ } (Muuttuja lkm on askeltaja ja luku on tuoreimman säilyttäjä.)

Seuraaja Seuraaja saa aina arvokseen jonkin tietyn toisen muuttujan vanhan arvon. Esimerkkiohjelma pyytää käyttäjältä 12 kokonaislukua ja kertoo lopuksi, mikä oli suurin kahden perättäisen syötetyn luvun ero. Muuttuja edellinen on seuraaja: se seuraa muuttujaa nykyinen (rivillä 9). /* 5 */ int kuukausi = 0; /* 6 */ int nykyinen = 0; /* 7 */ int edellinen = 0; /* 8 */ int suurinero = 0; /* 9 */ cout << "Anna 1. arvo: "; cin >> edellinen; /* 10 */ cout << "Anna 2. arvo: "; cin >> nykyinen; /* 11 */ suurinero = nykyinen - edellinen; /* 12 */ for( kuukausi = 3; kuukausi <= 12; ++kuukausi ) { /* 13 */ edellinen = nykyinen; /* 14 */ cout << "Anna << kuukausi <<. arvo: "; /* 15 */ cin >> nykyinen; /* 16 */ if( nykyinen - edellinen > suurinero ) { /* 17 */ suurinero = nykyinen edellinen; /* 18 */ } /* 19 */ } /* 20 */ cout << "Suurin ero oli << suurinero << endl; /* 21 */ return EXIT_SUCCESS; /* 22 */ } (Muuttuja kuukausi on askeltaja, nykyinen on tuoreimman säilyttäjä ja suurinero on sopivimman säilyttäjä.) Seuraajia käytetään paljon linkitettyjen tietorakenteiden yhteydessä osoittamaan käsiteltävää alkiota edeltänyttä alkiota.

Yksisuuntainen lippu Yksisuuntainen lippu on bool-tyyppinen muuttuja, joka ei saa enää alkuperäistä arvoaan sen jälkeen, kun se on kerran muuttunut. Esimerkkiohjelma tulostaa käytäjän antamien lukujen summan ja ilmoittaa oliko syötteiden joukossa yhtään negatiivista lukua. Yksisuuntainen lippu neg tarkkailee (rivillä 12) esiintyykö syötteiden joukossa yhtään negatiivista arvoa ja jos yksikin negatiivinen arvo löytyy, ei muuttuja enää palaa arvoon false. /* 5 */ int luku = 1; /* 6 */ int summa = 0; /* 7 */ bool neg = false; /* 8 */ while( luku ) { /* 9 */ cout << "Anna luku, 0 lopettaa: "; cin >> luku; /* 10 */ summa += luku; /* 11 */ if( luku < 0 ) { /* 12 */ neg = true; /* 13 */ } /* 14 */ } /* 15 */ cout << "Summa on << summa; /* 16 */ if( neg ) { cout << "Joukossa oli negatiivisia lukuja" << endl; } /* 17 */ return EXIT_SUCCESS; /* 18 */ } (Muuttuja luku on tuoreimman säilyttäjä ja summa on kokooja.) Yksisuuntaista lippua voidaan käyttää myös esimerkiksi tarkkailemaan virheen esiintymistä syöttötiedoissa, jotta ohjelma huomaisi pyytää syötteitä uudelleen.

Tilapäissäilö Muuttuja on tilapäissäilö, jos sen arvoa tarvitaan aina vain hyvin lyhyen ajan. Esimerkkiohjelma ottaa vastaan käyttäjän syöttämiä tuotteiden verottomia hintoja ja tulostaa aina kokonaishinnan ja veron osuuden siitä. Tilapäissäilöön vero lasketaan veron suuruus (rivillä 10), jota käytetään sitten välittömästi seuraavassa lauseessa kahteen kertaan (rivillä 12). /* 2 */ const int VEROPROSENTTI = 16; /* 3 */ int main() { /* 5 */ double veroton = 0; /* 6 */ double vero = 0; /* 6 */ while( veroton < 0 ) { /* 7 */ cout << "Anna veroton hinta (lopettaa negatiivisella): "; /* 8 */ cin >> veroton; /* 9 */ if( veroton >= 0 ) { /* 10*/ vero = veroton * VEROPROSENTTI / 100; /* 11 */ cout << "Kokonaishinta << veroton + vero <<, josta vero /* 12 */ << vero << endl; /* 13 */ } /* 14 */ } /* 15 */ return EXIT_SUCCESS; /* 16 */ } (Muuttuja veroton on tuoreimman säilyttäjä.) Tilapäissäilöä käytetään tyypillisesti ohjelman tehostamiseen (suorittamalla laskutoimitus, jonka tulosta tarvitaan useasti, vain kertaalleen) tai ohjelman selventämiseen (laskemalla tulos omaan muuttujaansa vaikka tämä ei ole välttämättä tarpeen). Tilapäissäilöä käytetään usein myös järjestelijän kahden alkion keskinäisen paikan vaihtamiseen.

Järjestelijä Järjestelijä on tietorakenne, jota käytetään siinä olevien tietojen uudelleen järjestämiseen sen jälkeen, kun se on ensin alustettu joillakin arvoilla. Esimerkkiohjelma pyytää käyttäjältä merkki kerrallaan yhteensä kymmenen merkkiä taulukkona toteutettuun järjestelijään merkki, kääntää niiden järjestyksen taulukossa ja lopuksi tulostaa merkit tässä käännetyssä järjestyksessä. /* 1 */ #include <stdio.h> /* 2 */ int main() /* 3 */ { /* 4 */ char merkki[10], tmp; /* 5 */ int i; /* 6 */ printf("anna kymmenen kirjainta: "); /* 7 */ for (i = 0; i < 10; i++) scanf("%c", &merkki[i]); /* 8 */ for (i = 0; i < 5; i++) { /* 9 */ tmp = merkki[i]; /* 10 */ merkki[i] = merkki[9-i]; /* 11 */ merkki[9-i] = tmp; /* 12 */ } /* 13 */ for (i = 0; i < 10; i++) printf("%c", merkki[i]); /* 14 */ printf("\n"); /* 15 */ exit(0); /* 16 */ } (Muuttuja tmp on tilapäissäilö ja i on askeltaja.) Järjestelijää voidaan käyttää lajitteluun tai muuhun uudelleenjärjestelyyn. Säiliö Säiliö on tietorakenne, johon voidaan lisätä ja josta voidaan poistaa tietoja. Esimerkkiohjelma toteuttaa pinon, johon käyttäjä voi lisätä uusia kokonaislukuja komennolla "u" (riveillä 11-15) ja poistaa pinossa vielä olevista luvuista viimeksi lisätyn komennolla "p" (riveillä 16-20). Pino tallennetaan säiliönä toimivaan taulukkoon taulukko. /* 1 */ #include <stdio.h> /* 2 */ #define MAXINDEKSI 9 /* 3 */ int main() /* 4 */ { /* 5 */ int pinta=-1, taulukko[maxindeksi]; /* 6 */ int uusi; /* 7 */ char komento='x'; /* 8 */ while (komento!= 'q') { /* 9 */ printf("anna komento: "); scanf(" %c", &komento); /* 10 */ switch (komento) { /* 11 */ case 'u': if (pinta < MAXINDEKSI) { /* 12 */ printf("anna sisältö: "); scanf("%d", &uusi); /* 13 */ taulukko[++pinta] = uusi; /* 14 */ } /* 15 */ break; /* 16 */ case 'p': if (pinta >= 0) { /* 17 */ printf("poistuu %d.\n", taulukko[pinta]); /* 18 */ pinta--;

/* 19 */ } /* 20 */ break; /* 21 */ } /* 22 */ } /* 23 */ exit(0); /* 24 */ } (Muuttuja pinta on kulkija, uusi on tuoreimman säilyttäjä ja komento on tuoreimman säilyttäjä.) Kulkija Kulkija käy läpi jotain tietorakennetta. Esimerkkiohjelma toteuttaa erityisellä alkuelementillä varustetun linkitetyn listan, johon käyttäjä voi lisätä kokonaislukuja komennolla "u" (riveillä 13-18) ja tulostaa listan komennolla "t" (riveillä 19-24). Muuttuja p on kulkija: se käy läpi listan kaikki alkiot (riveillä 15 ja 22). /* 1 */ #include <stdio.h> /* 2 */ struct alkio {int sisalto; struct alkio *linkki;}; /* 3 */ int main() /* 4 */ { /* 5 */ struct alkio *alku, *p, *t; /* 6 */ int uusi; /* 7 */ char komento='x'; /* 8 */ alku = (struct alkio*) malloc(sizeof(struct alkio)); /* 9 */ alku->linkki = NULL; /* 10 */ while (komento!= 'q') { /* 11 */ printf("anna komento: "); scanf(" %c", &komento); /* 12 */ switch (komento) { /* 13 */ case 'u': printf("anna sisältö: "); scanf("%d", &uusi); /* 14 */ p = alku; /* 15 */ while (p->linkki) p = p->linkki; /* 16 */ t = (struct alkio*) malloc(sizeof(struct alkio)); /* 17 */ t->sisalto = uusi; t->linkki = NULL; p->linkki = t; /* 18 */ break; /* 19 */ case 't': p = alku->linkki; /* 20 */ while (p) { /* 21 */ printf("%d\n",p->sisalto); /* 22 */ p = p->linkki; /* 23 */ } /* 24 */ break; /* 25 */ } /* 26 */ } /* 27 */ exit(0); /* 28 */ } (Muuttuja alku on kiintoarvo, t on tilapäissäilö, uusi on tuoreimman säilyttäjä, komento on tuoreimman säilyttäjä, kenttä sisalto on kiintoarvo ja kenttä linkki on kiintoarvo.) Enemmän tietoa muuttujien rooleista ja niihin liittyvästä tutkimuksesta löytyy nettisivulta: http://cs.joensuu.fi/~saja/var_roles/ Pääsyyllinen näiden käyttöönottamiseen ohjelmoinnin opetuksessa: Jorma.Sajaniemi@Joensuu.Fi