Professional Documents
Culture Documents
Procedural Programming in C++
Procedural Programming in C++
Programming in C++
Practicum
Hogeschool Utrecht
Jorn Bunk
H OGESCHOOL U TRECHT © 2018
https://canvas.hu.nl/courses/152
1 Week 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
,
2 Week 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1 Lezen 11
2.2 Opgaven 11
3 Week 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1 Lezen 19
3.2 Opgaven 19
4 Week 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.1 Lezen 25
4.2 Opgaven 25
5 Week 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.1 Lezen 33
5.2 Opgaven 33
6 Extra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
1. Week 1
Exercise 1.1 — Modulo operator. Zoek uit wat de rekenkundige operator % is en wat
het doet. De term ”rekenkundige operator” is vertaald in het engels “arithmetic operator”.
1. Wat zijn de decimale ASCII-waarden van ’a’, ’b’, ’c’, ’h’ en ’z’?
2. Wat zijn de decimale ASCII-waarden van ’A’, ’B’, ’C’, ’H’ en ’Z’?
3. Welke character krijg je als je bij character ’g’ het verschil tussen ’a’ en ’A’ aftrekta ?
4. Wat zijn de decimale ASCII-waarden van ’8’ en ’0’
5. Wat is de decimale waarde van ‘4’ - ’0’?
6. Waarom zijn de antwoord van vraag 3 en 5 handig om te weten?
a Dus wat komt er uit de berekening ’g’-(’a’-’A’)?
6 Hoofdstuk 1. Week 1
Exercise 1.3 — Datatypes. Schrijf de waarde op van de variabelen aan het einde van
het onderstaande stukje code. Probeer dit zonder de code uit te voeren op de computer.
#include <string>
using namespace std;
int main(){
int x = 8.2;
char c = 'b' + ('Z'- 'z');
int f = '8' - '0';
bool u = 8 >= 10;
string p = "Hoera!";
p.append(" HIEP!");
int y = 18 / 5;
int z = 18 / 5.0;
float t = 18 / 5;
float s = 18 / 5.0;
int e = 10 % 3;
bool b = true && (false || true);
}
int main(){
int number = 65;
while( number < 90){
if(number < 70){
number = 70;
}else if( number < 80){
number++;
}
number += 3;
}
}
7
int main(){
char letter = 'a';
for(int i=0; i < 26; i++){
cout << char(letter + i) << ", ";
}
}
2.1 Lezen
Lees hoofdstuk 7,8, 9.1 en 9.2. Deze hoofdstukken gaan over het datatype vector, functies en
programmeerpatronen bij het werken met één rij.
2.2 Opgaven
Exercise 2.1 — Functienamen.
Geef bij de onderstaande functienamen aan welk datatypen jij denkt dat ze teruggeven:
• numberOfCats()
• firstVowel()
• getAge()
• getName()
• count()
• printRow()
• uppercase()
• isEqual()
• readTextFile()
• isBike()
• yourTeacher()
12 Hoofdstuk 2. Week 2
Exercise 2.2 — Merge. Beschrijf in maximaal twee zinnen wat de onderstaande functie
merge() doet.
#include <iostream>
#include <string>
using namespace std;
unsigned int max(const unsigned int & x, const unsigned int y){
if(x > y){
return x;
}else{
return y;
}
}
Exercise 2.3 — Positief. In de onderstaande code staan drie functies, postive1(), posi-
tive2() en positive3(). Wat de functies doen lijkt erg op elkaar.
#include <vector>
using namespace std;
A:
Beschrijf in één zin wat de functie positive1() doet.
B:
De functie positive2() heeft geen return-statement. Hoe geeft de functie zijn resultaat
terug?
C:
De drie functies vervullen alle drie ongeveer dezelfde taak. Ze verschillen voornamelijk
in hun functiedefinitie. Noem van elke functie een voordeel van de functiedefinitie.
D:
Welke functie heeft in dit geval je voorkeur? Geef minimaal één argument.
14 Hoofdstuk 2. Week 2
int main(){
vector<int> n = {37,8,7,15,8,2,8,5};
int index = getIndex8(n);
cout << "There is a 8 at index: " << index << "\n";
}
A:
Herschrijf deze functie zodat hij niet de index van de laatste 8 uit de vector<int> teruggeeft,
maar de index van eerste 8 in de vector<int> teruggeeft. Doe dit door enkel regel 5, 6 en
7 aan te passen:
for(unsigned int i = numbers.size(); i > 0; i--){
if(numbers[i-1] == 8){
return i-1;
B:
Wanneer geeft de de functie -1 terug?
C:
Waarom is hier voor de waarde -1 gekozen en niet voor de waarde 99 of 0?
2.2 Opgaven 15
a De omgedraaide versies van deze woorden zijn: soodrekkets, neewollaH, lepel, ejself, gindlemmob
2.2 Opgaven 17
3.1 Lezen
Lees hoofdstuk 9 en 10. Deze hoofdstukken gaan over programmeren met rijen van rijen en
bitoperatoren.
3.2 Opgaven
Exercise 3.1 — Bytewaarde.
In de onderstaande code heeft de variabele b steeds een andere byte-waarde. Schrijf elke
keer dat de waarde van b verandert zijn nieuwe byte-waarde op.
int main(){
char mask = 0x6b;
char b = 15;
b = b | (1 << 6);
b = ~b;
b = b << 1;
b |= 7;
b &= ~(1 << 1);
b ^= mask;
}
20 Hoofdstuk 3. Week 3
Voorbeeld
Met ch gelijk aan ’a’ en n gelijk aan 2 is de return-value gelijk aan 1. De binaire waarde
van ’a’ is 01100001. Op positie 2 staat een 0, dus de functie geeft 0 terug.
22 Hoofdstuk 3. Week 3
int main(){
vector<vector<char>> letters =
{{'u', 'b', 'c', 'p'},
{'f', 'b', 'y', 'u'},
{'t', 'u', 'u', 's'},
{'x', 'u', 'w', 'q'};
vector<vector<int>> indexes = getIndexes(letters, 'u')
a In praktijk wordt transponeren niet vaak gebruikt voor het berekenen van een teamopstelling. Het wordt
wel veel gebruikt in image processing, signaal modulatie, big data en om studenten bezig te houden.
dan is de output van het programma:
1,4,7,
2,5,8,
3,6,9,
Je mag in de functie geen nieuwe matrix aanmaken. Je mag wel gebruik maken van een
tijdelijke variabele. De aanpak is vergelijkbaar met de functie van opdracht 2.12. Je mag
niet gebruik maken van de swap-functie die wordt gegeven door C++ (libraries). De
functiedefinitie is:
void transpose(vector<vector<int>> & m){
...
...
};
4. Week 4
4.1 Lezen
Lees hoofdstuk 11, 12, 13 en 14.1. Deze hoofdstukken gaan over het lezen en schrijven
van bestanden met C++, het gebruiken van meerdere bronbestanden voor je C++ code, het
datatype struct en reductie.
4.2 Opgaven
Exercise 4.1 — Tosti’s.
Tosti’s zijn het culinaire hoogtepunt van de Nederlandse keuken. Deze opdracht is een
eerbetoon aan dit stukje cultuurgoed. Wat is de inhoud van het bestand tosti.txt als de
onderstaande code (zie volgende pagina) wordt uitgevoerd? Neem aan dat het bestand
aan het begin leeg is.
26 Hoofdstuk 4. Week 4
#include <string>
#include <vector>
#include <fstream>
using namespace std;
struct ingredient{
string name;
int amount;
};
struct tosti{
string name;
vector<ingredient> ingredients;
int amount;
};
int main () {
ingredient cheese = {"kaas", 4};
ingredient bread = {"brood", 2};
ingredient herring = {"haring", 1};
ingredient coffee = {"koffiebonen", 4};
ingredient chocolat = {"hagelslag", 50};
tostis[2].ingredients.push_back(cheese);
tostis[0].ingredients[0].amount = 3;
tostis[0].amount = 1;
Tostis2File(tostis, "tosti.txt");
}
4.2 Opgaven 27
winners.hpp:
#ifndef WINNERS_HPP
#define WINNERS_HPP
#include <vector>
#include <iostream>
#endif /* WINNERS_HPP */
main.cpp:
#include "winners.hpp"
int main(){
vector<float> results {5.322,8.76,2.12,745,98.1,23.6,87.3};
cout << "De winnaar is: " << winner << "\n";
cout << "De mol is: " << mole << "\n";
return 0;
}
winners.cpp:
#include "winners.hpp"
queue.cpp:
#include <vector>
#include "queue.hpp"
using namespace std;
int main () {
Queue q;
init_queue(q);
enqueue(q, 5.43);
enqueue(q, 7.2);
enqueue(q, 3.90);
A:
De docenten willen een programma waarin ze overzichtelijk met de gegevens van studen-
ten kunnen werken. Van elke student hebben we de volgende gegevens:
•
• naam
• leeftijd
• lijst met cijfers
• huisdier
Schrijf een struct waarin de gegevens van een student in opgeslagen kunnen worden.
B:
De docenten willen in het programma ook kunnen werken met de gegevens van klassen.
Van elke klas hebben we de volgende gegevens:
•
• naam
• lijst met studenten
• docenten
Voeg aan het programma een struct toe waarin de gegevens van een klas kunnen worden
opgeslagen.
C:
De docenten willen makkelijk het gemiddelde cijfer van een klas kunnen opvragen.
Schrijf een functie die gegeven een klas het gemiddelde cijfer teruggeeft.
5.1 Lezen
Lees hoofdstuk 14.2. Dit hoofdstuk gaat over recursie.
5.2 Opgaven
Exercise 5.1 — Konijnen.
Beschrijf in één zin wat de onderstaande functie doet.
int ears(int n_rabbits){
if(n_rabbits <= 1){
return n_rabbits * 2;
}else{
return 2 + ears(n_rabbits-1);
}
}
34 Hoofdstuk 5. Week 5
int main(){
Dit hoofdstuk bevat extra opdrachten. Deze opdrachten behoren niet tot het verplichte
huiswerk. De opdrachten zijn grof gesorteerd per week op basis van de onderwerpen die
je oefent in de opgaven. De opdrachten wisselen sterk in moeilijkheidsgraad. Mocht een
opgave niet lukken kijk dan of een andere opgave je wel lukt. Een aantal van deze opgaven
zijn behandeld in de lessen.
week 1
Exercise 6.1 — Gokken.
Schrijf een programma dat een willekeurig getal kiest en de gebruiker net zo lang laat
gokken tot dat ze het goed hebben. Gebruik voor het kiezen van een willekeurig getal de
library stdlib.h en rand() % 10 voor een getal tussen 0 en 9.
Gok het getal:
8
Gok het getal:
3
Gok het getal:
6
Correct! Het getal is 6.
38 Hoofdstuk 6. Extra
a zie: https://nl.wikipedia.org/wiki/Caesarcijfer.
a Het FizzBuzz-probleem was een tijdje populair bij sollicitatiegesprekken voor programmeurs. Het
probleem kan op verschillende manieren opgelost worden (ook afhankelijk van de programmeertaal) en de
verschillende uitwerkingen hebben andere voor- en nadelen die interessant zijn om te bespreken tijdens een
sollicitatiegesprek.
40 Hoofdstuk 6. Extra
Week 2
Exercise 6.8 — Waar?.
Schrijf een functie die een vector<bool> mee krijgt, en teruggeeft hoe lang de langste rij
’true’ waarden in de vector is.
week 3
Exercise 6.19 — Rattenplaag. Schrijf een functie die van alle ratten in de vector<string>
animals van elke “rat” een “cat” maakt door de eerste letter van “rat” aan te passen.
Bijvoorbeeld de dieren vector<string> animals = {“rat”, “dog”, “rat”};
worden: vector<string> animals = {“cat”, “dog”, “cat”};
A:
Schrijf een functie die telt hoeveel bitjes van een uint8_t gelijk zijn aan 0.
B:
Schrijf een functie die gegeven uint8_t x en uint8_t y telt hoe vaak x en y het zelfde bitje
op dezelfde plek hebben staan.
A:
Schrijf een functie die controleert of een matrix (vector<vector<int>>) voldoet aan de
volgende eisen:
• het aantal enen is gelijk aan het aantal nullen
• in een rij komt een getal niet drie keer achter elkaar voor
• De som van een kolom moet groter zijn dan 5
Je mag aannemen dat alle rijen even lang zijn.
B:
Het gebruiken van een integer terwijl we enkel 1’en en 0’en opslaan is zonde van
het geheugen. Om geheugen ruimte te besparen gebruiken we voor de matrix een
vector<uint8_t>. Schrijf een nieuwe functie die kan controleren of een matrix van dit
type aan de eerder genoemde voorwaarde voldoet.
Een variabele van het type uint8_t bestaat uit 8 bits. Je mag dus aannemen dat elke rij
8 bits lang is.
vervolgens het character invullen waarvan ze denken dat het gerepresenteerd wordt door
de byte. De winnaar is de speler die het character heeft ingevuld met de laagste Hamming
distance van de gegeven byte.
Hamming distance
De Hamming distance tussen twee bitreeksen is het aantal bitjes die geïnverteerd moeten
worden om van de ene bitreeks naar de andere te komen. Voorbeeld:
Positie: 0|1|2|3|4|5|6|7
bitreeks1: 0|0|1|1|1|1|0|0
bitreeks2: 1|0|1|0|1|1|1|0
De Hamming distance tussen deze twee bitreeksen is 3, omdat de bit op positie 0, de bit
op positie 3 en de bit op positie 6 geïnverteerd moeten worden om tot de andere bitreeks
te komen.
Het onderstaande voorbeeld heeft een Hamming distance van 2, omdat de bit op positie 1
en de bit op positie 4 geïnverteerd moeten worden.
Positie: 0|1|2|3|4|5|6|7
bitreeks1: 1|0|1|1|1|1|1|0
bitreeks2: 1|1|1|1|0|1|1|0
Schrijf een functie die de Hamming distance tussen twee bytes uitrekent. Schrijf
vervolgens de rest van het programma dat dit spel mogelijk maakt.
a zie voor een korte how-to: https://www.youtube.com/watch?v=wCQSIub_g7M
A:
Schrijf een functie de controleert of een uint8_t eindigt met de bitreeks 0110.
B:
Schrijf een functie de controleert of een uint8_t ergens de bitreeks 0110 heeft.
Week 4:
Exercise 6.28 — Woorden tellen.
Schrijf een programma dat een tekstbestand inleest en elke zin in een struct stopt. De
struct bevat een string variabele met de zin, een variabele die aangeeft hoeveel woorden
de zin heeft en een variabele die aangeeft hoe vaak het woord “de” voorkomt in de zin.
A:
Maak een struct die een student naam (string) en een tentamencijfer (int) bevat.
B:
Maak een struct die de naam van een cursus en de tentamenresultaten (naam en cijfer)
van de cursus bevat.
C:
Een cursus heet “Python programmeren”. De cijfers zijn: Joep: 3, Kees: 7, Pieter: 8,
Klaas: 5. Initialiseer een variabele met deze waarden.
D:
Schrijf en test een functie die de studenten print (1 per regel) die een voldoende hebben
behaald voor een cursus.
E:
De cursus “C++” heeft de resultaten: Kees: 7, Joep: 8, Pieter: 2, Johan: 6, Arne: 5.
Initialiseer een variabele met deze waarden.
F:
Maak een vector met daarin de twee cursussen.
G:
Schrijf een functie die rapporteert over de cursussen: aantal deelgenomen, aantal geslaagd,
rendement (% geslaagd), gemiddeld cijfer. Gebruik in deze functie meerdere hulpfuncties.
H:
Schrijf een functie die van een lijst cursussen alleen de cursusnamen print van de cursussen
met meer dan 20 deelnemers. Print “geen cursussen” als er geen enkele van de cursussen
meer dan 20 deelnemers heeft.
I:
Schrijf een functie die van een lijst cursussen en een studentnaam de cursussen en cijfers
print die de student heeft behaalt.
J:
Schrijf een functie die van een lijst cursussen de studentennaam print van de studenten
die aan alle cursussen hebben deelgenomen.
K:
Schrijf een functie die een lijst cursussen meekrijgt en een string met een cursusnaam.
Van de cursus met deze cursusnaam worden alle cijfers met 1 verhoogd.
47
week 5:
Exercise 6.32 — Palindroom.
Schrijf een recursieve functie die controleert of een string een palindrooma is.
De functie heeft als parameters string word en int i. De functie heeft als return type bool.
a https://nl.wikipedia.org/wiki/Palindroom
Hint:
Het laatste cijfer van een getal kan je krijgen door gebruik te maken van de %-operatora .
int n = 12345;
int m = n % 10;
cout << "m: " m << "\n";
// output:
// m: 5