You are on page 1of 47

Procedural

Programming in C++
Practicum

Hogeschool Utrecht
Jorn Bunk
H OGESCHOOL U TRECHT © 2018

https://canvas.hu.nl/courses/152

Dit document is gecontroleerd door:


Jorn Bunk hogeschooldocent
Joop Kaldeway hogeschooldocent (eerste versie)
Wouter van ooijen hogeschooldocent (eerste versie)
Bart van Eijkelenburg hogeschooldocent (derde versie)

vierde versie, januari 2019


Inhoudsopgave

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

Installeer de benodigdheden om te programmeren in C++. Zie appendix A1 in de reader, en


lees hoofdstuk 1 t / m 6. Dit gaat over variabelen, datatypes, if/else-statements, loops, output
en input krijgen van een gebruiker.

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

Exercise 1.2 — Character.

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!");

string station = string("Driebergen") + "-Zeist";


string plaats = station.erase(10, station.size()-10);

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);
}

Exercise 1.4 — While-loop.


In de onderstaande code krijgt de variabele number verschillende waarden. Schrijf deze
waarden in goede volgorde op.
#include <iostream>
using namespace std;

int main(){
int number = 65;
while( number < 90){
if(number < 70){
number = 70;
}else if( number < 80){
number++;
}
number += 3;
}
}
7

Exercise 1.5 — ABC.


Beschrijf in één zin wat de onderstaande code doet.
#include <iostream>
using namespace std;

int main(){
char letter = 'a';
for(int i=0; i < 26; i++){
cout << char(letter + i) << ", ";
}
}

Exercise 1.6 — Character plus integer.


Maak een programma dat om een character vraagt, inleest, en bij de char 32 optelt, de
som afdrukt, de uitkomst afdrukt als integer en de uitkomst afdrukt als character. Een
voorbeeld van de output:
Geef een character: B
B + 32 = 98
B + 32 = b

Exercise 1.7 — 1337.


Wim, docent aardrijkskunde, heeft problemen met de communicatie met zijn studenten.
Volgens zijn manager komt dat doordat Wim en de leerlingen beide een andere taal
spreken. Wim snapte niet wat zijn manager bedoelde, maar na wat googlen vond hij
1337-speak. Wim is nog maar een n00b, dus help hem door een vertaalprogramma te
schrijven.
Het programma vraagt de gebruiker om invoer. Vervolgens wordt de invoer afgedrukt,
maar met de volgende aanpassingen:
• Elke ’e’ wordt afgedrukt als ’3’
• Elke ’l’ (letter) wordt afgedrukt als ’1’ (getal)
• Elke ’t’ wordt afgedrukt als ’7’
• Elke ’o’ wordt afgedrukt als ’0’
• Elke andere letter wordt afgedrukt als hoofdletter
Uiteraard mag je de vertaling nog meer hax0r maken. Gebruik niet de C++ functie
toupper(). De uitvoer van het programma kan er zo uitzien:
Geef een string om te vertalen:
We are going to have fun in school.
1337-speak:
W3 AR3 G0ING 70 HAV3 FUN IN SCH001.
8 Hoofdstuk 1. Week 1

Exercise 1.8 — Rechthoek.


Schrijf een programma dat een rechthoek van variabele lengte afdrukt, zoals in het
voorbeeld. Gebruik while- of for-loops en druk ieder character apart af. De gebruiker
geeft aan hoe groot de rechthoek is.
Hoe groot? 5
*****
*****
*****
*****
*****

Exercise 1.9 — Driehoek.


Schrijf een programma dat een driehoek van variabele lengte afdrukt, zoals in het voor-
beeld. Gebruik while- of for-loops en druk ieder character apart af. De gebruiker geeft
aan hoe groot de driehoek is.
Hoe groot? 5
*
**
***
****
*****

Exercise 1.10 — Omgekeerde driehoek.


Schrijf een programma dat een driehoek van variabele lengte afdrukt, zoals in het voor-
beeld. Gebruik while- of for-loops en druk ieder character apart af. De gebruiker geeft
aan hoe groot de driehoek is.
Hoe groot? 5
*****
****
***
**
*
9

Exercise 1.11 — Piramide.


Schrijf een programma dat een piramide van variabele lengte afdrukt, zoals in het voor-
beeld. Druk ieder character apart af. De gebruiker geeft aan hoe groot de piramide
is.
Implementeer je programma twee keer, de eerste keer met twee for loops, en daarna
met twee while loops. Beargumenteer welke variant jij mooier vindt.
Hoe groot? 5
*
**
***
****
*****
****
***
**
*

Exercise 1.12 — Piramide met opvulling.


Schrijf een programma dat een piramide van variabele lengte afdrukt, zoals in het voor-
beeld. Gebruik while- of for-loops en druk ieder character apart af. De gebruiker geeft
aan hoe groot de piramide is.
Hoe groot? 5
*
**
***
****
*****
****
***
**
*
2. Week 2

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;
}
}

