C-kurssi kevät t Luento 2: tyypit, rakenteet, makrot

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

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

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

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

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

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

Tietotyypit ja operaattorit

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

Ohjausrakenteet. Valinta:

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

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

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

13. Loogiset operaatiot 13.1

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

11. Javan toistorakenteet 11.1

Java-kielen perusteet

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

12. Javan toistorakenteet 12.1

Ohjelmointiharjoituksia Arduino-ympäristössä

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

13. Loogiset operaatiot 13.1

Java-kielen perusteet

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

Moduli 5: Kehittyneitä piirteitä

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

12. Javan toistorakenteet 12.1

Harjoitustyö: virtuaalikone

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Binäärioperaatiot Tiedostot ja I/O

Rakenteiset tietotyypit Moniulotteiset taulukot

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

Luento 5. Timo Savola. 28. huhtikuuta 2006

Binäärioperaatiot Tiedostot ja I/O

ITKP102 Ohjelmointi 1 (6 op)

Harjoitus 4 (viikko 47)

Java-kielen perusteita

7. Näytölle tulostaminen 7.1

Loppukurssin järjestelyt

Rakenne. C-ohjelmointi: Tietorakenteita ja tyyppejä. Tyyppimuunnoksia aritmeettisten tyyppien välillä. Tyyppimuunnokset. & (bitti and) Bittioperaatiot

Kielioppia: toisin kuin Javassa

Loppukurssin järjestelyt C:n edistyneet piirteet

Tietueet. Tietueiden määrittely

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

ITKP102 Ohjelmointi 1 (6 op)

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

C-ohjelmointi: Osoittimet

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

Osoittimet ja taulukot

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

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

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

C-ohjelmointi: Funktiot. Luento: viikko 2

C-ohjelmointi, syksy 2006

C-ohjelmointi, syksy Yksiulotteiset taulukot Moniulotteiset taulukot Dynaamiset taulukot. Binääritiedostot. Luento

C-ohjelmointi, syksy 2008: Funktiot

TITO. C-ohjelmointi, syksy 2008: Funktiot. ltö. Aliohjelmaesimerkki. Esimerkki: potenssiin korotus. Luento 4, pe

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

Sisältö. 2. Taulukot. Yleistä. Yleistä

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

Luennon sisältö. Taulukot (arrays) (Müldnerin kirjan luku 10) Yksiulotteiset taulukot. Mikä taulukko on? Taulukko-osoitin. tavallinen osoitin

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

5/20: Algoritmirakenteita III

Sisältö. C-ohjelmointi Luento 5: Osoittimet. Keko (heap) Pino (stack) Muistinhallinta Java vs C. Prosessin rakenne

14. Hyvä ohjelmointitapa 14.1

1. Esittelyt ja vakiot 1.1 Esittelyt (declarations) Ennen nimen, tunnuksen (identifier) käyttöä se on

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

Osoitin ja viittaus C++:ssa

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Sisältö. 22. Taulukot. Yleistä. Yleistä

Muuttujien roolit Kiintoarvo cin >> r;

Johdatus ohjelmointiin / Lausekielinen ohjelmointi 1 & 2

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

Fortran 90/95. + sopii erityisesti numeriikkaan:

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Lyhyt kertaus osoittimista

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

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

6. Muuttujat ja Java 6.1

Java-kielen perusteita

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

Ohjelmointi 1 Taulukot ja merkkijonot

ATK I OHJELMOINNIN PERUSTEET 76314P LUENTOMATERIAALI

Tietorakenteet ja algoritmit

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

C-ohjelmointi, kevät t 2006: Funktiot. Luento 4, ti Tiina Niklander

1. Mitä seuraava ohjelma tulostaa? Vastaukseksi riittää yksi rivi joka esittää tulosteen. (6 p)

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

811120P Diskreetit rakenteet

Harjoitus 5 (viikko 48)

Algoritmit 1. Demot Timo Männikkö

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

Transkriptio:

C-kurssi kevät t 2006 Luento 2: tyypit, rakenteet, makrot 24.1.2006

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

Tasokokeen kohta 1: Taulukon järjestj rjestäminen Oletetaan taulukon indeksointi alkamaan nollasta n = sizeof(t); for (i=0; i<n; ; i++) for (j=i( j=i; j<n; ; j++) if (t[i]] > t[j]) { temp = t[i]; t[i] ] = t[j]; t[j] ] = temp; }

Tasokokeen kohta 2 #include <stdio.h> #include <string.h> int longest(char **p, char *r) { char *s,*t; int max=0; len; while(*p++) { if ((len=strlen(*p len=strlen(*p)) > max ) { max==len len; s=*p; } p++; } t=s; whil ile(*r++ == = *s++); r=t; return s - t; } int main () { int pit; char pisin_rivi[80 80]; static char *tptr[5] ={ "Ensimmäinen inen \ rivi", "Toinen rivi", "Ja tässt ssä kolmas rivi", "Neljäs s on riveistä kaikkein pisin", "Viides ja viimeinen" }; char *pp = pisin_rivi; pit= longest(tptr,pp); printf tf("%d merkkiä: %s\n",pit n",pit, pp); return 0; }

