3 Styrning av programflöde. Här exekveras satserna enligt först sats1 sedan sats2 och sist sats3.

Relevanta dokument
Programmering i C, 7,5 hp

Övningar i JavaScript del 4

Loopar och datatyper. Föreläsning 3

Övningar i JavaScript del 3

Programmering Åk Blockly Games

Loopar och datatyper. Föreläsning 3

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

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl

Övningar i JavaScript del 7

Komponentvisa operationer,.-notation Multiplikation (*), division (/) och upphöj till (ˆ) av vektorer följer vanliga vektoralgebraiska

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

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Övningar i JavaScript del 2

Variabler använder man sig av för att under programkörningen spara data eller information i primärminnet. En variabel har typ, namn och värde.

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

Switch, Array (fält) switch break, continue, goto (scary) Sammansatta tilldelningar Kommentarer Array Sortering

Några småsaker. switch break, continue, goto Kommentarer

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

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

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

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

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

Laghantering i Equipe

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Programmering, grundkurs, 8.0 hp HI1024, extra tentamen, TEN1, för TIDAA1. Fredagen den 11 mars 2011,

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

Övningar i JavaScript del 5

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

Kravspecifikation Batchbeställningar Version:

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

Programmering, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012

BaraTrav Inställningar Version 1.3.4

TDIU01 - Programmering i C++, grundkurs

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Användning av stack: evaluera uttryck i RPN

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

Övningsuppgifter till föreläsning 2 Variabler och uttryck

Programmering F-3. -Osmo Coding

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

kl Tentaupplägg

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Blandat. Föreläsning 5

Lämna in en ifylld kursvärdering tillsammans med tentan! Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl

Villkor och tester. Utförande satser bygger upp metoderna, man brukar finindela detta i: sekvenser. Ett program består i princip av: selektioner (val)

2.1 Variabler. 2.2 Regler för namngivning i C. Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Föreläsning 2

Laghantering i Equipe. Uppdaterad Uppläggning på TDB. Efter inläsning av anmälningsfilen

Tentamen ges för: Tentamensdatum: Tid:

Data, typ, selektion, iteration

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 13. Omtentamen i Programmering C, 5p, A1, D1, PA1, Fri,

3.3 for-satsen. Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Föreläsning 3

Iteration while-satsen

En kort text om programmering i C.

Klassdeklaration. Metoddeklaration. Parameteröverföring

Föreläsning 4. Val, boolska värden, läsbarhet, osv

För att kunna utföra en variable data printning böhöver du följande filer:

Inledande programmering med C# (1DV402) Summera med while"-satsen

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

Kravspecifikation Batchbeställningar Version:

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

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

Föreläsning 3. Iteration while-satsen

2 Pekare och dynamiska variabler.

Exempel ( )

En villkorssats är den konstruktion som finns i C++ för att göra en selektion av två alternativa sekvenser. Formen för if satsen är

Programmering Åk Programmering i Kojo

1 Iteration. 1.1 for-satsen

4 Sammansatta datatyper

C++ Lektion Tecken och teckenfält

JAVAUTVECKLING LEKTION 4

Arrays (indicerade variabler) Föreläsning 6

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Användarmanual för registrering av resultat från Markörbaserad journalgranskning

Uttryck och villkor. Föreläsning 2

Föreläsning 9. Repetition och exempelproblem

Uppgift 1 ( Betyg 3 uppgift )

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

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

For-sats/slinga. Notis

MMA132: Laboration 2 Matriser i MATLAB

Programmering Grundkurs (HI1900) Teoridel

Variabler och konstanter

Anmälan av stipendier med systemet Personec F ESS

Enkla datatyper minne

7 Programmeringsteknik

Språket Python - Del 1 Grundkurs i programmering med Python

F4. programmeringsteknik och Matlab

ANVÄNDNINGSOMRÅDE. ÖVERFÖRINGING AV SNITTKRAFTER.

Föreläsning 2 Programmeringsteknik och C DD1316

TENTAMEN OOP

Föreläsning 3: Booleans, if, switch

Föreläsning 11. Strängar

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

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

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

KOMPLETTERANDE HEMTENTAMEN 2 TDDB53

Tentamen i Grundläggande Programvaruutveckling, TDA548

