Mail: wouter.vanooijen@hvu.nl Jan Zuurbier Mail: jan.zuurbier@hvu.nl Sheets en verdere info: www.voti.nl/hvu/2CPRG1 Onderwerp: C programmeren voor niet-C programmeurs Literatuur: C handboek Kernighan & Ritchie Academic Service ISBN 90 62 334 881 Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Wat er van u verwacht wordt U bent (op tijd!) aanwezig Theorie in D105; praktijk in 3009A Neem de aangeven stof (boek) goed door U krijgt iedere week een opgave; de opgave(n) van week N wordt op zijn laatst aan het begin van week N+1 getoond ter beoordeling U maak de opgave(n) zelf Afsluitend tentamen, cijfer geldt alleen als de opgaves voldoende zijn (> 5.5) (tbd: opgaves 30%?) Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Verplichte aanschaf Boek: C handboek, Kernighan & Ritchie Knoppix CD: bij je docent, E 1.00, copieren mag USB memory stick (floppy mag ook, maar op eigen risico) Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Wat is C? C ligt zeer dicht bij de processor C is een taal van weinig woorden C kan je makkelijk aanvullen met assembler C is de taal van DSP en Micro´s C is portabel en zeer flexibel C is zeer krachtig C is modulair Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Maar C is ook: De taal om de meest verschrikkelijke fouten te maken zonder dat je het in de gaten hebt De taal waarmee je ongemerkt de boel kunt verzieken De taal van de onbegrijpelijke foutmeldingen De taal van de onleesbare programma´s De taal die je tot wanhoop kan drijven Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Waarom C? C haalt het uiterste uit de computer C is oorspronkelijk bedacht als alternatief voor assembler en ‘machine-afhankelijke’ hogere programmeertalen, voor het schrijven van een ‘machine-onafhankelijke’ Unix ”C is de beste assembler die er bestaat.” Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Java / Python / Tcl / Perl / Delphi / ... Waarom *geen* C? C haalt het uiterste uit de computer! Maar het vergt ook het uiterste van de programmeur Java / Python / Tcl / Perl / Delphi / ... C assembler solderen nieuwe chip maken er is geen ‘beste programmeertaal/gereedschap’ maar er zijn wel verschillende toepassingsgebieden Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Onleesbaar schrijven in C #define P(X)j=write(1,X,1) #define C 39 int M[5000]={2},*u=M,N[5000],R=22,a[4],l[]={0,-1,C-1,-1},m[]={1,-C,-1,C},*b=N, *d=N,c,e,f,g,i,j,k,s;main(){for(M[i=C*R-1]=24;f|d>=b;){c=M[g=i];i=e;for(s=f=0; s<4;s++)if((k=m[s]+g)>=0&&k<C*R&&l[s]!=k%C&&(!M[k]||!j&&c>=16!=M[k]>=16))a[f++ ]=s;if(f){f=M[e=m[s=a[rand()/(1+2147483647/f)]]+g];j=j<f?f:j;f+=c&-16*!j;M[g]= c|1<<s;M[*d++=e]=f|1<<(s+2)%4;}else e=d>b++?b[-1]:e;}P(" ");for(s=C;--s;P("_") )P(" ");for(;P("\n"),R--;P("|"))for(e=C;e--;P("_ "+(*u++/8)%2))P("| "+(*u/4)%2 );} Compileer en executeer het programma en kijk naar de uitkomst. Bron: http://www.de.ioccc.org/main.html Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
C syntax lijkt op Java - loops (of eigenlijk andersom) while( Boolean expression ) { statement(s) } do { statement(s) } while ( Boolean expression ); for( initialisation; termination condition; incrementing expr ) { statement(s) } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
C syntax lijkt op Java - conditionals (of eigenlijk andersom) if( Boolean expression ){ statement(s) } if( Boolean expression ){ statement(s) } else { statement(s) } switch( integer expression ){ case constant integer expr: statement(s) break; ... default: statement(s) break; } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
C syntax lijkt op Java (of eigenlijk andersom) maar geen: exception handling classes break met label IO via <stdio.h> Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Layout neem een conventie naar keuze, maar wees consequent! if( b > a ){ a = b; } if( b > a ) { Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
char data type in C is een char gewoon een getal ’A’ + 1 == ’B’ ASCII: ’a’..’z’, ’A’ .. ’Z’, ’0’..’9’, ’ ’ speciale tekens: bv ’\n’ Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
arrays Een array heeft een vaste omvang Een array heeft maar 1 dimensie char woord[ 32 ]; char regel[ 100 ][ 32 ]; Index loopt vanaf 0: woord[ 0 ] = ’a’; woord[ 31 ] = ’a’; Buiten je grenzen schrijven: woord[ -1 ] = ’a’; woord[ 32 ] = ’a’; Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
input / output : Stdio.h putchar( c ); printf( string, expressie(s) ); bv: printf( “n=%d, m=%d”, n, m ); c = getchar(); let op: geeft een int terug, geen char geeft bij einde invoer EOF terug Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Command line parameters int main( int argv, char **argc ){ … } argc = aantal parameters argv[ 1 ] = eerste parameter argv[ 1 ][ 0 ] = eerste letter van eerste parameter Wat is hier onlogisch? Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
"Hello world!" #include <stdio.h> informatie over de standaard bibliotheek in het programma opnemen. int main( int argc; char **argv ) Definieer de functie main. Start altijd als eerste. Programma heeft altijd een main. { De statements van main staan tussen de accoladen in compound. printf( ”Hello world!\n” ); Main roept een uit stdio.h een standaardfunctie aan printf return 0; Deze functie heeft de returnwaarde 0 } Einde van main. Accolade sluiten. Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
gcc –Wall hello.c –o hello ./hello Een zeer simpel hello.c programma #include <stdio.h> int main( int argc, char **argv ) { printf(”Hello world!\n”); return 0; } Kan worden gecompileerd door: gcc –Wall hello.c –o hello en worden geexecuteerd door: ./hello Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
gebruik van Knoppix nedit & gcc –Wall hello.c –o hello hello CD erin en (her) opstarten click onderaan op Konsole (beeldscherm met schelp) typ: nedit & programma intypen, saven als hello.c in de console window: gcc –Wall hello.c –o hello hello Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
gebruik van Knoppix – USB stick commando’s: mkdir usb sudo mount /dev/sda usb Je hebt nu een subdirectory usb waarin je stick ‘zit’ Maar… de ’owner’ is root, dus voor ieder commando moet je ’sudo’ zetten: sudo cp opgave1.c usb Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Opdracht 1 ’hello world!’ Start een systeem op Voer het programma hello.c in Compileer het programma Executeer (run) het programma Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Opdracht 2 ’Cesar’ Maak een programma dat zijn invoer weer wegschrijft als uitvoer, maar met iedere letter vervangen door de letter N plaatsen verderop. N wordt bepaald door de letter die als command-line parameter, wordt meegegeven, waarbij a=0, b=1, etc. Let op: gebruikt wrap-around, kleine letters blijven kleine letters, etc niet-letters niet veranderen Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Opdracht 3 ’omkeren’ Maak een programma dat zijn invoer weer wegschrijft als uitvoer, maar met ieder woord achterstevoren. Neem als maximum woordlengte 10. Zorg dat je programma niet uit dat array kan lopen. Zorg dat je programma zijn eigen inverse is. Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology
Werk voor volgende week Koop het boek en een UsbStick Lees hoofdstuk 1 Maak (voor zover nog niet klaar) de opdrachten af Bewaar je opdrachten op je UsbStick Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology