Beslissingen…


Ons vierde programma is enigszins statistisch georiënteerd. Maak u geen zorgen, we gaan gewoon een gemiddelde berekenen. We beperken ons tot een gemiddelde van positieve gehele getallen. U kent het wel, neem ik aan.

Er zijn 2 mogelijke uitkomsten. Ofwel geeft men geen cijfers in, ofwel doet men dat wel. Hieronder de uitvoer in de twee gevallen.

Geen getallen ingegeven.

Geen getallen ingegeven.

Getallen ingegeven.

Getallen ingegeven.

De code is als volgt:

Het programma dat gemiddelden berekend.

Het programma dat gemiddelden berekend.

Een belangrijk gegeven bij dit soort programma’s is dat de programmeur niet kan weten hoeveel getallen men wil ingeven. Men kan een gemiddelde willen berekenen van 5 getallen, maar netzogoed één van 100 getallen. Er moet dus een manier zijn voor de gebruiker om aan te geven dat alle gegevens ingevoerd zijn, en dat de berekening mag starten. In ons geval gebruiken we daarvoor het getal -1. De ingave van -1 is dus een stopconditie.

Op de lijnen 8, 9 en 10 definiëren we onze variabelen, en initialiseren we ze. Als we dat laatste niet doen staat daar iets willekeurig in, en dat zou in dit geval zeker tot fouten leiden. De variabele som definiëren we als double, omdat we een double als gemiddelde willen. Moest dit ook een integer zijn, dan zou ons gemiddelde altijd afgekapt worden tot een geheel getal, en dat is duidelijk fout (probeer het maar eens , maak van som een integer in plaats van een double, en bereken dan het gemiddelde van 1 en 2).

Bemerk dat lijn 12 eigenlijk verderloopt op lijn 13. Zolang de computer geen “;” tegenkomt is alles deel van dezelfde instructie. U zou ook een paar keer op ENTER kunnen drukken zodat er nog wat witregels tussen 12 en 13 zitten, dat maakt geen enkel verschil (probeer maar eens). Toch niet voor de computer. Misschien wel voor u, naar leesbaarheid van het programma toe.

Op lijn 16 zien we iets nieuws: cin >> invoer. Deze lijn zorgt ervoor dat de invoerstroom (wat u intypt) doorgegeven wordt aan de variabele invoer. Omdat invoer van het type integer is, wordt enkel integer invoer toegelaten. De ENTER die u indrukt blijft in de invoerstroom zitten (ENTER is voor de computer ook gewoon een code, net zoals cijfers en letters dat zijn, en dat teken blijft dus steken in de stroom). Moest u iets anders ingeven dan een geheel getal, dus letters of een decimaal getal, dan slaat het programma tilt. Voor de nieuwsgierigen onder u: CTRL + C samen indrukken stopt de waanzin. 🙂

Er zijn natuurlijk manieren om dit op te vangen, daarover later meer.

Op lijn 18 start een while blok, dat controleert of de gebruiker geen -1 ingegeven heeft (het teken != staat voor “niet gelijk aan”). Indien dus invoer niet gelijk is aan -1, dan wordt het while blok (tussen {}) uitgevoerd. Op lijn 20 tellen we 1 bij bij aantal, en op lijn 21 tellen we de waarde van invoer op bij die van som, en steken het resultaat terug in som. Lijn 23 behoeft intussen geen uitleg meer en lijn 24 is een nieuwe invoer. Daarmee gaan we terug naar lijn 18, waar gekeken wordt of invoer al dan niet -1 is. Indien niet, doen we alles nog eens over, indien wel, dan is dat het einde van het while blok en gaan we over naar de volgende instructie.

Lijn 27 spreekt ook voor zich, neem ik aan.

Op lijn 30 komen we voor het eerst de if instructie tegen. If is engels voor als, dus daar staat in woorden iets als: als aantal precies (==) gelijk is aan 0, doe dan het codeblok dat volgt. De variabele aantal is alleen 0 als er geen ingaves geweest zijn, dus als de gebruiker direct -1 heeft ingegeven. De instructie if kan echter uitgebreid worden met else. Anders dus. Als aan de voorwaarde niet voldaan is (aantal is niet nul), dan wordt het codeblok na de else uitgevoerd. In dat geval kunnen we een gemiddelde berekenen, en dat doen we dan ook. Bemerk dat we de berekening direct in de uitvoerstroom (de cout) doen. We hadden natuurlijk ook een double resultaat kunnen definiëren en het resultaat daarin steken, en dat dan laten afdrukken. Als we dat resultaat verder nog nodig hebben in ons programma is dat zelfs een beter idee, omdat we de berekening dan maar éénmaal moeten doen.

De extra cin.get() op lijn 30 dient om de ENTER op te vangen die nog in de inputstroom zat. Zet hem maar even in comentaar en dan ziet u wel wat ik bedoel (de linuxgebruikers zullen dat niet zien als ze niet zeer aandachtig zijn :-)).

Tips

  • Typ het programma over. Dit helpt om de commando’s te leren, en je zult ze dan ook sneller onthouden.
  • Als het programma niet wil compileren, kijk na of je alles precies hebt overgetypt, en kijk vooral na of je nergens een puntkomma vergeten bent.
  • Maak u vooral geen zorgen als u niet alles direct begrijpt, dat komt wel. Als het echt niet gaat, schrijf u in op het forum en stel uw vraag daar.
  • Probeer zelf dingen uit. Verander hier en daar iets, en zie wat het doet. Doet het wat u dacht dat het ging doen, of net niet? Probeer in dat laatste geval te achterhalen waarom niet. Wees niet bang om te ewperimenteren!

U kunt de code hier downloaden.

Vragen kunnen gesteld worden op het forum – op het C++ board.

Opdracht

  • Maak een nieuw project aan, met daarin een file “main”. Noem het “project_1.4”.
  • Typ het programma over en compileer.
  • Probeer het eens te schrijven met een do-while lus in plaats van een while lus. Dat spaart u aan de ene kant misschien en paar regels code, maar aan de andere kant zult u iets moeten bedenken in verband met het aantal ingegeven waardes.
Advertisements

About justtheengineer

Ingenious engineer, slightly dotty...
This entry was posted in Cursus and tagged , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s