2. C-kieli ja ongelmanratkaisu

Samankaltaiset tiedostot
C-kieli mahdollistaa hyvin tiiviin ja samalla sekavan tavan esittää asioita, kuitenkin hyvän ohjelman tulisi olla mahdollisimman helppolukuinen ja

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

Java-kielen perusteet

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

Tietueet. Tietueiden määrittely

Java-kielen perusteet

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

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

Tietotyypit ja operaattorit

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

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

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

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

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

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

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

Ohjelmoinnin perusteet Y Python

Java-kielen perusteita

7. Näytölle tulostaminen 7.1

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

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

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

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

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

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

Ohjelmoinnin perusteet Y Python

Ohjausrakenteet. Valinta:

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Modulaarisessa ohjelmoinnissa jaetaan ohjelma osiin (moduuleihin), jotka ovat yksinkertaisia ja lyhyitä.

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

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

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

ITKP102 Ohjelmointi 1 (6 op)

Binäärioperaatiot Tiedostot ja I/O

Moduli 5: Kehittyneitä piirteitä

Ohjelmoinnin perusteet Y Python

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

4. Lausekielinen ohjelmointi 4.1

Ohjelmoinnin perusteet Y Python

Java-kielen perusteita

Johdatus ohjelmointiin / Lausekielinen ohjelmointi 1 & 2

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

VIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto

12. Näppäimistöltä lukeminen 12.1

1. Omat operaatiot 1.1

3. Muuttujat ja operaatiot 3.1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin peruskurssi Y1

5. HelloWorld-ohjelma 5.1

Binäärioperaatiot Tiedostot ja I/O

Ohjelmoinnin perusteet, syksy 2006

Ohjelmoinnin peruskurssi Y1

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

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

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

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

Tutoriaaliläsnäoloista

Ohjelmoinnin perusteet Y Python

Harjoitus 5 (viikko 48)

Ohjelmoinnin perusteet Y Python

Tiedosto on yhteenkuuluvien tietojen joukko, joka tavallisimmin sijaitsee kiintolevyllä, muistitikulla tai jollakin muulla fyysisellä tietovälineellä.

Loppukurssin järjestelyt C:n edistyneet piirteet

Ohjelmoinnin peruskurssi Y1

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

C++ Kuva 1-1. C- ja C++ kielien perustana olevat kielet.

Harjoitus 3 (viikko 39)

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

811120P Diskreetit rakenteet

Luennon sisält. ltö. C-kurssi syksy ääreet: int ja char. Yksinkertaiset tyypit. Kokonaisluvut. Merkit

Loppukurssin järjestelyt

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Ohjelmoinnin perusteet Y Python

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

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

14. Hyvä ohjelmointitapa 14.1

Lyhyt kertaus osoittimista

5. HelloWorld-ohjelma 5.1

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

etunimi, sukunimi ja opiskelijanumero ja näillä

Ohjelmoinnin peruskurssi Y1

Ohjelmointi 1 Taulukot ja merkkijonot

Harjoitus 2 (viikko 45)

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

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

13. Loogiset operaatiot 13.1

Transkriptio:

2. C-kieli ja ongelmanratkaisu Taustaa Esimerkki C-kielisen ohjelman kehityksestä Kielen yleispiirteet Muuttujat Suoritettavat lauseet Tietotyypit ja lausekkeet Tietojen lukeminen ja tulostaminen 64

C -kieli Bell Labs, UNIX-systeemiohjelmointiin kehitetty kieli Laaja osa UNIX-järjestelmän toiminnoista kirjoitettu C-kielellä Pohjautuu BCPL- ja B-kieliin yleiskäyttöinen ohjelmointikieli, standardoitu 1990. siirrettävä, sama ohjelma voidaan kääntää ja suorittaa eri käyttöjärjestelmä- ja laiteympäristöissä sisältää sekä koneläheisen että korkean tason kielen ominaisuuksia pieni ydin, monimutkaiset kokonaisuudet rakennetaan aliohjelmakirjastojen avulla. direktiivit ja esikääntäjien käyttö 65

