-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbook_chap00.tex
165 lines (129 loc) · 15.9 KB
/
book_chap00.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%% VOORWOORD
%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Voorwoord}
\label{cha:voorwoord}
\thispagestyle{empty}
Een van de beste boeken over C is \textsl{The C Programming Language} van
Brian Kernighan en Dennis Ritchie~\cite{kernighan1988c}. Het boek is kort en
bondig maar laat toch ruimte om de tekst te ondersteunen met voorbeelden.
Helaas zijn veel van de voorbeelden lastig te volgen voor de beginnende
programmeur. Zoals de schrijvers zelf opmerken:
\begin{displayquote}
The book is not an introductory programming manual; it assumes some familiarity
with basic programming concepts like variables, assignment statements,
loops, and functions.
[...]
C is not a big language, and it is not well served by a big book.
\end{displayquote}
De schrijvers geven aan dat hun boek eigenlijk niet bedoeld is om een
programmeertaal te leren
en dat een boek over de beginselen van C helemaal niet zo groot hoeft te zijn.
Dat heeft ook te maken met hoe rijk de taal is. C is gebaseerd op een aantal
kenmerkende taalconstructies die ook bij vele andere programmeertalen voorkomen.
Daarom is dit boek bedoeld als inleiding op de programmeertaal C en is niet
toereikend om alle facetten van de taal te leren. Het boek beschrijft ook niet
een specifieke standaard van de taal. Dat is ook niet de
bedoeling van dit boek. We laten alleen maar zien wat gebruikelijk is bij
het ontwikkelen van C-programma's.
Veel boeken over C beschrijven het ontwikkelen van programma's op het Unix
operating system en afgeleide varianten zoals Linux, FreeBSD en macOS.
Dat is echter niet de werkwijze van veel programmeurs. Veel software wordt
ontwikkeld met een Integrated Development Environment (IDE). Bekende IDE's
zijn Visual Studio, Code:Blocks en Xcode. Het is natuurlijk niet mogelijk
om alle mogelijkheden van zulke IDE's te beschrijven (of af te beelden).
Zo'n beetje alle programmavoorbeelden van enige omgang zijn getest op
Visual Studio. Dit is ook de meest gebruikte IDE. De IDE wordt zeker niet
alleen gebruikt voor het ontwikkelen van C-programma's. Bekend is bijvoorbeeld
de taal C\# die veel wordt gebruikt bij het ontwikkelen van programma's op
het Windows-besturingssysteem.
Hoewel C al een oude taal is, wordt het nog volop gebruikt. De reden daarvoor is
dat de C-statements door de compiler worden vertaald naar instructies die de
microprocessor direct kan uitvoeren. Daarom wordt de taal veel gebruikt bij
het schrijven van programma's op \textsl{microcontrollers}. Dit zijn kleine
computersystemen
zonder besturingssysteem. Op deze systemen is C (en C++) de enige taal die
gebruikt kan worden. Maar C wordt ook gebruikt op systemen die wel een
besturingssysteem draaien. Zo worden bij het Windows-besturingssysteem
zogenoemde \textsl{drivers} (koppelingen tussen een gebruikersprogramma
en de hardware) in C of C++ geschreven. Andere talen zijn
daarvoor niet toepasbaar. Bekend is ook dat het Linux-besturingssysteem
grotendeels is geschreven in C (en bevat duizenden C-bestanden).
%Merk op dat talen als C\#, Java en Python geen instructies voor de pr
Dit boek is geschreven voor hbo-studenten Elektrotechniek en Informatica. Zij
komen vaak in aanraking met \textsl{microcontrollers} (een kleine, compacte
microprocessor) en dan is, zoals eerder al
is vermeld, C vaak de enige taal die gebruikt kan worden. Daarnaast vonden we dat
er eigenlijk geen goede boeken zijn op het gebied van C. We hebben getracht het
boek kort te houden maar toch voorbeelden te geven die makkelijk gevolgd kunnen
worden, ook door de beginnende programmeur. We schuwen echter niet om de taal
te gebruiken bij enkele typische uitwassen van de taal, zoals \textsl{linked lists}
en bestandsafhandeling.
Dit boek is opgemaakt in \LaTeX~\cite{latexwebsite} (\LaTeX-engine = \booktexbanner).
\LaTeX\@ leent zich uitstekend
voor het opmaken van lopende tekst, tabellen, figuren, programmacode, vergelijkingen
en referenties. De gebruikte \LaTeX-distributie is TexLive uit 2023~\cite{texlivewebsite}.
Als editor is TexStudio~\cite{texstudiowebsite} gebruikt. Tekst is gezet in
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi>0
Calibri~\cite{calibrifont}, een van de standaard fonts op een bekend besturingssysteem.
Code is opgemaakt in Consolas~\cite{consolasfont}
\else
Charter~\cite{charterfont}, een van de standaard fonts in \LaTeX.
De keuze hiervoor is dat het een prettig te lezen lettertype is, een
\textsl{slanted} letterserie heeft en een bijbehorende wiskundige tekenset heeft.
Code is opgemaakt in Nimbus Mono~\cite{nimbusfont}
\fi
met behulp van de \textsl{listings}-package~\cite{listingsctan}.
Voor het
tekenen van arrays, pointers en flowcharts is \textsl{TikZ/PGF} gebruikt~\cite{tikzctan}.
Alle figuren zijn door de auteur zelf ontwikkeld, behalve de logo's van Creative
Commons en De Haagse Hogeschool.
Een aantal programmafragmenten is ontwikkeld door collega Harry Broeders, de overige
fragmenten zijn door de auteur ontwikkeld.
Natuurlijk zullen docenten ook nu opmerken dat dit boek niet aan al hun
verwachtingen voldoet. Dat zal altijd wel zo blijven. Daarom is de broncode
van dit boek vrij beschikbaar. Eenieder die dit wil, kan de inhoud
vrijelijk aanpassen, mits wijzigingen gedeeld
worden. Hiermee wordt dit boek een levend document dat nooit af is.
De broncode
van dit boek is beschikbaar op \url{https://github.com/jesseopdenbrouw/book_c}. We doen
een klemmend beroep aan alle lezers om fouten en omissies te melden.
\subsubsection*{Leeswijzer}
Hoofdstuk~\ref{cha:tour} geeft in vogelvlucht enkele belangrijke concepten van C weer. Er wordt gesproken over wat een computer en een compiler zijn en hoe een uitvoerbaar bestand wordt gegenereerd. We beginnen met het geven van voorbeelden die de lezer in ontwikkelsoftware kan invoeren om zo de uitvoer te bekijken. We beschrijven kort hoe uitvoer naar beeldscherm en invoer van het toetsenbord wordt gerealiseerd. We behandelen het concept van variabelen en datatypes. Verder wordt even stilgestaan bij beslissen en herhalen en functies. In dit hoofdstuk worden geen pointers, structures en bestandsbewerkingen behandeld.
Hoofdstuk~\ref{cha:vardatexp} gaat dieper in op variabelen, constanten en expressies. Alle beschikbare datatypes worden behandeld alsmede enkele vaste-lengte datatypes. Er wordt uitgelegd wat een expressie is en hoe expressies kunnen worden gebruikt bij berekeningen en beslissingen. C kent een aantal eigenaardige taalconstructies zoals de increment en decrement operatoren, de conditionele expressie en de komma-operator. Een aantal operatoren wordt in dit hoofdstuk niet behandeld zoals de adres- en dereferentie-operatoren, de element-operator en de member-operatoren. Die volgen in de verdere hoofdstukken.
Hoofdstuk~\ref{cha:programmabesturing} laat zien hoe de executie van een programma kan worden beïnvloed met beslissingen en herhalingen. We behandelen het gebruik van beslissingen aan de hand van een bepaalde voorwaarde (ook wel conditie genoemd). Een beslissing kan uitgebreid worden met een programmadeel dat uitgevoerd moet worden als een conditie waar of onwaar is. Herhalingen komen zeer vaak voor in een programma. We behandelen drie voorkomende taalconstructies hiervoor.
Hoofdstuk~\ref{cha:flowcharts} is een hoofdstuk over het documenteren van een (deel van een) programma met behulp van flowcharts en ligt in het verlengde van hoofdstuk~\ref{cha:programmabesturing}. De symbolen worden uitgelegd en
getoond wordt hoe bepaalde taalconstructies op grafische wijze kunnen worden beschreven. Hoewel het gebruik van flowcharts al vrij oud is, wordt het nog volop gebruikt. Het mooie van deze methode is dat het ook bij andere situaties kan worden gebruikt, zoals het beschrijven van de \textsl{flow} van processen in een organisatie
Hoofdstuk~\ref{cha:functies} beschrijft het gebruik van functies om een programma op te delen in kleine eenheden die uitgevoerd kunnen worden. We laten zien hoe een functie gegevens meekrijgt en hoe gegevens worden teruggegeven. Verder laten we zien hoe functies zichzelf kunnen aanroepen: de recursieve functie. We hebben een paragraaf opgenomen over de \textsl{computational complexity} van een recursieve variant van de reeks van Fibonacci. We behandelen verder het gebruik van lokale en globale variabelen en hoe de zichtbaarheid (scope) geregeld is.
Hoofdstuk~\ref{cha:arrays} gaat over arrays. We tonen hoe een array wordt gedefinieerd en kan worden gebruikt. We laten zien hoe arrays als argument aan functies kan worden meegegeven. We behandelen strings, een array van karakters en laten zien dat voor het bewerken van strings diverse functies beschikbaar zijn.
Hoofdstuk~\ref{cha:structures} gaat over structures en unions die handig zijn bij het gebruik van complexe datastructuren. We leggen uit wat een structure is en hoe de gegevens binnen een structure kunnen worden benaderd. Structuren kunnen als argumenten en returnwaarde van functies dienen. We beschrijven kort de union als een probaat middel om de hoeveelheid gebruikte geheugen in te dammen (alhoewel dat bij moderne PC's eigenlijk geen rol speelt). Ook bitfields worden behandeld, alhoewel bitfields in de praktijk nauwelijks worden gebruikt.
Hoofdstuk~\ref{cha:pointers} gaat over pointers. Er wordt uitgelegd wat een pointer is en wat de relatie met arrays is. Verder wordt beschreven hoe pointers een rol spelen in het doorgeven van veel informatie aan functies. Pointerstructuren kunnen bijzonder complex zijn en we schuwen dan ook niet om pointers-naar-pointers te behandelen. Het gebruik van command line argumenten wordt uitgelegd zodat een uitvoerbaar programma kan worden gestart met optionele argumenten. We geven een introductie in het gebruik van dynamische geheugenallocatie, noodzakelijk bij self-referential structures. Het gebruik van self-referential structures (voor onder andere \textsl{linked lists}) wordt als verdiepend behandeld, hoewel het geen onderdeel van de taal zelf is.
Hoofdstuk~\ref{cha:io} gaat over invoer en uitvoer. Dit zijn geen onderdelen van de taal zelf maar komt zo vaak voor dat er er flink stuk aan wijden. We kijken wat dieper naar het afdrukken op het scherm en het inlezen van het toetsenbord. Natuurlijk behandelen we ook hoe we informatie in bestanden kunnen bewerken: hoe worden bestanden geopend, geschreven, gelezen en gesloten en waar moeten we op letten als we met bestanden werken. Diverse besturingssystemen regelen de naamgeving van bestanden op eigen wijze. We laten zien hoe bestandsnamen op Windows en Linux worden vormgegeven.
Hoofdstuk~\ref{cha:preprocessor} gaat over de preprocessor. De preprocessor is een faciliteit die vóór de ``echte'' C-compiler wordt gebruikt. We laten zien hoe we header-bestanden kunnen inlezen, hoe we macro's kunnen definiëren en hoe we macro's kunnen gebruiken voor conditionele compilatie.
Hoofdstuk~\ref{cha:compilatieproces} gaat over het compilatieproces. We behandelen hoe het proces in elkaar steekt en wat er allemaal bij komt kijken voordat een uitvoerbaar programma is gerealiseerd. We laten zien hoe we een C-programma over meerdere bestanden kunnen verdelen en hoe we een bibliotheek kunnen realiseren. Ook behandelen we in dit hoofdstuk het verschil tussen globale en lokale variabelen en laten zien hoe de zichtbaarheid van globale variabelen en functies kan worden beperkt tot het C-bestand waarin ze zijn gedefinieerd. In dit hoofdstuk wordt ook het verschil tussen definitie en declaratie behandeld.
In bijlage~\ref{cha:asciitabel} worden de eerste 128 karakters van de ASCII-code behandeld. Diverse karakters zijn niet afdrukbaar, maar worden gebruikt om besturingscommando's tussen systemen te realiseren. De ASCII-code bevat de in westerse landen gebruikelijke tekens.
In bijlage~\ref{cha:visualstudio} is een korte tutorial beschreven voor het ontwikkelen van C-programma's met Visual Studio. Hoewel we ons hier concentreren op Visual Studio, werken alle Integrated Development Environments (IDE) op gelijke wijze.
In bijlage~\ref{cha:voorrang} is de complete lijst te zien met voorrangsregels van operatoren in C. De operatoren zijn in aflopende volgorde van prioriteit gerangschikt.
Een aantal paragrafen is gekenmerkt met een \texttt{*} voor het paragraafnummer. Deze paragrafen bevatten verdiepende stof en kunnen bij een eerste cursus worden overgeslagen.
\subsubsection*{Studiewijzer}
Om de taal goed te doorgronden zouden eigenlijk alle hoofdstukken aan bod moeten komen. Bij een eerste introductie van de taal kunnen hoofdstuk~\ref{cha:flowcharts} en~\ref{cha:compilatieproces} worden overgeslagen.
\subsubsection*{Verantwoording inhoud}
Dit boek voldoet alleen aan aandachtspunt 4,01 van de basis Body of Knowledge and Skills (BoKS) Elektrotechniek. De
BoKS is te vinden via~\cite{hboengineering2016boks}. Eigenlijk vertelt het boek alle kennis die elke beginnende C-programmeur moet weten. We hebben er naar gestreefd om alleen de taal te behandelen en geen onnodige informatie te verschaffen. Dat resulteert soms in schijnbaar onzinnige voorbeelden. Dat hebben we expres gedaan om de aandacht te houden bij het besproken onderwerp. Toch geven we hier en daar wat uitgebreide voorbeelden die direct aan een C-compiler kunnen worden gevoerd. Het boek gaat niet in op het gebruik van C in microcontroller-omgevingen, zoals Arduino.
\subsubsection*{Gebruik van Engelse woorden}
Het boek is doorspekt met Engelse woorden. Dat heeft te maken met het gangbare gebruik van deze woorden. Zo spreken we in dit boek over pointers in plaats van het Nederlandse woord wijzers. Aan de andere kant gebruiken we het woord lus bij herhalingen en niet van het Engelse woord loop. Het een en ander komt ook voort uit de persoonlijke voorkeur van de auteur.
\subsubsection*{Website}
Op de website \url{http://ds.opdenbrouw.nl} zijn slides, practicumopdrachten en aanvullende informatie te vinden. De laatste versie van dit boek wordt hierop gepubliceerd. Er zijn ook voorbeeldprojecten voor Visual Studio en Code::Blocks te vinden.
\subsubsection*{C-standaard}
Dit boek bespreekt niet een specifieke C-standaard. De meeste voorbeelden draaien op C89 en C99.
\subsubsection*{Afdrukken van dit boek}
Dit boek is opgemaakt op A4 met fontgrootte 12 pt. Het boek kan dus gewoon via een printer worden afgedrukt. Het boek kan ook worden afgedrukt op twee pagina's per bladzijde. De fontgrootte is dan 8,5 pt. Een andere optie is het boek af te drukken op 17x24 cm (academisch formaat). Vele online-printbedrijven ondersteunen dit formaat. De fontgrootte is dan 10 pt.
\subsubsection*{Zelf typesetten van dit book}
Het boek is opgemaakt in \LaTeX{} (\LaTeX-engine = \booktexbanner). Gebruik voor het typesetten van dit boek een volledig lokaal ge\"installeerde distributie van \LaTeX{} zoals TexLive of MikTeX. Download de broncode van het boek. Daarna is het boek te typesetten. Handig is om een \LaTeX-editor te gebruiken, zoals TeXstudio of TeXmaker. De broncode van het boek is te vinden op \url{https://github.com/jesseopdenbrouw/book_c}.
\subsubsection*{Dankbetuigingen}
Dit boek had niet tot stand kunnen komen zonder hulp van een aantal mensen. Ik wil collega Harry Broeders van Hogeschool Rotterdam bedanken voor zijn onuitputtelijke stroom van correcties en opmerkingen. Daarnaast zijn enkele programmavoorbeelden van hem gebruikt en is hoofdstuk~\ref{cha:functies} gebaseerd op een schrijven van zijn hand. Collega Kees de Joode wordt bedankt voor zijn bijdrage aan de wiskundige functies die in dit boek beschreven zijn. Jon van den Helder, Gerard Tuk, Jos Knol en Willem-Pieter Zoutendijk worden bedankt voor enkele rake opmerkingen en verbeteringen. René Terhorst wordt bedankt voor informatie over de verschillende C-standaarden. Verder wil ik Piet op den Brouw (mijn vader, een die-hard C programmeur) bedanken voor het opsporen van fouten en het geven van suggesties.
De ASCII-tabel op pagina~\pageref{tab:talascii-code} is ontwikkeld door Victor Eijkhout en is met zijn toestemming gebruikt. De tabel kan gevonden worden op \url{http://www.ctan.org/tex-archive/info/ascii-chart}.
\bigskip
\hfill \author, \ifcase\month \or januari\or februari\or maart\or april\or mei\or juni\or juli\or augustus\or september\or oktober\or november\or december\fi\ \the\year.