Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13...

27
DAVA07 Modul 2 - Byggstenar Programmeringsteknik Maria Green Page 1 20/08/03 Modul 2 – Byggstenar PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4 Byggstenar 4 Nyckelord 4 Tecken 4 Syntax 5 Standardbibliotek 5 Vårt första program 5 Variabler 6 Konstanter 9 Operatorer 9 Övningar 9 Mer operatorer 10 Teckenuppsättningar 11 Fler program 12 Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn 21 Iteration 21 While 22 Övningar 24 Do/while 24 for 26 Övningar 27

Transcript of Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13...

Page 1: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 1 20/08/03

Modul 2 – Byggstenar

PROGRAMMERING 2

GRUNDLÄGGANDE SEMANTIK 4

Byggstenar 4 Nyckelord 4 Tecken 4 Syntax 5 Standardbibliotek 5 Vårt första program 5 Variabler 6 Konstanter 9 Operatorer 9 Övningar 9 Mer operatorer 10

Teckenuppsättningar 11

Fler program 12 Övningar 13

Kontrollstrukturer 13

Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn 21

Iteration 21 While 22 Övningar 24 Do/while 24 for 26 Övningar 27

Page 2: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 2 20/08/03

Programmering

I första modulen sysslade vi med problemlösning och vi lärde oss olika sätt att beskriva våra lösningar. Nu är det dags att börja titta på hur man kan implementera sina lösningar så att det blir dataprogram av dem. Vi ska i den här modulen lära de grundläggande byggstenarna i C++ så att vi kan skriva enklare program i C++ och köra dem. Vad är då programmering? Vi har ju diskuterat kaffebryggning en del. I det enklaste fallet sa vi att brygga kaffe innefattar tre steg: 1. Mät upp vatten 2. Mät upp kaffe 3. Tryck på knappen Tänk dig nu att du skulle beskriva samma sak för en kines som endast pratar kinesiska, hur gör du då? Använder en tolk! Du pratar med tolken som översätter dina instruktioner till kinesen.

På samma sätt måste du använda en tolk när du pratar med en dator för han förstår inte svenska utan han talar maskinspråk. Denna tolk heter kompilator och den översätter dina instruktioner till maskinspråk.

Du

Maskinspråk

Tolken Datorn

Kompilatorn

Du Tolken Kinesen

Svenska Kinesiska

Page 3: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 3 20/08/03

Problemet med den här tolken är att den inte heller förstår vanlig svenska. Om vi tänker oss fallet där vi pratar med kinesen igen och tänker oss att tolken inte pratar svenska utan bara engelska och kinesiska. Vi har ju lärt oss att prata engelska och då kan vi kommunicera med tolken som sedan kan översätta till kinesen.

På samma sätt måste vi nu lära oss ett nytt språk för att kunna kommunicera med tolken som ska prata med datorn. Den typ av språk vi måste lära oss kallas för programmeringsspråk och det specifika programmeringsspråk vi ska lära oss i den här kursen heter C++. (Ni har säkert hört talas om andra programmeringsspråk också som t ex Java, Prolog, Pascal)

Alla programmeringsspråk består av vissa byggstenar, vilka det är kan vara lite olika i olika typer av språk men här ska vi prata om hur C++ är uppbyggt.

Du

C++ Maskinspråk Kompilatorn

Tolken

Datorn

Du Tolken Kinesen

Svenska Kinesiska

Engelska

Page 4: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 4 20/08/03

Grundläggande semantik

Byggstenar

C++ består av ett antal byggstenar: • Nyckelord • Tecken • Syntax • Variabler • Konstanter • Operatorer

Vi kommer att gå igenom dessa i tur och ordning.

Nyckelord Vår tolk som ska tolka mellan engelska och kinesiska förstår inte allt man kan säga på engelska, han är t ex inte så bra på slang och dialekter. Faktiskt så har han ett begränsat ordförråd och om man använder något ord som han inte känner till säger han bara ”Jag förstår inte det ordet”. På samma sätt måste man använda en viss uppsättning av ord när man pratar med kompilatorn. Dessa ord kallas för nyckelord (keywords) och är ord som är reserverade för att använda när man pratar med kompilatorn. Varje ord har en speciell betydelse som ni kommer att lära er under kursens gång. Ex på nyckelord är if, delete, return, new. En sammanställning av alla nyckelord finns i Deitel & Deitel Fig. 2.2.

