10. Functies - deel 2
In het hoofdstuk Functies - deel 1 heb je over parameters geleerd. Bij een functie zijn er 2 soorten parameters:
Call by value: een kopie van de variabele wordt als parameter doorgegeven. Dit betekent dat als de variabele in de functie van waarde veranderd, de originele variabele nog steeds dezelfde waarde heeft.
Call by reference: de variabele zelf wordt als parameter doorgegeven. Dit betekent dat als de variabele in de functie van waarde veranderd, de originele variabele ook van waarde is veranderd. Met een & teken voor de parameter geef je aan dat dit een call by reference variabele is.
Voorbeeld van call by value:
#include <iostream> 
using namespace std;
void hoogOp (int getal_in_functie){
    getal_in_functie++; //Lokaal in de functie wordt de waarde van getal 1
}
int main(){
  int getal = 0; //De variabele getal wordt gedeclareerd met de waarde 0
  hoogOp(getal);
  cout << "Waarde van getal = " << getal; //De waarde in de main is niet opgehoogd 
                                          //en er zal dus 0 geprint worden
  return 0;              
}Voorbeeld van call by reference:
#include <iostream> 
using namespace std;
void hoogOp (int &getal_in_functie){
    getal_in_functie ++; //In dit geval is getal een kopie van getal uit de main 
                         //en dus worden beide nu opgehoogd met 1
}
int main(){
  int getal = 0; //De variabele getal wordt gedeclareerd met de waarde 0
  hoogOp(getal);
  cout << "Waarde van getal = " << getal; //Er wordt nu 1 geprint
  return 0;   
}Opdracht 10.1 Probeer beide voorbeelden uit. Wat is het verschil tussen de 2 voorbeelden?
Een vector kun je ook call-by-value en call-by-reference aan een functie doorgeven:
void func(vector<int> vect) //call-by-value
void func(vector<int> &vect) //call-by-reference
Opdracht 10.2 Maak de opdracht: vectors. Schrijf nette code door gebruik te maken van functies.
Built-in functies
C++ bevat nuttige functies die je kan gebruiken. Bijvoorbeeld:
- min: geeft de kleinste van 2 getallen
- max: geeft de grootste van 2 getallen
- swap: hiermee kun je de waardes van 2 variabelen omwisselen
- sqrt: berekent de wortel. Deze kot
- pow: berekent de macht
- ceil: naar boven afronden
- floor: naar beneden afronden
- sort: sorteert de waardes in een array
Voor sommige functies moet je wel een extra library toevoegen aan je code. Bijvoorbeeld:
#include <iostream>     
#include <string>    
#include <vector>
#include <algorithm>    
#include <cmath>Op de pagina https://en.cppreference.com/w/cpp/header kun je een reference vinden van alle libraries. Als je bijvoorbeeld de library <cmath> selecteert dan kan je alle built-in functies zien van deze library.
Opdracht 10.3 Bepaal de kleinste van 3 getallen met de functie min. Kijk op de reference pagina hoe je de functie min kan gebruiken.
Opdracht 10.4
Schrijf een programma dat de cijfers in onderstaande vector sorteert. Maak gebruik van de functie sort.  Kijk op de reference pagina hoe je de functie sort kan gebruiken.
vector cijfers = { 5, 4, 9, 12, 8, 7, 13, 15, 4, 2, 1, 0, 4, 2, 5, 0, 4, 2, 10, 5, 20, 1, 7, 23, 16};
Samenvatting - nuttige functies voor een vector
int main() {
    vector<int> v; 
    /*
        Nuttige functies voor een VECTOR
        1) .assign()
        2) .size()
        3) .push_back()
        4) .front() & .back()
        5) .clear()
        6) reverse()
        7) sort()
        8) find()
        9) .erase()
        10) .lower_bound() & .upper_bound()
    */
    // .assign(grootte, waarde)
    v.assign(5, 1); // v = {1, 1, 1, 1, 1}
    // .size() => grootte van de vector
    cout << v.size() << '\n'; // output: 5
    // .push_back() => waarde toevoegen las laatste element
    v.push_back(4); // v = {1, 1, 1, 1, 1, 4}
    // .front() en .back() => eerste en laatste element
    cout << v.front() << '\n'; // eerste element; output: 1
    cout << v.back() << '\n'; // laatste element; output: 4
    v.clear(); // verwijdert alle elementen in v, dus v = {}
    v = {5, 9, 1, 3, 6, 6, 9, 18}; 
    // reverse => vector omkeren
    reverse(v.begin(), v.end()); // v = {18, 9, 6, 6, 3, 1, 9, 5}
    // sort => sorteer de elementen in OPLOPENDE volgorde
    sort(v.begin(), v.end()); // v = {1, 3, 5, 6, 6, 9, 9, 18}
    // sorteer de elementen in AFLOPENDE volgorde
    sort(v.begin(), v.end(), greater<int>()); // v = {18, 9, 9, 6, 6, 5, 3, 1}
    // find => geeft een iterator die wijst naar het element die je wil vinden
    // als het element er niet is, dan geeft die de .end() iterator
    // als het element meerdere keren in de vector zit, wijst de iterator de eerste aan
    auto it = find(v.begin(), v.end(), 6); // 6 zoeken in v
    if (it == v.end()) {
        cout << "6 zit niet in vector v!" << '\n';
    } else {
        cout << "Element 6 gevonden!" << '\n';
        // index vinden met de iterator:
        cout << "De eerste 6 zit op positie " << it - v.begin() << '\n'; // output: De eerste 6 zit op positie 3
    }
    // .erase() verwijdert de element met een iterator 
    v.erase(it); // de eerste 6 is nu verwijderd; v = {18, 9, 9, 6, 5, 3, 1}
    v.erase(find(v.begin(), v.end(), 9)); // verwijder de eerste 9 in v; v = {18, 9, 6, 5, 3, 1}
    sort(v.begin(), v.end()); // v = {1, 3, 5, 6, 9, 18}
    // voor gebruik van lower_bound en upper_bound upper_bound moest de vector eerst gesorteerd worden!
    it = lower_bound(v.begin(), v.end(), 6); // geeft een iterator die wijst naar het eerste element dat GELIJK IS AAN of GROTER IS DAN 6
    cout << "De eerste element gelijk aan of groter dan 6 is " << *it << '\n'; // output: 6
    it = upper_bound(v.begin(), v.end(), 6); // geeft een iterator die wijs naar het eerste element dat GROTER DAN 6 is
    cout << "De eerste element groter dan 6 is " << *it << '\n'; // output: 9
    
    // als er niks is gevonden, geven de functies de .end() iterator, bijv.
    it = upper_bound(v.begin(), v.end(), 18);
    if (it == v.end()) cout << "Geen getal boven de 18 gevonden!\n"; // output: Geen getal boven de 18 gevonden!
    
    return 0;
}Last updated