Programmeermethoden
Werkcollege 4: Functies en Tweede opgave I

Het vierde werkcollege van het vak Programmeermethoden vindt plaats in de week van 25 tot en met 29 september 2023.

Voorbereiding

Als voorkennis wordt bekend verondersteld:

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)):
  1. Schrijf een functie die een infoblokje voorstelt, en dus een paar regels tekst naar het beeldscherm stuurt. Dit is natuurlijk een "void"-functie.
  2. 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 (...);.
  3. 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.
  4. 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?
  5. (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?
  6. 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 ...========================
  7. Gebruik de sheets van het vierde college, met name het gedeelte over functies.
  8. 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.
  9. 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.
  10. Tel het aantal karakters in de file. Tel hierbij de regelovergangen (LineFeed: '\n') ook apart.
  11. 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.)
  12. 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 (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
  13. Dat afdrukken gebeurt toch wel met een functie verwerkgetal (...)?
  14. 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.
  15. Maak geregeld (elk kwartier) een backup van je C++-file, zo nu en dan onder een andere naam!
    ===============Tweede programmeeropgave========================
  16. 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.
  17. Hint: alleen een paar eenvoudige "eigenschappen" zijn nodig, zoals "wat zijn vorige en huidige karakter", en later: "wat is de getalswaarde van het getal tot nu toe (vaak 0)?". Tip: dit kost maar een paar regels C++!
  18. Gaat het goed voor een eenvoudige voorbeeldfile? En een lastige?
    ===============Voor verder oefenen ...========================
  19. Schrijf een functie char upcase (char letter) die, als letter een kleine letter is, de bijbehorende hoofdletter retourneert, en anders het oorspronkelijke karakter.
  20. Schrijf een functie die de alfabetisch eerste van twee gegeven kleine letters retourneert.
  21. Schrijf (uit je hoofd) een functie die de waardes van zijn integer argumenten (parameters) verwisselt. Denk aan het eventuele gebruik van &'s.
  22. 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
  23. Schrijf een functie die afdrukt de hoeveelste keer het is dat hij/zij wordt aangeroepen. Tip: gebruik een static variabele.
  24. 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.
  25. Schrijf een functie die een getal in factoren ontbindt. Bijvoorbeeld: 84=2^2 x 3^1 x 7^1.

Huiswerk

De antwoorden op de opgaven worden tevens via WWW verspreid. Als er vragen over de opgaven zijn, laat het weten.