Tasokokeen kohta 2 tptr on osoitintaulukko, jonka alkioina on osoittimia merkkijonovakioihin. Sen osoite välitään parametrina: int longest ( char **p,, char *r) tptr Toinen rivi Ja tässä kolmas rivi Ensimmäinen rivi Viides ja viimeinen Neljäs on riveistä kaikkein pisin static char *tptr[5] ={ "Ensimmäinen \ rivi", "Toinen rivi", "Ja tässä kolmas rivi", "Neljäs on riveistä kaikkein pisin", "Viides ja viimeinen" };

Tasokokeen kohta 3 while (*q++ = *p++); Muistialueen kopiointi (esim. merkkijono) if ((c=fgetc(filehandle fgetc(filehandle)) == EOF) Merkin luku tiedostosta, samalla tarkistetaan tiedoston päättyminen for (i=a, j=b; i<=j; i += 2, j += 2) Silmukka, josta tulee ikuinen tai sitä ei suoriteta lainkaan

Xptr DC 0 X DC 12 LOAD R1, =X STORE R1, Xptr LOAD R2, X LOAD R3, @Xptr Tieto ja sen osoite (3) Muuttujan X osoite on 230 Muuttujan X arvo on 12 12222 Osoitinmuuttujan (pointterin) Xptr osoite on 225 X=230: 12 Osoitinmuuttujan Xptr arvo on 230 12998 jonkun tiedon osoite (nyt X:n osoite) Osoitinmuuttujan Xptr osoittaman kokonaisluvun arvo on 12 ; R1 230 muisti Xptr=225: 230 ; R2 12 12345 ; R3 12 12556 128765 C-kieli: Y = *ptrx /* ei ptrx:n arvo, mutta ptrx:n osoittaman muuttujan arvo */

Yksinkertaiset tyypit int kokonaisluku char yksi merkki (c:ssä oikeastaan kokonaisluku) Float, double reaaliluku (liukuluku) HUOM: ei boolean tyyppiä Käytetään n kokonaislukuja 0 on epätosi, FALSE ja kaikki muut arvot tosia, TRUE Tyyppien kokoa (tavuina tai bitteinä) ) ei taata ympärist ristöstä toiseen

Lisämää ääreet: int ja char Etumerkki: signed, unsigned unsigned int signed char Kokomää ääreitä: short,, long long char short int Yhdistelmät: t: signed short int unsigned long int

Merkit Merkit ovat oikeastaan kokonaislukuja Merkistöst stä EI saa olettaa mitää ään Jos haluaa oikeasti tehdä siirrettävää ää ja kaikissa järjestelmissj rjestelmissä toimivaa koodia pitää eksplisiittisesti käyttk yttää tyyppiä signed char tai unsigned char

