Programmeermethoden
Werkcollege 4: Functies en Tweede opgave I

Het vierde werkcollege van het vak Programmeermethoden vindt plaats in zaal 302/304, zaal 303, zaal 306/308 en zalen 307 en 309 (de PC-zalen), op donderdag 28 september 2017, van 13:30 tot 15:15 uur voor de Informatica-studenten en op vrijdag 29 september 2017, van 13:30 tot 15:15 uur voor de Wiskunde-studenten. Anderen mogen kiezen. Het wordt verzorgd door de vaste staf.

Spreek/Vragenuur in zalen 302 ... 309: woensdag 27 september 2017, van circa 13:30 tot 15:15 uur; en donderdag 28 september 2017, van circa 15:15 tot 17:00 uur.

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 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 (...);.
  2. 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.
  3. 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, zie de eerste programmeeropgave.
    Waarom kan het hier niet direct met een return-value?
  4. (Opgave 20 uit het dictaat)
    Schrijf 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?
  5. 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 ...========================
  6. 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.
  7. 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 noem je testfiles bijvoorbeeld x, dat scheelt typewerk.
  8. Tel het aantal karakters in de file. Tel hierbij de regelovergangen (LineFeed: '\n') ook apart.
  9. Laat alle cijfers uit de file op het beeldscherm afdrukken. (Iets dergelijks is bij de programmeeropgave ook nodig.)
  10. 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 vorig karakter (altijd handig)
       lees karakter in
  11. Dat afdrukken gebeurt toch wel met een functie verwerkgetal (...)?
  12. Maak geregeld (elk kwartier) een backup van je C++-file, zo nu en dan onder een andere naam!
  13. Begin nu aan de tweede programmeeropgave; zie daartoe het vijfde werkcollege.
    ===============Voor verder oefenen ...========================
  14. Schrijf een functie char upcase (char letter) die, als letter een kleine letter is, de bijbehorende hoofdletter retourneert, en anders het oorspronkelijke karakter.
  15. Schrijf een functie die de alfabetisch eerste van twee gegeven kleine letters retourneert.
  16. Schrijf (uit je hoofd) een functie die de waardes van zijn integer argumenten (parameters) verwisselt. Denk aan het eventuele gebruik van &'s.
  17. 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
  18. Schrijf een functie die afdrukt de hoeveelste keer het is dat hij/zij wordt aangeroepen. Tip: gebruik een static variabele.
  19. 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.
  20. 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, stel deze dan (ook) op het college.