Gestructureerd Programmeren in C (GESPRG).
© Harry Broeders, Mark Schrauwen.
Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Academie
voor Technology, Innovation & Society Delft.
Inleiding.
De practicumopdrachten van dit vak kun je op BB vinden onder documents. Deze
website bevat vooral veel informatie over de theorie.
Let op! Deze pagina bevat mogelijk
verouderde informatie, kijk op Blackboard voor de meest recente informatie!
BOEK:
- Het gebruikte boek is: De
programmeertaal C, 4e vernieuwde editie van Al Kelley en Ira Pohl, ISBN
9789043016698.
- Opmerkingen bij het boek "De programmeertaal C, 4e vernieuwde
editie" per les:
- Les 1:
- Opmerking bij p.6 en verder: De functie
main
geeft
een int
terug en krijgt niets (void
) mee
bij aanroep. Daarom moet main
als volgt gedefinieerd
worden:
int
main(void) {
/* declaraties */
/* statements
*/
return
0;
}
Het is gebruikelijk om main
de waarde 0
terug te laten geven (aan het operating systeem) om aan te geven
dat het uitvoeren van het programma geen problemen heeft
opgeleverd.
- Les 2:
- Opmerking bij p.9: In het boek wordt voor het opslaan van een
reëel getal een variabele van het type
float
gebruikt. Ik adviseer je om in plaats van het type
float
het type double
te gebruiken. Lees hier waarom!
- Opmerking bij p.67 aan het einde van paragraaf 2.8: De volgende
expressies worden als voorbeeld gebruikt.
++a
a += b
Dit zijn afkortingen van expressies die je al kent.
++a
is een aflkorting voor a = a + 1
en
a += b
is een afkorting voor a = a + b
.
Ik ga deze afkortingen later ook gebruiken maar ik ben van mening
dat, als je net begint met programmeren, het beter is om het zo
simpel mogelijk te houden en dus gebruik ik in het begin deze
afkortingen nog niet. De auteurs van het boek denken daar blijkbaar
anders over.
- Opmerking bij p.90: Er staat: Personal computers bijvoorbeeld,
hebben woorden van 2 bytes. Yeah right, when your living in the
80's! Sinds Windows95 op PC's wordt gebruikt (1995) maken PC's
gebruik van 4 bytes woorden. De PC hardware ondersteunde dat al
sinds de introductie van de Intel 80386 processor (1985), zie (als
je geïnteresseerd bent in geschiedenis) http://nl.wikipedia.org/wiki/Intel_80386
.
- Opmerking bij p.90: Er staat: Dat brengt met zich mee dat een
int, omdat er 32 bits beschikbaar zijn, 232 verschillende
invullingen kan hebben. Dat moet natuurlijk 232 in
plaats van 232 zijn.
- Les 3:
- Opmerking bij p.20: De eerste regel:
printf("%d", a + b + e);
moet zijn
printf("%d", a + b + c);
.
- Opmerking bij p.21: Er staat: Op soortgelijke wijze zal
-i
de in i
opgeslagen waarde met één
verlagen. Dit moet natuurlijk zijn: Op soortgelijke wijze
zal --i
de in i
opgeslagen waarde met
één verlagen.
- Les 4:
- Opmerking bij p119:
!(a < b II c < d)
moet
natuurlijk zijn !(a < b || c < d)
.
- Opmerking bij p121: De onjuiste expressie
a ||
b
is natuurlijk gewoon juist. Waarschijnlijk bedoelde de
auteurs: a | | b
/* geen
extra spatie toegestaan */
.
- Opmerking bij p121: In de kop van de tabel staat
expr1 ll
expr2
dit moet natuurlijk zijn expr1 || expr2
.
Even verderop staat nogmaals ll
waar ||
wordt bedoeld. Ook op p122 wordt deze fout nogmaals gemaakt.
- Fout op pagina 30 voorbeeld arrays:
- De onderste for-lus heeft geen compound-statement (accolades).
Als je dit programma uitvoert in MVS2012 worden de ingevoerde
waardes niet geprint. Wel wordt een array-waarde geprint die buiten
het array valt. De juiste versie van het voorbeeld staat hier BoekVerbeterdeCodePagina30.c.
COLLEGES:
- Pas op: De onderstaande
presentaties bevatten uitwerkingen van het huiswerk. Probeer eerst zelf je huiswerk te maken!
Pas (alweer) op: De onderstaande presentaties kunnen (na de les) nog
bijgewerkt worden.
- In tegenstelling tot andere vakken zulen de colleges in één Powerpoint
presentatie worden aangeboden. De laatste versie is altijd hier te
downloaden:
HUISWERK:
- bij het boek "De programmeertaal C, 4e vernieuwde editie" per les (dit
huiswerk moet je na afloop van de les maken):
- Les 1:
- Bestudeer C boek: hoofdstuk 1 tot paragraaf 1.4.
- Maak opdrachten: 1a, 1b en 4 van paragraaf 1.12. Uitwerking. Probeer eerst zelf je huiswerk te maken!
- Les 2:
- Bestudeer C boek: paragrafen 2.3 t/m 2.6, 2.8 t/m 2.9, 3.1, 3.4
en 3.6.
- Maak opdrachten: 5, 7 en 9 van paragraaf 2.15 en 1 van paragraaf
3.13. Uitwerking. Probeer eerst zelf je huiswerk te maken!
- Les 3:
- Bestudeer C boek: paragrafen 1.6, 4.1 t/m 4.3, 4.5, 4.8 t/m 4.9
en 4.12.
- Schrijf een programma dat de tafels van 1 t/m 5 naast elkaar
afdrukt. Uitwerking: tafels.c
. Hoe maak je nu eigenlijk zo'n
programma?
- Maak opdrachten: 7 en 10 van paragraaf 1.12. Uitwerking. Probeer eerst zelf je huiswerk te maken!
- Les 4:
- Les 5:
- Bestudeer C boek: paragrafen 1.7, 5.1 t/m 5.5.
- Maak opdrachten: 1, 2 en 3 van paragraaf 5.17. Uitwerking. Probeer eerst zelf je huiswerk te maken!
- Les 6:
- Schrijf een recursieve functie
int
fib(int n)
die het nde getal uit
de fibonacci rij berekent. Zie: http://en.wikipedia.org/wiki/Fibonacci_number
. Paragraaf 4.13 van het C
boek geeft een iteratieve oplossing. Het antwoord op deze vraag
staat in het boek in paragraaf 5.15. Eerst
zelf proberen natuurlijk! Zie uitwerking.
- Bestudeer C boek: paragrafen 5.6, 5.7 en 5.15.
- Les 7:
- Bestudeer de werking van de functie
wissel
. Teken de
variabelen x
, y
, p
,
q
en hulpje
en bepaal hun inhoud
gedurende de uitvoering van het programma.
- Bestudeer C boek: paragrafen 6.2 en 6.3.
- Les 8:
- Bestudeer C boek: paragrafen 3.7, 6.1, 6.4 en 6.6.
- Schrijf een functie
reverse
waarmee de inhoud van
een rij gehele getallen omgedraaid kan worden. Als de rij de
getallen 0, 1, 2 en 3 bevat dan moet de rij na afloop van de
functie de getallen 3, 2, 1 en 0 bevatten. Deze functie wordt in
les 9 uitgebreid besproken!
- Maak opdrachten: 8 van paragraaf 6.18. Deze opgave is vrij
pittig. Klik hier voor de
uitwerking.
- Les 9:
- Bestudeer C boek: paragraaf 6.11.
- Schrijf een functie
areRowsValid
die checked of in
een matrix van 9 bij 9 niet meerdere malen hetzelfde cijfer
op dezelfde regel voorkomt. Een lege plaats wordt aangegeven met de
waarde 0. Een testprogramma kun je hier vinden: testAreRowsValid.c
- De functie geeft 1 terug als er niet meerdere malen hetzelfde
cijfer op dezelfde rij voorkomt.
- De functie geeft 0 terug als er meerdere malen hetzelfde
cijfer op dezelfde rij voorkomt.
- Als het goed is heb je na les 6 een recursieve functie
int
fib(int n)
geschreven die het
n
de getal uit de fibonacci rij berekent.
- Wat is het domein van deze functie.
- Pas de
fib
functie aan zodat gecontroleerd wordt
of n
in het domein ligt.
- Als de caller verantwoordelijk is voor de controle
- Als de callee verantwoordelijk is voor de controle
- Bestudeer C boek: paragraaf 8.10.
- Les 10:
- Bestudeer C boek: paragrafen 3.3, 8.6, 6.9, 6.10, 11.3, 11.4.
- Maak opdracht: 14 van paragraaf 6.18. Uitwerking.
- Schrijf een functie readPuzzle die een Sudoku puzzel kan inlezen
uit een bestand. Een lege plaats wordt aangegeven met de waarde 0.
- Schrijf een functie savePuzzle die een Sudoku puzzel kan
wegschrijven naar een bestand.
- Bekijk:
- Les 10 1/2 ;-)
- Les 11:
- Bestudeer C boek: paragrafen 2.10 t/m 2.12 en 4.17.
- Schrijf een zo kort mogelijke implementatie van de reverse functie.
- Les 12:
- Bestudeer C boek: paragrafen 8.1 t/m 8.3 en 8.7.
- Les 13:
- Bestudeer C boek: paragraaf 6.15.
- Les 14:
- Bestudeer C boek: paragrafen 4.7 (laatste deel op pagina 126) en
4.15.
- Maak opdracht: 9 van paragraaf 4.19.
- Bekijk (eventueel):
PROGRAMMA's:
- Les 1: prog1.c

