Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Tietorakenteet ja C-kieli

Samankaltaiset esitykset


Esitys aiheesta: "Tietorakenteet ja C-kieli"— Esityksen transkriptio:

1 Tietorakenteet ja C-kieli
TkT Jarno Mielikäinen Vastaanotto: ke 11-12

2 Luennot Noudattavat Lasse Lensun luentomonistetta, josta tulee korjattu versio lähiaikoina Mahdollisista eroavaisuuksista kerrotaan kurssin kotisivuilla To 16-17:45 Pe 12-13 Luentoviikot 1-4: C-kieli Luentoviikot 5-7: tietorakenteita Loput: algoritmeja

3 Harjoitukset EI pakolliset, mikroluokassa 6325
ti 16-18, 18:00-19:30, ke to , 10-12, 12-14, pe 10-12 Olennainen osa oppimista Kokeile, jos et osaa, kysy Ratkaisut annetaan, jos et ymmärrä, kysy Jos löydät vaihtoehtoisen/paremman ratkaisun, kerro

4 Harjoitustyöt 1. harjoitustyö 3. periodin lopussa

5 Tentit 1. välikoe 5.3 klo 16 2. välikoe 7.5 klo 16 Tentti 14.5 klo 16

6 kuutiollinen algoritmi
Alpha 21164A 533MHz, C-kieli, kuutiollinen algoritmi TRS-80, 2.03 MHz Basic, lineaarinen algoritmi 10 0.6 s 200 ms 100 0.6 ms 2.0 s 1000 0.6 s 20 s 10000 10 min 3.2 min 100000 7 päivää 32 min 19 vuotta 5.4 h

7 Kurssin tavoitteet: C-kieli
C-kielisten ohjelmien luku ja kirjoitustaidot Ymmärrät kaikki C:n rakenteet Osoittimien (pointterien) käyttötaito Yleiskatsaus kirjastofunktioihin Tietoinen C:n sudenkuopista

8 Kurssin tavoitteet: tietorakenteet
Yleisempien tietorakenteiden tuntemus: taulukot, pinot, jonot, listat, puut, keot ja graafit Tietorakenteen valinta käytettävien operaatioiden perusteella (lisääminen, poistaminen, jne.)

9 Kurssin tavoitteet: algoritmit
Johdattelua algoritmien kompleksisuus analyysiin Lajittelualgoritmeja Hakualgoritmeja

10 Miksi C-kieli? C-kielen data-tyypit ja operaatiot vastaavat laitteistotason tarjoamia Ohjelmat ovat hyvin siirrettävissä toisiin laitteisto- ja käyttöjärjestelmäympäristöihin Yleisesti käytössä Linux, Apache, gcc, jne. MISRA C, NVIDIA:n Cg, DX9:n HLSL, OpenGL 2.0:n shader kielet, BrookGPU

11 C-kielen historia Kernigan & Ritchie (K&R), 1972
ISO/IEC (C89, ANSI C) ISO/IEC (C99) Tällä kurssilla käsitellään C89:ä

12 Kertoo kääntäjälle syöttö- ja tulostusfunktioista (printf + muut)
C-Ohjelma Kertoo kääntäjälle syöttö- ja tulostusfunktioista (printf + muut) #include <stdio.h> int main(void) { printf(”Tervetuloa kurssille!\n”); return 0; /* paluuarvo == 0  OK */ } Pääohjelma ”Alku” ”Loppu”

13 Merkkijonovakiot Ympäröidään lainausmerkeillä
Vie muistitilaa merkkien lukumäärän verran + 1, jonka vie merkkijonon päättävä merkki ’\0’ Voidaan jatkaa toiselle riville ”merkki” ”jono” tai ”merkki\ jono” Kenoviivalla voidaan myös jatkaa mitä tahaansa tekstiä toiselle riville