vaikeahko, helppo tehdä pahoja virheitä kompakti eli tiivis esitysasu, tarvitaan kommentointia heikosti tyypitetty eikä ajonaikaisia tarkistuksia (vrt. esim Java) ei välttämättä paras kieli aloittelijalle C-kieli mahdollistaa hyvin tiiviin ja samalla sekavan tavan esittää asioita, kuitenkin hyvän ohjelman tulisi olla mahdollisimman helppolukuinen ja ymmärrettävä. 66

C-kielisen ohjelman kirjoittaminen: 1. Ohjelma kirjoitetaan tiedostoon tekstieditorilla. Editoinnin tuloksena saadaan tekstitiedosto, joka sisältää ohjelman koodin (ns.lähdekoodi) ohjelma.c 2. Tekstitiedosto muutetaan tietokoneen ymmärtämään muotoon C-kääntäjällä (käännetään ja ohjelmaan liitetään samalla kirjasto-ohjelmien binäärikoodit = linkittäminen) esim: gcc -o ohjelma ohjelma.c saadaan uusi tiedosto ohjelma, jossa ohjelma on konekielisessä muodossa 3. Ohjelman suorittaminen./ohjelma, jossa./ ilmaisee mistä hakemistosta suorittavaa ohjelma-nimistä ohjelmaa etsitään 67

#include <stdio.h> int main(void){ printf("tervehdys\n"); return(0); } ohjelma.c virheet kääntäjä kirjastot kirjastot kirjastot objektikoodi ohjelma.obj linkkeri suoritettava ohjelma ohjelma.exe 68

Esimerkki ohjelman kehityksestä Vaatimusmäärittely: Ongelma: Kartalla etäisyydet esitetty maileina. Tehtävänä muuttaa annettu mailimäärä kilometreiksi. Analyysi: Ohjelman syötteenä mailimäärä numerotietona ja tulostuksena vastaava kilometrimäärä numerona. Tietovaatimukset ja keskeinen kaava syote: mailit, etäisyys maileina tulostus: kilometrit, etäisyys kilometreinä maili on 1.609 kilometriä 69

mailit ja kilometrit ovat nimettyjä muistielementtejä, jotka tulevat sisältämään syötteen (mailit) ja tuloksen (kilometrit). Suunnittelu: Algoritmi yleisellä tasolla 1. lue etäisyys maileina 2. muuta etäisyys kilometreiksi 3. tulosta etäisyys kilometreinä Ensimmäinen ja kolmas lause selviä. Tarkennetaan toinen: kilometrit on 1.609 kertaa mailit 70

Toteutus C-kielellä saadaan seuraava ohjelma 71

/* * mailitkilometreiksi.c * Muuttaa etäisyydet maileista kilometreiksi * * Created by Ilkka Räsänen. * * */ #include <stdio.h> /* printf ja scanf */ /* #define KM_MAILISSA 1.609 muunnosvakio makron avulla */ const double KM_MAILISSA = 1.609; /* muunnosvakio vakiomuuttujana, parempi tapa */ int main (void) { double mailit, /* etäisyys maileissa */ kilometrit; /* etäisyys kilometreissä */ /* luetaan sisään etäisyys maileissa */ printf ("Anna etäisyys maileissa >"); scanf("%lf", &mailit); /* muuta etäisyys kilometreiksi */ kilometrit = KM_MAILISSA * mailit; /* tulosta etäisyys kilometreissä */ printf("etäisyys on %lf kilometriä", kilometrit); } return(0); 72

Ohjelman kääntäminen: 73

Ohjelman suoritus: 74

C-kielessä ohjelman kommentit /* ja */ -merkkien välissä. /* * mailitkilometreiksi.c * Muuttaa etäisyydet maileista kilometreiksi * * Created by Ilkka Räsänen. * * */ 75

C-kielessä ohjelman kääntäminen tapahtuu kahdessa vaiheessa. 1. esikääntäjä muuttaa ja täydentää ohjelman lähdekoodia 2. C-kääntäjä tuottaa konekielisen version esikäännetystä koodista 76

Ohjelma sisältää direktiivit, ohjeita esikääntäjälle, alkavat #- merkillä #include <stdio.h> informaatiota käsiteltävistä tietoelementeistä, mitä nimiä käytämme muistipaikoille ja minkä tyyppistä tietoa niihin talletetaan, muuttujien määrittelyt double mailit, /* etäisyys maileissa */ kilometrit; /* etäisyys kilometreissä */ 77