Tecken För att återigen gå tillbaks till vår kinesiske tolk så är han också väldigt känslig när han ska översätta skrivet material. Om vi skriver: Hello i am going to the beach do you want to come så förstår han inte det utan vi måste sätta ut punkter odyl Hello! I am going to the beach. Do you want to come? På samma sätt måste man använda vissa tecken när man pratar med kompilatorn för att han ska förstå vad saker börjar och slutar och vad de betyder Exempel på tecken är olika typer av parenteser, vanlig ( ), hårda [ ] och mjuka { }. Dessa används vid olika tillfällen för att avgränsa kod. Ett annat tecken som används väldigt flitigt är semikolon ; . Det används för att avgränsa olika satser ungefär på samma sätt som man avgränsar meningar med punkt. Situationstecken ” används för att avgränsa textsträngar och dubbla snedstreck // för att skriva kommentarer som inte tillhör själva programkoden.

Page 5: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 5 20/08/03

Syntax Vår kinesiske tolk är som sagt inte så bra på engelska, om man använder en felaktig grammatik så förstår han inte, om man t ex säger ” The button press” istället för ” Press the button” så säger tolken, jag förstår inte, du måste ha gjort något grammatiskt fel” På samma sätt talar kompilatorn om ifall vi har skrivit något som är syntaktiskt fel.

Standardbibliotek Detta är egentligen inga bibliotek utan prototyper som innehåller en massa färdig kod. I dagligt tal brukar de dock benämnas som bibliotek. Det finns en mängd olika bibliotek med kod för olika saker, tex finns det et med matematik-funktioner. Ett annat vanligt bibliotek som används i de allra flesta program är iostream som behövs då man ska skriva ut på skärmen och läsa in från tangentbordet.

Vårt första program Vi ska nu skriva ett program i C++ som skriver ut Hello på skärmen. Man öppnar helt enkelt en vanlig texteditor, skriver sin kod i den. Därefter kompilerar man programmet och sedan kan man köra det. Mer information om hur man gör kommer snart. Det första vi behöver i vårt program är ett ställe där programmet ska starta. Alla program startas i funktionen main. Funktioner anges med namn och parenteser (mer om detta i modul 4). main() bör också skriva nyckelordet int framför, varför förklaras senare: int main() Nu ska vi ha själva innehållet i funktionen. För att man ska vet var funktionen börjar och slutar använder man mjuka parenteser { }. int main() { //Här inne kan vi sedan skriva vår kod } Ovan ser en kommentar, den föregås av // och den raden hoppar kompilatorn över så där kan man skriva vad som helst. Vi ska nu fylla på med lite kod som skriver ut Hello. int main() { std::cout << ”Hello”; std::cout << endl; return 0;

Page 6: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 6 20/08/03

} Raden std::cout<<”Hello”; skriver ut Hello på skärmen. std::cout anger att vi vill skriva ut på skärmen. << är en operator som vi kommer att prata mer om senare. ” ” används runt vår textsträng för att tala om var strängen börjar och slutar. ; avslutar satsen. endl används för att få en ny rad (det finns fler sätt, se boken). Eftersom vi har ett returvärde (int) så måste vi skriva return sist i main-funktionen och vi väljer att returnera 0. Mer om detta i modul 4. Nu saknas det bara en sak för att vi ska kunna kompilera programmet. För att vi ska kunna använda cout måste vi inkludera ett bibliotek som heter iostream. Då skriver vi först i programmet #include <iostream> # talar om att det är ett preprocessor direktiv, vilket betyder att det utförs innan själva kompileringen börjar. Så hela vårt program ser nu ut så här: #include <iostream> int main() { std::cout << ”Hello”; std::cout << endl; return 0; } Skriv nu in detta program och testa att kompilera det och köra det innan du går vidare. Instruktioner om hur du gör finns på hemsidan, se ” Kompilera och köra programmet Hello” . Läs också Deitel kap 1.21 Ett tips för att lära sig programmera så snabbt och enkelt som möjligt är att kopiera alla exempel till en editor. Kompilera dem sedan och testkör dem. Prova därefter att ändra någon liten del eller lägga till något. Kompilera igen och kör. På så sätt ser man vad som händer på ett tydligare sätt. Tänk dock på att all exempel inte är fullständiga utan kanske bara visar en liten del av ett program. En tumregel är att finns main med är programmet oftast komplett och körbart.

Variabler En variabel har:

• ett Namn t ex summa, x, efternamn • ett Värde t ex 5, 7.2, ” karlsson” • en Typ t ex heltal, decimaltal, sträng • en Position i minnet

Page 7: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 7 20/08/03

