Upload
ivy-mooney
View
43
Download
3
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
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++ ) {
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++ )
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
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++)
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 ); }
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:
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;
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; }
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
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
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;
* - 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
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
*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
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 */ ;
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
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
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
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ä
PinoPino
Lisäykset ja poistot suoritetaan aina pinon päältä
Toimii LIFO (Last In First Out) periaatteella
Voidaan käyttää esim. undo toiminnon toteuttamiseen
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ä
Jono renkaanaJono renkaana
34
35 36
37
38häntäpää
poista jonosta
lisää jonoon
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
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;}
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
Binäärinen hakupuuBinäärinen hakupuu
Jokaisessa solmussa on yksikäsitteinen avainvasemmat jälkeläiset < nykyinen solmu <
oikeat jälkeläiset 9
116
7 105
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); }
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
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
Graafin toteutus Graafin toteutus vierusmatriisillavierusmatriisilla
Taulukossa on arvo 1 paikassa < vi,vj> silloin, kun kahden solmunvi ja vj välillä on kaari; muutoin 0.
Graafin toteutus vieruslistallaGraafin toteutus vieruslistalla
Vieruslista
Käänteinen vieruslista
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
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
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