string merge(const string & t1, const string & t2){

unsigned int maxSize = max(t1.size(), t2.size());


string newText = "";

for(unsigned int i=0; i < maxSize; i++){


if(i < t1.size()){
newText += t1[i];
}
if(i < t2.size()){
newText += t2[i];
}
}
return newText;
}
2.2 Opgaven 13

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;

vector<int> positive1(vector<int> numbers){


for(unsigned int i=0; i<numbers.size(); i++){
if(numbers[i] < 0){
numbers[i] *= -1;
}
}
return numbers;
}

void positive2(vector<int> & numbers){


for(unsigned int i=0; i<numbers.size(); i++){
if(numbers[i] < 0){
numbers[i] *= -1;
}
}
}

vector<int> positive3(const vector<int> & numbers){


vector<int> newNumbers = numbers;

for(unsigned int i=0; i<newNumbers.size(); i++){


if(newNumbers[i] < 0){
newNumbers[i] *= -1;
}
}
return newNumbers;
}

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

Exercise 2.4 — Zoek acht.


In de onderstaande code staat een functie die de index van de laatste 8 in de vector<int>
numbers teruggeeft.
#include <vector>
#include <iostream>
using namespace std;

int getIndex8(const vector<int>& numbers){


for(unsigned int i = numbers.size(); i > 0; i--){
if(numbers[i-1] == 8){
return i-1;
}
}
return -1;
}

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

Exercise 2.5 — Tellen.


Schrijf een functie die berekent hoe vaak een geheel getal x in een integer-vector voorkomt.
De functie heeft de vorm:
int count(const vector<int> & numbers, const int x) {
...
...
}
Een main functie kan deze functie aanroepen. Bijvoorbeeld:
int main(){
vector<int> n = {37,4,9,4,9,37,3,5,0,4,1};
int number_of_fours = count(n, 4);
cout << "The number of fours are: " << number_of_fours << "\n";
}

Exercise 2.6 — Minimum.


Schrijf een functie die het minimum in een vector<float> bepaalt en deze teruggeeft.

Exercise 2.7 — Verschil max en min.


Schrijf een functie die het verschil tussen het maximum en het minimum van een vec-
tor<int> berekent en deze teruggeeft.

Exercise 2.8 — Tekst vergelijken.


Schrijf een functie die de eerste index teruggeeft waarop twee strings een verschillende
waarde hebben. Bedenk zelf een goede functienaam.
Het complete programma vraagt om twee strings aan de gebruiker en print de index
waarop deze twee strings verschillen. Zorg je dat de functie goed test. Let op: een string
mag spaties bevatten! Voorbeeld output:
Geef een string: lalala Ik eet ui voor ontbijt.
Geef een string: lalala Ik eet citroen op zondag tijdens het ontbijt!
Het eerste verschil zit op index: 14

Exercise 2.9 — Grootste verschil.


Schrijf een functie die gegeven een vector<float> het grootste verschil tussen twee op
een volgende getallen bepaalt.
16 Hoofdstuk 2. Week 2

Exercise 2.10 — Vector controle.


Schrijf een functie, die bepaalt of een gegeven integer-vector met alleen 1’en en 0’en aan
de volgende eisen voldoet:
• het aantal enen is groter dan aan het aantal nullen
• Er mogen niet meer dan 12 nullen zijn.
Bedenk zelf wat het return type van deze functie moet zijn. Gebruik in je programma de
functie count() die je hebt geschreven bij de vorige opgave.

Exercise 2.11 — SumVectoren.


Schrijf de functie sumVectoren die twee float-vectoren meekrijgt. Bedenk zelf aan de
hand van de functienaam wat de functie doet en wat hij teruggeeft. Er zijn meerdere
goede antwoorden mogelijk.

Exercise 2.12 — Palindroom.


De onderstaande functie controleert of een string een palindroom is. Een palindroom is
een woord dat hetzelfde blijft als je het woord omdraait. De functie maakt gebruik van
de functie reverse() die een string omdraait. Schrijf een functie die een string omdraait.
Je mag hiervoor geen nieuwe string of vector aanmaken en je mag niet gebruik maken
van de swap-functie die wordt gegeven door C++ (libraries). Je mag hiervoor wel een
nieuwe tijdelijke character variabele gebruiken. Test de functie met de volgende woorden:
stekkerdoos, Halloween, lepel, flesje en bommeldinga .
bool isPalindroom(const string& word){
string orginalWord = word;
reverse(orginalWord);
for(unsigned int i=0; i<word.size(); i++){
if(word[i] != orginalWord[i]){
return false;
}
}
return true;
}

a De omgedraaide versies van deze woorden zijn: soodrekkets, neewollaH, lepel, ejself, gindlemmob
2.2 Opgaven 17

Exercise 2.13 — Gesorteerde vector.


Schrijf een functie die van een gegeven vector<int> controleert of de getallen zijn
gesorteerd van laag naar hoog. Bedenk zelf een goede naam voor de functie en wat de
functie teruggeeft.

Exercise 2.14 — Vector Input.


Schrijf een programma dat de gebruiker vraagt om een reeks getallen in te voeren door
steeds één getal te geven. Als de gebruiker een negatief getal geeft, dan is de reeks
compleet. Stop de getallen in een vector. Het negatieve getal neem je niet mee in de
vector.
Het programma print vervolgens op het scherm of de reeks gesorteerd is, wat de
gemiddelde waarde is, wat zijn minimum waarde is en hoeveel getallen de reeks bevat.
Zorg ervoor dat in de main()-functie zo min mogelijk code staat. Maak gebruik van je
code van de eerdere opdrachten.
Geef een getal: 1
Geef een getal: 21
Geef een getal: 7
Geef een getal: 45
Geef een getal: 567
Geef een getal: 9
Geef een getal: 3
Geef een getal: 7
Geef een getal: -1
De reeks is niet gesorteerd.
De gemiddelde waarde is: 82.5
De minimum waarde is: 1
De reeks bevat 8 getallen.
3. Week 3

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

Exercise 3.2 — Hoger en lager.


Beschrijf in maximaal twee zinnen wat de onderstaande functie upperAndLower() doet.
Je mag aannemen in je beschrijving dat de parameter van de functie enkel letters bevat.
#include <iostream>
#include <vector>
#include <string>
using namespace std;

void upperAndLower(vector<string> & text){


for(unsigned int i=0; i<text.size(); i++){
for(unsigned int j=0; j<text[i].size(); j++){
if(i % 2 == 0){
text[i][j] |= (1 << 5);
}else{
text[i][j] &= ~(1 << 5);
}
}
}
}

Exercise 3.3 — Print Doolhof.


Een doolhof is gepresenteerd als een matrix (een vector van integer vectoren), waarbij
0 een veilige plek aangeeft, 1 het einddoel aangeeft en -1 muren en boze eekhoorns
aangeeft.
Schrijf een functie die de matrix met de waarden 1, 0 en -1 afdrukt. Waarbij de -1 wordt
afgedrukt als een ’x’. De matrix:
vector<vector<int>> mat = { {-1, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1, 0,-1, 0, 0, 0,-1,-1, 0,-1,-1},
{-1, 0,-1, 0,-1,-1,-1, 0, 0, 1,-1},
{-1, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}};
wordt afgedrukt als:
x0xxxxxxxxx
x0x000xx0xx
x0x0xxx001x
x0000000xxx
xxxxxxxxxxx
3.2 Opgaven 21

Exercise 3.4 — Achteruit.


Beschrijf in één zin wat de onderstaande functie reverse() doet.
char reverse(char ch){
char result = (ch & 1);

for(int i=0; i<7; i++){


result <<= 1;
ch >>= 1;
result |= (ch & 1);
}
return result;
}

Exercise 3.5 — Gemiddelde.


Schrijf een functie die van een gegeven vector<int> het gemiddelde berekent en terug-
geeft.

Exercise 3.6 — Gemiddelde 2.


Schrijf een functie die van een gegeven vector< vector<int>> het gemiddelde berekent
van de gehele vector< vector<int>> en teruggeeft.

Exercise 3.7 — getBit.


Schrijf een functie met de parameters uint8_t b en integer n. De functie geeft de bitwaarde
(een 1 of een 0) terug van het n-de bitje van b. De bits zijn genummerd van rechts naar
links en we beginnen te tellen met 0. De functie definitie is gegeven:
int getBit(uint8_t b, int n){
...
...
}

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

Exercise 3.8 — Indexes.


Schrijf een functie die gegeven de parameters charMatrix en c alle indexen teruggeeft
waar c voorkomt in charMatrix. Je mag aannemen dat het aantal rijen en kolommen van
de matrix gelijk zijn. De functiedefinitie is gegeven:
vector<vector<int>> getIndexes(const vector<vector<char>> & charMatrix,
const char & c){
...
...
}
Het totale programma print de indexen. Met de main functie:
#include <iostream>
using namespace std;

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')

cout << "there is a \'u\' at:";


for(unsigned int i=0; i<indexes.size(); i++){
cout << "[" << indexes[i][0] << ", " << indexes[i][1] << "],";
}
}
Wordt het volgende geprint:
There is a 'u' at: [0,0], [1,3], [2,1], [2,2], [3,1],

Exercise 3.9 — Roze robots & harten van staal.


Arjen heeft een crush op een Noorse robot. Het enige probleem is dat de robot hem
niet leuk vindt. Arjen gaat haar stalen hart winnen door te communiceren met de robot.
Jammer genoeg kan dit alleen in bitpatronen. Helaas zijn de binaire pick-up lines van
Arjen dermate tragisch dat het beter is dat er ruis wordt doorgestuurd. De boodschappen
van Arjen zijn altijd 8 bits, kies steeds drie willekeurige bits die je inverteert om te zorgen
dat het signaal onbegrijpbaar wordt voor de Noorse robot. Gebruik voor kiezen van een
willekeurige bit de functie rand() van de library stdlib.h. De functie heeft de volgende
vorm:
void improveLoveMessage(char & message){
...
...
}
Auteur van deze opdracht: Luke Roovers