Några typer: Svenska Engelska C++ Heltal Integer int Flyttal (decimaltal) Floating point number float Tecken (t ex en bokstav) Character char När man ska skapa en variabel talar man om vilken typ den ska ha och vad den ska heta. int summa; Minne tilldelas automatiskt så det behöver man inte fundera över. När man vill ge den ett värde skriver man: summa = 5; Man kan också ge den ett värde direkt när man skapar den genom att skriva: int x = 7; Man ska tänka på att alltid ge variabler relevanta namn som talar om vad de används till. Andra exempel: int tal = 7; float kvot = 3.6; char bokstav = ’a’; Programexempel #include <iostream> int main() {

int tal; //Variabeln tal deklareras som heltal std::cout << "Mata in ett tal: "; //Text skrivs ut std::cin >> tal; //Värdet på tal läses in std::cout << tal; //Värdet på tal skrivs ut return 0;

}

5

summa namn

Position i minnet

värde

typ: heltal

Page 8: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 8 20/08/03

Utskriften blir: Allt som står efter // på en rad är kommentarer i programmet. Använd mycket kommentarer i början så att du minns vad du gjort och varför. Även då man kan programmera är det bra att kommentera sin kod mycket så att det blir lättare både för sig själv och för andra att förstå vad som händer. Med lite modifiering (fetmarkerad text) av exemplet ovan … #include <iostream> int main() {

int tal; //Variabeln tal deklareras som heltal std::cout<<"Mata in ett tal: "; //Text skrivs ut std::cin>>tal; //Värdet på tal läses std::cout<<"Du matade in: "<<tal <<endl; //Värdet på tal

//skrivs ut return 0;

} blir utskriften istället: endl ger som nämnts tidigare en ny rad. Ett tips är att alltid lägga på en ny rad i slutet så att man är säker på att allt skrivs ut.

std::cout<<"Du matade in: "<<tal <<endl;

kan också skrivas på två rader:

std::cout<<"Du matade in: "<<tal; std::cout<<endl;

Läs om ett annat enkelt exempel i Deitel, kap 1.22 och om minneskoncept i kap 1.23. Man kan även deklarera flera variabler på samma rad om de är av samma typ. Ex) int x, summa, tal; float kvot, medleVarde;

Mata in ett tal: 5 5

Utskrifter av olika program kommer att visas i fyllda rutor som den till vänster. Text som matas in markeras i fetstil.

Mata in ett tal: 5 Du matade in: 5

Page 9: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 9 20/08/03

Konstanter En konstant har också namn, typ och position men ett värde man inte kan förändra. Man anger att det är en variabel genom att skriva nyckelordet const framför. Ex) const int tal = 10; const float limit = 4.2; Man måste initialisera en konstant när man deklarerar den. Ofta använder man versaler för konstanter för att skilja på konstanter och variabler: Ex) const int MAX = 20; Vi kommer att se exempel på användningsområden senare.

Operatorer Det finns olika sorters operatorer, t ex

• aritmetiska t ex + - / * • tilldelning = • jämförelse t ex < > == • logiska operatorer • andra t ex >> ( ) [ ]

Vi har sett exempel på tilldelning och aritmetiska operatorer (i boken). Läs mer om aritmetiska operatorer i kapitel 1.24. Några ytterligare exempel:

• Division med heltal (integer) 9 / 2 = 4 8 / 3 = 2

• Division med flyttal (float)

9 / 2 = 4.5 8 / 3 = 2.667

• Modulus: ger resten vid en heltalsdivision 9 % 2 = 1 (9 / 2 = 4 + resten 1) 8 % 3 = 2 (8 / 3 = 2 + resten 2)

Vanlig tilldelning är när man ger en variabel ett värde, tex x = 7. Man kan också ha tilldelning tillsammans med aritmetiska operatorer. Information om tilldelningsoperatorn finns i kap 2.11.

Övningar Gör self-review exercise 2.4 och 2.6

Page 10: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 10 20/08/03

Mer operatorer När man programmerar vill man ofta öka eller minska en variabel med 1. Ex) int x = 5; //öka x med 1 x = 5 + 1; Eftersom detta är en väldigt vanlig operation har man skapat en speciell operator för att öka ++ eller minska -- med 1, kallade inkrement eller dekrement –operatorer. Ex) int x = 5; //öka x med 1: x++; I de fall där operatorn används i uttryck har det betydelse om operatorn står framför eller bakom variabeln, ++x är inte samma sak som x++. När operatorn står framför (kallas preinkrement) utförs ökningen först, dvs ++x returnerar värdet av x+ 1. Ex) a = 2, b = 2;

c = ++a * 5; //++a ger 2+1 = 3 och sedan gånger 5 = 15 //Resultat: a = 3, c = 15

Om operatorn står efter variabeln (postinkrement) returnerar x++ värdet av x. Ex) a = 2, b = 2;

d = b++ * 5; //b++ ger 2 och sedan gånger 5 = 10 och //så ökar vi på b också //Resultat: b = 3, d = 10

