-ohjelmointikurssi 1998-1999. luentomoniste ja tehtävät

Samankaltaiset tiedostot
Java-kielen perusteet

Java-kielen perusteet

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

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

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Python-ohjelmointi Harjoitus 2

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

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Harjoitus 3 (viikko 39)

ITKP102 Ohjelmointi 1 (6 op)

Kääntäjän virheilmoituksia

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Ohjelmoinnin perusteet Y Python

Harjoitustyö: virtuaalikone

Ohjelmoinnin perusteet Y Python

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

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

13. Loogiset operaatiot 13.1

Ohjelmoinnin perusteet Y Python

Java-kielen perusteita

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

Ohjelmointiharjoituksia Arduino-ympäristössä

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Tietueet. Tietueiden määrittely

Zeon PDF Driver Trial

Tietotyypit ja operaattorit

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

Osoitin ja viittaus C++:ssa

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: {

Harjoitus 5 (viikko 48)

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3

Ohjelmassa on käytettävä funktiota laskeparkkimaksu laskemaan kunkin asiakkaan maksu. Funktio floor pyöristää luvun lähimmäksi kokonaisluvuksi.

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

5. HelloWorld-ohjelma 5.1

Ohjelmoinnin peruskurssi Y1

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

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ehto- ja toistolauseet

ITKP102 Ohjelmointi 1 (6 op)

Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä.

Harjoitus 2 (viikko 45)

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

4. Lausekielinen ohjelmointi 4.1

Muuttujien roolit Kiintoarvo cin >> r;

Ohjelmoinnin peruskurssi Y1

Harjoitus 4 (viikko 47)

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

7. Näytölle tulostaminen 7.1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Ohjelmoinnin peruskurssi Y1

811120P Diskreetit rakenteet

13. Loogiset operaatiot 13.1

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

Ohjelmoinnin peruskurssi Y1

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

Apuja ohjelmointiin» Yleisiä virheitä

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

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Muuttujat ja kontrolli. Ville Sundberg

Ohjelmoinnin perusteet Y Python

Plagioinnin tunnistaminen lähdekielisistä ohjelmista

ITKP102 Ohjelmointi 1 (6 op)

11. Javan toistorakenteet 11.1

Harjoitus 6 (viikko 42)

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

Ohjelmoinnin perusteet Y Python

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

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva

6. Muuttujat ja Java 6.1

13 Operaattoreiden ylimäärittelyjä

Ohjelmoinnin perusteet Y Python

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3 opettaja: Pasi Ranne

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

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

Ohjelmoinnin perusteet Y Python

Harjoitus 5 (viikko 41)

Tutoriaaliläsnäoloista

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

811120P Diskreetit rakenteet

ELEC-A4010 Sähköpaja Arduinon ohjelmointi. Jukka Helle

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

Transkriptio:

-ohjelmointikurssi 1998-1999 luentomoniste ja tehtävät

Sisällysluettelo C++-KIELESTÄ...2 KONEKIELI JA LAUSEKIELI...3 C++-KIELEN OHJELMAN RAKENNE...4 TYYPIT JA MUUTTUJAT...6 OPERAATTOREISTA...8 TYYPPIMUUNNOKSET...11 FUNKTIOT...13 MUUTTUJIEN NÄKYVYYSALUEET...15 SYÖTTÖ...17 EHTOLAUSE IF...19 SWITCH-RAKENNE...24 SILMUKAT...25 TAULUKOT...27 MERKKIJONOT : CHAR-TAULUKKO...28 MERKKIJONOT : STRING...30 SUDENKUOPPIA C:SSÄ JA C++:SSA...32 ESIMERKKI KIRJASTOFUNKTIOIDEN KÄYTÖSTÄ...34 LIITE A: ASCII -TAULUKKO...35 LIITE B: TYYPPIEN TARKENNUKSET...36 LIITE C: VUOKAAVION SYMBOLIT...37 ERIKOISTEHTÄVIÄ...38 LÄHDELUETTELO...39 1

C++-kielestä Kehittänyt Bjarne Stroustrup Laajalti käytetty, eräänlainen teollisuusstandardi Lähes jokaiseen käyttöjärjestelmään saatavilla C++-kääntäjä C++ on tarpeeksi monipuolinen monimutkaistenkin rakenteiden toteuttamiseen C++ on kehitetty C-kielestä. Pieniä yksityiskohtia lukuun ottamatta C++ on C -ohjelmointikielen laajennus. Miksi C valittiin C++:n pohjaksi? Miljoonia rivejä ohjelmia ja kirjastofunktioita on tehty C:llä, joita voidaan käyttää C++:ssa, koska C++ on linkitettävästi yhteensopiva ja syntaktisesti samanlainen kuin C. On olemassa satoja tuhansia ohjelmoitsijoita jotka käyttävät C:tä, joiden tarvitsee oppia vain C++:n uudet piirteet. C++:aa ja C:tä tullaan käyttämään sekaisin samoissa systeemeissä vuosikausia, joten erojen täytyi olla joko erittäin suuria tai pieniä minimoidakseen virheet ja ohjelmistojen sekavuutta. C:n kirjastoja voidaan käyttää C++ -ohjelmassa, ja useimpia C- ohjelmointityökaluja voidaan käyttää myös C++ -ohjelmointiin. C++ on saanut vaikutteita myös mm. kielistä BCPL, Simula67, Algol68 ja Ada. Mikä C++ on? parempi C tukee datan kätkemistä tukee olio-ohjelmointia yms. 2

Konekieli ja lausekieli Konekieli muodostuu ykkösen ja nollien muodostamista käskyistä. Eri ohjelmointikielillä kirjoitetut ohjelmat joudutaan aina kääntämään konekieleksi, koska tietokone ei ymmärrä muita kieliä. Lähinnä konekieltä on symbolinen konekieli eli assembly, jossa jokaista käskyä vastaa lyhyt kirjainyhdistelmä ja muistiosoite. Assembly vaatii kuitenkin yksityiskohtaista tuntemusta tietokoneen sisäisestä rakenteesta ennen kuin sillä saa aikaan ohjelmia, ja on vaivalloinen ja virhealtis käyttää. Lausekieltä on helpompi käyttää, koska se muistuttaa enemmän luonnollista kieltä. Esimerkkinä näistä ovat C, C++, Java, Ada, Pascal ja BASIC. C++ on käännettävä ohjelmointikieli. Ero tulkattavan ja käännettävän ohjelmointikielen kohdalla on se, että käännettävä kieli käännetään ajettavaksi ohjelmaksi ennen ajoa, ja tulkattavaa kieltä käännellään sitä mukaa, kun ohjelman suoritus etenee. Eräs esimerkki tulkattavasta kielestä on BASIC. C++:lla ohjelman tekeminen tapahtuu suurin piirtein näin: Ohjelma kirjoitetaan eli koodataan, josta syntyy lähdekoodi (source) Lähdekoodi käännetään konekielelle Linkkeri yhdistää luodut tiedostot valmiiksi käännettyihin kirjastoihin ja muodostaa ajettavan ohjelman Ohjelma on valmis 3

C++-kielen ohjelman rakenne C++ -ohjelma koostuu funktioista ja muuttujista. Pääohjelma, eli mistä ohjelmaa aletaan ajamaan on funktio main. Esimerkki: #include <iostream.h> int main () { cout << Hello World << endl; Tämä ohjelma tulostaa ruudulle Hello World ja rivinvaihdon. ( endl tarkoittaa rivinvaihtoa ja vastaa C:n rivinvaihtomerkkiä \n. Muita erikoismerkkejä ovat mm. \t tabulaattori ja \b backspace ). Rivillä 1 #include liittää ohjelmaan mukaan kirjaston iostream.h, joka sisältää mm. funktion cout. (Kirjaston (library) ideana on laajentaa kieltä niin, että joukko pieniä ohjelmia tallennetaan funktioiksi kirjastoon, joka on sitten kenen tahansa käytettävissä.) Ruudulle tulostaminen tapahtuu cout:lla rivillä 3. Funktion main tulee palauttaa arvonaan jokin kokonaisluku, kuten rivillä 4:. Jokainen lause loppuu puolipilkkuun (;). Poikkeuksen muodostavat #:lla alkavat ns. esiprosessorin direktiivit, esim #include ja aaltosulut {. Funktioilla on esittelyosa ja määrittelyosa. Esittelyosassa määritellään funktion muuttujat ja määrittelyosa sisältää suoritettavat lauseet. Esittelyosan tulisi olla ennen määrittelyosaa. (C:ssa pakko). Funktioiden ja muuttujien niminä kannattaa käyttää tavallisia kirjaimia, mutta ei skandinaavisia merkkejä, välilyöntejä tai erikoismerkkejä. 4

Tehtäviä 1. Kirjoita ohjelma Hello World koneellesi ja aja se. 2. Muokkaa Hello World ohjelma niin, että se tulostaa nimesi. 3. Ota pois puolipilkku cout- lauseen lopusta, käännä ohjelma ja katso, mistä kääntäjä herjaa. 4. Muuta ohjelmaa niin, että World -merkkijono tulostuu omalle rivilleen ( vihje: endl ) 5. Muuta ohjelmaa niin, että tulostat Hello World kahdella eri cout -käskyllä. 6. Lisää ohjelmaan rivi, joka tulostaa merkkijonon toinen rivi. 7. Mitä virheitä seuraavassa koodinpätkässä on? Voit kokeilla myös kääntää ohjelmaa. #include <iostream.h> int main () { cout Introduction to C++ programming language << endl; return 5

Tyypit ja muuttujat C:ssä ja C++:ssa jokaisella muuttujalla tulee olla tyyppi. Perustyyppejä ovat seuraavat: int char float double kokonaisluku merkki desimaaliluku (liukuluku) tarkempi desimaaliluku kuin float Esim. int luku; char merkki; int a=1; a=1; // kokonaisluvun esittely // merkin esittely // luvun a alustus // sijoitus muuttujaan a Tyyppeihin voi myös lisätä tarkentimia (short, long, signed, unsigned, ks. liite B). Muuttujat täytyy esitellä ennen käyttöä ja ne voidaan alustaa esittelyn yhteydessä. Esimerkki ohjelmasta, jossa käsitellään muuttujaa. 1 #include <iostream.h> 2 int main () { 3 int a; // esittely 4 a = 1; // sijoitus 5 cout << a; // luvun tulostus 6 7 Ohjelmaan voidaan lisätä kommentteja koodin havainnollistamiseksi ja yleensäkin selittämään, mitä kukin osa tekee. Kommentti C++:ssa alkaa // -merkillä ja loppuu rivinvaihtoon. // tässä on kommentti Rivillä 3 esitellään kokonaislukumuuttuja a. Rivillä 4 sijoitetaan muuttujaan a luku 1 ja rivillä 5 tulostetaan a. Rivillä 5: cout huomaa automaattisesti minkä tyyppinen muuttuja on tulostettavana. cout:lla voi tulostaa myös useammat luvun, merkin tai merkkijonon samalla rivillä. Nämä erotetaan toisistaan << -merkinnällä. Merkkien (char) alustus tapahtuu samaan tapaan kuin lukujen. Huomaa :n käyttö sijoituksessa! Merkkijonoihin palataan taulukoiden yhteydessä. Esim. char kirjain = Q ; cout << kirjain; 6

Merkkejä voidaan vertailla samaan tapaan kuin lukuja. Vertailu tapahtuu ASCII-taulukon* merkkejä vastaavien lukujen avulla. Tätä voidaan käyttää hyväksi mm. aakkostamisessa. * ks. liite A Tehtäviä 1. Tee ohjelma, joka esittelee muuttujan (int) a, sijoittaa siihen luvun 3 ja tulostaa a:n arvon. 2. alustaa muuttujan a 3:lla, ja tulostaa a:n arvon. 3.... tulostaa luvun 4. 4. esittelee muuttujan (char) c, sijoittaa siihen kirjaimen B ja tulostaa muuttujan c. 7

Operaattoreista Laskujärjestyksen nyrkkisääntönä voisi sanoa, että ensimmäisinä suoritetaan (evaluoidaan) sulkujen sisältö (), sitten laskutoimitukset *, /, %,... ja sitten laskutoimitukset +, -,... siten, että samanarvoiset lasketaan oikealta vasemmalle. Esim. lauseessa 1+2*3 lasketaan ensin 2*3, joka lisätään sitten lukuun 1, lopullinen tulos on siis 7, kun taas (1+2)*3 tuottaisi luvun 9. Taulukossa operaattorit ovat järjestyksessä (ensin käsitellään ylinnä olevat). Kaikkia taulukon operaattoreita ei ole vielä käsitelty, joten ei syytä paniikkiin. () [] sulkeet, taulukko! negaatio (NOT) * / % kertominen, jakolasku, jakojäännös + - summa, vähennys < <= > >= pienempi kuin, pienempi tai yhtäsuuri, suurempi kuin, suurempi tai yhtäsuuri ==!= yhtäsuuri, erisuuri && JA (AND) TAI (OR) = sijoitus Kryptisimmät operaattorit ovat jätetty pois lähinnä koska niillä saa aikaan täysin käsittämättömän näköistä koodia. Myös pointtereita ei käsitellä tässä. Mikäli olet epävarma laskujärjestyksestä, käytä sulkuja. Sulkuja voi käyttää myös selkeyttämään koodin rakennetta. Huom! = on sijoitus ja == on yhtäsuuruusvertailu! Tämä on yksi yleisimmistä sudenkuopista C:ssä ja C++:ssa, varsinkin if -ehtolauseissa. Myös & ja &&:n sekä ja :n kanssa on oltava tarkkana, koska & ja ovat bittikohtaisia operaatioita (jätetään väliin tässä). C:ssa totuusarvot määritetään siten, että 0 on epätosi ja kaikki muut arvot tosia. Kokonaisluvuilla (integer) jaettaessa tulos pyöristyy alaspäin. Esim. 8 / 3 = 2. 8

Esimerkki: #include<iostream> int main () { int a; // esittely int b; a = 2; // sijoitus b = 3; cout << (a + b * a) << endl; // lasku ja tulostus Muuttujiin voi sijoittaa myös toisia muuttujia. #include<iostream> int main () { int a = 2; // alustus int b = 3; int c = 0; c = a + b * a; cout << c << endl; Alustamattomista muuttujista saattaa olla yllättävääkin päänvaivaa laajemmissa ohjelmissa. Niiden arvo saattaa olla aivan mitä tahansa. (Kokeilepa jättää esim. edellisestä esimerkistä b:n alustus pois). Tämä johtuu siitä, että muuttujaa esitellessä vain varataan vapaasta muistista muuttujan tyypin mukainen tavumäärä. Muuttujaan sijoitettaessa varattu muistialue käytetään. 9

Tehtäviä: Muuttujat ja operaattorit 1. Tee ohjelma, joka tulostaa lukujen 2, 5 ja 7 summan. 2.... esittelee muuttujat a, b ja c, sijoittaa niihin arvot 4, 10 ja 50, ja tulostaa muuttujien summan. 3. tulostaa π:n likiarvon (sopivalla tarkkuudella) 4.... alustaa muuttujan p π:n likiarvolla, ja tulostaa p:n 5. Mikä virheitä seuraavassa ohjelmassa on? #include<iostream>; int main () { char aakkonen = a ; cout Variable is now << aakkonen << endl 6. Tee ohjelma, joka tulostaa lukujen 5, 7 ja 9 keskiarvon. 7.... lukujen 6, 7 ja 9 summan keskiarvon. Vihje 7. Voit jakaa desimaaliluvulla tai käyttää float -typpisiä muuttujia. 10

Tyyppimuunnokset Jotta erityyppisiä muuttujia voitaisiin käsitellä samassa lauseessa, täytyy ne muuttaa samantyyppisiksi. Kääntäjä tekee myös automaattisesti tyyppimuunnoksia (joista useimmista ei ohjelmoijan tarvi päätään vaivata, mutta joistain saattaa tulla yllättävääkin päänvaivaa). Ohjelmoijan tekemät muunnokset tehdään ns. cast -operaattorilla. Muuttuja esitellään eri tyyppisenä laittamalla muuttuja sulkeisiin tyypin jälkeen. Huom: tämä ei muuta itse muuttujan tyyppiä! Esim. int t = 42; cout << char (t); Tulostaa lukua 42 vastaavan ASCII -merkin *. Muuttuja t on edelleen tyyppiä int. Esimerkki, jossa desimaaliluku tulostetaan kokonaislukuna: float p = 3.1415; cout << int (p); Tulostaa ruudulle 3 (int). Muista, että kokonaisluvuksi muutettaessa desimaaliluku pyöristyy alaspäin. Esimerkki, joka tulostaa ruudulle kirjaimen Q : int n = 81; char m; m = char (n); cout << m; m on nyt lukua 81 vastaava merkki Q ja n edelleen kokonaisluku 81. 11

Tehtäviä: Typpimuunnokset 1) Tee ohjelma, joka tulostaa lukua 65 vastaavan merkin ( int char ). 2)... lukua 35 vastaavan merkin. 3)... lukua 62 vastaavan merkin. 4)... merkkiä T vastaavan luvun ( char int ). 5)... merkkiä [ vastaavan luvun. 6)... merkkiä @ vastaavan luvun. 7)... desimaaliluvun (float) 8.1 kokonaislukuna (int). 8)... desimaaliluvun 8.99 kokonaislukuna. Vihjeet luku ASCII 35 # 62 > 64 @ 65 A 84 T 91 [ ( Liitteessä A on C++:lla tehty ASCII -kartta ). 12