C-kielen lauseita, jotka vastaavat algoritmin käskyjä tai toimintaohjeita printf ("Anna etäisyys maileissa >"); scanf("%lf", &mailit); /* muuta etäisyys kilometreiksi */ kilometrit = KM_MAILISSA * mailit; /* tulosta etäisyys kilometreissä */ printf("etäisyys on %lf kilometriä\n\n", kilometrit); Esimerkkiohjelma joka koostuu kahdesta osasta: direktiivit esikääntäjälle ja pääfunktio, joka sisältää muuttujien määrittelyt ja suoritettavat lauseet. 78

#include <stdio.h> /* printf ja scanf määrittelyt */ int main(void) { } char kirjain1, kirjain2, kirjain3; /* kolme kirjainta */ int vuosi; /* kuluva vuosi */ printf( Anna kolmikirjaiminen tunnus ja paina returnia ); scanf( %c%c%c, &kirjain1, &kirjain2, &kirjain3); printf( Anna kuluva vuosi ja paina returnia ); scanf( %d, &vuosi); printf( Tervehdys %c%c%c.\nvuosi on %d\n, kirjain1,kirjain2,kirjain3, vuosi); return(0); 79

Ohjelma tulostaa käyttäjän antaman tunnuksen ja kuluvan vuoden. 80

C-kielen yleispiirteet Ohjelman ulkoasu: esikääntäjän direktiivit main-funktion aloitus { muuttujien määrittelyt suoritettavat lauseet } 81

Esikääntäjän direktiivit Jokaiseen C-ohjelmaan liitetään yksi tai useampia otsikkotiedostoja, joiden tarve riippuu ohjelmassa käytetyistä kirjastofunktioista. Esikääntäjän direktiivit ovat C-esiprosessorin ymmärtämiä käskyjä, jotka suoritetaan ennen ohjelman varsinaista kääntämistä. direktiivi alkaa "#"-merkillä #include kertoo käytetyt kirjastot #define määrittelee mm. vakiomakrot 82

C-kieli sisältää aika pienen määrän toimintoja ohjelmakirjastojen käyttö C-kielen standardi edellyttää tiettyjen kirjastojen toimittamisen jokaisen C- kielen toteutuksen mukana. kirjastotiedostot päättyvät.h tunnukseen (h = header) 83

Esimerkiksi: #include<stdio.h> -direktiivi käskee esiprosessoria lisäämään tiedoston stdio.h sisältämät määrittelyt ohjelmatiedostoon ennen ohjelman varsinaista kääntämistä. Määrittelyt kertovat esiprosessorille mm. sen, että ohjelmassa käytetyt nimet (kuten scanf ja printf ) löytyvät em. tiedostosta. #define MK_EUROINA 5.94573 /* muunnosvakio */ liittää vakiomakroon MK_EUROINA merkityksen 5.94573. Esikääntäjä korvaa ohjelmakoodissa esiintyvän tunnuksen MK_EUROINA arvolla 5.94573 ennen kääntämistä. 84

vakiomakroiksi määritellään vain sellaisia arvoja, jotka pysyvät vakioina! tunnuksen käyttö ohjelmakoodissa lisää ohjelman luettavuutta ja ylläpidettävyyttä. 85

main-funktio main-funktion aloitus kertoo, mistä ohjelman suoritus alkaa main-funktion otsikko on muotoa: int main ( void ) Kaikissa suoritettavissa C-ohjelmissa on oltava yksi main-funktio. 86

Loput koodirivit muodostavat ohjelman rungon. Ohjelman runko sijoitetaan {, } -merkkien sisälle Sulkeissa olevaa ohjelman osaa kutsutaan lohkoksi ( block ). Ohjelma päättyy "}"- merkkiin. Sisentäminen, välilyönnit ja rivien katkaisu ohjelmaa kirjoitettaessa on olennaista ohjelman selkeyden vuoksi! 87

Ohjelman runko koostuu kahdesta osasta Määrittelyistä Suoritettavista lauseista Esimerkki C-ohjelmasta: #include <stdio.h> int main(void){ printf("hello, World!\n"); return(0); } 88

