Programmeermethoden — Werkcollege 4 — Functies

Het vierde werkcollege van het vak Programmeermethoden vindt plaats in zaal 302/304, zaal 306/308 en zalen 307 en 309 (de PC-zalen; 307 en 309 zijn speciaal bestemd voor Wiskunde-studenten). Voor studenten Wiskunde of Informatica is dit werkcollege op dinsdag 22 september 2009, van 13.45 tot 15.30 uur, en voor studenten Natuurkunde of Sterrenkunde, en voor hen die een dubbele propedeuse WN of WA doen op donderdag 24 september 2009, van 11.15 tot 13.00 uur. Het wordt verzorgd door Ramon van Dam, Sjoerd Henstra, Ben Kwint en Jonathan Vis, onder leiding van Mattias Holm, MSc en drs. Tijn Witsenburg.

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 kun je overigens de functie uit Hoofdstuk 5.1.1 van het dictaat voor gebruiken, zie straks de tweede programmeeropgave).
    Nee, 1/2 plus 1/3 is niet gelijk aan 2/5.
    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 of math.h. Werkt het ook voor negatieve exponenten?
    Kies je voor een return-value of een call by reference parameter?
  5. Schrijf een functie char upcase (char letter) die, als letter een kleine letter is, de bijbehorende hoofdletter retourneert, en anders het oorspronkelijke karakter.
  6. Schrijf een functie die de alfabetisch eerste van twee gegeven kleine letters retourneert.
  7. Schrijf (uit je hoofd) een functie die de waardes van zijn integer argumenten (parameters) verwisselt. Denk aan het eventuele gebruik van &'s.
  8. 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
  9. 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.
  10. Schrijf een functie die afdrukt de hoeveelste keer het is dat hij/zij wordt aangeroepen. Tip: gebruik een static variabele.
  11. 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.
  12. Schrijf een functie die een getal in factoren ontbindt. Bijvoorbeeld: 84=2^2 x 3^1 x 7^1.
  13. (Opgave 19 uit de opgavenbundel, afkomstig van het tentamen van 5 januari 1998)
    Gegeven zijn de volgende functies (kopieer ze naar een eigen C++-file):
        int peter (int r, int s) {
         s--; return r+s+2; } // peter
        int ellen (int p, int q) {
         int a = 7; p++; q -= 2;
         for ( a = 2; a < q; a++ ) p = p + peter (p,q);
         cout << a << p << q << endl; return a+p+q; } // ellen
    1. Neem aan dat de waardes van de globale variabelen a en b, beide int, bij binnenkomst van de functie ellen 2 respectievelijk 6 zijn. Wat gebeurt er bij
          cout << ellen (a,b) << endl;
          cout << a << b << endl;
      Wat wordt er afgedrukt? Probeer duidelijke uitleg te geven.
    2. We voegen vier maal een & toe, en wel bij alle parameters in de headings van ellen en peter. Beantwoord opnieuw de vorige vraag.
    3. Vervang in de functie ellen het statement p = p + peter (p,q); door het statement p = p + peter (q,p);. Zet de vier &'s er weer bij, net als bij het vorige onderdeel. Leg uit waarom uiteindelijk de globale variabele a verschillende waarden kan hebben, en geef deze. Wat geeft je eigen C++-compiler?

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.


Werkcolleges (in zalen 302/304, 306/308, 307 en 309, of in "gewone" zalen)
1. UNIX 2. Eerste opgave I 3. Eerste opgave II 4. Functies
5. Tweede opgave I 6. Tweede opgave II 7. Op papier  
8. Pointerpracticum 9. Derde opgave 10. Derde/vierde opgave 11. Vierde opgave
12. Qt 13. Oude tentamens    


Vragen en/of opmerkingen kunnen worden gestuurd naar: kosters@liacs.nl.

14 september 2009 — http://www.liacs.nl/home/kosters/pm/pmwc4.html