Läs mer om dessa operatorer i kap 2.12. Jämförelse-operatorer finns beskrivna i kap 1.25. Ett vanligt fel som kan vara svårt att upptäcka är att man använder ett = istället för två = = när man ska göra jämförelser. De här operatorerna fungerar bra för heltal. Ska man däremot jämföra två flyttal (decimaltal) så får man istället titta på om skillnaden mellan talen är väldigt liten. Detta beror på att datorn räknar numeriskt. Ex) float tal1 = 7.2

Om tal1 == 7.2 //svaret är nej Om tal1 – 7.2 är mindre än 0.00001 //svaret är ja!

Ex) float tal1 = 5.3 float tal2 = 5.3

Om tal1 == tal2 //svaret är nej Om tal1 – tal2 är mindre än 0.00001 //svaret är ja!

Logiska operatorer Logiska operatorer är desamma som används inom matematiken.

• Logiskt ” icke” (NOT): ! • Logiskt ” och” (AND): &&

Page 11: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 11 20/08/03

• Logiskt ” eller” (OR): || Logiska operatorer kan kombineras med andra operatorer Ex) a == 3 && b > 9

c <= 7 || d > 5 Vi såg också flera exempel på hur dörrvakten Calle Carlsson avgjorde vilka som fick komma in och inte i del 3 av Relationsalgebra. I exemplet i kap 1.25 såg vi också att det finns sätt att slippa skriva std:: framför cout och cin mfl. I fortsättningen kommer inte detta att skrivas ut och vid de tillfällen det endast ges delar av program som kodexempel kommer det att antas att raderna using std::cout, using std::cin etc finns med precis som inkluderingar och main.

Teckenuppsättningar

Varje tecken representeras egentligen av ett heltal och det finns olika teckenuppsättningar som talar om vilket tal varje tecken ska representera. Två kända teckenuppsättningar är ASCII och unicode. I den här kursen kommer vi att använda ASCII, en tabell finns i Appendix B i Deitel. I ASCII så har bokstaven A värdet 65, B 66 osv. Ex) char teck1 = ’a’;

cout << teck1 << endl; cout << static_cast<int>(teck1) << endl;

Teck1 är av typen char som bara kan innehålla ett enda tecken. När vi skriver ut det vanligt blir det ett a på skärmen men om vi väljer att skriva ut heltalsvärdet (med hjälp av static_cast<int>, mer om detta senare i kursen) så skrivs ASCII-värdet för a ut, vilket är 97. Inkrement- och dekrement-operatorerna (++ och --) fungerar även på char och det är ASCII-värdet som ökas eller minskas då. Ex) char teck2 = ’G’;

teck2++; cout << teck2 << endl;

a 97

H

Page 12: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 12 20/08/03

Siffersymbolerna 0, 1, 2, …, 9 har också ASCII-värden, 48, 49, 50, …, 57. Om man har en siffra i form av en char kan man ta fram värdet på den genom att dra bort värdet på talet 0, dvs 48. Titta i ASCII-tabellen och räkna. Ex) char siffra = ’4’;

int varde; varde = siffra - ’0’; // 52 - 48 blir 4

Det går bra att använda våra svenska bokstäver när man skriver ut på skärmen och i en del miljöer går det bra att använda dem även i namn på variabler, filer odyl men inte i alla. Min rekommendation är därför att inte använda å, ä och ö i namn av olika slag.

Fler program

Vi tittar på det program som herr Jansson ville utveckla för att använda när han sålde jordgubbar bland annat. Vi börjar med den första lösningen han hade, ta gärna en titt på diagrammet i Jordgubbsexemplet del 1 – utvecklad lösning. Pseudokoden såg ut så här för den utvecklade delen av den första lösningen: Bestäm kilopriset Fråga ” Hur många kilo?” Läs in antal kilo och spara i variabeln vikt totalpris = kilopris * vikt Skriv ut totalpris Om vi ska skriva ett program som gör detta kan koden se ut så här: #include <iostream> using std::cout; using std::cin; using std::endl; int main() {

float kilopris, vikt, totalpris;

kilopris = 4.9; cout<<"Hur många kilo? "; cin>>vikt; totalpris = kilopris * vikt; cout<<"Totalpris: "<<totalpris <<endl;

return 0;

}

Page 13: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 13 20/08/03

Övningar Titta nu på din lösning av del 2 av Godisaffären. Utgå ifrån diagrammet och/eller pseudokoden och skriv ett program som fru Jönsson kan använda i sin affär. När du gjort det kan du jämföra det med min lösning, men tänk åter på att även om våra lösningar skiljer sig åt behöver din lösning inte vara fel utan bara ett alternativt sätt att lösa uppgiften på. Det finns även en del övningar med svar i boken som jag rekommenderar att ni gör. Selfreview Questions: 1.4 – 1.8