Funktiot Ohjelman kasvaessa tulee vastaan tilanne, jossa esim. samaa operaatiota vaaditaan useammassa paikassa. Funktioita voidaan kutsua pääohjelmasta (main), ja niille voidaan välittää arvoja. Funktion yleinen muoto: paluutyyppi funktio ( argumentit ) {... Itse main -funktio on int -tyyppinen, joten se palauttaa jonkin lukuarvon. Funktion paluuarvo palautetaan komennolla return. main -funktion paluuarvo 0 tarkoittaa sitä, että ohjelman suoritus oli virheetön. void -tyyppinen funktio ei palauta mitään. Esimerkki, jossa pääohjelmasta kutsutaan funktiota tulosta: #include<iostream> void tulosta () { cout << Pikkarainen << endl; int main () { tulosta(); Esim. #include<iostream> int summa ( int a, int b ) { return (a + b); int main () { int luku; luku = summa ( 1, 2 ); cout << luku << endl; Huomattavaa on, että funktion summa muuttuvat a ja b näkyvät vain funktion sisällä, eivätkä esim. main -ohjelmaan. summa palauttaa arvon, joka tässä esimerkissä on 3. Palautettu arvo sitten sijoitetaan pääohjelmassa muuttujaan luku ja tulostetaan. 13

Funktiolle summa annettua kahta kokonaislukua kutsutaan argumenteiksi. Jos funktion nimi koostuu useammasta sanasta, voidaan funktion nimessä käyttää alaviivaa yhdistelemään sanoja, esim. tulosta_ruudulle. Tehtäviä: Funktiot 1. Tee ohjelma Hello World! siten, että tulostus tapahtuu funktiossa tulosta, jota kutsutaan pääohjelmasta. 2. Tee funktio, joka palauttaa kolmen int -muuttujan summan. 3.... kahden int -muuttujan tulon. 4. sille annetun ASCII-merkkiä vastaavan luvun. 5. nollan, jos sille annettu argumentti on kolmella jaollinen. 14

Muuttujien näkyvyysalueet Muuttujan näkyvyysalue tarkoittaa sitä osaa koodia, jossa muuttujaa voidaan käyttää. Tavallisesti muuttujan ovat lokaalisia (paikallisia). Aaltosulkujen { erottamassa kokonaisuudessa eli lohkossa esitellään lokaalit muuttujat. Lohkossa esitelty muuttuja näkyy myös lohkon alilohkoihin. Muuttujat syntyvät, kun ne esitellään ja häviävät, kun mennään alueelle, jossa ne eivät enää ole voimassa. Globaali muuttuja näkyy kaikkialla koodissa. Globaaliksi muuttujan tekee se, että se on kirjoitettu jokaisen funktion ulkopuolelle. Koska tällaisen muuttujan arvoa voidaan käsitellä missä paikassa hyvänsä, virheiden löytäminen virhetilanteissa voi olla työlästä. Vältä globaaleja muuttujia. Esim. float f; void trunc ( float x ) { int b;... int main () { float e;... muuttuja näkyvyysalue f globaali x funktiossa void trunc () b lohkossa void trunc () e pääohjelmassa globaali f pääohjelma e trunc -funktio x b 15

Tehtäviä: Muuttujien näkyvyysalueet 1. Mitkä ovat muuttujien a, c ja d näkyvyysalueet? #include<iostream> int a; void lisaa ( int c ) { a = a + c; int main () { int d; a = 0; d = 1; lisaa (d); 16

Syöttö Käyttäjän syötetietoja voidaan lukea käskyllä cin. Ohjelman ajaminen pysähtyy cin:n ajaksi ja käyttäjä voi tällöin antaa jonkin luvun, merkin tai merkkijonon ja sitten painaa return -näppäintä. Syöte sijoittuu cin >>:n ohjaamaan muuttujaan. Merkkijonoa luettaessa cin lukee välilyöntiin tai rivinvaihtoon saakka. Esimerkki ohjelmanpätkästä, joka esittelee muuttujan a ja sijoittaa siihen käyttäjän antaman luvun. int a; cin >> a; Esimerkki: Ohjelma, joka lukee luvun a ja tulostaa sen. #include<iostream> int main () { int a; cout << Anna luku << endl; cin >> a; cout << Luku oli: << a << endl; Esimerkki: Ohjelma, joka kysyy pallon sädettä ja tulostaa sen tilavuuden #include<iostream> float pii = 3.1415; float vol (float r) { // funktio vol palauttaa floatin return (4.0/3.0*pii*r*r*r); int main () { float r; cout << Anna säde: ; cin >> r; cout << endl << Pallon tilavuus = << vol(r) << endl; 17

Tehtäviä: Syöttö 1. Tee ohjelma, joka kysyy käyttäjältä lukua ja tulostaa sen. 2.... kahta lukua ja tulostaa niiden summan. 3.... ympyrän sädettä ja tulostaa sen pinta-alan. ( π r 2 ) 4. Tee ohjelma, joka kysyy suorakulmaisen kolmion kahta kateettia ja tulostaa kolmion hypotenuusan. Neliöjuurifunktio sqrt löytyy kirjastosta math.h. 18

Ehtolause if If -lause on muotoa if ( ehto ) { toteutetaan jos ehto on tosi else { toteutetaan jos ehto on epätosi Else-osa ei ole pakollinen. Esimerkki ohjelmanpätkästä, joka tarkistaa onko a:n arvo 1. Kuvassa 1 on sama esitetty vuokaaviona. (Vuokaavion symbolit ovat liitteessä C). int a = 1; if ( a == 1 ) { cout << a oli 1 << endl; Kuva 1 19

Toinen esimerkki: int a = 1; if ( a == 1 ) { cout << a oli 1 << endl; else { cout << ei ollutkaan << endl; Esimerkki ohjelmasta, joka vertailee kahden muuttujan arvoja: #include<iostream> int main () { int a; int b; a = 3; b = a - 1; if ( a > b ) { cout << a on suurempi kuin b << endl; Miksi seuraavat ohjelmanpätkät toimivat eri tavalla? if ( a == 0 ) { cout << a oli nolla << endl; // oikein if ( a = 0 ) { cout << a oli nolla << endl; // väärin Ehto voi myös olla moniosainen, jolloin eri osat erotetaan toisistaan loogisilla operaattoreilla. && JA (AND) TAI (OR)! EI (NOT) 20

Esim. if ( a == 1 && b == 1 ) {... // jos a on 1 JA b on 1 if ( a == 1 b == 1 ) {... // jos a on 1 TAI b on 1 if ( a!= 1 ) {... // jos a ei ole 1 if ( a == 3 && b!= 4 c == 12 ) {... if ( d == N ) {... // jos merkki d on N if ( d == Q d == d == \n ) {... // jos d on Q, välilyönti tai rivinvaihto Myös else-osan jälkeen voi olla if -lause. if ( ehto ) { jos ehto oli tosi else if ( toinen ehto ) { ellei ollut, niin jos toinen ehto oli tosi else { muussa tapauksessa 21

Tehtäviä: Ehtolauseet 1. Miten seuraavat if -lauseet toimivat? Oletetaan, että a ja b ovat tyyppiä int ja c char. if ( a > 6 ) {... if ( a == 0 ) {... else {... if ( (-3 < a) && (a < 3) ) {... if ( a!= b ) {... if ( a > b ) {... if ( c == N c == R ) {... if ( c == v ) {... else if ( c == w ) {... else {... if ( c >= 0 && c <= 9 ) {... if (! (a == b) ) { 2. Miten muotoilisit seuraavat if -lauseiksi? Oletetaan, että a ja b ovat tyyppiä int. Muista = ja == :n ero ja että voit yhdistellä JA ja TAI -lauseita. a) a on nolla b) a on yhtäsuuri kuin 7 c) a on pienempi kuin 16 d) a on suurempi kuin 16 e) a on suurempi tai yhtäsuuri kuin 0 f) a on pienempi tai yhtäsuuri kuin 0 g) a ei ole nolla h) a ei ole negatiivinen i) b on pienempi kuin 10 j) a on b k) a ei ole b l) a on suurempi kuin b m) a on 1 tai 2 n) a on 1, 3 tai 5 o) a on -10, b tai 10 p) a on 0 tai suurempi kuin 127 q) 0 < a < b r) a on suurempi kuin 0 ja pienempi kuin b s) a on välillä 0...255 t) a on välillä 0...b 3. Muuta seuraavat C++:n if-lauseiksi. Muuttuja c on tyyppiä char. 22

a) c on f b) c on q c) c on k tai p d) c on rivinvaihto ( \n ) e) c on tabulaattori ( \t ) f) c on (välilyönti, space) g) c on rivinvaihto tai tabulaattori h) c ei ole rivinvaihto i) c ei ole rivinvaihto eikä välilyönti ( ) j) c on ESC-näppäin ( ASCII merkki 27 ) k) c on numero ( ASCII -taulukon merkit 0 9 ) l) c on pieni kirjain ( ASCII -taulukon merkit a z ) m) c on iso kirjain ( ASCII -taulukon merkit A... Z ) n) c on pieni tai iso kirjain o) c ei ole numero p) c on alfanumeerinen merkki k) Vihje luentomonisteen tehtävässä. Toinen vihje: TAI-lauseilla tehty tarkistus saattaa olla työläs... p) Vihje: Alfanumeerisia merkkejä ovat numerot 0 9 sekä kirjaimet a z ja A...Z. Voit myös vilkaista kappaletta "Esimerkki kirjastofunktioiden käytöstä". Karkausvuosi Karkausvuodet ovat vuosilukuja, jotka ovat neljällä jaollisia. Erikoisasemassa ovat 100:lla jaolliset vuosiluvut, joista vain 400:lla jaollisiset ovat karkausvuosia. Jaollisuutta C++:ssa tarkastellaan jakojäännös-operaattorilla %. Jos jakojäännös on 0, luku on jaollinen jakajalla. Tee ohjelmanpätkä, joka kertoo, onko kokonaisluku (int) vuosi karkausvuosi. Esim. laskuoperaatio jakojäännös 8 % 1 = 0 8 % 2 = 0 8 % 3 = 2 8 % 4 = 0 8 % 5 = 3 8 % 6 = 2 8 % 7 = 1 1979 % 4 = 3 1980 % 4 = 0 2000 % 4 = 0 23