- Les 2: print_procent.c
, quotient.c
, quotient_float.c
, float_vs_double.c
, f_2_c_FOUT.c
, f_2_c_AFKAPPEN.c
, f_2_c_AFRONDEN_FOUT.c
, f_2_c_OMSLACHTIG.c
, f_2_c.c
, f_2_c_float.c
- Les 3: for_simple.c
, for.c
, do.c
, while.c 
- Les 4: if.c
, ifelse.c
, switch.c 
- Les 5: Zie Extra voorbeelden van functies.
- Les 6: faculteit.c
, binomiaalcoefficient.c
, assert.c
, foutcode.c 
- Les 7: wissel_poging1.c
, print_adres.c
, pointer.c
, wissel_poging2.c 
- Les 8: gem_temperatuur.c
, gem_array_fun.c
, gem_array_fun_alt1.c
, gem_array_fun_alt2.c
, gem_array_fun_alt3.c
, gem_array_fun_alt4_WERKT_NIET.c
, gem_array_fun_alt5.c
, gem_array_fun_alt6.c
- Les 9: reverse_SOLUTION.c

- Les 10: testAreRowsValid_SOLUTION.c
, char.c
, string.c
, tekstfile_schrijven.c
, tekstfile_lezen.c
, stand.txt 
- Les 10 1/2 ;-): stand.c
, stand_met_tekstfile_simpel.c
Dit programma leest de,
in de les behandelde, datastructuur Stand
in uit de tekstfile
stand.txt
in en drukt de winnaar(s) af op het scherm, stand_met_tekstfile.c
Dit programma doet hetzelfde
als het vorige programma maar maakt geen gebruik van tijdelijke variabelen
bij het inlezen.
- Les 11: sudoku.c