Kontrollstrukturer

För att styra exekveringen i ett program används olika typer av kontrollstrukturer. Hittills har vi sett en av dessa kontrollstrukturer, sekventiell struktur. I sekventiell struktur händer allt i den ordning som satserna står i filen. Vi kommer även att använda selektion och iteration. Läs kap 2.4 i Deitel. Här introduceras en annan typ av flödesdiagram än de ni sett tidigare, UML (Unified Model Language). De diagram ni sett tidigare bygger på denna standard så de är väldigt lika, jämför gärna olika exempel.

Selektion

Om vi går tillbaka och tittar på några av våra exempel i modul 1 så ser vi att vi redan vet vad selektion är. I Kaffeexemplet del 3 var det första val vi stötte på det där vi skulle välja om vi skulle sätta i sladden eller inte. Det beskrevs ju i både diagram och i pseudokod: Om kontakten inte sitter i uttaget Sätt i kontakten Det handlar om villkor som styr exekveringen, dvs vilka vägar programmet tar. Villkoren kan evalueras till sanna eller falska, tex:

• 10 kronor är mer än fem kronor sant • jag är längre än Michael Jordan falskt

Vi såg också flera exempel på hur dörrvakten Calle Carlsson avgjorde med hjälp av olika villkor, vilka som fick komma in och inte i del 2 och 3 av Relationsalgebra. Det finns tre varianter av selektion:

• if/else

Page 14: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 14 20/08/03

• switch • villkorsoperatorn

och vi ska titta på hur de fungerar alla tre.

if/else Exempel) om minimum poäng på en tenta för att få godkänt är 60 gäller följande: om studentens poäng är högre än eller lika med 60 studenten är godkänd Om villkoret är sant så är studenten godkänd Om villkoret är falskt så är studenten inte godkänd Om vi vill skriva ut en text när studenten är godkänd skulle det se ut så här: om studentens poäng är högre än eller lika med 60 skriv ut ” Godkänd” och om vi nu översätter detta till C++-kod skulle det se ut så här: if( poang >= 60 ) cout<< ”Godkänd”; Samma exempel finns i kap 2.5. Titta även på diagrammet och se hur det stämmer överens med koden. Herr Jansson hade också en valsituation när han skulle börja ge rabatter i Jordgubbsexemplet del 2 Pseudokoden såg ut så här: Om totalpris > X totalpris = totalpris * 0.9 Det enda vi egentligen behöver göra nu är att översätta från psuedokod till C++-kod. Om blir if och så måste vi sätta uttrycket inom parenteser. if(totalpris > X) totalpris = totalpris * 0.9; Och så får vi inte glömma ; i slutet av satsen. Observera dock att det inte ska vara något semikolon efter uttrycket i if-satsen.

Page 15: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 15 20/08/03

I nästa del av Jordgubbsexemplet har Herr Jansson bestämt sig för att börja sälja potatis också, vilket gör att han får två olika kilopriser att välja mellan, ett för jordgubbar och ett för potatis. Om vi tittar på det första diagrammet och skriver ner pseduokoden för det skulle det se ut så här: Om kunden har jordgubbar totalpris = kiloprisJordgubbar * vikt; Annars totalpris = kiloprisPotatis * vikt; Här har vi två alternativ och detta är också bara att översätta till C++. Vi måste dock ah ett sätt att representera vilken vara kunden har, vi bestämmer att varan är ’j’ för jordgubbar och ’p’ för potatis. if(vara == j) totalpris = kiloprisJordgubbar * vikt; else totalpris = kiloprisPotatis * vikt; I exemplet med kaffebryggaren gör vi också ett val av detta slag när vi väljer mellan mörkrostat eller vanligt kaffe. I kap 2.6 kan vi se hur man kan utöka exemplet med betyg. Här ser ni också exempel på nästlade if-satser. Sådana har ni också sett tidigare när Herr Jansson började sälja morötter i Jordgubbsexemplet del 4.

Övningar Ta er en titt på er övningsuppgift med Godisaffären del 3 och försök skriva kod till den. Sedan kan ni titta på min lösning. Lägg till en koll ifall kunden har betalt för lite och skriv i så fall ut en lämplig kommentar. Gör self-review exercise 2.3 och 2.7

Flera operationer i en sats I det sista exemplet i kap 2.6 så utför man två operationer i else-satsen. Då måste man använda { } för att ange vilka operationer som ska utföras, en god vana är att alltid använda { } även om man bara har en operation. Ex) if(vara == j) { totalpris = kiloprisJordgubbar * vikt; }