14 Muuttujat Muuttujat on määriteltävä ennen käyttöä, välittömästi ’{’:n jälkeen Muuttujan nimi alkaa kirjaimella(a-z, A-Z) Seuraavat merkit voivat olla kirjaimia tai ’_’ tai numeroita (0-9) Muuttujanimen maksimipituus 31 merkkiä Nimet ’A’ ja ’a’ eivät ole samat

15 Muistimääritteet Määrite Tarkoitus auto
Muutujat ovat oletusarvoisesti tällaisia const Muuttujan arvo on vakio register Vihje kääntäjälle viittauksien nopeuttamiseksi extern Muuttujan määritelmä löytyy muualta static Muuttuja on olemassa ohjelman suorituksen ajan typedef Tyyppimäärittely volatile Arvo voi muuttua ulkoisista syistä

16 C-kielen varatut sanat
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

17 Kokonaislukutietotyypit
Tyyppi Tulkinta Tavut char Yksittäinen merkki 1 signed char etumerkillinen merkki unsigned char etumerkitön merkki short int lyhyt kokonaisluku väh. 2 unsigned short etumerkitön kokonaisluku int kokonaisluku unsigned int long int pitkä kokonaisluku väh. 4 unsigned long etumerkitön pitkä kokonaisluku

18 GNU Compiler Collection(GCC)
GCC, on käytössä ainakin koulun Unix koneissa Käyttö: gcc –ansi –Wall –okohde lahde.c missä kohde on ajettavan ohjelman nimi ja lahde.c lähdetiedoston nimi käännetty ohjelma ajetaan: ./kohde

19 Liukulukutyypit Tyyppi Tulkinta float liukuluku double
kaksoistarkkuuden long double vielä tarkempi

20 Vakiot . tai E:n sisältävät luvut ovat tyyppiä double
c:n E+X tarkoittaa 10+X -1.23 25E+34 . tai E:n sisältävät luvut ovat tyyppiä double F numeron perässä määrittää floatin Tyypille long double lisää L Muutoin luku on tyyppiä int Kokonaisluvuille L määrittää tyypin long int -1.23F 25E+34F -1.23L 25E+34L 123 2534 123L 2534L

21 Liukulukuja ei vertailla näin
#include <stdio.h> int main(void) { float a=1.345,b=1.123,c; c=a+b; if (c == 2.468) printf("Yhtäsuuret\n"); else printf("Erisuuret! c:n arvo on %13.10f, tai%f\n",c,c); } Yhtäsuuruuden testaamiseen käytetään == operaattoria % leveys . tarkkuus f, määrittää tulostuskentän leveyden ja liukuluvun tarkkuuden

22 Liukulukujen vertailua
#include <stdio.h> #define EPSILON int main(void) { float a=1.345,b=1.123,c; c=a+b; if (abs(c-2.468)<EPSILON) printf("Yhtäsuuret\n"); else printf("Erisuuret! c:n arvo on %13.10f, tai%f\n",c,c); } EPSILON korvataan :llä ennen varsinaista käännöstä abs() on itseisarvofunktio

23 C:n operaattorit Vertailuoperaattorit Aritmeettiset operaattorit
Bittitason operaattorit Sijoitusoperaattorit sizeof operaattori Ehtolauseke Tyyppimuunnos

24 Vertailuoperaatoreita
suurempi kuin > suurempi tai yhtäsuuri kuin >= pienempi kuin < pienempi tai yhtäsuuri kuin <= yhtäsuuri == erisuuri != looginen ja && looginen tai || kääntää totuusarvon !

25 luodaan kokonaislukuvakiot alaraja <= a < ylaraja
Vertailua #include <stdio.h> int main(void){ int a=3; const int alaraja=3; const int ylaraja=7; if(a<ylaraja && a>=alaraja) printf("%i <= a < %i\n", alaraja, ylaraja); } luodaan kokonaislukuvakiot alaraja <= a < ylaraja

26 Short-Circuit Evaluation
Ensimmäinen epätosi &&-operaatorin yhdistämä lauseke päättää evaluoinnin b saa arvoksi 0:n ei 2+2=4 koska (b=a) on epätosi eli nolla int a=0, b=1, c=2; if((b=a) && (b=c+2)) printf("Ihme\n"); Ensimmäinen tosi ||-operaatorin yhdistämä lauseke päättää evaluoinnin int b=1, c=2; if(!((b=c) || (b=c+2))) printf("Ihme\n"); b saa arvoksi 2:n ei 2+2=4 koska (b=c) on tosi eli ei-nolla

27 Aritmeettiset operaattorit
yhteenlasku + vähennyslasku - kertolasku * jakolasku / jakojäännös (kokonaisluvuille) % int x=23,y=2; float z; z=x/y; /* z == 11 */ Jakolasku suoritetaan tyypille int, jonka jälkeen tulos sijoitetaan tyyppiin float Tapahtuu implisiittinen tyyppimuunnos

28 Tyyppimuunnokset Lausekkeessa olevat eri tyyppiset tietotyypit muutetaan samaksi ennen lausekkeen arvon laskentaa Implisiittisessä tyyppimuunnoksessa ”alempi” korotetaan ”ylemmäksi” esim. int -> float int x=23; float y=2, z; z=x/y; /* z == 11.5 */

29 Eksplisiittinen tyyppimuunnos
Muoto: (tyyppi) lauseke int x=23,y=2; float z; z=(float)x/y; /* z == 11.5 */ Ekspliittisen tyyppi- muunnoksen käyttö selkeyttää koodia int a=2; float b, c=4; b=(float)a+c; /* b = a+c */

30 ++ ja -- operaattorit ++ lisää muuttujan arvoa yhdellä
-- vähentää yhden operaattori muuttujan nimen edessä (++a): ensin muutetaan arvoa ja sitten lasketaan lausekkeen arvo operaattori nimen perässä (a--): ensin lasketaan lausekkeen arvo ja sitten muutetaan arvoa int x=1,y=2; x=y++; /* x==2, y==3 */ x=--y; /* x==2, y==2 */

31 Lukujärjestelmät Kymmenjärjestelmä: = 1*101+3*100+ 5* *10-2 Binääriluvut: =0*27+1*26+1*25+ 0*24+1*23+1*22+1*21+1*20=11110 Sama heksadesimaalimuodossa: F 6F16 A=1010, B=1110, C=1210 D=1310, E=1410, F=1510

32 Bittien käsittely operaattorit
B Biteittäin suoritettava ja (AND) A & B Biteittäin suoritettava tai (OR) A | B Biteittäin suoritettava poissulkeva tai (XOR) A ^ B Siirto vasemmalle biteittäin A << 1 Siirto oikealle biteittäin B >> 2 Yhden komplementti (kääntää bitit) ~A

33 Bittioperaatioiden käytöstä
luku maski luku|maski |-operaatiota käytetään bittien päälle laittamiseen ^ -operaatiota käytetään bittien tilan vaihtamiseen &-operaatiolla voidaan nollata halutut bitit luku maski luku^maski luku maski luku&maski

34 Etuliitteellä 0x merkitään heksadesimaalilukuja
Bittien käsittelyä #include <stdio.h> tulosta_bitit(char str[], unsigned char c); int main(void){ unsigned char a=0x5F, b=0xF5; tulosta_bitit("a", a); tulosta_bitit("b", b); tulosta_bitit("a & b", a & b); tulosta_bitit("a && b", a && b); Etuliitteellä 0x merkitään heksadesimaalilukuja Bittitason ja (AND) Looginen ja operaatio

35 Bittitason poissulkeva
Bittien käsittelyä II Bittitason tai (OR) tulosta_bitit("a | b", a | b); tulosta_bitit("a ^ b", a ^ b); tulosta_bitit("a << 1", a << 1); tulosta_bitit("a >> 2", a >> 2); tulosta_bitit("~a", ~a); return 0; } Bittitason poissulkeva tai (XOR) Yhden komplementti (kääntää bitit)