Switch-rakenne switch:n parametrinä olevaa muuttujaa (int) testataan, onko se jonkin case-sanan jälkeen tuleva vaihtoehto. Jos on, niin suoritetaan case-lohkon koodi. Sanalla break poistutaan switchrakenteesta. Mikäli se puuttuu, suoritus jatkuu seuraavaan case-lauseeseen. default-lohko (ei ole pakollinen) suoritetaan, jos mikään edellinen lohko ei täsmää. Esim. ( c on tyyppiä int ) switch ( c ) { case 1: cout << ykkönen << endl; break; case 2: cout << kakkonen << endl; break; default: cout << jokin muu << endl; Esim. ( c on tyyppiä char ) switch ( c ) { case + : a = a + 1; break; case - : a = a - 1; break; default: cout << # << endl; Tehtäviä: switch-rakenne 1. Tee ohjelma, joka kysyy käyttäjältä kokonaislukua väliltä 1-3 ja tulostaa luvun sanana. 2. Sama kuin 1, ja jonkin muun luvun kohdalla antaa virheilmoituksen. 3. Miten ensimmäisen esimerkin ohjelmanpätkä toimisi, jos case 1-lohkon break-komento puuttuu? 4. Tee ohjelma, jolla voi laskea yhteen-, vähennys-, kerto- tai jakolaskun (nelilaskin). Tarkista erikseen mahdollinen nollalla jakaminen. 24

Silmukat for -silmukka on muotoa: for ( alustus ; ehto ; askel ) { silmukan koodi Alustus tehdään vain silmukan alussa. Ehto ja askel toteutetaan joka kierroksella. Esim. ohjelmanpätkä, joka tulostaa luvut 1...10 omille rivilleen. int a; for ( a = 1; a <= 10; a = a + 1 ) { cout << a << endl; Kuva 2 Esim. Sarjan 1+2+3+... +10 summa saadaan laskettua seuraavasti: #include<iostream> int main () { int summa = 0; int k; for ( k = 1; k <= 10; k = k + 1 ) { summa = summa + k; cout << Summa oli << summa << endl; 25

while -silmukka on muotoa: while ( ehto ) { silmukka While-silmukkaa kierretään niin kauan, kuin ehto on tosi. Esimerkki ohjelmakoodista, joka tekee saman kuin edellinen for -silmukka. int a = 1; while ( a <= 10 ) { cout << a << endl; a = a + 1; do-rakenne eroaa while:sta siten, että silmukan koodi suoritetaan ehdosta riippumatta ainakin kerran. do { silmukka while ( ehto ); Silmukan toteutustapa valitaan käyttötarkoituksen mukaan. Silmukoissa on syytä olla tarkkana: on myös mahdollista tehdä silmukoita, jotka eivät lopu koskaan. Tehtäviä 1. Tee ohjelma, joka tulostaa for-silmukalla 10 rivillistä merkkijonoa ****. 2.... tulostaa for -silmukalla luvut 1...10 omille riveilleen. 3.... luvut -10...20 välilyönnillä erotettuna. 4. Tee tehtävien 1-3 silmukat while -tekniikalla. 5.... parilliset luvut välillä 1...20. (Huom: useampi tapa toteuttaa) 6.... lukusarjan 0, 3, 6, 9, 12...30 7. Tee ohjelma, joka tulostaa aakkoset (a...z). Käytä tyyppimuunnosta. 8. Miten liitteen A ASCII -taulukko-ohjelma liittyy silmukoihin? Miten se toimii? Vihje: 8. ASCII -koodit 0...31 ja 127 ovat merkkejä, jotka ohjelmassa ovat esitetty tulostettavassa muodossa. Control -näppäinyhdistelmiä merkitään ^-merkillä, esim control+a kirjoitetaan ^A. ASCII merkki 10 (^J) on newline, 13 (^M) vastaa returnia, ^H on backspace jne. 26

Taulukot Taulukko on tietorakenne, johon voidaan tallettaa useampia samantyyppisiä muuttujia. Taulukon muuttujia kutsutaan alkioiksi. Taulukon koko täytyy tietää jo käännösaikana. Käytännössä tämä tarkoittaa sitä, että taulukon koko pitää määritellä koodissa luvulla tai vakiolla. Esimerkki: luodaan taulukko taul, johon mahtuu 4 int -tyyppistä alkiota. int taul[4]; Taulukko voidaan myös alustaa luodessa, jolloin taulukon koko voidaan jättää kääntäjän huoleksi: int taul[] = { 1, 2, 3, 4 ; Esittelyn jälkeen taulukon arvoja voidaan käsitellä yksi kerrallaan. Taulukkoa käsitellään operaattorin [] avulla. Taulukon ensimmäisen alkio C:ssä ja C++:ssa nolla (0). taul[0] = 5; Ensimmäinen alkio on nyt 5. int a; a = taul[1]; a saa arvon 2. Tehtäviä 1) Tee ohjelma, joka luo int-tyyppisen taulukon table, jossa on 6 alkiota. a) Alusta table -taulukon luvuilla 1, 2, 3,... b) Sijoita table:n ensimmäiseen alkioon luku 99. (Ensimmäinen alkiohan oli paikassa [0]). c)... toiseen alkioon luku 10. d)... viimeiseen alkioon luku 1. ( Vihje: ei ole table[6]...) 2) Tee ohjelma, joka kysyy käyttäjältä kolmea lukua, ja sijoittaa ne taulukkoon. 3) Edellinen tehtävä for -silmukkaa käyttäen. 27

Merkkijonot : char-taulukko Char-taulukoilla toteutetut merkkijonot ovat taulukoita ( [] ), jotka loppuvat aina merkkiin \0 (NUL). Esimerkiksi merkkijono foobar on koneen muistissa muodossa: f o o b a r \0 Esimerkki: char array[] = foobar ; cout << array; Taulukon koko on kuitenkin tiedettävä jo käännösaikana. Tämä tarkoittaa sitä, että ohjelmoijan on pidettävä itse huolta siitä, että taulukon koko riittää joka käänteessä. Edellisessä esimerkissä taulukon koko jätettiin kääntäjän huoleksi. Taulukon koon ylitystä ei kääntäjä valvo mitenkään, vaan ohjelma sitten myöhemmin sekoilee tai/ja kaatuu. Taulukkoon saa myöhemmin sijoitettua merkkijonon strcpy:llä, joka löytyy kirjastosta string.h. Esim. char array[10]; strcpy ( array, foobar ); cout << array; Merkkijonoja vertaillaan strcmp -funktiolla (kirjastosta string.h). Jos strcmp palauttaa nollan, merkkijonot ovat samoja. Esim. char automobiili[] = Lada ; if ( strcmp(automobiili, Mosse ) == 0 ) {... Jos haluamme muuttaa merkkijonon ensimmäisen kirjaimen, se sijoitetaan merkkinä taulukon alkuun: array[0] = m ; m o o b a r \0 28

Käyttäjän syötteen voi lukea cin:llä. cin >> array; Tässä kohtaa voi mennä pieleen, miksi? Varsinkin strcat:a (string.h:sta) käytettäessä pitää varmistaa, että taulukossa todellakin on tilaa. strcat kopioi merkkijonon toisen merkkijonon perään. Esimerkki strcat:n käytöstä: char array[20]; strcpy ( array, "esim" ); strcat ( array, "erkki" ); Voit myös lukea merkkejä (välilyönti mukaan lukien) cin.getline:llä: char word[30]; cin.getline ( word, 30 ); // ei mene yli varatun tilan Tehtäviä: char-merkkijono 1. Tee ohjelma, joka alustaa char -taulukon merkkijonolla Wartburg ja tulostaa sen. 2. kysyy käyttäjän nimeä ja tulostaa sen. 3. kopioi merkkijonon 1500 merkkijonon Lada jälkeen ja tulostaa sen. 4.... kysyy käyttäjältä tunnusta ja salasanaa ja tulostaa access granted, mikäli tunnus on jobe ja salasana mainframe. Muussa tapauksessa ohjelma tulostaa access denied. 29

Merkkijonot : string String-tyyppisen merkkijonon C++:ssa saat käyttöön seuraavasti: #include<string> String-merkkijono on C++:n yksi tapa toteuttaa merkkijono. Erona char-taulukkoon on, että string:iä käytetään hieman eri tavalla. Esim. #include<iostream> #include<string> int main () { string s = Hello, World! ; cout << s << endl; Stringejä voidaan liittää toisiinsa seuraavasti: string s1 = Hello, ; string s2 = World ; string s3 = s1 + + s2; Esimerkissä s3 alustetaan merkkijonoksi Hello, World. String-merkkijonojen vertailu tapahtuu == -operaattorilla: if ( s1 == s2 ) {... if ( s1 == Eastwood ) {... Käyttäjän syötteen lukeminen merkkijonoon tapahtuu cin:llä: string str; cin >> str; 30

Vielä yksi esimerkki: string str; cout << Please enter your name << endl; cin >> str; cout << Hello, << str <<! << endl; Tehtäviä: string 1) Tee ohjelma, joka sijoittaa string:iin s merkkijonon olio. 2)... liittää s:n perään merkkijonon -ohjelmointi ja tulostaa sen. 3) kysyy käyttäjän nimeä ja tulostaa sen. 4)... kysyy käyttäjältä tunnusta ja salasanaa ja tulostaa access granted, mikäli tunnus on jobe ja salasana mainframe. Muussa tapauksessa ohjelma tulostaa access denied. 31