Kort användarmanual för Test och quiz i Mondo 2.0

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv

ARKIV DIGITAL - att släktforska i färg

Transkript:

3 Styrning av prgramflöde Ett prgram består av ett antal satser. När prgrammet körs exekveras satserna i den rdning sm de står. ; ; ; Här exekveras satserna enligt först sedan ch sist. Ofta måste man i prgrammet kunna förändra vanstående prgramflöde för att få en krrekt ch önskad bearbetning av data. Man ska kanske bara utföra, m någt villkr är sant eller man vill upprepa fem gånger. I ett prgramspråk måste det finnas möjligheter att styra det nrmala eller sekventiella prgramflödet genm att välja (selektera) eller upprepa (iterera) vissa satser. De styrmekanismer sm behövs för att bryta sekvenserna är selektiner ch iteratiner. Med hjälp av dessa styrmöjligheter kan man lösa alla bearbetningar av data sm kan behövas. När man knstruerar sina prgram eller databearbetningar är det fta lämpligt att först tänka ut en plan hur bearbetningen ska göras. Istället för att då använda ett prgrammeringsspråk kan man rita ett strukturdiagram, eller skriva så kallad pseudkd, även kallad halvkd. I pseudkd beskriver man sin bearbetning på vanlig svenska, men man kan ckså blanda in knstruktiner från ett prgrammeringsspråk. Ett strukturdiagram sm visar vanstående sekvens. Prgram tidsaxel finfördelning Pseudkd för vanstående sekvens. Prgram 39

3.1 Selektin Med styrmekanismen selektin kan man välja att utföra satser under förutsättning att vissa villkr är uppfyllda. Man väljer ut eller selekterar vilka satser sm ska utföras. I vanstående exempel ska endast utföras m villkr1 är sant. Strukturdiagram: Prgram (villkr1) ---- sm i r pseudkd: Prgram m villkr1 C-kd: ; if (villkr1) ; ; Villkr1 är ett lgiskt uttryck sm kan anta värdet falskt (0) eller sant (1). Då prgrammet kmmer till if-satsen kntrllerar det värdet på villkr1. Är detta sant utförs annars inte. OBS! I strukturdiagrammet ska varje ruta ha en entydig struktur. Den ska antingen vara sekvens, selektin eller iteratin. OBS! Indragningen (indenteringen) i pseudkden ch C-kden för att markera att man styrt prgramflödet på ett speciellt sätt. 40

Skriv ett prgram sm läser in ett reellt tal ch beräknar ch skriver ut dess inverterade värde. Är det inlästa talet 0 ska feltexten 'Saknar inverterat värde!' skrivas ut. Stukturdiagram: Invertera Läs tal (tal ej 0) (-) Skriv 1/tal Skriv feltext pseudkd: Invertera läs tal m tal ej 0 skriv 1/tal annars skriv feltext C-kd: #include <stdi.h> duble tal; printf("ge tal: "); scanf("%lf", &tal); if (tal!= 0) printf("inverterat tal = %f\n", 1/tal); printf("saknar inverterat värde!\n"); OBS! Annars markeras i strukturdiagrammet med ett streck (-). OBS! Man kan m man vill skriva text i den tmma burken. I vanstående exempel kan man exempelvis skriva bearbeta tal. Denna text kan sedan återkmma sm rubrik i kden. 41

Selektiner kan nästlas d.v.s man kan ha selektiner inuti selektiner. Vid nästlade selektiner kan det uppstå prblem med ch veta till vilken del sm annars-delen hör. Regeln är att annars-delen alltid hör till den närmast föregående selektinen sm saknar annars-del. En första nästlad selektin. Strukturdiagram: (villkr1) Selektin1 (-) (villkr2) (-) C-kd: if (villkr1) if (villkr2) ; ; ; En andra nästlad selektin. Strukturdiagram: (villkr1) Selektin2 (-) (villkr2) (-) C-kd: if (villkr1) ; if (villkr2) ; ; 42