Exercise 3.10 — Som.


Schrijf een functie die van een gegeven vector<vector<float>> de som per rij berekent
en teruggeeft.
3.2 Opgaven 23

Exercise 3.11 — Tellen.


Schrijf een functie die van een gegeven vector<vector<int>> telt hoe vaak een gegeven
getal voorkomt per kolom. Neem aan dat alle rijen even lang zijn.

Exercise 3.12 — Voetbalteam.


Een groep wiskundigen besloten mee te doen aan een 9-tegen-9-voetbaltoernooi. Na
analyse van eerdere wedstrijden is besloten dat de beste opstelling is drie rijen van
drie. Om de tegenstanders te verwarren en omdat hun teamnaam ‘the Transposers’ is, is
besloten om tijdens de wedstrijden af en toe de opstelling te transponeren.
Schrijf een functie die de getransponeerde matrix van de opstelling kan berekenena .
Een getransponeerde matrix is een matrix gespiegeld is over zijn hoofddiagonaal. Met
andere woorden, de functie moet van matrix m element m[i][ j] verwisselen met element
m[ j][i]. De functie moet ook werken voor andere matrixen, maar je mag aannemen dat de
kolommen even lang zijn als de rijen. Laat het programma de getransponeerde matrix
afdrukken. Gegeven de matrix:
vector<vector<int>> team = { {1,2,3},
{4,5,6},
{7,8,9}};

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;
};

void Tostis2File(vector<tosti> tostis, string fName){


ofstream tostiFile;
tostiFile.open(fName, ofstream::app);
for(unsigned int i=0; i < tostis.size(); i++){
tostiFile << tostis[i].name << ", ";
tostiFile << "(";
for(unsigned int j=0; j<tostis[i].ingredients.size(); j++){
tostiFile << "[" << tostis[i].ingredients[j].amount;
tostiFile << " x " << tostis[i].ingredients[j].name << "]";
}
tostiFile << "), ";
tostiFile << tostis[i].amount << "\n";
}
tostiFile.close();
}

int main () {
ingredient cheese = {"kaas", 4};
ingredient bread = {"brood", 2};
ingredient herring = {"haring", 1};
ingredient coffee = {"koffiebonen", 4};
ingredient chocolat = {"hagelslag", 50};

vector<tosti> tostis = {{"Tosti Haring",{bread, cheese, herring}, 0}};


tostis.push_back({"Tosti koffie", {bread, cheese, coffee}, 2});
tostis.push_back({"Tosti hagelslag", {bread, chocolat}, 4});

tostis[2].ingredients.push_back(cheese);
tostis[0].ingredients[0].amount = 3;
tostis[0].amount = 1;

Tostis2File(tostis, "tosti.txt");
}
4.2 Opgaven 27

Exercise 4.2 — TV-sensatie.


De TV-sensatie “Heel Idols bakt a Voice on Ice with Stars Island” is bijna afgelopen.
Tijdens de finale willen de producenten zo snel mogelijk de winnaar berekenen. De
winnende score is de score die het dichts bij de gemiddelde score zit. Daarnaast moet
worden bepaald wie de mol is, want die zoekt een boer. Dat gebeurt door het punten
verschil tussen de laatste plek en de eerste plek te berekenen.
Schrijf een programma die deze berekeningen uitvoert. Een header-file en de main-file
zijn al geschreven. Verander de source file ’winners.cpp’ zodat het programma werkt.

winners.hpp:
#ifndef WINNERS_HPP
#define WINNERS_HPP

#include <vector>
#include <iostream>

using std::vector, using std::cout, std::endl;

float nearestScore2Average(const vector<float>& scores);


float distanceFirstLast(const vector<float>& scores);

#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};

float winner = nearestScore2Average(results);


float mole = distanceFirstLast(results);

cout << "De winnaar is: " << winner << "\n";
cout << "De mol is: " << mole << "\n";

return 0;
}
winners.cpp:
#include "winners.hpp"

float nearestScore2Average(const vector<float>& scores) { return 0.0; }


float distanceFirstLast(const vector<float>& scores) { return 0.0; }
28 Hoofdstuk 4. Week 4

Exercise 4.3 — Voorwerpen.


Gegeven is de struct-definitie:
struct furniture {
int number = 0;
string name = "";
float weight = 0.0;
Schrijf
float length = 0.0;
};
een programma dat de gebruiker vraagt om de gegevens van een meubelstuk. Stop deze
gegevens in een struct furniture en druk de gegevens vervolgens af. Een voorbeeld van de
interactie is:
nummer: 5
naam: stoel
gewicht: 4.5
lengte: 90

stoel heeft nummer 5, weegt 4.5 kilo en is 90 cm.

Exercise 4.4 — Priority queue.


Een priority queue is een datastructuur die qua werking erg lijkt op een vector, maar
als verschil heeft dat enkel het eerste element bereikbaar is. De priority queue werkt
vanuit het first-in-first-out principe. In de onderstaande code (zie volgende pagina) is een
main-file te zien die gebruikt maakt van een priority queue en de source-file (queue.cpp)
van een implementatie van een priority queue. Schrijf de header-file van de priority queue.
In de header staat onder andere de definitie van de struct Queue.
4.2 Opgaven 29

queue.cpp:
#include <vector>
#include "queue.hpp"
using namespace std;

void init_queue(Queue & pq){


pq.v = {};
pq.head = 0;
pq.tail = 0;
}

void enqueue(Queue & pq, float data){


pq.v.push_back(data);
pq.tail++;
}

float dequeue(Queue & pq){


if(pq.tail <= pq.head){
cout << "error";
while(1);
}

float tmp = pq.v[pq.head];


pq.v.erase(pq.v.begin());
pq.tail--;
return tmp;
}

float show(const Queue & pq){


return pq.v[pq.head];
}
main.cpp:
#include "queue.hpp"

int main () {

Queue q;
init_queue(q);

enqueue(q, 5.43);
enqueue(q, 7.2);
enqueue(q, 3.90);

cout << dequeue(q) << "\n";


cout << show(q) << "\n";
cout << dequeue(q) << "\n";
cout << dequeue(q) << "\n";
}
30 Hoofdstuk 4. Week 4

Exercise 4.5 — compression.


Schrijf een compress-programma, dat uit een gegeven bestand een nieuwe bestand maakt,
waarbij van iedere regel alle spaties en tabs aan het begin van de regel zijn verwijderd.
Verder zijn alle lege regels verwijderd (een lege regel bevat ’\n’ , eventueel voorafgegaan
door spaties en tabs(‘\t’)). De compress-functie heeft de volgende definitie:
void compress(string src_filename, string dest_filename){
...
...
}

Exercise 4.6 — Verschuif Cyclisch.


Schrijf een functie met twee parameters. De eerste parameter, ch, is een character. De
tweede parameter, n, geeft aan hoeveel posities de bitjes van ch opgeschoven moeten
worden. Als n > 0 is dan worden de bitjes naar links geschoven. Als n < 0 is dan worden
de bitjes naar rechts geschoven. De bitjes die wegvallen worden aan de andere kant van
de byte weer teruggeplaatst.
Voorbeeld 1
ch met bitwaarde 1011000 en n is gelijk aan 3 resulteert in een ch met de bitwaarde:
1000101.
Voorbeeld 2
ch met bitwaarde 1011100 en n is gelijk aan -4 resulteert in een ch met de bitwaarde:
1100101.
4.2 Opgaven 31

Exercise 4.7 — Studentgegevens.

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.

Exercise 4.8 — Deelproblemen.


De volgende functies lossen een "groot"probleem op. Bedenk per functie de deelproble-
men en schrijf de functienamen op van de functies die deze deelproblemen oplossen. Je
hoeft de inhoud van de functies niet te maken.
1. void raadGetalOnderDeTien()
2. int aantalWoordenInLangsteZin(string filename)
3. void bestuurZelfrijdendeAuto()
5. Week 5

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

Exercise 5.2 — Mmm Mmm Mmm Mmm.


Beschrijf in één zin wat de onderstaande functie m() doet.
#include <iostream>
#include <vector>
using namespace std;

int m(vector<int> numbers, int size){


if(numbers.size() <= 0 || size <= 0){
cout << "De rij is leeg.";
exit(0); // be\"eindig het programma.
}
if(size == 1){
return numbers[0];
}

int mmm = m(numbers, size-1);


if (mmm < numbers[size-1]){
return mmm;
}else{
return numbers[size-1];
}
}

int main(){

vector<int> numbers = {6,3,7,3,8,2,34};


int CTD = m(numbers, numbers.size());
}

Exercise 5.3 — Groot en gemeen.


Hoe vaak wordt de onderstaande code uitgevoerd met a=900 en b=280?
int findGCD(int a,int b){
if(a == b){
return a;
}
else if(a>b){
return findGCD(a-b,b);
}else{
return findGCD(a,b-a);
}
}
5.2 Opgaven 35
Figuur 5.1
Voorbeeld van
een programma
dat recursief
het vierde
element van de
fibonacci reeks
uitrekent.

Exercise 5.4 — Rij van Fibonaci.


De rij van Fibonacci is genoemd naar Leonardo van Pisa, bijgenaamd Fibonacci, die de
rij noemt in zijn boek Liber abaci uit 1202. De rij begint met 0 en 1 en vervolgens is elk
volgende element van de rij steeds de som van de twee voorgaande elementen. Bij de
rij gebruiken we de notatie fn voor het aangeven van het n-de element van de rij. f9 is
bijvoorbeeld gelijk aan 34. De eerste elementen van de rij zijn dan als volgt:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584
Implementeer een functie die fn uitrekent gegeven integer n. De functie moet recursief
zijn. Maak gebruik van de volgende definitie van de rij van Fibonacci:
1. f0 == 0
2. f1 == 1
3. fn = fn−1 + fn−2 , voor n > 1
Dezelfde regels, maar iets uitgebreider uitgelegd:
1. Als n == 0, dan geeft de functie 0 terug
2. Als n == 1, dan geeft de functie 1 terug
3. Als n > 1, dan geeft de functie de waarde terug van fn−1 + fn−2

Exercise 5.5 — Maximum.


Schrijf een recursieve functie die van een vector<float> de maximale waarde bepaalt.
Neem aan dat de vector die de functie mee krijgt minimaal één element heeft.

Exercise 5.6 — Gemiddelde.


Schrijf een recursieve functie die van een vector<int> het gemiddelde uitrekent. Neem
aan dat de vector die de functie meekrijgt minimaal één element heeft.

Exercise 5.7 — Gesorteerd.


Schrijf een recursieve functie die controleert of een vector<float> gesorteerd is van laag
naar hoog. Neem aan dat de vector die de functie meekrijgt minimaal één element heeft.
36 Hoofdstuk 5. Week 5

Exercise 5.8 — Robotpiraat.


De robotpiraat Arrrrr2D2 is op zoek naar de schat van de beroemde robotpiraat Roestbaard.
Om de schat te vinden heeft hij instructies gekregen, maar zijn batterij is bijna op. Schrijf
een programma die de kortste instructies geeft naar de schat, zodat Arrrrr2D2 genoeg
energie heeft om de schat te bereiken. Split je programma op in minimaal 2 deelproblemen.
Schrijf voor elk deelprobleem een functie. Minimaal één van de functies moet recursief
zijn.
De instructies naar de schat zijn:

Vector<string> map = {"west", "west", "south", "south", "south", "west",


"west", "west", "north", "north", "north", "north", "north", "west",
"west", "west", "west", "west", "west", "south", "south", "south",
"south", "east", "east", "east", "west", "west", "south", "south", "
south", "west", "west", "north", "north", "north", "north", "north",
"north", "west", "west", "west", "west", "west", "west", "south", "
south", "south", "south", "east", "east", "east", "north", "north",
"north", "north", "north", "north", "north", "north", "north", "
north", "north", "east", "east", "east", "east", "east", "east", "
east", "east", "east", "south", "south", "south", "south", "south",
"west", "west", "west", "east", "east", "east", "east", "east", "
east", "east", "east", "north", "west", "north", "north", "north", "
north", "north", "north", "north", "north", "north", "north"}
6. Extra

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

Exercise 6.2 — Ceasarcijfer.


Schrijf een programma voor Ceasarcijfera . Voorbeeld van de interactie met het pro-
gramma:
Geef een tekst: To be or not to be, That is the question
Geef een rotatie: 4
Ceasarcode: Xs fi sv rsx xs fi, Xlex mw xli uyiwxmsr

a zie: https://nl.wikipedia.org/wiki/Caesarcijfer.

Exercise 6.3 — Rechthoek.


Schrijf een programma een rechthoek van #-tekens afdrukt op het scherm. De grootte van
de rechthoek kan worden aangegeven door de gebruiker. Een voorbeeld van de uitvoer is:
Lengte van de zijden: 6
# # # # # #
# #
# #
# #
# #
# #
# # # # # #

Exercise 6.4 — Mastermind.


Schrijf een programma voor een simpele versie van Mastermind. De computer ‘bedenkt’
een random getal dat bestaat uit 4 cijfers, bijvoorbeeld 3582. De speler mag 6 keer een
getal tussen 0 en 9 raden. Als het geraden getal in het random getal zit, laat de computer
dit zien, bijvoorbeeld:
****
Geef een getal (0-9):
8
**8*
Geef een getal (0-9):
Het spel is afgelopen als de speler het getal raadt of als de 6 beurten voorbij zijn.

Exercise 6.5 — Piramide 3.


Schrijf nog een programma dat een piramide van asterisken (*-tekens) afdrukt op het
scherm, maar nu met de punt naar boven. Het programma vraagt eerst aan de gebruiker
hoe groot de piramide moet worden. De sterretjes staan verder van de kantlijn af door
middel van spaties. Als de gebruiker een piramide met grootte 5 wil krijgt hij/zij het
volgende te zien:
Hoe groot? 5
*
***
*****
*******
*********
39

Exercise 6.6 — De tafel.


Maak een programma dat een geheel getal n inleest met 0 < n < 100. Vervolgens wordt
de tafel (1 t/m 10) van n afgedrukt. De kolommen zijn daarbij rechts uitgelijnd. Het
uitlijnen doe je door extra spaties te plaatsen. Bijvoorbeeld met n = 12:
12 * 1 = 12
12 * 2 = 24
12 * 3 = 36
12 * 4 = 48
12 * 5 = 60
12 * 6 = 72
12 * 7 = 84
12 * 8 = 90
12 * 9 = 102
12 * 10 = 120
Tip: Door slim te delen door 10 (en dat bij te houden) kan je bepalen uit hoeveel cijfers
een getal bestaat.

Exercise 6.7 — FizzBuzz.


Schrijf een programma dat de getallen 1 tot 100 print, maar print voor veelvouden van
drie "fizzïn plaats van het getal en voor veelvouden van vijf print "buzzïn plaats van
het getal. Getallen die zowel veelvoud zijn van drie als van vijf worden afgedrukt als
"fizzbuzz"a
De eerste 20 getallen worden als volgt afgedrukt:
1
2
fizz
4
buzz
fizz
7
8
fizz
9
buzz
11
fizz
14
fizzbuzz
16
17
fizz
19
buzz

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.

Exercise 6.9 — Daar.


Schrijf een functie die een vector<bool> mee krijgt, en teruggeeft Waar de de langste rij
’true’ waarden in de vector begint.

Exercise 6.10 — Groter verschil dan 5.


Schrijf een functie die een vector<float> mee krijgt, en controleert of er twee op een
volgende waarden zijn waarvan het verschil groter is dan 5. De functie geeft false terug
als dat niet is zo is en anders true.

Exercise 6.11 — Muizen.


Conciërge Maria moet de muizenplaag van het hotel oplossen. Gelukkig heeft ze alle
muizen al gevangen in de vector<int> hallway. In de vector<int> is de waarde -1 gelijk
aan een muis.
Om de muizen te verslaan moet ze alle muizen op 1 zetten. Schrijf een functie die dit
doet.

Exercise 6.12 — Olifantenplaag.


Olifantenverdelger Karin moet de kelder van een hotel olifantenvrij maken. De meest
diervriendelijke wijze om dit te doen is door nepmuizen naast de olifanten te leggen. De
kelder van het hotel wordt gerepresenteerd als een vector<int>. De waarde 1 betekent
dat er daar een olifant is. De waarde 2 geeft aan dat op die positie een nepmuis ligt. De
waarde 0 geeft aan dat er niks op die positie staat.
A:
Schrijf een functie die naast alle olifanten een nepmuis legt. Doe dit alleen als het dat
kan. Soms staan olifanten op een kluitje en is er geen vrije positie naast de olifant.
B:
Schrijf een functie die alle olifanten die naast een nepmuis staan weghaalt.
C:
Schrijf een programma die de bovenstaande functies net zo lang herhaalt totdat alle
olifanten weg zijn.
41

Exercise 6.13 — Trein.


In de nieuwe treinen van de NS zijn ze vergeten toiletten te plaatsen. Om toch toiletten te
plaatsen moet nu worden bepaalt waar de toiletten moeten komen.
Een trein wordt gepresenteerd door een vector<int>. Een 0 is de voor- of achterkant
van de trein is, een 1 zijn eersteklas stoelen, een 2 zijn tweedeklas stoelen en een -1 is een
toilet.
Schrijf een functie die een toilet plaatst bij elke overgang van eerste naar tweede
klassen (en andersom). Een toilet komt altijd in plaats van tweedeklas stoelen. Je mag
aannemen dat er altijd 2 of meer stoelen van de zelfde soort achter elkaar staan.
vector<int> train = 0,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,1,1,0

Exercise 6.14 — Vervang.


Schrijf een functie met drie parameters: string s, char a en char b. Het resultaat van de
functie is string s met iedere char a vervangen door char b.

Exercise 6.15 — Prefix.


Schrijf de functie is_prefix( string a, string b ) die teruggeeft of a een prefix is van b. “he”
is een prefix van “hello”.

Exercise 6.16 — Positief.


Schrijf een functie die controleert of alle getallen in een vector<int> positief zijn. De
functie heeft als return-type bool.

Exercise 6.17 — Eerste nul.


Schrijf een functie die de index van de eerste nul in een vector<int> teruggeeft.

Exercise 6.18 — Enge verhalen.


Paul vindt enge verhalen erg leuk, maar kan niet slapen als hij niet weet hoe het afloopt.
Het probleem is dat hij niet altijd genoeg tijd heeft om het hele verhaal te lezen. Als
oplossing leest hij nu eerst het einde en gaat daarna verder met het begin van het verhaal.
Schrijf een functie die voor hem het verhaal op zijn leesvolgorde zet. Het verhaal zit
in een string en de parameter n geeft aan bij de hoeveelste letter Paul wil beginnen met
lezen.
Voorbeeld met n = 22:
“The last man on Earth heard knock on the door. . . ” wordt
“heard knock on the door. . . The last man on Earth ”
42 Hoofdstuk 6. Extra

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”};

Exercise 6.20 — Bitjes tellen.

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.

Exercise 6.21 — Matrix controle.

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.

Exercise 6.22 — Quiz.


Bob doet mee aan een quiz. Hij krijgt op een lopende band 5 producten te zien en moet
dan de totaalprijs van de producten raden. Helaas is hij hier erg slecht in.
Klaartje is bevriend met Bob, werkt voor de quiz en wil hem helpen met valsspelen.
Ze bedenkt het volgende. Aan de letters van de naam van het product kan Bob de waarde
bepalen. De letter ‘e’ is 15 euro waard en de letter ‘a’ 20 euro.
Zelfs dit is voor Bob te moeilijk. Schrijf een functie die de totaalprijs voor Bob kan
bepalen.

Exercise 6.23 — Real computer engineers speak binary.


Echte TI’ers lezen met gemak reeksen met bitjesa . Om dit te bewijzen programmeren we
hiervoor een spel. Het spel begint met het laten zien van een byte. Beide spelers moeten
43

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

Exercise 6.24 — Inverteren.


Schrijf een functie die alle bitjes van een uint8_t inverteert behalve die op index i. De
functie krijgt als parameters een uint8_t b en int i mee.
voorbeeld 1:
uint8_t x = 170 // 10101010
int i = 4
Uitkomst bitwaarde: 01000101
voorbeeld 2:
uint8_t x = 162 // 10100010
int i = 4
Uitkomst bitwaarde: 01010101

Exercise 6.25 — 0110.


44 Hoofdstuk 6. Extra

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.

Exercise 6.26 — Print bitjes.


Schrijf de functie printBit(uint8_t x) die alle bitjes van x print, maar zonder de nullen die
vooraan staan.
als x gelijk is aan 38 (in bitwaarde: 00100110), dan wordt er 100110 geprint.

Exercise 6.27 — Bit AND.


Schrijf een functie die gegeven uint8_t x, uint8_t y, en int i de AND neemt van x en y,
behalve op index i. Op index i blijft het de waarde van x.
Voorbeeld 1:
i=4
x = 106 // 10101010
y = 7 // 00000111
uitkomst: 10 // 00001010
45

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.

Exercise 6.29 — 4-chords song.


Pop-liedjes staan er om bekent dat ze veelal dezelfde 4 akkoorden gebruiken. De volgende
twee youtube-filmpjes illustreren dit:
• 4 Four Chord Song - Axis of Awesome:
https://www.youtube.com/watch?v=5pidokakU4I
• Pachelbel Rant - Rob Paravonian:
https://www.youtube.com/watch?v=JdxkVQy7QLM
A:
schrijf een functie waarmee we kunnen tellen op hoeveel posities twee liedjes de zelfde
noot hebben Een liedje is een vector<char> met de noten ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’.
B:
Dat twee liedjes op veel plekken dezelfde noten hebben zegt niet zo veel als tussen de
noten andere noten zitten. Schrijf een functie die telt hoe lang het langste stuk is dat twee
liedjes gemeen hebben.

Exercise 6.30 — LOLcats.


Van een set LOLcatsa hebben we de volgende informatie:
• naam
• Aantal keer bekeken
• Leeftijd
A:
Schrijf een struct waarin we deze informatie in kunnen opslaan.
B:
Schrijf een functie die de naam print van elke LOLcat met meer dan 100000 views.
C:
Een docent is een presentatie aan het maken voor eerstejaarsstudenten. Om grappig en
hip te lijken gebruikt hij LOLcats. Hiervoor zit hij een hele treinreis LOLcats plaatje
te bekijken. Schrijf een functie die het aantal views van de LOLcats ouder dan 10 jaar
verhoogt met 2.
a http://knowyourmeme.com/memes/lolcats

Exercise 6.31 — Studenten++.


46 Hoofdstuk 6. Extra

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

Exercise 6.33 — Super Sum.


Schrijf een recursieve functie die de som uitrekent van de cijfers in een getal. De functie
heeft als enige parameter int number.
Voorbeelden:
12345 → 1+2+3+4+5 = 15
36 → 3 + 6 = 9
903 → 9 + 0 + 3 = 12

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

a De %-operator heet de modulo-operator.

Exercise 6.34 — Algoritme van Euclides.


De grootste gemene deler (GGD)a van twee getallen is de grootste integer die beiden
deelt (zonder rest). Bijvoorbeeld de GGD van 102 en 68 is 34; 102 en 68 zijn beiden een
meervoud van 34, en er is geen integer groter dan 34 die een gemeenschappelijke deler is.
de GGD is eenvoudig te bereken aan de hand van de eigenschappen:
• Als p > q, de GGD van p en q is hetzelfde als de GGD van q en van p % q
• als p == q, dan is de GGD de waarde van p
Schrijf een recursieve, en een iteratieve versie van dit algoritme
a In het Engels: Greatest Common Divisor (GCD).

Exercise 6.35 — Vind x.


Schrijf de recursieve functie index(vector<int> v, int size, int x) die index van x in v
teruggeeft. Als x niet in v zit geeft de functie -1 terug. Je mag er vanuit gaan dat v alleen
unieke getallen bevat.

You might also like