Sudenkuoppia C:ssä ja C++:ssa Kokonaisluku int on kääntäjästä tai käyttöjärjestelmästä riippuen joko 16 tai 32-bittinen. (Näin ei ole esim. Javassa, jossa perustyypit ovat tarkemmin standardisoitu). 16:lla bitillä voidaan ilmaista 65 536 lukua ja 32:lla bitillä 4 294 967 296 lukua. Mikäli muuttuja ylittää lukualueen, kääntäjä ei ilmoita virhettä, vaan ohjelma antaa todennäköisesti virheellisiä tuloksia. Toisinaan etumerkillisyyskin voi tuottaa yllätyksiä; int onkin oletusarvoisesti tyyppiä signed (etumerkillinen), jolloin se on väliltä -32768... +32767 (16-bittisillä luvuilla). Esimerkkiohjelma lukualueen ylittämisestä: #include <iostream.h> int main () { signed short int a = -32768; cout << a << endl; a = a - 1; cout << a << endl; Indeksointi alkaa nollasta. Esimerkin ohjelma kääntyy ilman virheilmoituksia, mutta ajettaessa kirjoittaakin varatun muistin ulkopuolelle (mikä pidemmän päälle sekoittaa kaiken PC:ssä). Taulukon ensimmäinen alkio jää myös alustamatta, ja sen arvo saattaa olla mitä tahansa. #include <iostream.h> int main () { int array[3]; int a; for ( a = 1; a <= 3; a = a + 1 ) { array[a] = 0; == on vertailu ja = on sijoitus(operaattori). Esimerkin ohjelmanpätkä sijoittaa 1:n muuttujaan a, ja if-lause tulkitsee tämän olevan tosi. (C:ssa totuusarvot määritetään siten, että 0 on epätosi ja kaikki muut arvot tosia). if ( a = 1 ) { // tämä suoritetaan aina riippumatta a:sta Huom: char-tyyppisiä merkkijonoja ei voi suoraan verrata == -operaattorilla. 32

Näkyvyysalueiden kanssa on myös oltava tarkkana. C:n ja C++:n syntaksi sallii kirjoittaa mitä kryptisimmän näköisiä ohjelmia. Näitä ei ole tässä opetettu, koska lyhenteet voivat olla vaikealukuisia ja myös virhealttiita. Klassinen esimerkki on kaarisulkeiden jättäminen pois if -lauseessa. Esimerkiksi tämä toimii: if ( a == 1 ) cout << jep ;...mutta tämä suorittaa joka kerta sijoituksen a b: if ( a == 1 ) cout << jep ; a = b; 33

Esimerkki kirjastofunktioiden käytöstä Näillä ctype.h -kirjaston funktioilla näytetään tässä esimerkin avulla, miten pienissä ja yleisissä ongelmissa kannattaa käyttää kirjastoja. Näin vältytään myös matalan tason koodaukselta ja yleensäkin pyörän uudelleen keksimiseltä. Funktio Tarkistaa onko argumentti Selitys islower pieni kirjain Tests for lowercase character. isupper iso kirjain Tests for uppercase character. isalpha kirjain Classifies an alphabetical character. isdigit numero Tests for decimal-digit character. isalnum kirjain tai numero Tests for an alphanumeric character. iscntrl kontrollikoodi Tests for a control character. Esim. Tarkastellaan, onko merkki C kirjain: #include <iostream> #include <ctype.h> int main() { char c; c = 'C'; if ( isalpha(c) ) { cout << c << is alphabetical" << endl; else { cout << c << is not alphabetical" << endl; 34

Liite A: ASCII -taulukko 0 ^@ 1 ^A 2 ^B 3 ^C 4 ^D 5 ^E 6 ^F 7 ^G 8 ^H 9 ^I 10 ^J 11 ^K 12 ^L 13 ^M 14 ^N 15 ^O 16 ^P 17 ^Q 18 ^R 19 ^S 20 ^T 21 ^U 22 ^V 23 ^W 24 ^X 25 ^Y 26 ^Z 27 ^[ 28 ^\ 29 ^] 30 ^^ 31 ^_ 32 ' ' 33! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 43 + 44, 45-46. 47 / 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 125 126 ~ 127 DEL 1 #include <iostream.h> // ASCII table v0.2 2 int main () { // by EP 6.11.1997 3 int a = 0; 4 cout << endl; 5 for ( a = 0; a <= 127; a = a + 1 ) { 6 cout << int(a) << " "; 7 if ( a>=0 && a<=31 ) { 8 cout << "^" << char ( a+64 ) ; 9 10 else if ( a==32 ) { 11 cout << "\' \'"; 12 13 else if ( a==127 ) { 14 cout << "DEL"; 15 16 else { 17 cout << char (a); 18 19 cout << "\t"; 20 21 cout << endl; 22 23 35

Liite B: Tyyppien tarkennukset int char float double kokonaisluku merkki desimaaliluku (liukuluku) tarkempi desimaaliluku kuin float short long signed unsigned pienentää lukualuetta suurentaa lukualuetta etumerkilliset luvut ei-negatiiviset luvut Tarkennin short sopii ainoastaan tyyppiin int. char hyväksyy vain tarkentimet signed ja unsigned. Muita rajoituksia ei ole. Tarkentimia voi myös yhdistellä: unsigned long int suurluku; 36