Page 16: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 16 20/08/03

else { totalpris = kiloprisPotatis * vikt; } Ni kommer att se { } placerade på lite olika sätt. I boken sätter de den första på samma rad som uttrycket. Fördelen med att sätta den på en ny rad är att koden blir luftigare och lättare at läsa. Det viktigaste är att ni indenterar korrekt och är konsekventa. Vi har sett flera exempel på hur if/else används, så här ser if/else-strukturen ut lite mer allmänt:

Det går också bra att ha sammansatta villkor. I Relationsalgebra del 3 var det flera villkor som gällde för att Calle Carlsson skulle få släppa in dem. Tex kunde man få komma in om man var tjej och minst 20 år eller om man var kille och minst 23 år. När man har sådana sammansatta uttryck använder man logiska operatorer och mer om dem kan du läsa i kap 2.19. Ett vanligt fel som är lätt att göra är att använda tilldelningsoperatorn = istället för jämförelseoperatorn ==. Se exempel i kap 2.20

switch I vissa sammanhang blir det onödigt krångligt att använda if/else-satser, tex när man ska testa en variabels värde mot många olika alternativ. Då kan man använda switch. I kaffeexemplet skulle vi bestämma hur många koppar kaffe vi skulle koka. Nu var ju alternativen inte så många men de flesta kanske kan ha fler gäster än mig hemma.

if (villkor) satser

if (villkor) satser 1 else satser 2

if (villkor 1) satser 1 else if (villkor 2) satser 2 else if (villkor 3) satser 3 … else if (villkor n) satser n else satser n+1

Page 17: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 17 20/08/03

Allmänt uttryckt ser switch-strukturen ut så här: switch (uttryck) { case värde1: satser1; break; case värde2: satser2; break; … case värdeN: satserN; break; default: satser; } Först har vi nyckelordet switch och innanför parenteser har vi det uttryck som vi ska ” switcha” på. Det finns en stor skillnad mellan uttrycken som används i if/else och i switch. I switch kan vi inte använda jämförelse-uttryck som x > 10 utan vi måste ha en variabel eller dylikt där. I kaffeexemplet skulle uttrycket vara ” personer” . Uttrycket måste vara av typen int, char eller enum (mer om enum senare i kursen). Inuti de mjuka parenteserna har vi sedan olika ” case” , olika fall på svenska. Värde 1, värde 2 osv är de olika värden som uttrycket kan ta. I kaffeexemplet var värdena 1, 2, 3 och 4. Default är den sats som man hanar i om inget av fallen ovan stämmer. Man måste inte ha en default-sats men ofta vill man ha med den. För varje fall specificerar man sedan vad man vill utföra om det fallet är det giltiga, satser. I Kaffeexemplet bryggde vi olika många koppar beroende på vilket fall som var sant. Man kan ha flera operationer efter varandra och här behöver man inte avgränsa dem med { }. Efter satserna använder man break för att avbryta selektionen. Om man glömmer break kommer exekveringen fortsätta på nästa rad. I vissa fall är detta vad man vill och då utelämnar man helt enkelt break, men för det mesta vill man gå ur switch-satsen när man hittat ett fall som matchar. Ex) Vi har en bok med en massa olika kapitel. Vi vill ha ett program där vi kan skriva in kapitelnumret och få en utskrift av titeln på kapitlet.

Page 18: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 18 20/08/03

Diagrammet skulle kunna se ut så här:

Och pseudokoden: om kapitel är 1 skriv ut ” Introduction” om kapitel är 2 skriv ut ” Control Structures” om kapitel är 3 skriv ut ” Functions” ... annars skriv ut ” kapitlet finns ej”

kapitel 1 Skriv ut

”Introduction” break sant

Skriv ut ”kapitlet finns ej”

falskt

kapitel 2 Skriv ut

”Control Structures” break

falskt

kapitel 3 Skriv ut

”Functions” break

falskt

Page 19: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 19 20/08/03

och slutligen koden: #include <iostream> using std::cout; using std::cin; int main() {

int kapitel;