Ohjelma sisältää kaksi suoritettavaa lausetta (statement): printf("hello, World!\n"); Se tulostaa kuvaruudulle tekstin Hello, World!, (lainausmerkkejä ei tulosteta). Käskyllä: return(0); lähetetään kontrolli takaisin käyttöjärjestelmälle, eli main-funktion suoritus päättyy. Luku 0 ilmoittaa käyttöjärjestelmälle että ohjelman suoritus päättyi normaalisti. 89

Varatut sanat varattuja sanoja (32 kpl), joita ei saa käyttää mihinkään muuhun, kuin niille varattuun tarkoitukseen. auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while 90

Standarditunnukset esimerkiksi scanf ja printf, ovat standardi syöttö/tulostus -kirjastossa määriteltyjen operaatioiden nimiä voidaan määritellä uudelleen (ei suositella) Käyttäjän määrittelemät tunnukset ohjelman käyttämien muistipaikkojen ja funktioiden nimeäminen Tunnus voi koostua kirjaimista (a - z,a - Z) numeroista (0-9), mutta ei saa alkaa numerolla alaviivasta varattua sanaa ei saa käyttää tunnuksena standardikirjaston tunnuksia ei tulisi määritellä uudelleen 91

Tunnuksen pituudelle ei ole määritelty maksimipituutta, mutta jotkut ANSI C- kääntäjät saattavat pitää kahta tunnusta samana elleivät tunnukset eroa mitenkään 31 ensimmäisen merkin osalta. Tunnukset kannattaa nimetä kuvaavasti, jolloin sen merkitys on helpompi tajuta. Jos tunnus koostuu kahdesta tai useammasta sanasta voidaan lukemista helpotta kirjoittamalla esim. hintaeuroina tai hinta_euroina Liikaa toisiaan muistuttavia tunnusten nimiä kannatta välttää, ei kannata määritellä tunnuksia suuri ja SUURI C-kääntäjä tekee eron isojen ja pienten kirjainten välillä! 92

Muuttujien määrittelyt Muuttuja on muistielementti, joka tallettaa ohjelman käsittelemää syöttö- ja tulostustietoa sekä välituloksia. Muuttujan määrittely kertoo talletetun tiedon tyypin talletukseen käytetyn muistielementin nimen sallitut operaatiot int vuosi; /* kokonaislukumuuttuja nimeltä vuosi */ char kirjain_1, kirjain_2, kirjain_3; /* kolme kirjainta */ double kilometrit; /* yksi reaaliluku */ Muuttujien, vakioiden, funktioiden ja tyyppien niminä käytetään ohjelmoijan määrittelemiä tunnuksia. 93

Kaikki C-ohjelmassa käytettävät muuttujat on määriteltävä ennen käyttöä! Tietotyypit C-kielen etukäteen määritellyt standarditietotyypit ovat short, int, long (kokonaisluvut) float, double (reaaliluvut) char (merkkitieto) bool (totuusarvot, c99->, sijaitsee stdbool.h -tiedostossa) Kaikki C-kielen numeeriset vakiot ovat positiivisia kokonaislukuja. Negatiivisten lukujen "-" -merkki tulkitaan operaattoriksi (ei luvun osaksi), joka muuttaa positiivisen luvun negatiiviseksi. 94

Tietotyyppi int int -tyyppiseen muistipaikkaan voidaan tallettaa kokonaislukuja. ANSI C määrittelee tyypin int koon siten, että sen täytyy kyetä tallettamaan vähintään arvoja väliltä -32768... 32767. mahdolliset aritmeettiset operaatiot +, -, *, / ja % -operaatiot (% on jakojäännös eli modulo -operaatori) = = lukujen vertailu kokonaisluvuilla laskeminen tuottaa lopputulokseksi kokonaislukuja 95

Tietotyyppi double Tietotyyppi double kykenee tallettamaan reaalilukuja (desimaalilukuja) kokonais- ja desimaaliosa erotetaan toisistaan pisteellä (32.99) mahdolliset aritmeettiset operaatiot +, -, *, / -operaatiot == lukujen vertailu double tyypin luvut voidaan esittää myös käyttäen tieteellistä notaatiota (yleensä hyvin pienten ja hyvin suurten arvojen esittämisessä). 1.23e5 tai 1.23E5, jossa e tai E tulkitaan luvuksi 10, jota korotetaan potenssiin 5. Tyyppi double kykenee tallettamaan vain pienen osan kaikista reaaliluvuista, ja lukujen tarkkuus on äärellinen, koska muistipaikoilla on rajallinen koko! 96

