C++ Slumptalsfunktioner + switch-satsen



Relevanta dokument
C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

C++ Lektion Tecken och teckenfält

TDIU01 - Programmering i C++, grundkurs

Programexempel: tärningsspel. Programexempel: tärningsspel Kasta tärning tills etta. Klassen Die Specifikation. Slumptalsgenerator Klassen Random

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

OBS! All teori i detta och följande dokument kompletteras med genomgångar på lektionerna. Så det är viktigt att närvara och göra egna anteckningar.

Programmeringsteknik med C och Matlab

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

TDIU01 - Programmering i C++, grundkurs

Programmering i C, 7,5 hp

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

TDIU01 - Programmering i C++, grundkurs

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

Enkla datatyper minne

L04.1 Marodören. Inledning. Mål. Genomförande. Uppgift 1 Hello World. Moment I

JavaScript del 5 Funktioner

Tentamen på kursen DA7351, Programmering , kl Malmö högskola Teknik och samhälle. DA7351, Programmering

Skizz till en enkel databas

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Nu till dagens ämne: Vi rekapitulerar det första problemet ur ProblemI:

Datorövningar. Grunderna i C/C++

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 20

Komponenter med COM (och COM+/VC++ 7.0)

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera

Variabler och konstanter

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010

6.5 Spelserien Gissa tal

Föreläsning 3-4 Innehåll

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

TENTAMEN MOM1 GRUNDLÄGGANDE PROGRAMMERINGSTEKNIK OCH

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Funktionens deklaration

Repetera snabbt vad du lärde dig förra veckan. Du är nu redo att kasta dig in i nästa fas, teorin om villkor.

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

Agenda. Objektorienterad programmering Föreläsning 13

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Introduktionslaboration

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

C++ - En introduktion

Tentamen EDAF30 Programmering i C++

[] Arrayer = Indexerad variabel

TDIU01 (725G67) - Programmering i C++, grundkurs

HI1024 Programmering, grundkurs TEN

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

Introduktion till algoritmer - L0 - Grunder i C++ Matematikgymnasiet, Läsåret L0 - Grunder i C++

Arrays (indicerade variabler) Föreläsning 6

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Programmeringsuppgifter 1

JavaScript. Innehåll. Historia. Document object model DHTML. Varför Javascript?

En kort text om programmering i C.

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4

Enkla uppgifter. Uppgift 1. Uppgift 2

Tentamen OOP

DD1311 Programmeringsteknik för S1 Laborationer läsåret

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Modul 3 - Modularisering

Föreläsning 1: Momstabellen i C++

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

*Pekarvärden *Pekarvariabler & *

F4. programmeringsteknik och Matlab

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Blandat. Föreläsning 5

HI1024 Programmering, grundkurs TEN

Övning från förra gången: readword

Objektorientering i liten skala

översiktskurs (5DV031)

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

TDIU01 Programmering i C++

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Diagnostiskt Prov. Antaganden Om förutsättningar saknas I en uppgift skall rimliga antaganden göras och nedtecknas.

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera

Planering Programmering grundkurs HI1024 HT data

Övning 4. Arv och andra relationer

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

TUTORIAL: SAMLING & KONSOLL

C++ Objektorientering - Klasser. Eric Elfving

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

FÖRSLAG TILL LÖSNING AV Tentamen i Objektorienterad programmering C++ I

Introduktionslaboration

Arrays (indicerade variabler) Föreläsning 4

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Användarhandledning Version 1.2

OOP Objekt-orienterad programmering

Objektorienterad programmering Föreläsning 2

Klassdeklaration. Metoddeklaration. Parameteröverföring

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

TDDC76 - Programmering och Datastrukturer

HI1024 Programmering, grundkurs TEN

Transkript:

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. Sida 1(6)

Ex.1: //Program som skriver ut 100 slumptal mellan 1 och 100 på skärmen. //# include <stdlib.h> //Tages med ifall det behövs. 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 ) //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. Ex.2: #include <iostream> //#include <stdlib.h> //#include <time.h> #include <iomanip> int 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; return 0; Sida 2(6)

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 <stdlib.h> 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; Sida 3(6)

Ex.4: //Program som visar "fall through" i en switch-sats //# include <stdlib.h> 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; Ex.5: //Program som visar "fall through" i en switch-sats //# include <stdlib.h> 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; Sida 4(6)

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. Sida 5(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 Sida 6(6)