Nästlade selektiner har fta en tendens att bli krångliga. Ser man att en selektin börjar bli väldigt djup i strukturdiagrammet bör man tänka m. Man ska då göra m selektins-villkren så att en flervalsselektin fås med bredd istället för djup. I en flervalsselektin kan man välja mellan fler saker än två ch endast en av sakerna utförs. Skriv m den första selektinen van sm en flervalsselektin. Strukturdiagram: Selektin1 (villkr1) ch (villkr2) (villkr1) (-) C-kd: if (villkr1 && villkr2) ; if (villkr1) ; ; Den andra selektinen skriven sm en flervalsselektin. Strukturdiagram: Selektin2 (villkr1) (villkr2) (-) C-kd: if (villkr1) ; if (villkr2) ; ; 43

Skriv ett prgram sm löser andragradsekvatinen x 2 + ax + b = 0 sm har lösningarna 2 x a / 2 a / 4 b pseudkd: Andragrad läs a, b c = a 2 / 4 - b m c > 0 skriv x1 skriv x2 annars m c = = 0 skriv x annars skriv 'Saknar reell lösning' C-kd: #include <stdi.h> #include <math.h> duble a, b, c; printf("ge a ch b: "); scanf("%lf%lf", &a, &b); c = pw(a, 2)/4 - b; if (c > 0) /* OBS! */ printf("x1 = %f\n", -a/2 - sqrt(c)); printf("x2 = %f\n", -a/2 + sqrt(c)); /* OBS! */ if (c == 0) printf("x1 = x2 = %f\n", -a/2); printf("ekvatinen saknar reell lösning!\n"); OBS! Ska flera satser utföras inuti en selektinsdel måste blckparenteserna användas. 44

Skriv ett prgram sm läser in ett uttryck av typen 2.3 p 3.4 där p kan vara +, -, * eller /. Prgrammet ska sedan skriva ut resultatet av peratinen. Matas en felaktig peratr in ska ett felmeddelande skrivas ut. Ett felmeddelande ska ckså skrivas ut m man försöker dividera med 0. Strukturdiagram: Cunt ( p == '+' ) '-' '*' '/' (-) Skriv a+b Skriv a-b Skriv a*b Skriv feltext C-kd: Läs a, b, p #include <stdi.h> duble a, b; char p; ( b!= 0 ) (-) Skriv a/b printf("ge ett uttryck på frmen a p b: "); scanf("%lf %c %lf", &a, &p, &b); if (p == '+') printf("%f\n", a + b); if (p == '-') printf("%f\n", a - b); if (p == '*') printf("%f\n", a * b); if (p == '/') if (b!= 0) printf("%f\n", a / b); printf("divisin med 0!\n"); printf("fel peratr!\n"); Skriv feltext (Km ihåg: Vid inläsning till en duble med scanf ska man använda frmat-specificeraren %lf, ch vid utskrift med printf ska man använda %f.) 45

Flervalsselektiner kan i vissa fall kdas med en switch-sats istället för en if-sats i C. Skriv m prgrammet cunt van med en switch-sats istället för en if-sats. #include <stdi.h> duble a, b; char p; printf("ge ett uttryck på frmen a p b: "); scanf("%lf %c %lf", &a, &p, &b); switch (p) case '+': printf("%f\n", a + b); break; /* OBS! */ case '-': printf("%f\n", a - b); break; case '*': printf("%f\n", a * b); break; case '/': if ( b!= 0) printf("%f\n", a / b); printf("divisin med 0!\n"); break; default : printf("fel peratr!\n"); Switch-satsen fungerar så att satsens styruttryck, sm van är variabeln p ch sm måste vara uppräknelig (heltal), beräknas. Därefter hppar prgrammet in i den första case-del sm överenstämmer med detta värde ch alla efterföljande satser utförs. Om det ej finns någt överenstämmande värde utförs satserna i default-delen. OBS! Man måste hppa ur switch-satsen med break. Har man ej med break kmmer alla efterföljande delar att ckså utföras. Har man exempelvis läst in ett *-tecken kmmer prgrammet att utföra multiplikatin, divisin ch även skriva ut ett felmeddelande m felaktig peratr m den aktuella case-delen skulle sakna break. 46

3.2 Iteratin Med styrmekanismen iteratin, även kallad lp eller slinga, kan man välja att upprepa satser så länge någt villkr är uppfyllt. I vanstående första exempel ska upprepas så länge villkr1 är sant. Strukturdiagram: Prgram (villkr1) * ---- * sm i gånger pseudkd: Prgram så länge villkr1 C-kd: ; while (villkr1) ; ; Villkr1 är ett lgiskt uttryck sm kan anta värdet falskt (0) eller sant (1). Då prgrammet kmmer till while-satsen kntrllerar det värdet på villkr1. Är detta sant utförs ch ny kntrll av villkr1 görs.s.v. Då villkret blir falskt frtsätter prgrammet med. 47