Esimerkiksi 10.0 * 0.1 ei välttämättä olekaan 1.0 Tietotyyppi char Tyyppi char esittää yksittäisen merkin arvon. Yksittäinen merkki esitetään ohjelmakoodissa heittomerkkien sisällä ( 'A', '1'...) Kullekin merkille on sovittu numeerinen arvo, tavallisimmin on käytössä ns. ASCII-koodi (American Standard Code for Information Interchange ). char -tyypin tietoja voidaan verrata ja tiedoille voidaan suorittaa myös aritmeettisia operaatioita. 97

Tietotyyppi bool Totuusarvotyyppi, voi saada vain arvoja TRUE tai FALSE. Käytetään loogisten operaatioiden yhteydessä 98

Kommentit Kommenttien avulla selitetään ohjelman lukijalle mitä ohjelma tekee, kääntäjä sivuuttaa kommentit, eli suoritettavan ohjelman koko ei kasva. Kommentit voi kirjoittaa kahdella eri tavalla. // -merkillä alkava kommentti on voimassa tämän rivi loppuun saakka. /* ja */ -merkkien välissä oleva teksti tulkitaan kommentiksi, mutta tämän kommentin sisällä ei saa olla toista kommenttia! /* tämän pitäisi olla kommenttia. /* kuten myös tämän */ mutta kuinkas tässä näin kävi */ 99

Suoritettavat lauseet Ohjelman suoritettavat operaatiot esim. laskutoimitukset käännetään konekielelle ja ladataan muistiin ja suoritetaan (ajetaan). Sijoituslause Sijoituslause tallettaa muuttujaan laskennan tuloksen entinen arvo tuhoutuu kilometrit = KM_MAILISSA * mailit; Yleinen muoto: tulos = lauseke 100

Ohjelmoinnissa mahdollista myös: summa = summa + 1; pankkitili = pankkitili - otto; Lauseke on ohjelmointikielinen ilmaisu, jolla on arvo Lausekkeen arvon tietotyyppi määräytyy operandien tyyppien perusteella Lausekkeen: muuttuja operaattori muuttuja (esim. x + y) arvo on tyyppiä int, jos molemmat muuttujat ovat tyyppiä int, jos toinen tai molemmat operandit ovat tyyppiä double, on lausekkeen arvo double. 101

Sijoituslauseessa muotoa x = y + z lasketaan ensin lausekkeen y + z arvo, jonka tyyppi määräytyy operandien perusteella jos muuttujan x ja lausekkeen tyyppi on sama niin OK jos muuttuja x on double ja lauseke on int niin ko. kokonaisluku muutetaan reaaliluvuksi jos muuttuja x on int ja lauseke on double niin reaaliluvun desimaaliosa tipahtaa sijoituksessa pois, katkaisu tehdään desimaalipisteen kohdalta, ei pyöristystä ei tapahdu Aritmeettisten lausekkeiden laskentajärjestys ensin sulut sisältä ulos operaattoreiden sidontajärjestyksen mukaan 102

Operaattoreiden assosiointi yksioperandiset (unarit) oikealta vasemmalle kaksioperandiset (binäärit) vasemmalta oikealle 103

Syöttö- ja tulostusoperaatiot ( I/O) Ohjelmalle välitetään tietoa syöttö-operaatioiden avulla ja ohjelmasta välitetään tietoja tulostusoperaatioiden avulla. C-kielessä ei ole itsessään valmiita syöttö- tai tulostusoperaatioita, vaan käytetään kirjastofunktioita. Useimmat C-kielen syöttö- ja tulostusfunktiot käyttävät puskurointia. Tiedot kerätään väliaikaiseen muistialueeseen (puskuri). Tieto välitetään lukufunktiolle, kun käyttäjä on painanut returnia (enteriä). C-kieli käyttää ns. virtoja (stream, vuo) esittämään tietoa, joka siirtyy ohjelmaan tai ohjelmasta ulos. 104

