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.
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!