Kokonaisluvut Rajat otsikkotiedostossa limits.h Yläraja INT_MAX aina >= 32767 Laitoksen ympärist ristössä 2147483647 - - SHRT_MAX on 32767 (signed( short int) Kaikenkokoisille kokonaisluvuille on omat maksimi- ja minimiarvot Kokonaislukuja käytettk ytettäessä voi kertoa tyypin kirjaimella arvon jälkeen j (U, L) sizeof(short) <= sizeof(int) <= sizeof(long)

Otsikkotiedosto limits.h Siirrettävyyden vuoksi tyyppien maksimikoot määm ääritelty erillisessä tiedostossa voivat vaihtua Laitoksen ympärist ristössä otsikkotiedostot ovat hakemistossa /usr/include/ Otsikkotiedostot liitetää ään n omaan ohjelmaan esikää ääntäjän ohjauskomennolla: #include <limits.h>

Reaaliluvut float double long double Otsikkotiedostossa float.h on koot ja rajat sizeof(float) <= sizeof(double) <= sizeof(long double)

Tyyppimuunnoksia Jos lausekkeen operandit ovat erityyppisiä, niin c:ssä tehdää ään automaattinen tyyppimuunnos laskutoimitusta varten aritmeettisten tyyppien välillä. Aina pienemmän tarkkuuden omaava tyyppi muunnetaan tarkemmaksi tyypiksi seuraavasti: int ja char unsigned long unsigned long float double long double

Eksplisiittinen tyyppimuunnos C:ssä voi muuttujan arvon tyyppiä vaihtaa lausekkeessa määm ääreellä (uusityyppi)mtja Tämä voi olla jopa välttv lttämätöntä Vakioarvojen tyypitys U ja L määm ääreillä int x; char merkki = a ; float c, f; x = merkki + 17; c = (5/9)*(f-32); /* arvo on 0!! */ c = ( (double)5/9 ) * (f-32);

Ylivuoto Ylivuodon testaamista ei saa tehdä vertailulla i + j > INT_MAX vaan vertailulla i > INT_MAX - j

Luennon sisält ltö Tyypit int, char, float, double signed, unsigned short,, long Vakiot const Rakenteet if,, for, while, switch, do-while Makrot #define

Tunnuksista Käytä yhtenäist istä tyyliä nimissä. Nimien pitää olla kuvaavia. Selvyyden vuoksi voit sekoittaa isoja ja pieniä kirjaimia.. HUOM: ne ovat merkitseviä: longidentifier,, _k3 Vain 31 ensimmäist istä merkkiä käytössä (Aikoinaan vain 6 merkkiä erotti)

Vakioiden määm äärittely Vakiot määm ääritellään n kuten muuttujat, mutta niiden määm äärittely alkaa sanalla const Vakioiden nimet kirjoitetaan ISOILLA KIRJAIMILLA (vakiintunut tapa) const float PI = 3.1412; const int ISO_LUKU = 0xFF7D; const int TRUE = 1; const int FALSE = 0; const char A_KIRJAIN = a ; const char [] MJONO = merkkijonossa on lainausmerkit ;

Kokonaislukuvakiot Luvun saa syött ttää etumerkillä tai ilman Kymmenkantaisena: 1234567789 Oktaalina (kahdeksankantaisena): 034 01234567 Heksadesimaalina: 0x12ABCDEF Luvun tyyppi määm ääräytyy sen arvon mukaan: Jos mahtuu int tyyppiin int Muuten jos mahtuu long tyyppiin long Muuten jos mahtuu unsigned long unsigned long Muuten määm äärittelemätön n (liian suuri) Tyypin voi myös s määm äärätä kirjaimella U tai L 12U on unsigned int ja 7L on long int

Merkkivakiot ja merkkijonovakiot Merkkivakio a \065 \xa6 Merkkijonovakio absdefkkjhaöj Merkkivakio talletetaan yhden merkin tilaan (ja se siis on oikeasti numero) Merkkijono talletetaan sen tarvitsemaan tilaan (peräkk kkäisiä muistipaikkoja) ja loppuun vielä merkkijonon pääp äättävä arvo \0 vakiona toimii osoitin tähän muistialueeseen!!!

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

Ehtolausekkeet Looginen AND Looginen OR Ehdollinen lauseke Pilkkulauseke e1 && e2 e1 e2 e1? e2 : e3 e1, e2 Käytä sulkuja selkeyttämää ään lausekkeita

Assosiatiivisuus lauseke a < b < c tulkitaan (a < b) < c ja sen merkitys on eli kuin lausekkeen a < b && b < c

Samalla rivillä samanarvoisia Evaluointijärjestys () []. ->! ~ - ++ -- & * (tyyppi) sizeof Aritm. operaatiot { Bittisiirrot vasen ja oikea { suuruusvertailut { Bittivertailut and or Ehdollinen vertailu sijoitukset * / % + - << >> < <= > >= ==!= & ^ &&?: = *= /= %= += -= <<= >>= &=!= ^=,

Vältä virheitä u i = 8 on ihan eri asia kuin i == 8 u Tarkista rajat (vältä off by one ) u Huomaa että nämä eivät ole loogisia vertailuja!!! e1 & e2 e1 e2 if(x = 1)

Tyylistä Älä laita välilyöntiä seuraaviin : -> >. []! ~ ++ -- -(etum.) *(osoitin osoitin)& Yleensä erota seuraavat välilyönnillä: = +=?: + < && + (yhteenl( yhteenl.) ja vastaavat a->b a[i] *c a = a + 2; a= b+ 1; a = a+b * 2;

Lauserakenteet Ehto Toistot if (ehto) lause; else lause; If (ehto) { useita lauseita } else { useita lauseita } for (;;) lause while (1) { lauseet } do{ lauseet } while (ehto); Toistojen keskeytys Break - hyppää toistoa seuraavaan lauseeseen Continue hyppää seuraavalle kierrokselle Näissä ei saa olla nimeä!! (vrt. Java)

Break - käyttö While (1) { printf( anna kaksi lukua a ja b, a < b: ); if (scanf( %d%d, &a, &b) == 2) break; if (a < b) break;... } /* break jatkaa suoritusta tästä */ Tässä on tyypillisiä c:n piirteitä - ikuinen toisto while(1) - virheentarkistus!! - tulostus ja syöttö käyttäen standardifunktioita

Poistuminen syväst stä rakenteesta Poistuminen useamman tason yli silmukassa on tehtävä goto lauseella for(i = 0; i < length; i++) for(j = 0; j < length1; j++) if(f(i, j) == 0) goto done; done: Break jatkaisi ulomman silmukan seuraavaa kierrosta!

Valinta: switch esimerkkiohjelma.. /* ohjelman alkuosa ja muuttujien esittelyt */ Printf( Syötä korkeintaan %d merkkiä\n, LIMIT); For (i = 1; i <= LIMIT; i++) { if ( (c=getchar()) == EOF) break; /* tiedosto loppui CTRL-D merkki */ switch (c) { case : valil++; break; case \t : tabul++; break; case * : tahti++; break; default : if (c>= a && c<= z ) pienia++; } }... /* täällä voidaan sitten vaikka tulostaa */

/* Program that reads two integer values, and * outputs the maximum of these values. */ #include <stdio.h> int main() { } } int i, j; printf("enter two integers:"); if(scanf("%d%d", &i, &j)!= 2) { fprintf(stderr, "wrong input\n"); return EXIT_FAILURE; printf("maximum of %d and %d is %d\n", return EXIT_SUCCESS; i, j, i > j? i : j); Lue kaksi lukua"

Control Statements Tämä toisto while(expr expr!= 0) statement; on identtinen tämän kanssa while(expr expr) statement;

Kirjan esimerkki 4.4 /* Example 4.4 * Read characters until "." or EOF and output * the ASCII value of the largest input * character. */ #include <stdio.h< stdio.h> int main() { const char SENTINEL = '.'; int aux; int maxi = 0;

printf("enter characters,. to terminate\n"); while(1) { if((aux = getchar())== EOF aux == SENTINEL) break; } if(aux > maxi) maxi = aux; Idiomi? (sanonta) } printf("the largest value: %d\n", maxi); return EXIT_SUCCESS;

Lue merkkejä loppumerkkiin asti yksi kerrallaan while(1) { } if((aux = getchar()) == EOF aux == SENTINEL)... or: while(1) { break; if((aux = getchar()) == EOF) break; if(aux == SENTINEL)... break;

Lue kokonaislukuja while(1) { if (scanf("%d", &i)!= 1 i == SENTINEL) break; }

Syött ttö ja tulostus lyhyesti Merkki kerrallaan int getchar() int putchar(int) Muotoiltuna int scanf("format", ", &var& var) int printf("format", ", exp)

/* File: ex1.c * Program that reads a single character and * outputs it, followed by end-of-line */ #include <stdio.h> #include <stdlib.h> int main() { HUOM: Nämä otsikkotiedostot tarvitaan funktioiden käyttöä varten int c; /* chars must be read as ints */ if ((c = getchar()) == EOF) return EXIT_FAILURE; putchar(c); putchar('\n'); } return EXIT_SUCCESS;

Kokonaislukujen muotoilukomennot Kokonaislukujen muotoilussa käytetään seuraavia määreitä: d etumerkillinen kokonaisluku ld long decimal u o etumerkitön kokonaisluku oktaali (kahdeksankantainen) x, X heksadesimaali (kuusitoistakantainen) printf("%d%o%x", 17, 18, 19);

Reaalilukujen muotoilukomennot Reaaliluvuille käytetään seuraavia ohjauksia (oletustarkkuus on 6): f [-] ddd.ddd e E g G [-] d.ddddde{sign}dd [-] d.ddddde{sign}dd fe (vain lyhyempi) FE printf("%5.3f\n", 123.3456789); printf("%5.3e\n", 123.3456789); 123.346 1.233e+02

Merkkien ja merkkijonojen muotoilu Merkkejä ja merkkijonoja muotoillaan seuraavasti: c merkki s merkkijono printf("%c", 'a'); printf("%d", 'a'); printf("this %s test", "is");

scanf() - paluuarvot scanf() palauttaa arvonaan luettujen alkioiden määrän ja EOF, jos yhtään alkiota ei saatu luettua ennen tiedoston loppumista. Esimerkiksi voi palauttaa seuraavat arvot: scanf("%d%d", &i, &j) 2 Jos molemmat luvut onnistuivat 1 Jos vain i saatiin luettua 0 jos luku epäonnistui kokonaan EOF jos tiedosto päättyi.

Pyydä ja lue yksi merkki printf("enter integer: "); if(scanf("%d", &i)!= 1 ) /* error, else OK */ Lue kaksi kokonaislukua if(scanf("%d%d", &i, &j)!= 2 ) /* error, else OK */

Makro Esikää ääntäjän n ohjauskomennoilla voi määritellä makroja Makro on tunnus, joka korvataan sisäll llöllään n ohjelmakoodiin ennen varsinaista kääk äännöstä HUOM: Koko loppurivi on korvaava arvo! #define MAKSIMI 30 #define NIMI Tiina Niklander #define TRUE 1 #define FALSE 0