Gestructureerd Programmeren in C (SOPX1E1T1/P1).
© Harry Broeders.
Deze pagina was bestemd voor studenten van de THRijswijk groepen Pm en Pv.
Op deze pagina vind je het in de lessen SOPX1E1T1/P1 gebruikte studiemateriaal.
Meer recente informatie over gestructureeerd programmeren in C vind je hier.
Het belangrijkste studiemateriaal, het boek "De taal C van PSD tot
C-programma" heb je als het goed is al in je bezit.
Beschikbaar materiaal (Kwartaal 2):
Zie hier!
Beschikbaar materiaal (Kwartaal 1):
- Studiewijzer
Klik
hier als je al ingelogd bent.
- In de studiewijzer staat allleen een globale planning. Een gedetailleerde planning kun je hier vinden.
- Sheets.
Veel van de sheets (die ik van mijn voorgangster heb gekregen) bevatten uit
het boek gekopieerde informatie. Het lijkt me niet zinvol deze sheets hier
nogmaals weer te geven. Je kunt hier de door mij gemaakte extra sheets
vinden:
Extra sheets per les. 1 2 3 4 5 6 7 8 9 10 11 12 13 14
- Extra sheets les 1 t/m 4 (verkleind, 9
per pagina).
- Extra sheets les 10 en 11 (verkleind, 9
per pagina).
- Extra sheets les 12 (verkleind, 9 per
pagina).
- Practicumhandleiding.
Klik
hier als je al ingelogd bent.
- Zelf Borland C++ 5.02 (of een alternatief) aanschaffen voor thuis.
Je kunt Borland C++ 5.02 heel goedkoop aanschaffen voor thuisgebruik. Ga
naar http://intranet.thrijswijk.nl, log
in en klik op de map "Informatievoorzieningen". Klik vervolgens op
"Software voor studenten", druk het formulier af en je kunt bestellen. Er
zijn ook upgrades beschikbaar:
- Als je Borland C++ 5.02 te duur vindt kun je ook gebruik maken van de
gratis C/C++ GNU gcc compiler en de DevC++ IDE = Integrated Development
Environment. Deze kun je downloaden vanaf http://www.bloodshed.net/dev/devcpp.html.
Een IDE is een ontwikkelomgeving waarin alle tools (editor, compiler,
linker, debugger, enz.) die je nodig hebt om een programma te kunnen maken
in een applicatie samengebracht zijn. Borland C++ 5.02 is dus ook een IDE.
- C reference card.
Heel C op 2 A4-tjes.
- Tools voor het tekenen van PSD's!
- Andere interessante sites betreffende Gestructureerd
Programmeren in C.
- Huiswerk. Per les zal ik hier het huiswerk vermelden:
- voor les 1:
- voor de eerste les hoef je helemaal niets voor te bereiden
;-)
- voor les 2:
- p1 t/m p9 bestuderen.
- alle opgaven op p10 maken (antwoorden staan op p285).
- p11 t/m p15 (tot 2.1.4) bestuderen.
- p27 en p28 opgave 1 t/m 3 maken.
- voor les 3:
- p15 t/m p27 bestuderen.
- opmerking bij p23. 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!
- p19 voorbeeld 2-3 aanpassen zodat het correct werkt met Euro
biljetten. (Het is overigens zo dat met de coupure indeling van de
Euro in de meeste gevallen minder coupures nodig zijn als met de
gulden.)
- p28 opgave 4 en 5 maken.
- p344 bestuderen. Deze wiskundige functies worden ook gebruikt in
het inleidende deel van hoofdstuk 2 van de practicumhandleiding.
- voor les 4:
- p29 t/m p40 bestuderen.
- p42 en p43 opgave 1 of 2, en 3 of 4, en 5 maken.
- voor les 5:
- p41, p42 en p45 t/m p48 bestuderen.
- p63 opgave 1 en p64 opgave 2 maken.
- voor les 6:
- p48 t/m 63 bestuderen.
- p64 opgave 3 maken.
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.acm.org/classics/oct95/
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://www.digidome.nl/edsger_wybe_dijkstra.htm.
- Extra opgave (maken):
In de VS wordt niet gewerkt met een beoordelingsschaal van 1 tot
10, maar met de letters A, B, C, D en F. Het is niet mogelijk om
het Amerikaanse beoordelingssysteem rechtstreeks om te zetten naar
het Nederlandse systeem. Een A behaald op een topuniversiteit heeft
een andere waarde dan een A behaald op een minder hoog
aangeschreven instelling. Het is ook niet mogelijk om Nederlandse
cijfers om te zetten in Amerikaanse grades. Om echter een idee te
krijgen wat je Nederlandse cijfers waard zijn, kan de volgende
tabel als indicatie dienen (bron: http://www.fulbright.nl/downloads.aip?language=NL&destination=USA&id=7):
Nederlands |
Amerikaans |
8, 9 of 10 |
A |
7 |
B |
6 |
C |
5 |
D |
0,1,2,3 of 4 |
F |
- Er moet een programma gemaakt worden dat een getal inleest (als
integer) en de bijbehorende Amerikaanse beoordeling afdrukt. Als
een getal > 10 of < 0 wordt ingevoerd moet een foutmelding
worden gegeven.
- Maak gebruik van geneste if-else instructies om dit
programma te maken. Geef de PSD en het bijbehorende programma.
- Maak gebruik een switch instructies om dit programma
te maken. Geef de PSD en het bijbehorende programma.
- Vraag van student: Mag de default (in een switch) ook als
eerste? Ja hoor kijk maar: switch_default.c (en probeer maar).
- voor les 7:
- p65 t/m 79 bestuderen.
- p90 opgave 1 en 3 maken en p91 opgave 5 en 6 maken.
- Met
#define
kun je "leuke" dingen doen. Hier is een voorbeeld.
- Antwoorden van de self-assessment: B, D, A, D, A, A, C, C, A, A.
Beoordeling:
fouten |
cijfer |
tip |
0 |
10 |
Ga zo door! |
1 |
9 |
2 |
7 |
3 |
6 |
Nog voldoende, maar wat extra inspanning kan geen
kwaad. |
4 |
5 |
Onvoldoende, maar met wat extra inspanning kan het nog
goed komen. Aan het werk dus! |
5 |
3 |
Jammer. Kom eens langs voor een gesprekje
want dit gaat niet goed.... |
6 |
2 |
7 of meer |
1 |
- In de onderstaande grafiek (frequentietabel) kun je zien hoe er
"gescoord" is (Pm + Pv).

- voor les 8:
- voor les 9:
- Extra opgave (maken):
Combineer de verbeterde bubble sort uit paragraaf 5.4.4 met de in
5.4.5. besproken methode om te stoppen als de array gesorteerd is
(als er niet meer gewisseld is).
- p93 t/m 108 alvast doorlezen.
- voor les 10:
- p93 t/m 108 bestuderen.
- opmerking bij p95 en verder: De auteur gebruikt steeds haakjes
bij een
return
statement. Dit is volkomen overbodig.
Ik vind het persoonlijk ook verwarrend omdat bij een
if
, while
en for
, waar de
haakjes wel noodzakelijk zijn, tussen de haakjes altijd een
booleanse voorwaarde staat. Achter een return
moet gewoon een expressie staan waarvan het resultaat wordt
teruggegeven.
- opmerking bij p96 (paragraaf 6.2.5): Deze paragraaf kun je beter
overslaan! De auteur wil duidelijk maken dat je verschillende
variabelen beter verschillende namen kunt geven. Hij gebruikt
echter een voorbeeld waarin 1 persoon meerdere namen heeft
(afhankelijk van de context = omgeving waarin hij zich bevind). Een
variabele in een C programma kan echter altijd maar 1 naam hebben.
Het is natuurlijk wel handig om elke variabele een eigen unieke
naam te geven (dan kun je ze makkelijker uit elkaar houden). Twee
variabelen in een C programma mogen wel dezelfde naam hebben als ze
in verschillende functies zijn gedefinieerd. Zo kun je bijvoorbeeld
in de functie
main
een lokale variabele x
hebben gedefinieerd. In datzelfde programma kun je een functie
fun
definiëren met daarin ook een lokale variabele
x
. Deze twee variabelen zitten elkaar nooit in
de weg want de x
in main
is alleen in
main
te gebruiken en de x
in
f
is alleen in f
te gebruiken (de scope
is lokaal). Als je nu iets over de variabele x
wilt
vertellen moet je er altijd bijvertellen over welke x
je het hebt (bijvoorbeeld: "De x
in main
krijgt de waarde 5."). Om verwarring te voorkomen is het dan vaak
slimmer om beide variabelen een eigen (unieke) naam te geven. Je
kunt de variabele in fun
dus beter
bijvoorbeeld xfun
noemen. Om dezelfde redenen is het
beter om de formele parameter (die je gebruikt in de aangeroepen
functie) en de actuele parameter (die je meegeeft als je deze
functie aanroept) verschillende namen te geven.
- opmerking over het definiëren van
main
: De functie
main
geeft een int
terug en moet dus als
volgt gedefinieerd worden:
int main() {
/*
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.
- Extra voorbeelden: sla2RegelsOver.c slaRegelsOver.c functie_voorbeeld.c
- p122 opgave 1 maken en p123 opgave 4 en 5 maken. (De uitwerking
van opgave 5 in het boek rammelt aan alle kanten en kun je beter
niet bekijken.)
- Extra opgave (maken):
Schrijf een functie waarmee een aantal opeenvolgende tafels, achter
elkaar, op het scherm afgedrukt worden. Na elke tafel moet het
programma wachten tot de gebruiker op de Enter toets drukt.
Maak daarbij gebruik van de voor opgave 4 gemaakte functie om 1
tafel af te drukken. Hieronder is een korte main
functie gegeven die de functie tafels
test door de
tafels van 15 t/m 20 af te drukken:
int main() {
/*
prototype hier nog invullen! */
tafels(15, 20);
return 0;
}
Vul het prototype van de functie op de aangegeven plaats in.
- voor les 11:
- p109 t/m 122 bestuderen.
- sheets bestuderen.
- opmerking bij p118 (paragraaf 6.8). Deze paragraaf kun je beter
overslaan! De auteur verward File scope met Global scope en
onderscheid Functie scope en Block scope wat gewoon hetzelfde is.
Je hoeft (op dit moment) alleen het verschil te weten tussen
globale en lokale variabelen (zoals in de les van donderdag 30
september behandeld is).
- Extra voorbeeld: fac_recursief.c In
dit geval is het efficienter om deze functie niet recursief te
maken: fac_herhaald.c
- Extra opgave (maken):
Schrijf een functie waarmee een array met double getallen
gesorteerd kan worden. Bij aanroep van de functie moet de array en
het aantal te sorteren getallen worden meegegeven. Na afloop van de
functie moet de array gesorteerd zijn. Schrijf ook een main
programma om deze functie te testen. Maak gebruik van de extra
opgave die je voor les 9 hebt gemaakt.
- Extra opgave (maken):
De grootste gemene deler (ggd) van a en b kun je als volgt
vinden:
ggd(a,b) = b als a==0
= a als b==0
= ggd(b, a%b) als b!=0 && a!=0
Deze definitie is recursief. Schrijf een recursieve functie waarmee
de ggd van twee getallen kan worden berekend. Schrijf ook een main
programma om deze functie te testen.
- voor les 12:
- p125 t/m 131 bestuderen.
- opmerking bij p128. Voorbeeld 7-2 kan nog korter (beetje flauwe
opmerking eigenlijk):
#include <stdio.h>
int main() {
printf("Het product van 6 en 10 is: 60");
getchar();
return 0;
}
- opmerking bij p130. De haakjes bij de regel
max = (a>b)
? a : b;
zijn niet nodig want > heeft een hogere
prioriteit dan ?: (kijk maar op p340). De schrijver van het boek
gebruikt steeds onnodige haakjes voor het ?
.
- opmerking bij p131. Het is in voorbeeld 7-4 mogelijk om de twee
printf
statements te combineren tot 1
printf
statement (dat was nu net het nut van
?:
):
#include <stdio.h>
int main() {
int getal;
printf("Geef een getal: ");
scanf("%d", &getal);
printf(getal%2==0 ? "Het getal is even.\n" : "Het getal is oneven.\n");
getchar();
getchar();
return 0;
}
- p131 en 132 opgave 1 t/m 5 maken.
- Extra opgave (maken):
Schrijf een functie waarmee de volgorde van alle elementen in een
array met integers omgekeerd kan worden. Schrijf ook een programma
om deze functie te testen. Nadat je hem
zelf hebt geprobeerd mag je mijn oplossing bekijken: keerom.c.
- voor 13:
- sheets bestuderen. Moraal van
het verhaal: gebruik in plaats van een
#define
met argumenten een functie. Voor iemand die graag alles wil
weten: er is wel een uitzondering.
- p133 t/m 140 bestuderen.
- voor 14:
- p141 t/m 149 bestuderen.
- p169 en p170 opgaven 1 t/m 4.
- Er is een tussentoets na het eerste kwartaal (verplicht voor P1,
vrijwillig voor Pm en Pv). Ik raad je sterk aan om mee te
doen met deze tussentoets! De tussentoets bestaat uit een aantal
meerkeuze vragen (vergelijkbaar met de self-assessment) en enkele open
vragen (vergelijkbaar met de vraagstukken uit het boek).
Beschikbaar materiaal (Kwartaal 2):
Zie hier!