Kurt Nørmark
Institut for Datalogi, Aalborg Universitet
Sammendrag Forrige lektion Næste lektion Stikord Referencer Indhold | I denne lektion gennemgår vi forskellige former for konstrolstrukturer, i hovedsagen forskellige former for selektion og iteration. Som en vigtig og relevant detalje, ser vi også på logiske udtryk, som styrer de fleste kontrolstrukturer. |
Kontrolstrukturer - Motivation og Oversigt |
Oversigt over basale kommandoer Slide Indhold Stikord Referencer |
|
|
|
Oversigt over konstrolstrukturer Slide Indhold Stikord Referencer |
Begrebet kontrolstruktur: En kontrolstruktur styrer og kontrollerer rækkefølgen af udførelsen af et antal kommandoer |
|
Motivation: Primitiv kontrol med hop Slide Indhold Stikord Referencer |
|
Program: Et uddrag af et C program med gotos. |
|
Program: Et helt C program med to goto kommandoer. |
|
Program: Goto programmet reformuleret med en if-else kontrolstruktur. |
|
|
Logiske udtryk |
Logiske udtryk Slide Indhold Stikord Referencer |
Begrebet logisk udtryk: Et logisk udtryk beregnes til en værdi i datatypen boolean. | ||
Begrebet boolean: Datatypen boolean indeholder værdierne true og false. |
Program: Et uddrag af et C program med logiske udtryk. |
|
|
Program: De boolske udtryk vist i realistiske sammenhænge i et C program. |
|
Program: Misforståede logiske udtryk. |
|
|
Opgave 3.2. Inden i eller uden for en cirkel | Det er ofte nyttigt at kunne afgøre, om et punkt i et koordinatsystem er placeret inden i eller udenfor en bestemt cirkel. Skriv et program med tre doubles r, x og y. r fortolkes som radius af en cirkel omkring punktet (0,0). x og y er koordinaterne (x, y) af et punkt. Programmet skal afgøre om punktet (x, y) er placeret inden i cirklen, på cirkelperiferien, eller uden for cirklen. Der er altså tre tilfælde. I bedes have tre logiske udtryk, assignet til tre logiske variable, som afspejler de tre forskellige situationer. Kan I lave én printf med brug af betingede udtryk (?:), der udskriver 'inden i'/'uden for' og 'på' cirklen, baseret på de logiske udtryks værdi? Hint: Det kan være svært at ramme periferien eksakt, fordi vi regner med doubles. Derfor kan I antage at punktet er 'på periferien' hvis det er ganske tæt på periferien. Indfør en symbolsk konstant DELTA, der fortæller hvor meget vi ønsker at kunne afvige fra et "perfect hit". |
Sandhedstabeller Slide Indhold Stikord Referencer |
Tabel. Sandhedstabel for not operatoren |
|
Tabel. Sandhedstabel for and operatoren |
|
Tabel. Sandhedstabel for or operatoren |
|
|
Prioriteter af logiske operatorer Slide Indhold Stikord Referencer |
Tabel. |
|
Short Circuit evaluering Slide Indhold Stikord Referencer |
|
Begrebet short circuit evaluering: Short circuit evaluering betegner en beregning hvor visse operander ikke evalueres, idet deres værdi er uden betydning for resultatet |
|
|
Short Circuit evaluering: eksempler Slide Indhold Stikord Referencer |
|
Program: Short circuit beregning i kombination med assignments. |
|
Program: Et ækvivalent program. |
|
Program: Output fra ovenstående programmer. |
|
Program: Short circuit beregning som beskyttelse mod fejlberegning. |
|
|
Opgave 3.3. Operator prioriteter i logiske udtryk | Denne opgaver giver dig træning i at anvende operator prioritering i logiske udtryk. Det er ikke nødvendigt at beregne værdierne af udtrykkene. Lad blot computeren foretage de faktiske beregninger. Se på følgende C program: #include <stdio.h> int main(void){ int a = 1, b = 2, c = 3; double x = 1.0; int res1, res2, res3, res4; res1 = a > b && c < x; res2 = a < ! b || ! ! a; res3 = a + b < ! c + c; res4 = a - x || b * c && b / a; printf("res1 = %d, res2 = %d, res3 = %d, res4 = %d \n", res1, res2, res3, res4); return 0; } Sæt parenteres i de fire sammensatte, logiske udtryk, hvis værdier assignes til variablene res1, ..., res4. Ved at sætte parenteser bliver det klart, hvorledes de sammensatte udtryk beregnes. Vær sikker på at du anvender operator prioriteringerne i C, for at sætte parenteserne korrekt. Check at overstående program, og dit modificerede program, er ækvivalente (giver det samme output når værdierne af res1, ..., res4 udskrives). |
Sammensætning af kommandoer |
Sammensætning Slide Indhold Stikord Referencer |
Begrebet blok: En sammensat kommando, også kaldet en blok, er en gruppering af kommandoer til én kommando, hvori der i starten kan forekomme erklæringer af variable |
Syntax: En blok |
|
|
Program: Tre indlejrede blokke med lokale erklæringer af heltal. |
|
Program: Program output. |
|
|
Udvælgelse af kommandoer |
Udvælgelse med if (1) Slide Indhold Stikord Referencer |
|
Syntax: En if-else kontrolstruktur. |
|
Figur. Flow graf for if |
|
Udvælgelse med if (2) Slide Indhold Stikord Referencer |
|
Syntax: En if kontrolstruktur uden else |
|
Figur. Flow graf for if uden else |
Eksempler på if (1) Slide Indhold Stikord Referencer |
|
Program: To assignments til boolske konstanter i en if - unødvendig omstændeligt. |
|
Program: Bedre program - med ét assignment til værdien af et logisk udtryk. |
|
Eksempler på if (2) Slide Indhold Stikord Referencer |
|
Program: Et program som beregner det største af to doubles - coding style. |
|
Program: En variant med blokke - alternativ 'coding style'. |
|
Program: Endnu en variant med blokke - alternativ 'coding style'. |
|
Program: Et attraktivt alternativ - som ikke handler om coding style. |
|
|
|
'Sekvens af if' kontra if-else Slide Indhold Stikord Referencer |
|
Program: Brug af if-else. |
|
Program: Brug af to if sætninger i sekvens. |
|
Program: Brug af to if sætninger i sekvens - variant nummer et. |
|
Program: Brug af to if sætninger i sekvens - variant nummer to. |
|
Program: Brug af to if sætninger i sekvens - med en ganske lille ændring. |
|
|
'Dangling else' problemet Slide Indhold Stikord Referencer |
|
Program: Illustration af dangling else problemet. |
|
Program: Output fra ovenstående program. |
|
|
Udvælgelse med switch (1) Slide Indhold Stikord Referencer |
Syntax: Opbygningen af en switch kontrolstruktur. |
|
|
Udvælgelse med switch (2) Slide Indhold Stikord Referencer |
|
Program: Et program der udskriver en ECTS karakter fra en dansk 7-trins karakter. |
|
Program: Et program konverterer en 13 skala karakter til 7-trin skalaen. |
|
Program: Et program der beregner antal dage i en måned. |
|
|
If-else kæder Slide Indhold Stikord Referencer |
|
Program: Et program med en if-else kæde der løser en andengradsligning. |
|
|
Program: Et program med en if-else kæde der beregner beregner en 13-skala karakter ud fra et antal procentpoint. |
|
Program: Alternativt og uønsket layout af if-else kæde. |
|
|
Opgave 3.4. pH værdier | I denne opgave antages det, at du lige har løst self-check opgave 3 side 236 i lærebogen Problem Solving and Program Design in C, eighth edition. Målet med opgaven er at træne din evne til at arbejde med nestede if-else konstrolstrukturer, herunder if-else kæder (multiple alternative if statements). Sammenlign din løsning med følgende if-else kæde (som bogen kalder en multiple-alternative if): if (ph <= 2) printf("Very acidic"); else if (ph < 7) printf("Acidic"); else if (ph == 7) printf("Neutral"); else if (ph < 12) printf("Alkaline"); else printf("Very alkaline"); Er ovenstående if-else kæde ækvivalent med din løsning på bogens opgave? Som en hjælp til afgørelsen, skriv en kommentar efter hvert printf kald som viser præcist, for hvilket interval pH værdier udskriften er gældende. Du skal være meget omhyggelig og systematisk - ellers laver du let en fejl. |
Observationer om if-else kæder Slide Indhold Stikord Referencer |
|
Betingede udtryk Slide Indhold Stikord Referencer |
|
Syntax: Opbygningen af den betingede operator i C. |
|
|
Program: Et program der bestemmer fortegnet af et tal. |
|
Program: Et ækvivalet program - med parenteser i udtrykket. |
|
|
Opgave 3.5. Timer, minutter og sekunder - igen | Denne opgave er en fortsættelse af en tidligere opgave, hvor vi konverterede hele sekunder til uger, dage, timer, minutter og sekunder efter sædvanlige principper. I denne opgave begrænser vi os til timer, minutter og sekunder (vi dropper altså interessen for uger og dage). Målet med opgaven er at træne dig i at bruge af if-else kæder, if'er i sekvens og betingede udtryk (med ?: operatoren). Målet er endvidere at opdele et lidt større program i mindre og markerede dele inden for main. Det er sjusket og utilfredsstillende når det oprindelige program giver output som dette:
Vi ønsker at blive fri for '0 timer' og '0 minutter'. Endvidere ønsker vi korrekt angivelse af ental og flertal. Derfor foretrækker vi et program der giver følgende output:
Skriv en ny version af programmet, som opfylder disse krav. Overvej ombyggelig brugen af if-else kæder kontra sekvenser af if kontra betingede udtryk med brug af den ternære operator ?: |
Flere opgaver Slide Indhold Stikord Referencer |
Opgave 3.6. Ordningen af betingelser i en if-else kæde | Vi har på en tidligere slide set på følgende program med en if-else kæde: #include <stdio.h> int main(void) { int percent, grade; printf("How many percent? "); scanf("%d",&percent); if (percent >= 90) grade = 11; else if (percent >= 82) grade = 10; else if (percent >= 74) grade = 9; else if (percent >= 66) grade = 8; else if (percent >= 58) grade = 7; else if (percent >= 50) grade = 6; else if (percent >= 40) grade = 5; else if (percent >= 10) grade = 3; else grade = 0; printf("%d percent corresponds to the Danish grade %d\n\n", percent, grade); return 0; } Nu bytter vi om på tilfældene i if-else kæden (dog bevarer vi else-delen): #include <stdio.h> int main(void) { int percent, grade; printf("How many percent? "); scanf("%d",&percent); if (percent >= 10) grade = 3; else if (percent >= 40) grade = 5; else if (percent >= 50) grade = 6; else if (percent >= 58) grade = 7; else if (percent >= 66) grade = 8; else if (percent >= 74) grade = 9; else if (percent >= 82) grade = 10; else if (percent >= 90) grade = 11; else grade = 0; printf("%d percent corresponds to the Danish grade %d\n\n", percent, grade); return 0; } Ændrer dette betydningen af programmet? Uddrag en generel tommelfingerregel for ordningen af de logiske udtryk i en if-else kæde. |
Kapitel 3: Kontrolstrukturer
Kursets hjemmeside Forfatteren's hjemmeside Om frembringelsen af disse sider Forrige lektion (top) Næste lektion (top) Forrige lektion (bund) Næste lektion (bund)
Genereret: 9. maj 2022, 13:58:27