cout << "Mata in ett kapitel: "; cin >> kapitel; switch(kapitel) {

case 1 : cout<< “Introduction”; break; case 2 : cout<< “Control Structures”; break; case 3 : cout<< “Functions”; break; … default: cout<<“kapitlet finns ej”;

} //slut switch return 0;

}//slut programmet I exemplet ovan var det variabeln “kapitel” som var uttrycket. Kapitel är av typen int och kan ta de olika värdena 1, 2, 3 osv. I nästa exempel ska vi se hur uttrycket kan vara en variabel av typen char, det vill säga ett tecken. Ex) När barn ska lära sig alfabetet så får de ofta associera de olika bokstäverna till olika saker som börjar på den bokstaven, tex djur eller leksaker. Vi vill skriva ett program där man får mata in en bokstav och utskriften blir en sådan sak, tex apa för a, björn för b osv. Vi presenterar här inte hela programmet utan nöjer oss med att visa exempel till och med bokstaven C. (Man skulle ju kunna protestera mot att ett ord skrivs ut när barnen lär sig bokstäverna, men med lite fantasi kan man ju byta det ordet mot en bild. Programmering med bilder ingår dock inte i denna kurs.) Pseudokoden skulle kunna bli: om bokstaven är a skriv ut ” apa” om bokstaven är b skriv ut ” björn” om bokstaven är c skriv ut ” cykel” ... annars skriv ut ” finns ej i alfabetet”

Page 20: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 20 20/08/03

Finns ej i alfabetet skulle ju kunna användas om barnet trycker på något konstigt tecken. Flödesdiagrammet för detta program kan se ut så här:

Och om vi helt enkelt översätter detta till kod: #include <iostream> using std::cout; using std::cin; int main() {

char bokstav; cout << "Mata in en bokstav: "; cin >> bokstav; switch(bokstav) {

case ‘a’ : cout<< “apa”; break; case ‘b’ : cout<< “björn”; break; case ‘c’ : cout<< “cykel”; break; //…

bokstav a Skriv ut ”apa” break sant

Skriv ut ”finns ej i alfabetet”

falskt

bokstav b Skriv ut ”björn” break

falskt

bokstav c Skriv ut ”cykel” break

falskt

Page 21: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 21 20/08/03

default: cout<<“finns ej i alfabetet ”; } //slut switch return 0;

}//slut programmet

Övningar Gör self-review exercise 2.11.

Villkorsoperatorn Det tredje varianten av selektion är villkorsoperatorn ? vilken tas upp tillsammans med if/else i kapitel 2.6.

Iteration

Att iterera betyder att upprepa något. Vi upprepar operationer hela tiden i vårt dagliga liv. Om vi läser en bok eller en tidning så måste vi ju vända blad, upprepade gånger vänder vi blad. När vi äter för vi gaffeln till munnen upprepade gånger. Att vända blad och att föra gaffeln till munnen är de operationer vi utför, frågan är hur länge håller vi på att upprepa oss. Vi kan ju inte sitta och vända blad i all evighet utan bara så länge det finns blad att vända, det vill säga så långe boken inte är slut. Likaså kan vi ju inte sitta och föra gaffeln till munnen resten av våra liv utan det gör vi ju bara så länge det finns mat på tallriken och vi fortfarande är hungriga. Vi fortsätter så länge ett visst villkor är sant. Detta villkor brukar kallas brytvillkor och i ovanstående fall kan det vara ” boken är inte slut” . Vi kan också ha sammansatta uttryck precis som vid selektion. Brytvillkoret för att sluta äta är ” det finns mat på tallriken och jag är hungrig” . Om maten tar slut spelar det inte någon roll om jag är hungrig eller inte, det finns inte mer mat. Om jag är mätt och inte vill ha mer så spelar det ingen roll om det finns mer mat eller inte (den kan få bli matlåda istället). För att hela uttrycket ska bli sant måste bägge uttrycken inuti vara sanna. I kaffeexemplet såg vi iteration i form av att mäta upp kaffe, en skopa åt gången. Där fortsatte vi tills vi hade mätt upp rätt antal skopor. I program använder man ofta olika typer av räknare för att utföra en operation rätt antal gånger. Det finns tre olika varianter på iteration:

• while • do/while • for

och vi ska gå igenom de alla tre.

Page 22: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 22 20/08/03

While While betyder ju ” så länge” och det är precis i den betydelsen det används i C++. While-strukturen ser ut så här: while (villkor) satser Villkoret är brytvillkoret som vi pratade om tidigare och är alltså ett uttryck som kan evalueras till sant eller falskt. Så länge som uttrycket är sant utför vi de satser som står under. Man brukar beteckna detta för en ” loop” (eller ” slinga” på svenska). Har man flera satser avgränsar man dem med mjuka parenteser { } precis som vid andra tillfällen: while (villkor) { sats 1 sats 2 … sats n } Läs kap 2.7 och 2.8 i Deitel. Man måste inte alltid öka på räknaren, man kan även minska den. Man behöver inte heller öka eller minska med 1 utan man kan välja vilket tal som helst. Ex) int tal = 10; while ( tal > 0 )

tal > 0 Skriv ut talet Minska talet sant

falskt

Initiera talet

