C++ leren voor de informatica olympiade
  • šŸ’ƒIntro
  • Leer de basis van programmeren
    • 1. Programmeren, hoe te beginnen?
    • 2. Integer
    • 3. Keuze
    • 4. Herhalingen
    • šŸ‘“Code lezen
    • 5. String
    • 6. Boolean
  • Leer meer C++
    • 🪲Code debuggen - deel 1
    • 7. Array/vector
    • 8. Functies - deel 1
    • 9. 2D vector
    • 10. Functies - deel 2
  • šŸ’»C++ en Visual Studio Code
  • Leer competitief programmeren
    • 11. Meer data types
    • 12. Recursie
    • 13. Complete search
    • 14. Binair zoeken
    • 15. Grafen
    • 16. Dynamisch programmeren
  • Meer info over Girls@informatica olympiade.nl
    • Wie zijn wij?
    • Hoe ziet een cursusdag eruit?
    • Wat is de EGOI?
  • Wil je meedoen?
Powered by GitBook
On this page
  • Struct
  • Pair
  • Set
  • Map
  • Pointers
  1. Leer competitief programmeren

11. Meer data types

Struct

Met een struct kun je meerdere variabelen groeperen. Een groenteboer wil bijvoorbeeld eigenschappen van fruit vastleggen. Zij wil dan vastleggen wat voor soort fruit het is en wat de prijs is en het aantal dat aanwezig is in de winkel. Hiervoor kunnen we een struct gebruiken.

#include <iostream>
#include <string>
using namespace std;

int main() {
  
  struct struct_fruit {
    string soort;
    float prijs;
    int aantal;
  };

  struct_fruit fruit;

  fruit.soort = "Appel";
  fruit.prijs = 1.70;
  fruit.aantal = 10;

  cout << "Soort = " << fruit.soort << endl;
  cout << "Prijs = " << fruit.prijs << endl;
  cout << "Aantal = " << fruit.aantal << endl;
}

In bovenstaande code kan je maar 1 fruitsoort opslaan. Je kan meerdere variabelen van het type struct_fruit aanmaken maar mooier is het om een array te declareren van het type struct_fruit.

struct_fruit fruit[10];

Op deze manier kan je meerdere fruitsoorten opslaan. De eerste fruitsoort wordt dan:

fruit[0].soort = "Appel";
fruit[0].prijs = 1.70;
fruit[0].aantal = 10;

Opdracht 11.1 Bij een hardloopwedstrijd worden de namen van de deelnemers en het aantal minuten dat de deelnemers gerend hebben opgeslagen. Schrijf een programma dat met deze invoer berekent wat de naam was van de snelste renner. Gebruikt een struct om de namen en tijden op te slaan.

Pair

Een pair houdt precies twee waarden bij elkaar. Je krijgt de eerste waarde met de functie first en de tweede waarde met de functie second. De datatypes van de twee waardes kunnen verschillen.

Voorbeeld:

#include <bits/stdc++.h>
using namespace std;

int main() {
    pair<string, int> persoon = {"Emma", 21};
    cout << "Naam: " << persoon.first << endl;
    cout << "Leeftijd: " << persoon.second << " jaar" << endl;
    return 0;
}

Opdracht 11.2 Je zit op een eiland en hebt een kaart met daarop coƶrdinaten van een verborgen schat. Elke coƶrdinaat is een pair<int, int>, waarbij first de x-waarde en second de y-waarde is. Schrijf een programma dat de gebruiker vraagt om een x- en y-coƶrdinaat in te voeren. Het programma vergelijkt dit met de "schatlocatie" en geeft passende feedback:

  • Als het exact overeenkomt, toon: Je hebt de schat gevonden!

  • Als de x-waarde te klein is: Ga oostwaarts!

  • Als de x-waarde te groot is: Ga westwaarts!

  • Als de y-waarde te klein is: Ga noordwaarts!

  • Als de y-waarde te groot is: Ga zuidwaarts!

Set

Een set is een lijst waarin alle elementen uniek zijn en automatisch in gesorteerde volgorde worden bewaard (standaard in oplopende volgorde).

#include <bits/stdc++.h>
using namespace std;

int main() {
    set<int> getallen;

    getallen.insert(5);
    getallen.insert(3);
    getallen.insert(9);
    getallen.insert(5);  // Dubbel, wordt genegeerd

    for (int getal : getallen) {
        cout << getal << " ";
    }

    return 0;
}