Ennalta määriteltyjä standardeja tietovirtoja ovat: Virran nimi kuvaus laite stdin syöttövirta näppäimistö stdout tulostusvirta näyttö stdprn tulostinvirta rinnakkaisportti stdaux oheislaitetulostus sarjaportti stderr virhevirta näyttö Standardivirrat avataan automaattisesti ohjelmaa suoritettaessa. Tietoja voidaan lukea myös puskuroimattomasti, jolloin käyttäjän antamat yksittäiset merkit ovat ohjelman käytettävissä heti merkkien syöttämisen jälkeen. 105

Syöttö- ja tulostusoperaatiot i/o-funktioilla, jotka yleensä otetaan käyttöön direktiivillä #include <stdio.h> Tietojen tulostaminen Yksittäisen merkin tulostaminen tapahtuu funktiolla: char merkki = 'A'; putchar ( merkki ); 106

Muotoileva tulostus; printf printf -funktio kykenee muotoilemaan tulostusta käyttäjän haluamalla tavalla. funktion nimi funktion argumentit (parametrit ) printf("pankkitilin saldo on %lf euroa.\n", pankkitili); formaattimerkkijono tulostuslista 107

Funktion printf kutsu koostuu funktion nimestä suluissa kirjoitetuista (pilkuilla toisista ertettuna) funktion argumenteista (parametreista). 108

Funktion printf argumentit ovat formaatti-merkkijono lainausmerkeissä: "Pankkitilin saldo on %lf euroa.\n" tulostuslista: muuttuja pankkitili Jos muuttujalla pankkitili on arvo 55999.125 niin kuvaruudulle tulostuisi Pankkitilin saldo on 55999.125000 euroa. ennen tulostusta muotoilumääre %f tai %lf korvataan tulostuslistan muuttujan pankkitili sisällöllä. Muotoilumääre ilmaisee missä muodossa muuttujien arvot tulostetaan. Muotoilumääre alkaa aina % -merkillä. 109

Jokaiselle tietotyypille on oma muotoilumääreensä esim. muotoilumääre tyyppi käyttö funktiossa %d int printf / scanf %f double printf %lf double printf / scanf %c char printf / scanf %s merkkijono printf / scanf Huomatkaa että %d ei ole reaalilukujen tulostamiseen tarkoitettu muotoilumääre, vaan kokonaislukujen (kymmenjärjestelmässä) tulostamiseen! 110

Tulostettavan muuttujan arvo tulostuu muotoilumääreen paikalle siten, että tilaa varataan juuri sen verran kuin tarvitaan. Haluttaessa voidaan tulostuskentän leveyteen vaikuttaa kirjoittamalla %-merkin ja kirjainkoodin väliin kokonaisluku, joka ilmaisee vähimmäistilan, joka varataan tulostettavalle tiedolle. Esimerkiksi %8d varaa kahdeksan merkkiä tilaa kokonaisluvun tulostusta varten. Tulostettava tieto kirjoitetaan tulostuskentän oikeaan laitaan. Jos halutaan sijoittaa tulostettava tieto kentän vasempaan reunaan käytetään "-" - merkkiä %-merkin ja kentän koon välissä, esim. %-8d Reaalilukujen desimaalit tulostetaan oletusarvoisesti järjestelmän määräämällä tarkkuudella. 111

Haluttaessa voidaan tarkkuutta rajoittaa kirjoittamalla tulostuskentän leveysmääreen jälkeen piste ja kokonaisluku, jolla ilmaistaan tulostettavien desimaalien määrä. Esimerkiksi printf("pankkitilin saldo on %9.3lf euroa.\n", pankkitili); tulostaisi Pankkitilin saldo on 56999.125 euroa. 112

Desimaalit pyöristetään tulostuksessa, jos tulostuksen muotoilussa käytetään desimaalien määrää kuvaavaa kenttää. Tämä ei kuitenkaan muuta pysyvästi käsiteltävää tulostettavaa tietoa. Tulostuskentän leveysosa voidaan jättää pois ja kuitenkin tulostettavien desimaalien määrää voidaan rajata esim: printf("pankkitilin saldo on %.1lf euroa.\n", pankkitili); Formaattirivi sisältää myös tulostuksenohjausmerkin \n (rivinvaihto). Kaikki C- kielen ohjauskomennot alkavat aina \-merkillä (backslash). Samalla printf -lauseella voidaan tulostaa useamman muuttujan arvo. Muotoilumääreiden paikalle sijoitetaan perässä tulevien muuttujien sisällöt siinä järjestyksessä kuin ne on tulostuslistaan kirjoitettu. 113