Skriv ett prgram sm läser in tal ch summerar talen så länge de inlästa talet är skilt ifrån 0. Efter inläsning ska medelvärdet skrivas ut m någt tal lästs in annars feltext. Strukturdiagram: Medel Initiera Läs tal (tal!= 0) (antal!= 0) (-) * Skriv medel Skriv feltext Summera Öka antal Läs tal C-kd: #include <stdi.h> duble tal, summa = 0.0; int antal = 0; printf("ge tal (avsluta med 0): "); scanf("%lf", &tal); while (tal!= 0) /* OBS! */ summa += tal; antal++; printf("ge tal (avsluta med 0): "); scanf("%lf", &tal); /* OBS! */ if (antal!= 0) printf("medel = %f\n", summa / antal); printf("finns inget medel att beräkna!\n"); OBS! Om flera satser ska upprepas måste blckparenteserna användas. 48

En verklig iteratin ska kunna upprepas 0, 1 eller flera gånger. Ibland kanske man vill att en sats alltid ska utföras minst en gång ch sedan eventuellt upprepas så länge ett villkr är sant. I C finns en speciell knstruktin för detta sm heter d... while. I vårt arbetsexempel vet man att ska köras minst en gång ch sedan upprepas så länge villkr1 är sant. pseudkd: Prgram gör så länge (villkr1) C-kd med d.. while: ; d ; while (villkr1); ; Strukturdiagram: I strukturdiagrammet markerar man med texten d.. while (villkr1) istället för med bara while. Prgram (villkr1) * Knstruktinen d... while kan till exempel vara användbar när prgrammet ska läsa in data, ch man vill upprepa inläsningen tills användaen matar in ett tillåtet värde. 49

Ekvatinen x 3-25x 2 + 18x - 450 = 0 har en lösning sm är ett litet psitivt heltal. Skriv ett prgram sm hittar denna lösning genm att pröva med talen 1, 2, 3.s.v. C-kd med while: #include <stdi.h> #include <math.h> int y, x = 0; x++; y = pw(x, 3) - 25* pw(x, 2) + 18*x - 450; while (y!= 0) x++; y = pw(x, 3) - 25* pw(x, 2) + 18*x - 450; printf("x = %d\n", x); C-kd med d.. while: #include <stdi.h> #include <math.h> int y, x = 0; d x++; y = pw(x, 3) - 25* pw(x, 2) + 18*x - 450; while (y!= 0); printf("x = %d\n", x); 50

Från en meny ska man upprepat kunna välja lika alternativ. I menyn ska finnas ett alternativ sm man kan avsluta upprepningen med. Skriv ett prgram sm upprepat visar menyn: K R S Kvadrat Rt Sluta Välj >> mitt på en tm skärm. Prgrammet ska kunna läsa reella tal, skriva ut kvadraten eller kvadratrten mitt på skärmen. #include <stdi.h> #include <math.h> /* Makr för att rensa bufferten */ #define SKIPLINE while (getchar()!= '\n') duble tal; char svar; d /* menytext */ printf("k Kvadrat\n"); printf("r Rten\n"); printf("s Sluta\n"); printf("\n"); printf("välj >> "); /* läs svar ch rensa bufferten */ svar = getchar(); SKIPLINE; 51

switch (svar) case 'k': case 'K': /* läs tal ch rensa */ printf("ge ett tal: "); scanf("%lf", &tal); SKIPLINE; /* skriv kvadraten */ printf("kvadraten: %f\n", pw(tal, 2)); printf("tryck RETURN!!\n"); SKIPLINE; break; case 'r': case 'R': /* läs tal ch rensa */ printf("ge ett tal: "); scanf("%lf", &tal); SKIPLINE; /* skriv rten */ if ( tal >= 0 ) printf("kvadratrten: %f\n", sqrt(tal)); printf("kvadratrten ej definierad!\n"); printf("tryck RETURN!!\n"); SKIPLINE; break; case 's': case 'S': /* gör ingenting */ break; default: /* skriv feltext */ printf("fel val!!\n"); printf("tryck RETURN!!\n"); SKIPLINE; while (svar!= 's' && svar!= 'S'); (När vi senare ser hur man kan dela upp sitt prgram i funktiner, kmmer vi att se bättre alternativ till det där SKIPLINE-makrt.) 52

