Labo Informatica II

2007-2008 [02]

Random, bool, lazy evaluation

In deze les wordt extra aandacht besteed aan :
  • het gebruik van constanten
  • de juiste naamgeving van variabelen (vooral bij logische variabelen is dit heel belangrijk)
  • het testen van een programma in alle aspecten
  • duplicated code : je code gemakkelijk aanpasbaar maken.

    1. Herneem oefening 3 van de eerste reeks, maar gebruik nu de rand() functie. Kan je dezelfde besluiten trekken ?

    2. Let op !! : in deze oefening gebruik je zoveel mogelijk logische variabelen ( type bool ) om informatie te onthouden. (Je kiest dus niet voor het alternatief om te "tellen". ) Om het programma goed leesbaar te maken kies je bovendien een duidelijke naam voor elke logische variabele.
      Opgave : als je met twee dobbelstenen gooit is de kans om twee gelijke dobbelstenen te werpen 1 op 6. Als je dus 6 keer gooit met twee dobbelstenen, dan verwacht je dat de situatie twee gelijke dobbelstenen voorkomt. Schrijf een programma waarbij de computer dit simuleert. De eenvoudigste oplossing hiervoor is dat je een tekst op het scherm schrijft telkens deze situatie zich voordoet. Dat is echter niet de bedoeling !!! Bepaal in het programma of de situatie twee gelijke dobbelstenen is voorgekomen, en schrijf , behalve de worpen, nog 1 eindbesluit op het scherm.
      Testen : bij het controleren van het programma ben je afhankelijk van de rand()-functie. Het is dan ook niet mogelijk om gericht te controleren of een specifieke situatie (bvb. de dobbelstenen zijn in de 6 beurten steeds verschillend) correct wordt afgehandeld . Deze situatie testen is veel eenvoudiger indien je zelf de waarden van de dobbelstenen kan intypen (inlezen). Pas het programma aan zodat je vooraf aan de gebruiker laat kiezen tussen twee mogelijkheden : de dobbelstenen inlezen of de dobbelstenen genereren. Gebruik voor het antwoord op deze vraag een string die "Ja" of "Nee" moet bevatten alvorens het programma verdergaat.
      Gebruik een logische variabele die het antwoord onthoudt en let erop dat er zo weinig mogelijk duplicated code is.

    3. Lees maximaal 200 gehele getallen in, het inlezen stopt als een 0 wordt ingelezen, of als er 200 getallen zijn. Gebruik zinvol een constante voor 200 zodat je dit eenvoudig en correct kan testen.
      Bepaal daarna of alle ingelezen getallen verschillend zijn en geef een gepast besluit. Aangezien je in deze opgave niet weet welke getallen er kunnen ingelezen worden is een frequentietabel niet de juiste oplossing !! Je mag de getallen ook niet ordenen !!
      Let op !! van zodra er een getal gedetecteerd wordt dat meer dan 1 keer voorkomt ken je het besluit, en is het niet zinvol dat er nog verder gecontroleerd wordt.

      Gebruik redirection om het intypen te beperken. Bij het runnen aan de prompt vraag je:

        naamprogramma.exe < rij1.txt
      

      Test je programma uit met het bestand rij1.txt.
      Lukt het ook met rij2.txt en rij3.txt ??

      Groepswerk (tweede labo)

    4. Priemgetallen : De zeef van Eratosthenes is een oude methode (circa 240 v.Chr.) om alle priemgetallen te bepalen kleiner dan een gegeven bovengrens. Deze methode is vooral efficiënt wanneer hij wordt gebruikt voor de kleinere priemgetallen, maar heeft als nadeel dat alle getallen kleiner dan de gewenste bovengrens moeten worden onthouden.

      Methode : Initialiseer een tabel met alle gehele getallen van 2 tot de bovengrens. Het kleinste priemgetal is 2. Je doorstreept nu in de tabel alle veelvouden van dit priemgetal. Nu herhaal je deze 2 stappen voor elk volgend kleinste priemgetal (een niet-doorgestreepte getal). Hoelang moet je dit herhalen ?
      Besluit : alle getallen die niet doorstreept werden zijn priemgetallen.

      Werk dit eerst zelf uit op onderstaande rij van getallen kleiner dan 30:

      2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
      Opgave : schrijf een programma dat deze techniek gebruikt om alle priemgetallen kleiner dan 1000 te bepalen. Hierbij moet je verplicht gebruik maken van een aanwezigheidstabel, dit is een tabel van het type 'bool'.
      Doordenkertje : probeer zo zuinig mogelijk te zijn met bewerkingen: welk (priem)getal is het laatste dat je moet gebruiken om nog nieuwe veelvouden te doorstrepen?

    5. Programmeer een spel Hoger/Lager waarbij de computer willekeurige kaarten trekt uit een boek met 52 kaarten. Gebruik constanten voor alles wat met het aantal kaarten te maken heeft (13 verschillende kaarten, 4 verschillende kleuren, 52 verschillende kaarten).
      Het spel : de eerste kaart wordt getoond en de speler moet intypen of de volgende kaart hoger of lager zal zijn dan de getoonde kaart. Er wordt (door de computer) een nieuwe kaart getrokken. Als de speler juist gegokt heeft gaat het spel verder anders stopt het spel. (Indien de volgende kaart dezelfde waarde heeft als de kaart die net getoond werd moet dit ook juist gerekend worden.) Bepaal hoeveel kaarten getrokken worden alvorens de speler fout gokt. Om het programma goed leesbaar te maken gebruik je zoveel mogelijk logische variabelen (bool) om informatie te onthouden - gebruik daarbij ook een duidelijke naam voor elke logische variabele.

      Stap 1 : het maakt niet uit dat een kaart meerdere keren getrokken wordt.

      Stap 2 : je mag elke kaart maar 1 keer trekken. Indien de speler de 52 kaarten correct kan gokken is hij gewonnen !!

      Opmerking : om het programma te kunnen testen pas je de constanten aan. Een alternatief is om dezelfde methode als in de tweede oefening te gebruiken. De situatie "de speler is gewonnen en heeft alle kaarten dus juist geraden", kan je anders heel moeilijk testen.