printf("%d + %d = %d\n", luku1, luku2, summa); jos luku1, luku2 ja summa ovat int -tyypin muuttujia ja niillä on arvot. luku1 = 10; luku2 = 19; summa = 29; Ohjelma tulostaisi: 10 + 19 = 29 114

printf -lauseesta voi myös puuttua tulostuslista: printf("tässäpä on kaksi\nriviä tekstiä.\n"); Tulostaisi Tässäpä on kaksi riviä tekstiä. 115

Muita ohjausmerkkejä ovat: Koodi Määrittely \a äänimerkki (alarm) \b askelpalautin \r palautus saman rivin alkuun \f sivunvaihto \n rivinvaihto \t vaakatabulaattori \v pystytabulaattori \\ kenoviiva \0 NUL-arvo \ lainausmerkki \ heittomerkki \? kysymysmerkki 116

Tiedon lukeminen C-kielestä löytyy useita funktioita, joiden avulla voidaan lukea tietoja ohjelman käyttöön. Tavallisimmin tietoja luetaan näppäimistöltä. luetaan merkki kerralla luetaan rivi kerralla Kaikki lukeminen tapahtuu merkkitietona, muunnos muuttujan käyttämäksi tietotyypiksi tapahtuu lukuvaiheessa. 117

Puskuroitu lukeminen Yksittäisten merkkien lukeminen funktiolla getchar( ); char mki; mki = getchar( ); Palauttaa näppäimistöltä syötetyn yksittäisen merkin. Käyttää puskurointia. Ei tarvitse argumentteja. 118

Muotoileva (formatoiva) lukeminen, scanf Funktiolla scanf luetaan formatoidusti standardi-inputvirrasta, joka on tyypillisesti näppäimistö. scanf("%lf", &palkka); scanf -funktio kopioi näppäimistöltä syötetyn tiedon palkka -muuttujaan. %lf kertoo minkä tyyppisenä tieto talletetaan lukemisen yhteydessä (tässä tapauksessa reaaliluku). &-merkki on ns. osoiteoperaattori, scanf -funktiolle kerrotaan muuttujan palkka muistiosoite, jonne luettava tieto talletetaan reaalilukuna. scanf odottaa luettavaa tietoa ja <return>-näppäimen painallusta. 119

tietoa voidaan korjata syöttövaiheessa, jos ei ole ehditty painaa <return>näppäintä. scanf palauttaa tiedon siitä kuinka monta tietoalkiota se pystyi lukemaan näppäimistöltä virheettömästi. lukuvirheen sattuessa puskuriin jää lukematon tieto talteen! Useamman tiedon lukeminen yhdellä scanf -funktiolla tapahtuu seuraavasti: int maara; char merkki; double palkka; printf("anna yksi kokonaisluku, merkki ja reaaliluku"); scanf ("%d%c%lf", &maara, &merkki, &palkka); 120

Käyttäjän on tällöin syötettävä pyydetyt tiedot samalla rivillä yhteen kirjoitettuna. 1A1200.50<return> Käskyllä: scanf("%d %c %lf", &maara, &merkki, &palkka); Käyttäjä voisi syöttää luvun, merkin ja reaaliluvun samalla rivillä siten, että tiedot erotetaan välilyönneillä: 1 A 1200.50<return> 121

Käyttäjä voisi viimeisessä tapauksessa syöttää kunkin tiedon erikseen: 1<return> A<return> 1200.50<return> 122

Jos edellinen lukufunktio kirjoitetaan esimerkiksi näin: scanf("%d,%c,%lf", &maara, &merkki, &palkka); Odottaa ohjelma, että syötettävät tiedot erotetaan toisistaan pilkuilla: 1, A, 1200.50<return> Pilkun paikalla voi käyttää vaikka kirjainta a, jolloin lukeminen tulkitsee a:n erottimeksi eikä lue sitä muuttujien sisällöksi. 1aAa1200.50<return> 123