• No results found

C++ Slumptalsfunktioner + switch-satsen

N/A
N/A
Protected

Academic year: 2021

Share "C++ Slumptalsfunktioner + switch-satsen"

Copied!
6
0
0

Loading.... (view fulltext now)

Full text

(1)

C++ Slumptalsfunktioner + switch-satsen

Veckans avsnitt består av ett antal lite udda funktioner man kan ha nytta av när man skriver program. Det är en slumptalsgenerator och lite annat smått och gott. Dessutom ska du titta på ett alternativ till väldigt många else if i if-satser, nämligen switch-funktionen.

Teori Slumptal

Här följer en lista över några funktioner. Överst står vilken/vilka filer som måste inkluderas i din kod för att kompilatorn ska hitta funktionen, underst står funktionsdeklarationen (returtyp, namn, parametrar).

Kommentar: I vårt fall så behövs inte <stdlib.h> inkluderas utan det följer med automatiskt (förhoppningsvis!!).

rand

Slumptalsgenerator, som returnerar ett slumptal mellan 0 och 32767. Det returnerade slumptalet är heltal.

#include <stdlib.h>

int rand( void );

Funktionen rand returnerar ett slumptal som är ett heltal i intervallet 0 till RAND_MAX (=32767).

Använd srand funktionen för att få slumptalsgeneratorn att generera nya slumptalsserier vid varje start av programmet, innan du anropar rand.

(Av någon anledning blir det första slumptalet återkommande gång efter gång, kasta bort det i dina övningar för att få en korrekt slumptalsgenerering.)

Ex.:

//För att få ett heltalsslumptal mellan 0 och 99 int tal1;

tal1=(int)(rand()/32767.01*100); //( (int) framför uttrycket ”typar” om uttrycket till ett heltal ) rand() slumpar ut ett heltal mellan 0 och 32767.

rand ()/32767.01 gör slumptalet till ett decimaltal mellan 0,0 och 0,9999 rand()/32767.01*100 gör slumptalet till ett decimaltal mellan 0,0 och 99,99

(int)(rand()/32767.01*100 ”typar” om uttrycket till ett heltal, dvs ett heltal mellan 0 och 99 srand

Sätter en slumpmässig startpunkt för slumptalsgeneratorn. Anropas lämpligen innan man första gången anropar random-funktionen.

#include <stdlib.h>

void srand( unsigned int seed );

srand-funktionen sätter startpunkten för genereringen av slumptal (heltal). För att grundlägesinitiera generatorn använd 1 som "seed"-argument. Alla andra värden som används som "seed"-argument sätter generatorn på en slumpmässig startpunkt.

Att ropa rand innan srand används ger samma sekvens av slumptal, samt samma som erhålls om "seed"- argument i srand() är satt till 1 .

(2)

C++ Slumptal + switch.doc

Sida 2(6)

Ex.1:

//Program som skriver ut 100 slumptal mellan 1 och 100 på skärmen.

# include <iostream>

# include <iomanip>

//# include <stdlib.h> //Tages med ifall det behövs.

using namespace std;

main() {

int tal1, i;

srand (time(0)); //Skapa en ny följd av slumptal

tal1=rand(); // Läs bort det första i slumptalsföljden som är samma varje gång annars (BUGG!!!)

for (i=1; i<101; i++) //en loop med 100 steg {

tal1=(int)(rand()/32767.01*100); //( (int) framför uttrycket ”typar” om uttrycket till ett heltal ) if ( (i-1)%10 == 0 ) cout<<endl; //radbrytning efter var 10:e slumptal

cout << setw(5) << tal1+1; //Eftersom tal1 är mellan 0 och 99 lägger vi på 1, så får vi 1-100.

}

cout<<endl;

system("PAUSE");

}

Ex.2:

#include <iostream>

//#include <stdlib.h>

//#include <time.h>

#include <iomanip>

using namespace std;

int main() {

int test[101],min=100000,max=-10000000,slump,nr;

for (nr=0;nr<=100;nr++) test[nr]=0;

srand( (unsigned)time( NULL ) );

rand();

for (nr=1;nr<=10000000;nr++) {

slump = (int)(rand()/32767.01*100);

// utskriften på nästa rad , visas vid testning och vid ett färre antal tal som ska slumpas // annars tar körningen alldeles för lång tid

// cout << slump << endl;

if(slump<min) min=slump;

if(slump>max) max=slump;

test[slump]++;

}

cout << "min = " << min << " max = " << max << endl;

for (nr=0;nr<=100;nr++) {

cout << setw(6)<< "nr " << setw(2)<< nr << "="<< setw(7)<< test[nr];

if (nr%4==0)

cout << endl;

}

system("PAUSE");

return 0;

}

