340 likes | 428 Views
Etsi virhe. #include <stdio.h> int main() { d ouble x, y; for( x = 0; x < 4.00; x++ ) for( y = 0; y < 5,00; y++ ) { if( x * y < 1000 ) printf( "%g * %g = %g<br>", x, y, x*y ); } return 0; }. for( y = 0; y < 5 . 00; y++ ) {. Etsi virhe. int sum( int a[], int n ) { int i;
E N D
Etsi virhe #include <stdio.h> int main() { double x, y; for( x = 0; x < 4.00; x++ ) for( y = 0; y < 5,00; y++ ) { if( x * y < 1000 ) printf( "%g * %g = %g\n", x, y, x*y ); } return 0; } for( y = 0; y < 5.00; y++ ) {
Etsi virhe int sum( int a[], int n ) { int i; int s = 0; for( i = 0, i < n; i++; ) s += a[i]; return s;} int main(){ int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; printf("summa on %i\n", sum(a,10)); return 0;} for( i = 0; i < n; i++ )
#define EPSILON 0.0001 if (abs(c-2.468)<EPSILON) Etsi virhe #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); }
Etsi virhe int a[10000]; void f() { int i; for( i = 0; i < 10000; i++); a[i] = i; } for( i = 0; i < 10000; i++)
Etsi virhe #include <stdio.h> void tulosta_summa( double a[], int n ){ int i; double summa = 0; for( i = 0; i < n; i++ ) summa += a[i]; printf( "Summa = %d\n", summa ); } int main() { double x[3] = { 1.0, 2.0, 3.0 }; tulosta_summa( x, 3 ); return 0; } printf( "Summa = %f\n", sum ); }
Etsi virhe #include <stdio.h> int f(int n){ int m; switch( n ){ case 1: m = 2; break; case 2: m = 4; break; case 3: m = 8; break; delault: m = 0; break;} return m;} int main() { printf( "f(5) = %d\n", f(5) ); return 0; } default:
break; break; break; break; Etsi virhe #include <stdio.h> void tulosta( int luku ){ switch (luku){ case 1: printf("yksi\n"); case 2: printf("kaksi\n"); case 3: printf("kolme\n"); case 4: printf("nelja\n"); } } int main(){ int i; for( i = 1; i <= 4; i++ ) tulosta( i ); return 0;}
Etsi virhe int laske_vokaalit( char *s ){ int sum = 0; for(;;) switch( *s++ ){ case 'a': case 'e': case 'i': case 'o': case 'u': sum++; continue; default: continue; case '\0': break;} return sum; } case '\0': break; default: continue; }
Etsi virhe VERSION #define VERSI0N 12 #include <stdio.h> char *ss( char *s ) { return s; } int main() { #if VERSION > 10 printf( "hello %s\n", ss("world") ); #endif return 0; }
Etsi virhe void f( int n ) { if( n > 0 ) { int labs, research; research = n-1; if( research > 15 ) labs = 3; else labs = 0; } if( labs ) labs *= 100; } if( labs ) printf( "%d - 1 is greater than 15\n", n ); } int main() { f(13); return 0; } paikallisella muuttujalla labs on sama nimi kuin funktiolla labs(), joten ennen printf():ää oleva labs on funktion nimi
Etsi Virhe #include <stdio.h> int main(){ unsigned row = 25, col = 80; if( row + col > -1 ) printf("ei-negatiivinen\n"); else printf("negatiivinen\n"); return 0; } signed row = 25, col = 80;
* - operaattori • Käänteinen &-operaattorille • &-operaattori antaa muuttujan osoitteen • *-operaattori antaa osoitteessa olevan muuttujan #include <stdio.h> int main(void){ char a = 'c'; char *p=&a; printf("%c\n", a); printf("%c\n", *p); /* p:n osoittama merkki */ return 0; } a p 0xbffffa67 c
Osoittimien käyttöä • pointterin osoittamiin arvoihin voidaanmyös kirjoittaa #include <stdio.h> int main(void){ char a = 'c'; char *p=&a; printf("%c\n", *p); (*p)++; printf("%c\n", a); return 0; } p a 0xbffffa67 ’c’ ’d’
*p=*q vs p=q p a #include <stdio.h> int main(void){ char a = 'c', b='d'; char *p=&a, *q=&b; *p=*q; printf("%c, %c\n", *p, *q); p=q; printf("%c, %c\n", *p, *q); return 0; } 0xbffffa67 ’c’ ’d’ q b 0xbffffa68 ’d’ p a 0xbffffa67 0xbffffa68 ’d’ q b 0xbffffa68 ’d’
if(*p) return *q/(*p) /* laske suhde */ ; Kommentti kommentin sisällä Etsi Virhe #include <stdio.h> int osamaara(int *q, int *p) { if(*p) return *q/*p /* laske suhde */ ; else return *q; } int main(){ int n = 20, m = 4; int q = osamaara( &n, &m ); printf( "%d/%d == %d\n", n, m, q ); return 0; }
Etsi virhe int *p = NULL; int i; for( i = 0; i < n; i++ ) p = &a[i]; *p = 0; p on NULL, jos silmukkaa ei suoriteta kertaakaan
Etsi virhe #include <stdio.h> int prosessoi( char *tiedostonnimi ) { FILE *fp; int laskuri = 0; if( tiedostonnimi ) { if( fp = fopen(tiedostonnimi, "r") ){ while( fgetc( fp ) != EOF ) laskuri++; } fclose( fp ); } return laskuri; } fopen():in paluuarvoa ei tarkisteta virheen varalta
Etsi virhe #define KMAX 30 double q[KMAX]; void f( double limit ){ double s = 1; int k = 0; q[0] = 0; while( q[k] <= limit && k < KMAX ){ k++; s = s * (k+1); q[k] = q[k-1] + s; } } q[k] voi ylittää taulukon rajat
Dynaamisten taulukoiden käyttö • Määritä osoitin haluttuun taulukko elementtiin • Alusta osoitin malloc():n tai calloc():n avulla varattuun muistialueeseen • Vertaa osoitinta NULL osoittimeen • Lisää/vähennä alkioiden määräärealloc():n avulla • Vapauta varattu muisti free():llä
Pino • Lisäykset ja poistot suoritetaan aina pinon päältä • Toimii LIFO (Last In First Out) periaatteella • Voidaan käyttää esim. undo toiminnon toteuttamiseen
Jono • Lisäykset tehdään jonon loppuun ja poistot alusta • Toimii FIFO (First In First Out) periaatteella • Käytetään esim. rajapinnoissa:Yhden systeemin generoima data laitetaan jonoon josta toinen käsittelee sitä
Jono renkaana 35 36 poista jonosta 34 37 38 pää häntä lisää jonoon
911 112 1 Linkitetty lista • Joukko alkioita jotka on kytketty toisiinsa linkeillä • Listan alkio sisältää talletettavan datan jalinkin seuraavan alkioon • Alkion lisääminen listan keskelle on helppoa • Alkioihin ei voida viitata indeksin avulla vrt. taulukko • Listan kokoa ei ole ennalta rajoitettu luku seuraava NULL
Etsi virhe typedef struct _solmu { int Arvo; struct _solmu *linkki; } solmu, *solmuos; solmuos Lisaasolmu(solmuos paa, solmuos uusi ){ solmuos solmu = paa; solmuos edsolmu = NULL; while ( solmu->Arvo <= uusi->Arvo) { edsolmu = solmu; solmu = solmu->linkki; } edsolmu->linkki = uusi; uusi->linkki = solmu; return paa; }
112 1 Kahteen suuntaan linkitetty lista • Lisääminen vaatii enemmän operaatiota • Alkioita voidaan lisätä/poistaa käyttämällä pelkästään alkiota edellinen luku 911 seuraava NULL pääosoitin häntäosoitin
Binäärinen hakupuu • Jokaisessa solmussa on yksikäsitteinen avain • vasemmat jälkeläiset < nykyinen solmu <oikeat jälkeläiset 9 6 11 5 7 10
Binäärisen hakupuun läpikäynti sisäjärjestyksessä (inorder) • Järjestys: vasenalipuu - juuri - oikea alipuu 5 6 7 9 10 11 9 6 11 void sisajarjestys(puuos alkio){ if(alkio){ sisajarjestys(alkio->vasen); tulosta_alkio(alkio); sisajarjestys(alkio->oikea); } 5 7 10
Maksimi- ja minimikeko • Täydellinen binääripuu jonka jokaisen solmun avain on suurempi (pienempi) tai yhtäsuuri kuin lasten avain • Suurimman (pienimmän) alkion etsiminen on nopeaa
Graafi G – terminologia • Ei-tyhjä solmujen/kärkien (vertex) joukko V(G) • Kaarien (edge) joukko E(G) • Suuntaamaton (G1), Suunnattu (G2) solmu kaari
Graafin toteutus vierusmatriisilla Taulukossa on arvo 1 paikassa < vi,vj> silloin, kun kahden solmun vi ja vjvälillä on kaari; muutoin 0.
Graafin toteutus vieruslistalla Vieruslista Käänteinen vieruslista
Graafin leveyshaku • Merkitään aloitussolmu v vierailluksi • Lisätään solmu v jonoon • Toistetaan kunnes jono on tyhjä • Seuraava kärki v jonosta käsittelyyn • Vieraile v:hen kytketyissä ei-vierailluissa solmuissa w • Lisää w jonoon • Merkitse w vierailluksi
Suuntaamattoman graafin syvyyshaku A H I B C G Vieruslista A: F C B GB: AC: AD: F EE: G F DF: A E D:G: E A:H: I:I: H: D E F
Välikokeeseen valmistautumisessa kannattaa kerrata seuraavat asiat: • Luennoilla käsitellyt asiat luentomonisteesta • Luennoilla esitetyt ohjelmat • Harjoituksissa käsitellyt asiat