Opdracht 11.3 Er is een lange gang in een school, met een lengte van x meter. De gang is genummerd van 0 tot en met x (waarbij elk punt een mogelijke positie is om een kluisje te plaatsen). In het begin staan er geen kluisjes in de gang, maar gedurende de dag worden er n kluisjes geplaatst op verschillende posities. Na elke plaatsing wil je weten wat de lengte is van het langste stuk gang zonder kluisjes. Invoer - De eerste regel bevat twee gehele getallen x en n: de lengte van de gang en het aantal te plaatsen kluisjes. - De tweede regel bevat n gehele getallen p₁, pā‚‚, …, pā‚™: de posities van de kluisjes. Elke positie is uniek . Uitvoer Na het plaatsen van elk kluisje druk je de lengte af van het langste aaneengesloten stuk gang zonder kluisjes. Voorbeeld invoer: 8 3 3 6 2 Voorbeeld uitvoer: 5 3 3

Map

In C++ is een map een datastructuur die wordt gebruikt om sleutel-waardeparen op te slaan, vergelijkbaar met een woordenboek.

Een paar belangrijke eigenschappen:

  • Elke sleutel (key) in een map is uniek.

  • De sleutels zijn automatisch gesorteerd (standaard in oplopende volgorde).

  • De map hoort bij de Standard Template Library (STL) van C++.

#include <iostream>
#include <map>
using namespace std;

int main() {
    map<string, int> leeftijd;

    leeftijd["Anna"] = 12;
    leeftijd["Sara"] = 16;

    for (auto pair : leeftijd) {
        cout << pair.first << ": " << pair.second << endl;
    }

    return 0;
}

Opdracht 11.4 Je krijgt een lijst met gehele getallen, en je moet de frequentie van elk getal in de lijst tellen. Daarna moet je elk getal en de bijbehorende frequentie in de lijst afdrukken. Invoer:

  • De eerste regel bevat een enkel getal n, het aantal elementen in de lijst.

  • De tweede regel bevat n spatie-gescheiden gehele getallen, de elementen in de lijst.

Uitvoer:

  • Print elk uniek getal uit de lijst samen met de bijbehorende frequentie. De uitvoer moet gesorteerd zijn op basis van de getallen.

Pointers

Pointers is een onderwerp dat lastiger is om te begrijpen. In dit hoofdstuk is een korte intro over pointers zodat jullie begrijpen wat een pointer is als je ze tegenkomt in een code. Een variabele is een naam die je geeft aan een plaats in het geheugen van je computer, zodat je daar gegevens op kunt slaan. De geheugenplaatsen hebben een adres, een uniek getal, om precies aan te geven waar in het geheugen de gegevens zich bevinden.

Je kunt zien wat het geheugenadres van een variabele is met de volgende code:

string dier = "Octopus"; // Een variabele met de naam dier krijgt de waarde Octupus
cout << dier;  // Deze code print de waarde van de variabele dus Octupus
cout << &dier; // Deze code print het geheugenadres van de variabele

Opdracht 11.5 Wat is het geheugenadres van de variabele dier?

Een pointer variabele bevat een geheugenadres. Door het adres op te geven, wijst een pointer naar een unieke plaats in het geheugen. Op die plaats staat de daadwerkelijke waarde.

Schematisch ziet dat er zo uit:

Een pointer declareer je door een * na het type van de variabele te zetten: string* dierPointer;

Dit kan je doen voor alle gegevenstypes, dus ook voor int , float etc. Als je een variabele hebt gedeclareerd dan heeft deze pointer nog geen waarde, ze wijzen dus nog nergens naar.

Een methode om een pointer variabele een waarde te geven is: dierPointer = &dier; nu wijst de pointer naar hetzelfde geheugenadres als de variabele dier, die de waarde Octopus heeft.

Opdracht 11.6 Wat is de uitvoer van onderstaand programma?

string dier = "Octopus";
string* dierPointer = &dier;
cout << dierPointer;

Bovenstaande code print het geheugenadres van de pointer, hier zijn we minder in geĆÆnteresseerd. We willen graag weten wat de waarde is van de variabele waar de pointer naar toe wijst. Dit kan met de code *dierPointer.

Opdracht 11.7 Wat is de uitvoer van onderstaand programma?

string dier = "Octopus";
string* dierPointer = &dier;
cout << *dierPointer;

Je kan de waarde van de variabele waar de pointer naar wijst ook aanpassen met de code: *dierPointer = "Zeekoe";

Opdracht 11.8 Wat is de uitvoer van onderstaand programma?

string dier = "Octopus";
string* dierPointer = &dier;
*dierPointer = "Zeekoe";
cout << dier;
PreviousC++ en Visual Studio CodeNext12. Recursie

Last updated 5 days ago