(3)

Teori switch-satsen

Ibland när vi använder if-satsen blir det många if och else if satser. Det fungerar men ser inte speciellt effektivt ut. För dessa fall har C++ en konstruktion som är mycket praktisk då man vill välja en av flera olika alternativ. Om vi t.ex. har en meny där användaren kan välja alternativen 1, 2, 3, 4 eller 5 kan vi lösa det hela if och else if, men det är ganska klumpigt. Här kan man använda switch-satsen istället.

En switch-sats börjar med switch och inom parentes en variabel som ska analyseras m h a case-satser, se exempel nedan.

Koden i en case-kropp är speciell på det viset att man inte behöver gruppera koden i block. Satser utförs nedåt ända tills slutet av switch-satsen nåtts, eller att break påträffas.

Switch använder sig av en ganska praktisk funktionalitet som kallas fall through. Det betyder att så fort som en case-test är sann kommer dess sats(er) att utföras. Exekveringen kommer dock efter att case-kroppen utförts att direkt fortsätta med kroppen för nästa case-sats, d.v.s. exekveringen "faller igenom", se exempel 2 och 3 nedan. För att stoppa detta fenomen kan man använda sig av break. Denna stoppar exekveringen av switch-konstruktionen direkt och fortsätter på satsen efter själv switch-blocket.

Ex.3:

//Program som visar likheten mellan många if-satser och switch

# include <iostream>

# include <iomanip>

//# include <stdlib.h>

using namespace std;

main() {

char val;// läs ett menyval från tangentbordet cout << "Välj ett tal mellan 1 och 5 :";

cin >> val;

cout<< endl << endl;

if (val=='1') cout << "Du valde 1" << endl;

else if (val=='2') cout << "Du valde 2" << endl;

else if (val=='3') cout << "Du valde 3" << endl;

else if (val=='4') cout << "Du valde 4" << endl;

else if (val=='5') cout << "Du valde 5" << endl;

else cout << "Fel val!" << endl;

switch ( val ) {

case '1' : cout << "Du valde 1" << endl; break;

case '2' : cout << "Du valde 2" << endl; break;

case '3' : cout << "Du valde 3" << endl; break;

case '4' : cout << "Du valde 4" << endl; break;

case '5' : cout << "Du valde 5" << endl; break;

default : cout << "Fel val!" << endl;

}

cout<<endl;

system("PAUSE");

}

(4)

C++ Slumptal + switch.doc

Sida 4(6)

Ex.4:

//Program som visar "fall through" i en switch-sats

# include <iostream>

# include <iomanip>

//# include <stdlib.h>

using namespace std;

main() {

char val;

cout << "Välj ett tal mellan 1 och 5 :";

cin >> val;

cout<< endl << endl;

switch ( val ) {

case '1' : cout << "Du valde 1" << endl;

case '2' : cout << "Du valde 2" << endl;

case '3' : cout << "Du valde 3" << endl; break;

case '4' :

case '5' : cout << "Du valde 4 eller 5" << endl; break;

default : cout << "Fel val!" << endl;

}

cout<<endl;

system("PAUSE");

}

Ex.5:

//Program som visar "fall through" i en switch-sats

# include <iostream>

# include <iomanip>

//# include <stdlib.h>

using namespace std;

main() {

char val;

int tal1, tal2;

cout << "Läs in två heltal:";

cin >> tal1 >> tal2;

cout << "Skriv A för att addera och M för att multiplicera talen";

cin >> val;

cout<< endl << endl;

switch ( val ) { case 'A':

case 'a': cout<< tal1+tal2 << endl;

// här kan läggas flera rader kod break;

case 'M':

case 'm': cout<< tal1*tal2 << endl;

break;

default : cout << "Felaktigt val!" << endl;

}

cout<<endl;

system("PAUSE");

}

(5)

Läs

Läs kapitel 6 på ”C++-manual på Internet” (se länk v 34), som handlar om switch-funktionen. Den är ett alternativ till långa if-sekvenser.

Öva Övning 1

Skriv en funktion som simulerar ett tärningsslag. Funktionen ska returnera ett heltal mellan 1-6 och ska alltså ha följande utseende:

int dice () {

//…någon kod som returnerar ett tal mellan 1-6 }

Testa funktionen genom att skriva ett huvudprogram som anropar funktionen och sedan skriver ut resultatet.

Övning 2

Skriv ett huvudprogram som slår 500 tärningsslag (utnyttja funktionen från förra övningen) och håller räkningen hur många slag av varje sort som man har fått. När de 500 slagen gjorts, ska programmet skriva ut antalet ettor, tvåor, treor o.s.v.

Övning 3

Skriv en funktion som slumpar ut ett heltal mellan 1-13, skriv ytterliggare en funktion som tar 3 värden som indata och som skriver ut om det blir ”par” eller ”triss”. Skriv ett huvudprogram som utnyttjar dessa två funktioner.

Övning 4

Skriv ett program för att gissa ett tal mellan 0 och 100. Jämförelsen av det slumpade talet och ditt gissade ska utföras i en separat funktion. T ex så returnerar funktionen en 1 om det gissade talet är för stort, -1 om det är för litet och 0 om det är rätt gissat. Skriv dessutom efter varje gissning ut ”antalet gissningar hittills”.

Övning 5

Bygg ihop 3 av de tidigare övningarna till ett program, skapa en meny där man kan välja vilket man vill köra och utnyttja switch-satsen. Se även till att man kan fortsätta köra tills man i menyn väljer ”avsluta”.

(6)

C++ Slumptal + switch.doc

Sida 6(6)

Övning 6

Skriv ett program där datorn spelar 21 mot dig. Spelet ska fungera på följande sätt:

Datorn ska dra kort från en kortlek, där korten kan ha värdena 2-11 (vi räknar alla ess som 11 för

enkelhetens skull). Datorn ska först dra ett kort till dig och ett till sig själv, och sedan ska du få frågan om du vill ha ett kort till. Spelet ska sedan fortsätta tills du

• antingen får 21 (då har du vunnit)

• väljer att stanna och inte ta flera kort

• blir tjock (får 22 eller mer). Blir du tjock har du förlorat.

Om du stannar ska datorn börja dra sina kort ett i taget, antingen tills den blir tjock eller tills den fått mellan 17 och 21, då den måste stanna. Om den stannar ska ni jämföra era summor, högst vinner. Om det är lika vinner banken (datorn).

Resultatet av spelet (vem som vann och varför) ska skrivas ut på skärmen, och man ska sedan få välja om man vill starta ett nytt spel.

På skärmen ska hela tiden skrivas ut den aktuella summan för bägge spelare, och man ska även kunna se värdet av det senaste kortet spelaren drog. Kortens värden ska slumpas fram m.h.a. random-funktionen.

Minitest G-nivå:

1. Skriv koden för att slumpa ut ett tal mellan 1 och 35?

VG-nivå:

1. Skriv en funktion som tar 3 parametrar talspruta(antal, start, slut) . T ex med anropet

talspruta(100, 20, 60) ska den slumpa ut 100 tal mellan 20 och 60, samt skriva ut det på ett snyggt och överskådligt sätt (t ex 10 på varje rad). Skriv också ett program som utnyttjar din funktion och så att allt fungerar.

Läxa

G-nivå: de 4 första övningarna VG-nivå: även övning 5 MVG: alla

References

Related documents

Under vattnet påverkas föremål av vatten- trycket som inte bara kommer ovanifrån utan från alla håll.. Vattentrycket beror aldrig på ett föremåls form utan enbart på

Om du flyttar linjalen fram och tillbaka kan du skapa ljud som är både olika höga och olika starka.. Om du tänker dig rörelsen i slow motion inser du att molekylerna i luften

Det be- ror på att hjärnan inte tar hänsyn till ljusbryt- ningen utan tänker att ljuset färdas längs en rät linje mellan föremålet och ögat.. För att se föremålet behöver

Detta innebär att föremål inte kan ändra sin hastighet själv, utan det behövs alltid en kraft för att sätta föremål i rörelse, bromsa det eller få det att ändra

Om denna kedjereaktion får fortsätta bildas till slut extremt mycket ljus, värme och joniserande strålning. En atombomb är en kedjereaktion som

Värmen driver sedan en turbin som med hjälp av en generator omvandlar rörelseenergin till elektrisk

Venus är ungefär lika stor som jorden men har en atmosfär av koldioxid vilket gör att det inte är så trevligt att vara där.. Dess- utom är det 450

Installera Anaconda Python.. Vi ska bygga ett litet program, RIDER, som ska gissa vilket nummer som du tänker på. Reglerna är att du tänker på ett heltal mellan 1 och 100.