Page 23: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 23 20/08/03

{ cout << tal <<endl; tal = tal -3;

} Här minskar vi talet med 3 vid varje iteration. Utskriften blir: Vad blir utskriften om vi ändrar tal till 9 istället? 0 skrivs inte ut eftersom när tal är 0 kommer vi inte att gå in i loopen och utföra operationerna. Man måste inte alltid bestämma i förväg hur många iterationer som ska utföras. Det kan bestämmas under programmets gång. Läs kap 2.9 i Deitel. För alla typer av iteration gäller några grundregler:

• Initialt värde för variabeln/variablerna i uttrycket Detta kan antingen sättas av programmeraren som i vårt exempel här och det i Fig 2.7 eller av användaren som i exemplet i Fig 2.9. Det viktiga är att det sätts till något innan man försöker testa på det.

• Det finns ett brytvillkor som kan uppnås Det måste finnas ett brytvillkor som kan uppnås annars kommer iterationen att fortsätta i all evighet. Brytvillkoret kan vara som i vårt exempel ” tal > 0” eller exemplet i Fig 2.7 gradeCounter >= 10. Det kan också vara sammansatt uttryck av olika slag. Det måste vara ett uttryck som kan evalueras till sant eller falskt. • Man måste närma sig kontrollvariabeln Ett vanligt nybörjarfel är att man skriver en loop som innehåller ett brytvillkor som tex x < 10 och så initierar man x = 1, men så glömmer man att öka x. Detta leder då till en oändlig loop, det vill säga den fortsätter tills man stänger av programmet med våld. Man måste helt enkelt se till att brytvillkoret någon gång uppfylls. Detta måste inte göras med räknare som ökas eller minskas. I exemplet i Fig 2.9 ser vi hur man kan låta användaren styra hur länge iterationen ska fortsätta.

10 7 4 1

9 6 3

Page 24: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 24 20/08/03

Se även kap 2.13

Övningar Gör self-review exercise 2.13 a och d, 2.5 och 2.10 Läs kap 2.10

Do/while En struktur som fungerar nästan precis likadant som while är do/while. Skillnaden är att med do/while utförs iterationen alltid minst en gång. do satser while (villkor) ; Observera semikolonet efter while-satsen.

Page 25: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 25 20/08/03

Om vi tittar på samma exempel som tidigare då vi skriver ut ett tal kan det se ut så här: int tal = 10; do { cout << tal <<endl; tal = tal -3; } while ( tal > 0 ); Utskriften blir densamma som för while-loopen:

Skriv ut talet

Minska talet

tal > 0

santt

falskt

Skriv ut talet

Initiera talet

10 7 4 1

Page 26: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 26 20/08/03

Skillnaden blir om vi tex väljer ett annat startvärde. Om vi i while-loopen sätter x = 0 vid start så kommer ingen utskrift att ske. Om vi däremot sätter x = 0 i do/while-loopen så kommer 0 att skrivas ut eftersom loopen alltid utförs minst en gång då kollen mot villkoret ligger sist i hela uttrycket. Läs kap 2.17.

for Den tredje och sista typen av iteration är for-loopen. Läs om den i kapitel 2.14 och 2.15 i boken. All iteration går att göra med alla typerna men de olika typen passar bäst i olika sammanhang. Ni kommer att se detta i exempel och när ni själva skriver kod. Exemplet tidigare med ett tal som ska skrivas ut kan givetvis utföras med en for-loop: int tal; for(tal = 10; tal >10; tal = tal – 3) {

cout << tal; } Diagrammet ser likadant ut som för while-loopen: Det går också utmärkt att deklarera variabeln inuti for-loopen. Tänk dock på att den endast är känd inuti loopen då. Mer om variablers räckvidd (scope) tas upp i nästa modul.

tal > 0 Skriv ut talet Minska talet sant

falskt

Initiera talet

Page 27: Programmeringsteknik Modul 2 – Byggstenar...Övningar 13 Kontrollstrukturer 13 Selektion 13 if/else 14 Övningar 15 Flera operationer i en sats 15 switch 16 Övningar 21 Villkorsoperatorn

DAVA07 Modul 2 - Byggstenar Programmeringsteknik

Maria Green Page 27 20/08/03

for(int tal = 10; tal >10; tal = tal – 3) {

cout << tal; } Ta en titt på 2.16 switch som vi hoppade över förut då vi ej hade gått igenom iteration vilket används i exemplet i det kapitlet.

Övningar Avsluta den här modulen med att läsa sammanfattningen i kap 2.21. Dessa regler går lika bra att applicera på de diagram som ni sett här som på bokens UML-diagram. Gör också self-review exercise 2.12 och 2.13 d.