34
Etsi virhe 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

Embed Size (px)

DESCRIPTION

Etsi virhe. #include 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\n", x, y, x*y ); } return 0; }. for( y = 0; y < 5 . 00; y++ ) {. Etsi virhe. int sum( int a[], int n ) { int i; - PowerPoint PPT Presentation

Citation preview

Page 1: Etsi virhe

Etsi virheEtsi 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++ ) {

Page 2: Etsi virhe

Etsi virheEtsi 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++ )

Page 3: Etsi virhe

Etsi virheEtsi 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);}

if (abs(c-2.468)<EPSILON)

#define EPSILON 0.0001

Page 4: Etsi virhe

Etsi virheEtsi virhe

int a[10000]; void f() { int i; for( i = 0; i < 10000; i++); a[i] = i;}

for( i = 0; i < 10000; i++)

Page 5: Etsi virhe

Etsi virheEtsi 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 ); }

Page 6: Etsi virhe

Etsi virheEtsi 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:

Page 7: Etsi virhe

Etsi virheEtsi 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;}

break;break;break;break;

Page 8: Etsi virhe

Etsi virheEtsi virheint 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; }

Page 9: Etsi virhe

Etsi virheEtsi virhe

#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; }

VERSION

Page 10: Etsi virhe

Etsi virheEtsi 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 labson sama nimi kuin funktiollalabs(), joten ennen printf():ääoleva labs on funktion nimi

Page 11: Etsi virhe

Etsi VirheEtsi 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;

Page 12: Etsi virhe

* - operaattori* - 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; }

c0xbffffa67

p a

Page 13: Etsi virhe

Osoittimien käyttöä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; }

’c’ ’d’0xbffffa67

p a

Page 14: Etsi virhe

*p=*q vs p=q*p=*q vs p=q

#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;}

’c’ ’d’0xbffffa67

p a

’d’0xbffffa68

q b

’d’0xbffffa670xbffffa68

pa

’d’0xbffffa68

q b

Page 15: Etsi virhe

Etsi VirheEtsi 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; }

Kommentti kommentin sisällä

if(*p) return *q/(*p) /* laske suhde */ ;

Page 16: Etsi virhe

Etsi virheEtsi 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

Page 17: Etsi virhe

Etsi virheEtsi 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 eitarkisteta virheen varalta

Page 18: Etsi virhe

Etsi virheEtsi virhe

#define KMAX 30double 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

Page 19: Etsi virhe

Dynaamisten taulukoiden Dynaamisten taulukoiden käyttökäyttö

1. Määritä osoitin haluttuun taulukko elementtiin 2. Alusta osoitin malloc():n tai calloc():n avulla

varattuun muistialueeseen3. Vertaa osoitinta NULL osoittimeen4. Lisää/vähennä alkioiden määrää

realloc():n avulla5. Vapauta varattu muisti free():llä

Page 20: Etsi virhe

PinoPino

Lisäykset ja poistot suoritetaan aina pinon päältä

Toimii LIFO (Last In First Out) periaatteella

Voidaan käyttää esim. undo toiminnon toteuttamiseen

Page 21: Etsi virhe

JonoJono

Lisäykset tehdään jonon loppuun ja poistot alusta

Toimii FIFO (First In First Out) periaatteellaKäytetään esim. rajapinnoissa:

Yhden systeemin generoima data laitetaan jonoon josta toinen käsittelee sitä

Page 22: Etsi virhe

Jono renkaanaJono renkaana

34

35 36

37

38häntäpää

poista jonosta

lisää jonoon

Page 23: Etsi virhe

Linkitetty listaLinkitetty lista

Joukko alkioita jotka on kytketty toisiinsa linkeillä Listan alkio sisältää talletettavan datan ja

linkin seuraavan alkioon Alkion lisääminen listan keskelle on helppoa Alkioihin ei voida viitata indeksin avulla vrt. taulukko Listan kokoa ei ole ennalta rajoitettu

911 112luku

seuraava1

NULL

Page 24: Etsi virhe

Etsi virheEtsi 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;}

Page 25: Etsi virhe

Kahteen suuntaan linkitetty listaKahteen suuntaan linkitetty lista

Lisääminen vaatii enemmän operaatiotaAlkioita voidaan lisätä/poistaa käyttämällä

pelkästään alkiota

911 112lukuseuraava

1NULL

pääosoitin häntäosoitin

edellinen

Page 26: Etsi virhe

Binäärinen hakupuuBinäärinen hakupuu

Jokaisessa solmussa on yksikäsitteinen avainvasemmat jälkeläiset < nykyinen solmu <

oikeat jälkeläiset 9

116

7 105

Page 27: Etsi virhe

Binäärisen hakupuun läpikäynti Binäärisen hakupuun läpikäynti sisäsisäjjärjesärjestytyksessäksessä ( (ininorder)order)

Järjestys:vasen alipuu - juuri - oikea alipuu5 6 7 9 10 11

9

116

7 105void sisajarjestys(puuos alkio){ if(alkio){ sisajarjestys(alkio->vasen); tulosta_alkio(alkio); sisajarjestys(alkio->oikea); }

Page 28: Etsi virhe

Maksimi- ja minimikekoMaksimi- 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

Page 29: Etsi virhe

Graafi G – terminologiaGraafi G – terminologia

Ei-tyhjä solmujen/kärkien (vertex) joukko V(G) Kaarien (edge) joukko E(G) Suuntaamaton (G1), Suunnattu (G2)

solmu

kaari

Page 30: Etsi virhe

Graafin toteutus Graafin toteutus vierusmatriisillavierusmatriisilla

Taulukossa on arvo 1 paikassa < vi,vj> silloin, kun kahden solmunvi ja vj välillä on kaari; muutoin 0.

Page 31: Etsi virhe

Graafin toteutus vieruslistallaGraafin toteutus vieruslistalla

Vieruslista

Käänteinen vieruslista

Page 32: Etsi virhe

Graafin leveyshakuGraafin leveyshaku

1. Merkitään aloitussolmu v vierailluksi2. Lisätään solmu v jonoon3. Toistetaan kunnes jono on tyhjä4. Seuraava kärki v jonosta käsittelyyn5. Vieraile v:hen kytketyissä ei-vierailluissa solmuissa w6. Lisää w jonoon7. Merkitse w vierailluksi

Page 33: Etsi virhe

Suuntaamattoman graafin Suuntaamattoman graafin syvyyshakusyvyyshaku

Vieruslista

A: F C B GB: AC: AD: F EE: G F DF: A E D:G: E A:H: I:I: H:

F

A

B C G

D E

H I

Page 34: Etsi virhe

Välikokeeseen valmistautumisessa Välikokeeseen valmistautumisessa kannattaa kerrata seuraavat asiat: kannattaa kerrata seuraavat asiat:

1. Luennoilla käsitellyt asiat luentomonisteesta2. Luennoilla esitetyt ohjelmat3. Harjoituksissa käsitellyt asiat