36 Bittien tulostus tulosta_bitit(char str[], unsigned char c){
int bitti; printf("%s:\t", str); for(bitti = 7; bitti >= 0; bitti--) { if((c & (1 << bitti )) != 0 ) printf( "1" ); else printf( "0" ); } printf("\n");

37 Sijoitusoperaattorit
Sijoitusoperaattorin ’=’ lisäksi löytyy joukko tiivistettyjä sijoitusoperaattoreita Seuraaville sijoitusoperaattoreille X*=(Y+Z); X=X*(Y+Z); += -= *= /= %= &= |= ^= <<= >>= (lauseke1) = (lauseke1) operaattori (lauseke2) tiivistetty muoto on lauseke1 operaattori=lauseke2

38 sizeof operaattori ja ehtolauseke
sizeof operaattori antaa muuttujan viemän tilan tavuina, kaksi muotoa: sizeof(tyyppi) sizeof muutuja lauseke1 ? lauseke2 : lauseke3 jos laukeke1 on tosi koko lausekkeen arvo on lauseke2 muutoin lauseke3 Z=(X>Y)?X:Y; if(X>Y) Z=X; else Z =Y;

39 Tärkeysjärjestys/assosiatiivisuus taulukko
Operaattori Assosiatiivisuus () [] -> . vasemmalta oikealle ~ (tietotyyppi) * & sizeof oikealta vasemmalle * / % + - << >> < <= > >= == != & ^ | && || ?: = += -= *= /= %= &= |= ^= <<= >>= ,

40 Operaattoreiden tärkeysjärjestys
a=c==4;  a=(c==4) Sulkujen käyttö selkeyttää järjestystä a=b+=c;  a=(b+=c); 2*5%3  (2*5)%3 == tärkeämpi kuin = = ja += yhtätärkeitä assosiatiivisuus oikealta vasemmalle * ja % yhtätärkeitä assosiatiivisuus vasemmalta oikealle (2*5)%3 == 1

41 Itsemääritellyt tietotyypit
Tarkoitus enum Määrittelee nimettyjä kokonaisluku vakioita struct Joukko tietotyyppejä union Joukko vaihtoehtoisia tietotyyppejä enum luku {nolla, yksi, kaksi}; enum luku l=yksi;

42 Tietueet (structure) struct paivays{ int paiva; int kuukausi;
int vuosi; }; struct paivays paiva1={15, 1, 2004}, paiva2; Ei voi sisältää struct paivays tyyppistä muuttujaa Tietoalkioiden ryhmittelyyn Useiden arvojen palauttamiseen funktiosta Linkitettyjen listojen rakentamiseen

43 Union union U{ double d; char c[2]; int i; } d (8 tavua) c (2)
i (4 tavua)

44 Kaksi lähdekooditiedostoa
#include <stdio.h> extern int lisaa(int); int main(void){ int a = 0; a = lisaa(a); printf("a = %i\n", a); printf("a = %d\n", a); return 0; } Toisessa lähdekooditiedostossa määritellyn funktion esittely Funktion paluuarvo muuttaa pääohjelman muuttujan arvoa printf():n parametri %d tai %i tulostaa kokonaisluvun

45 Funktion lisaa() määrittely
int lisaa(int i) { static int j = 1; return i + (j++); } Muuttuja j on staattinen eli olemassa koko ohjelman suorituksen ajan. Ensimmäisellä kutsukerralla funktio alustaa muuttujan j arvoon ’1’. j:tä kasvatetaan yhdellä paluuarvon määräämisen jälkeen


Lataa ppt "Tietorakenteet ja C-kieli"

Samankaltaiset esitykset


Iklan oleh Google