Ibland kanske man vill att en sats ska upprepas ett visst antal gånger. Istället för att använda en räknare sm initieras ch räknas upp så länge den är mindre än antalet kan man i C använda en knstruktin med fr. I vårt arbetsexempel vill man att ska upprepas 20 gånger. pseudkd: Prgram nr = 1 så länge (nr <= 20) nr++ C-kd med while-knstruktin: int nr; ; nr = 1; while (nr <= 20) ; nr++; ; C-kd med fr-knstruktin: int nr; ; fr(nr = 1; nr <= 20; nr++) ; ; Strukturdiagram : Prgram nr = 1 ( nr <= 20 ) * nr++ 53

Skriv ett prgram sm frågar efter ett psitivt heltal ch skriver ut multiplikatinstabellen för talet. Matar man exempelvis in talet 5 ska utskriften bli: 0 * 5 = 0 1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25 C-kd med while-sats: #include <stdi.h> int tal, mult; printf("ge talet: "); scanf("%d", &tal); mult = 0; while (mult <= tal) printf("%d * %d = %d\n", mult, tal, mult*tal); mult++; C-kd med fr-sats: #include <stdi.h> int tal, mult; printf("ge talet: "); scanf("%d", &tal); fr (mult = 0; mult <= tal; mult++) printf("%d * %d = %d\n", mult, tal, mult*tal); 54

Man kan naturligvis ha nästlade iteratiner precis sm man kan ha nästlade selektiner. Man pratar m yttre ch inre iteratin. Den inre iteratinen kmmer att upprepas fullständigt varje gång sm den yttre iteratinen upprepas. Skriv ett prgram sm tillverkar ett mönster på skärmen enligt: XXXXXXXXXXXXXXXXX XXXXXXXX XXXXXXXX XXXXXXX XXXXXXX XXXXXX XXXXXX XXXXX XXXXX XXXX XXXX XXX XXX XX XX X X #include <stdi.h> int rad, kl; /* för alla rader */ fr (rad = 1; rad <= 9; rad++) /* för alla klumner */ fr (kl = 1; kl <= 17; kl++) if (kl > (10 - rad) && kl < (rad + 8)) printf(" "); printf("x"); printf("\n"); OBS! I en nästlad lp körs alltid den innersta lpen färdigt innan man går till den yttre lpen ch kör nästa varv. I exemplet van innebär det att man för varje rad kör färdigt alla klumner innan man går till nästa rad. OBS! I exemplen van har vi låtit lp-variablerna till exempel stegas från 1 till 17, m vi vill köra lpen 17 gånger. I C är det vanligare att man i så fall låter lp-variablerna stegas från 0 till 16. Men mer m det senare. 55

3.3 Övriga styrmekanismer Man kan även styra prgramflödet med hjälp av hpp. I C finns möjligheter att hppa till en angiven plats i prgrammet med gt.... if (villkr1) gt slut;... slut: printf("ett fel har uppstått. Vi måste avbryta!"); Här finns slut sm sista sats i prgrammet så att prgrammet avsutas m villkr1 är uppfyllt. Man kunde ha uppnått samma sak genm att använda funktinen exit i prcess.h enligt: if (villkr1) printf("ett fel har uppstått. Vi måste avbryta!"); exit(1); Man kan hppa ur en iteratin eller en selektin i frm av en switch-sats med hjälp av break.... while (villkr1)... if (villkr2) break;... Här hppar prgrammet ur while-lpen m villkr2 är sant. Man kan hppa över en upprepning med cntinue.... fr (nr = 0; nr <= 10; nr++) if (nr == 5) cntinue; ; Här utföres ej när nr är 5 utan man frtsätter direkt med nr = 6. OBS! Hpp försvårar prgramunderhåll. Försök att undvika hpp i största möjliga utsträckning. Använd istället strukturerna sekvens, selektin ch iteratin. 56