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 |
|
|
|
| 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. |
|
|
| Oversigt over konstrolstrukturer Slide Indhold Stikord Referencer |
| Begrebet kontrolstruktur: En kontrolstruktur styrer og kontrollerer rækkefølgen af udførelsen af et antal kommandoer |
|
| 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 med radius r og centrum i (0,0). |
| 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);
}
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 | ![]() |
| Udvælgelse med if (3) Slide Indhold Stikord Referencer |
|
| Program: Et program som beregner det største af to doubles. |
|
| Program: En variant med blokke. |
|
| Program: Endnu en variant med blokke. |
|
|
|
| 'Sekvens af if' kontra if-else Slide Indhold Stikord Referencer |
|
| Program: Sekvenser af if kontra if-else. |
|
| Program: Sekvenser af if kontra if-else med markering af de forgreninger der udføres. |
|
| Program: Sekvenser af if kontra if-else - med forklarende kommentarer. |
|
| Program: Program output. |
|
|
| '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, seventh edition. 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, for hvilke pH værdier udskriften er gældende. |
| 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 timer, minutter og sekunder efter sædvanlige principper. Det er sjusket og utilfredsstillende når det oprindelige program giver følgende output:
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 ?: |
| Gentagelse af kommandoer |
| Gentagelse med while (1) Slide Indhold Stikord Referencer |
|
| Syntax: Syntaksen af en while løkke i C. |
|
| Figur. Flow graf for en while løkke | ![]() |
|
| Gentagelse med while (2) Slide Indhold Stikord Referencer |
|
| Program: Euclids algoritme - største fælles divisor - programmeret med en while løkke. |
|
| Program: En udgave af Euclids algoritme som udskriver den beregnede talrække. |
|
|
| Opgave 3.8. Forklaring af et program med while løkke og udtryk med assignments | Forklar hvad der udskrives af følgende program. Hvor mange gange udføres kroppen af while-løkken? Forudsig først resultatet, og kør dernæst programmet. #include <stdio.h>
int main(void){
int i = 0, power = 1;
while (++i <= 10)
printf("%5d", power *= 2);
printf("\n");
return 0;
}
Vær sikker på at du forstår værdierne af de to udtryk ++i og power *= 2. Hvad sker der hvis ++i erstattes af i++? Det viste program er skrevet i typisk, koncis C-stil, og er på denne måde en typisk repræsentant for den programmeringsstil, som dyrkes af mange C programmører. Omskriv programmet (stadig med brug af en while-økke) således at assignments (ala *=) og increments (++) kun har en effekt på variable, men uden direkte at anvende disse i udtryk, som det er gjort i ovenstående program. Det er også interessant at omskrive programmet, så det bruger en for-løkke i stedet for en while-løkke. Prøv dette! Vurder selv hvilken udgave af programmet du foretrækker. |
| Opgave 3.8. Sum af tal i interval som er dividerbare med samme tal | I denne opgave gives tre heltal m, n og k, hvor k er større end 1. Skriv en funktion der adderer alle heltal mellem m og n (inklusive) hvor i k går op. Eksempler:
Denne opgave stammer fra bogen C by Dissection - anvendt med tilladelse fra forlaget. |
| Opgave 3.8. Endnu en sum af tal i et interval | Skriv et program som læser et heltal n. Programmet skal addere alle tal i intervallet fra n til 2 * n hvis n er ikke negativ. Hvis n er negativ, skal programmet addere tallene fra 2 * n til n. Skriv først en version med for-løkker. Dernæst en version med while løkker. Denne opgave stammer fra bogen C by Dissection - anvendt med tilladelse fra forlaget. |
| Gentagelse med do (1) Slide Indhold Stikord Referencer |
|
| Syntax: Syntaksen af en do-løkke i C |
|
| Figur. Flow graf for en do løkke | ![]() |
| Gentagelse med do (2) Slide Indhold Stikord Referencer |
|
| Program: Et program som ønsker et 'yes/no' svar. |
|
| Gentagelse med for (1) Slide Indhold Stikord Referencer |
|
| Syntax: Opbygningen af en for-løkke i C. |
|
| Program: En typisk for-løkke med et forudbestemt antal gentagelser. |
|
|
| Gentagelse med for (2) Slide Indhold Stikord Referencer |
|
| Program: En for løkke med to kontrol variable. |
|
| Program: Euclids algoritme - største fælles divisor - programmeret med en for-løkke 'uden krop'. |
|
|
| Program: En for løkke, der optæller en variabel uendeligt. |
|
|
| Opgave 3.9. Generering af grafik-filer | I denne opgave vil vi generere grafik filer med flotte mønstre. Vi vil benytte et meget simpelt fil-format, Portable Pixmap (PPM), som du kan læse om i notatet Simple Image File Formats på nettet. Se også Wikipedia artiklen Netpbm format, som giver et godt overblik over formatet. Her følger et velkommenteret C program, som genererer et 500 x 500 rødt rektangel: #include <stdio.h>
int main(void) {
FILE *image_file; // The file on which to write the image
int i, j;
image_file = fopen("image-file-1.pnm", "wb"); // Open a file for writing.
fputs("P6\n", image_file); // Write the header, including the
// so-called magic number P6
fputs("500 500\n", image_file); // Width: 500, Height: 500
fputs("255\n", image_file); // 255 colors per byte.
for(i = 0; i < 500; i++)
for (j = 0; j < 500; j++){
fputc(255, image_file); // Writing the red byte
fputc(0, image_file); // Write the green byte
fputc(0, image_file); // Write the blue byte
}
fclose(image_file); // Close the file.
return 0;
}
Her er en variation af programmet, som genererer et lidt mere spændende resultat: #include <stdlib.h>
#include <stdio.h>
int main(void) {
FILE *image_file;
int i, j;
int r, g, b;
image_file = fopen("image-file-4.pnm", "wb");
fputs("P6\n", image_file);
fputs("500 500\n", image_file);
fputs("255\n", image_file);
for(i = 0; i < 500; i++)
for (j = 0; j < 500; j++){
r = i % 256; g = j % 256; b = (i+j) % 256;
fputc(r, image_file); fputc(g, image_file); fputc(b, image_file);
}
fclose(image_file);
return 0;
}
Begge programmer udskriver, via den ydre for-løkke, RGB bytes (red, green, blue) række for række. Den kreative udfordringen består i at lave flotte mønstre ved at variere programmerne ovenfor. I denne opgave er det dog en betingelse at de to for-løkker, som kontrollerer hhv. række og søjler i bitmønstret, bibeholdes. Du skal ikke forsøge at lave et stort array af RGB værdier, og ændre i dette. Senere i kurset vil vi udvikle varianter af programmet, som gør det meget mere fleksibelt at tegne forskellige geometriske figurer i en stor tabel (array) af pixels. Det er naturligvis vigtigt, at du kan se den grafik som genereres af dit program. Her er et antal muligheder, som jeg ved virker:
|
| Komma operatoren Slide Indhold Stikord Referencer |
|
|
| Program: Eksempler på brug af komma operatoren - gode og dårlige. |
|
| Program: Output fra programmet. |
|
|
| Klassificering af gentagelser Slide Indhold Stikord Referencer |
|
|
| Eksempler Slide Indhold Stikord Referencer |
|
| Program: Eksempel på counter controlled loop. |
|
| Program: Eksempel på sentinel-controlled loop. |
|
| Program: Eksempel på sentinel-controlled loop - med typisk fejl. |
|
| Program: Eksempel på sentinel-controlled loop - med typisk fejl og forklaring. |
|
| Program: Et forsøg på at lave sentinel controlled loop med do-while - med fejl. |
|
| Program: Et forsøg på at lave sentinel controlled loop med do-while - med fejl og forklaring. |
|
| Program: Et forsøg på at lave sentinel controlled loop med do-while - nu OK. |
|
| Program: Eksempel på input validation loop. |
|
| Program: Eksempel på input validation loop - med særlig håndtering af første prompt. |
|
| Program: Eksempel på general condition loop - Euclids algoritime igen. |
|
| Nestede gentagelser Slide Indhold Stikord Referencer |
|
| Program: Et eksempel på indlejrede gentagelser. |
|
| Program: Program output. |
|
|
| Program: Et andet eksempel på indlejrede gentagelser - et kvadrat af bogstaver fra A - Z. |
|
| Program: Program output. |
|
| Break, continue og return Slide Indhold Stikord Referencer |
|
|
| Program: Illustration af break og continue i en for-løkke. |
|
|
| Konvertering af do og for løkker til while Slide Indhold Stikord Referencer |
|
| Tabel. |
|
|
| Den næste afleveringsopgave Slide Indhold Stikord Referencer |
|
| Her er opgaven |
| Dagens Gruppeopgaver Slide Indhold Stikord Referencer |
|
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: 11. oktober 2012, 08:57:43