- Les 12: reverse_short1.c
, reverse_short2.c
, reverse_short3.c
, includeVergeten.c
, include.c
, define.c
,macro_KWAD_1.c
, macro_KWAD_2.c
, functie_KWAD.c

- Les 13: pointerNaarFunctie.c
, pointerNaarFunctieAfko.c
, printTabel.c 
- Les 14: bepaalNulpunt_UITWERKING.c
, if_else.c
, lengte_eerste_woord_FOUT.c
, lengte_eerste_woord_break.c
, lengte_eerste_woord.c 
OVERIGE:
AANVULLEND STUDIEMATERIAAL:
- Heel C op één dubbelzijdig
A4-tje.
Dit document zal
als bijlage bij de toets worden bijgesloten!
- Extra informatie na les 4:
In plaats
van programma structuren zoals while
, for
,
if
, if else
, do while
,
switch
kun je ook ongestructureerd rondspringen in een
programma door middel van het goto
statement. Programma's die gebruik maken van dit goto
statement worden al snel ondoorzichtig en onbegrijpelijk. Dit soort
programma's wordt ook wel spaghetti code genoemd omdat alles door elkaar
kronkelt. De (op het gebied van computerkunde) beroemde Nederlander Edsger W. Dijkstra had dit
als een van de eersten in de gaten. Hij schreef een beroemd artikel
genaamd: "Go To Statement Considered Harmful" dat in 1968 werd
geplubliceerd in het Amerikaanse blad "Communications of the ACM". Je kunt
het nog nalezen op http://www.netzmafia.de/service/gotoharmful.html
of als je liever de orginele (met de schrijfmachine getypte) tekst wilt
lezen dan kan dat op http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF.
Het hele verhaal is waarschijnlijk voor jullie niet te volgen maar het
volgende citaat is duidelijk:
The go to statement as it stands is just too primitive; it is too
much an invitation to make a mess of one's program.
Het VPRO programma Noorderlicht was in april 2001 helemaal (25 min) gewijd
aan deze grote Nederlandse wetenschapper. Dit programma kun je online
bekijken op http://www.cs.utexas.edu/users/EWD/videos/NoorderlichtVideo.html.
Meer informatie over het leven en werken van Dijkstra kun je vinden op http://nl.wikipedia.org/wiki/Edsger_Dijkstra.
- Extra voorbeelden van functies.
ANTWOORDEN
OP 'VEEL' GESTELDE VRAGEN: