Programmeermethoden
Werkcollege 4: Functies en Tweede opgave I
Het vierde werkcollege van het vak
Programmeermethoden
vindt plaats in
de week van 23 tot en met 27 september 2024.
Voorbereiding
Als voorkennis wordt bekend verondersteld:- Inhoud colleges tot en met deze week.
- Elementaire kennis over functies.
- Doorgelezen: de tweede programmeeropgave.
Het eigenlijke werkcollege
Maak allereerst een kaal C++-programma, zoiets als:#include <iostream>
using namespace std;
int main ( ) {
return 0;
}//main
Doe achtereenvolgens deze opdrachten (plaats de zelfgeschreven functies in dit programma, en test ze (dus roep ze aan)):
- Schrijf een functie die een infoblokje voorstelt, en dus een paar regels tekst naar het beeldscherm stuurt. Dit is natuurlijk een "void"-functie.
- Schrijf een functie int telop (int x, int y)
die de waardes van x en y optelt
en deze som retourneert.
Dit is dus een uiterst simpele functie die met behulp van een return-value informatie doorgeeft.
Roep de functie aan met telop (11,12), en telop (u,v) (met geschikte variabelen u en v), en gebruik zowel cout << telop (...); als u = telop (...);. - Schrijf een functie void telop (int x, int y, int & z)
die de waardes van x en y optelt
in de (call by reference) variabele z.
Dit is dus een functie die met behulp van een call by reference variabele informatie doorgeeft. - Schrijf een functie void telop (int x1, int x2, int y1, int y2, int & z1, int & z2)
die de waardes van de "breuken"
x1/x2 en y1/y2 optelt
in de breuk z1/z2. Vereenvoudigen hoeft niet
(daar had je overigens de functie uit Hoofdstuk 4.1.1 van het
dictaat, gedeelte "aantekeningen bij de hoorcolleges", voor kunnen gebruiken).
Nee, 1/2 plus 1/3 is niet gelijk aan 2/5.
Waarom kan het hier niet direct met een return-value? - (Opgave 20 uit het opgaven-dictaat)
Schrijf (eerst op papier) een functie die x tot de macht y berekent, waarbij x van type double is en y van type int. Gebruik geen functies uit cmath, maar gewoon een for-loop. Werkt het ook voor negatieve exponenten?
Kies je voor een return-value of een call by reference parameter? - Schrijf een functie die bij gegeven getal n
de cijfers van n op aparte regels zet,
het laatste cijfer eerst. Dus getal 725 levert drie regels,
respectievelijk met 5, 2 en 7.
En laat de functie meteen het aantal cijfers van het getal uitrekenen (3 in het voorbeeld).
===============Ter voorbereiding op de tweede programmeeropgave ...======================== - Gebruik de sheets van het vierde college, met name het gedeelte over functies.
-
Schrijf een programma dat een gegeven (invoer)file,
zeg invoer.txt,
onveranderd kopieert naar een uitvoerfile, zeg uitvoer.txt.
Maak zelf een geschikte invoerfile als testfile,
zie ook het volgende werkcollege.
Hint: dictaat, gedeelte "aantekeningen bij de hoorcolleges", Hoofdstuk 3.7, en de sheets van het vierde college. De benodigde code staat ook hier. De ruwe programastructuur is:
lees karakter in
while not einde file
doe iets met het karakter
lees karakter in - Laat de gebruiker voorlopig nog geen namen van in- en uitvoerfile kiezen. Bij het testen is het namelijk handig niet steeds die namen te hoeven invoeren. En geef later je testfiles korte namen, dat scheelt typewerk.
- Tel het aantal karakters in de file. Tel hierbij de regelovergangen (LineFeed: '\n') ook apart.
- Laat alle cijfers uit de file op het beeldscherm afdrukken, en de niet-cijfers naar de uitvoerfile kopiëren. (Iets dergelijks is bij de programmeeropgave straks ook nodig.)
- Print op het beeldscherm de kwadraten van de
getallen die in de file voorkomen, één per regel.
Pas daartoe het programma subtiel aan!
Bouw cijfers karakter voor karakter op tot getallen. Tip: als je getal 123 is, en je leest nu een 4 (als karakter!), hoe maak je dan het getal 1234? Gebruik dus een integer die het "huidige" getal bevat, en die meestal gewoon 0 is.
De ruwe programastructuur is nu (het kan ook anders ...):
lees karakter in
while not einde file
if karakter is een cijfer
update een en ander
else
print (kwadraat van) getal
update van alles
print huidig karakter
onthoud huidig = binnenkort vorig karakter (altijd handig)
lees karakter in - Dat afdrukken gebeurt toch wel met een functie verwerkgetal (...)?
- Laat na afloop het aantal keer dat het woordje "de" in de file voorkwam afdrukken.
Tip: vorig en huidig karakter moeten dan een d en een e zijn. - Maak geregeld (elk kwartier)
een backup van je C++-file, zo nu en dan onder een andere naam!
===============Tweede programmeeropgave======================== - Begin nu aan de tweede programmeeropgave; zie daartoe het vijfde werkcollege. Dus eigenlijk is dit bedoeld voor volgende week, maar een beginnetje kan geen kwaad.
- Hint: alleen een paar eenvoudige "eigenschappen" zijn nodig, zoals "wat zijn vorige en huidige karakter", en: "wat is de getalswaarde van het getal tot nu toe (vaak 0)?". Tip: dit kost maar een paar regels C++!
- Gaat het goed voor een eenvoudige voorbeeldfile? En een lastige?
Zie de opgave voor enkele voorbeeldfiles.
===============Voor verder oefenen ...======================== - Schrijf een functie char upcase (char letter) die, als letter een kleine letter is, de bijbehorende hoofdletter retourneert, en anders het oorspronkelijke karakter.
- Schrijf een functie die de alfabetisch eerste van twee gegeven kleine letters retourneert.
- Schrijf (uit je hoofd) een functie die de waardes van zijn integer argumenten (parameters) verwisselt. Denk aan het eventuele gebruik van &'s.
- Schrijf een functie die aan de gebruiker een getal vraagt,
zeg n, en vervolgens n regels afdrukt op het scherm,
waarbij op de i-de regel de eerste i i-vouden staan. Een voorbeeld voor n gelijk aan 4:
1
2 4
3 6 9
4 8 12 16 - Schrijf een functie die afdrukt de hoeveelste keer het is dat deze wordt aangeroepen. Tip: gebruik een static variabele.
- Schrijf een functie, die bij gegeven positief geheel getal m, maximaal n stappen uit het 3x+1-algoritme doorrekent. De tussenresultaten moeten, als de gebruiker dat wil, op het scherm gezet worden.
- Schrijf een functie die een getal in factoren ontbindt. Bijvoorbeeld: 84=2^2 x 3^1 x 7^1.
Huiswerk
- Probeer call by value en call by reference te begrijpen, zie ook Hoofdstuk 3.6 uit het dictaat, gedeelte "aantekeningen bij de hoorcolleges".
- Maak de opgaven 11 tot en met 17 uit de opgavenbundel (1 tot en met 10 waren toch al af?).