Kurt Nørmark
Institut for Datalogi, Aalborg Universitet
Sammendrag Forrige lektion Næste lektion Stikord Referencer Indhold | I denne lektion gennemgår vi funktions- og procedure begrebet, herunder lokale variable og parametre. Vi ser naturligvis også på detaljer omkring funktioner i C. |
C funktioner med output parametre |
Output fra funktioner Slide Indhold Stikord Referencer |
|
|
Single eller multiple return Slide Indhold Stikord Referencer |
Begrebet single return: En funktion har single return hvis der kun findes én return sætning i slutningen af funktionen | ||
Begrebet multiple return: En funktion har multiple return hvis der findes to eller flere return sætninger spredt i funktionen |
Program: Funktionen daysInMonth - med single return. |
|
Program: Funktionen daysInMonth - med multiple return. |
|
|
Introduktion til Pointere (1) Slide Indhold Stikord Referencer |
|
Figur. En variabel v og en pointer til v | ![]() |
Introduktion til Pointere (2) Slide Indhold Stikord Referencer |
|
Figur. En variabel v og en pointer til v | ![]() |
Program: Et tilsvarende C program - lettere udvidet. |
|
Program: Program output. |
|
To operatorer knyttet til pointere Slide Indhold Stikord Referencer |
|
|
|
|
Output parametre i scanf Slide Indhold Stikord Referencer |
|
Program: . |
|
|
Output parametre - ift. input parametre Slide Indhold Stikord Referencer |
|
Figur. Værdi parametre (til input) og reference parametre (til output) | ![]() |
Program: Funktionen f modtager værdierne af to variable som input - figur til venstre. |
|
Program: Samme som ovenfor - sammenfaldende navnet af formelle og aktuelle parametre - intet ændret. |
|
Program: Program output. |
|
Program: Samme som ovenfor - men vi forsøger at bruge i og j fra main i f. |
|
Program: Funktionen f modtager værdierne af to udtryk som input. |
|
Program: Program output. |
|
Program: Funktionen f ændrer på værdierne af de to formelle parametre. |
|
Program: Program output. |
|
Program: Funktionen f ændrer på værdierne af de to lokale variable. |
|
Program: En funktion g der modtager to pointere til variable som input - med henblik på tilbageføring af output - figur til højre. |
|
Program: Program output. |
|
Program: En funktion g der modtager to pointere til udtryk som input - Giver ikke mening. |
|
Program: Der udføres pointer aritmetik på pointerne - usikkert og uden god mening. |
|
Program: Program output. |
|
Program: Tilbageføring af output fra g med scanf. |
|
Program: Program input og output. |
|
Eksempel: Rødder i en andengradsligning Slide Indhold Stikord Referencer |
|
|
Program: En funktion der finder rødder i en andengradsligning - både input og output parametre. |
|
|
|
Opgave 6.4. Celcius til fahrenheit med output parameter | Vi har tidligere programmeret en simpel funktion, der omregner fra en celcius temperatur til fahrenheit temperatur. Det er helt naturligt at celcius temperaturen er en call by value input parameter. Ligeledes er det naturligt at fahrenheit temperaturen returneres med return fra funktionen. Omskriv nu funktionen således at fahrenheit temperaturen returneres gennem en output parameter - en pointer. Omskriv også main, således at kaldet ændres til denne nye parameterprofil. Hvilken version foretrækker du? |
Opgave 6.4. Timer, minutter og sekunder - igen, igen | Vi har på et tidligt tidspunkt i kurset skrevet et program, som omregner et antal sekunder til timer, minutter og sekunder efter de sædvanlige principper. Skriv nu en funktion, hours_minutes_seconds, som tager antal af sekunder som en input parameter, og som returnerer de tre outputs (timer, minutter og sekunder) som output parametre (pointere, call-by-reference). |
Opgave 6.4. Seddeludlevering i pengeautomat | Dette program handler om seddeludlevering fra en amerikansk pengeautomat, hvor der kun anvendes 100, 50, 20 og 10 dollar sedler. Målet med programmet er at arbejde med både input og outputparametre af en funktion. Programmet skal som input acceptere et dollar beløb, der er dividerbart med 10. Programmet skal beregne antallet af udleverede 100, 50, 20 og 10 dollar sedler svarende til beløbet. Der skal udleveres så få sedler som muligt. Problemet skal løses med en funktion der tager både input og output parametre. Beløbet, der skal veksles, skal være en input parameter. Antallet af udleverede 100, 50, 20 og 10 dollar sedler skal være output parametre. |
Pointere og Konstanter Slide Indhold Stikord Referencer |
|
|
Program: Ekspempler på forkellige former for konstanter og pointere. |
|
Rekursive funktioner |
Introduktion til rekursive funktioner Slide Indhold Stikord Referencer |
|
|
Program: Et program med en rekursivt defineret fakultetsfunktion. |
|
Program: Et tilsvarende program med en iterativ fakultetsfunktion. |
|
Program: Output fra ovenstående programmer. |
|
|
Program: En rekursiv version af funktionen findRootBetween. |
|
Program: Den iterative version af funktionen findRootBetween - for reference . |
|
Program: Hele rodsøgningsprogrammet. |
|
|
Pointere til funktioner |
Pointere til funktioner Slide Indhold Stikord Referencer |
|
Program: Funktionen combine som modtager en funktion som parameter. |
|
|
Program: Rodsøgning i en funktionen, som overføres som parameter til findRootBetween. |
|
Program: En version uden dereferencing og address operator på funktionerne. |
|
|
|
Opgave 6.5. En funktion som kalder en anden funktion flere gange | Skriv en funktion multi_apply med tre parametre:
multi_apply(f, n, s) skal beregne og returnere f(f( ... f(s))), hvor f kaldes n gange. Eksempelvis - og mere konkret - skal multi_apply(f, 4, 16.0) beregne og returnere f(f(f(f(16.0)))). Afprøv f.eks. dit program hvor den aktuelle første parameter til multi_apply er double half(double x){ return x/2; } på følgende måde multi_apply(half, 4, 16.0) Hvilken værdi forventer du at se fra dette kald? Som en variant af ovenstående kan du overveje at programmere multi_apply_2 med følgende fire parametre:
multi_apply_2(f, g, n, s) skal beregne og returnere (f (g (f (g ... (f (g s)))))), hvor både f og g kaldes n gange. Eksperimenter med forskellige kald af multi_apply_2. |
Coding Style |
Indrykning Slide Indhold Stikord Referencer |
|
Program: K & R Style. |
|
Program: K & R Style, med curly braces om enkelt sætninger. |
|
Program: Mindre variant af K & R style. Alternativ opsætning af else. |
|
Program: Meget kompakt formatering - ofte anvendt i disse noter. |
|
Program: Allman style. |
|
Program: Whitesmiths style. |
|
Program: Inkonsistent indrykning - blandet anvendelse af indrykningsreglerne. |
|
Program: Inkonsistent indrykning - ujævn mængde af indrykning. |
|
Program: Udrykning - ikke indrykning. |
|
Program: Så bliver det ikke meget værre... |
|
Variabelnavne Slide Indhold Stikord Referencer |
|
Program: Lower camel case. |
|
Program: Upper camel case. |
|
Program: Underscore. |
|
|
Program: Brug af meget korte navne. |
|
Program: Hungarian notation - forkortede typenavne anvendt som prefix på alle variable. |
|
Program: All caps - som et eksempel på at små/store bogstaver kan bruges til at signalere rollen af navne. |
|
Ekstra Opgaver |
Ekstra Opgaver Slide Indhold Stikord Referencer |
Opgave 6.7. En simpel lommeregner | Skriv et program der modellerer en simpel lommeregner. Som altid udvikler vi programmet top-down, med trinvis forfinelse. Lommeregneren holder styr på ét enkelt tal, som indholder 'det hidtidige beregnede resultat': akkumulatoren (som starer med at være 0.0). Hver input-line skal bestå af den næste operation (binær), som skal udføres, efterfulgt af den højre operand til denne operation. (En binær operator tager to operander). Vi antager her at den venstre operand er akkumulatoren (den beregnede værdi, i starten 0.0). Således udfører lommeregneren i hvert trin følgende: akkumulator operation højre_opperand Det anbefales at operationen som lommeregneren skal udføre indlæses som en char med scanf. Den næste højre operand læses naturligvis som en double. Her er en god måde at indlæse disse på: scanf(" %c %lf", ...) Space tegnet foran %c kan være ganske vigtig. Hvorfor? (Læs evt. side 87 i Problem Solving and Program Design in C, 8th edition for at lære mere om dette). Du skal have en funktion, scan_data, med to output parametre som returnerer en operator og den højre operand fra en data linje, som brugeren taster efter en prompt. (Normalt anbefaler vi at printf/scanf foregår i main. Men som her kan vi naturligvis også have enkelte funktioner, som abstraherer over bruger input/output fra tastatur/skærm). Du skal også have en funktion, do_next_op, som udfører den påkrævede operation: do_next_op skal have to input parametre (operator og operand) foruden akkumulatoren, som både skal kunne bruges til input og output (og som derfor skal være en pointer). Her er de gyldige operationer i lommeregneren: + for addition - for subtraktion * for multiplikation / for division ^ for potensopløftning q for at komme ud af lommeregneren med slutresultatet Din lommeregner skal vise den akkumulerede værdi efter hver operation. Her er et eksempel på en dialog med lommeregneren - som det ser ud når du får skrevet dit program: Enter operator and operand: + 5.0 Result so far is 5.0 Enter operator and operand: ^ 2 Result so far is 25.0 Enter operator and operand: / 2.0 Result so far is 12.5 Enter operator and operand: q 0 Final result is 12.5 (Denne opgave svarer til opgave 10 side 360 i 6. udgave af lærebogen, og den minder om opgave 10 side 391 i 7. udgave). |
Opgave 6.7. En valutaomregner | Skriv et C program som konverterer valuta i dollars til euro, kroner, rubler og yen. I kan antage en én dollar er 0.89 euros, 6.66 kroner, 66.43 rubler og 119.9 yen. I denne opgave skal der indgå en funktion med én input parameter (dollar-beløbet), og fire output parametre (svarende til de fire andre valutaer). Brug funktionen til at udskrive en omregningstabel til omregning af 1, 2, 3, ... 100 dollars til de fire andre valutaer. (Denne opgave svarer til programmeringsprojekt 1, side 384 i 7. udgave af lærebogen). |
PPM Grafik |
PPM grafik funktioner Slide Indhold Stikord Referencer |
|
|
|
Program: Header filen pixel.h. |
|
Program: Den tilsvarende fil pixel.c - en mulig implementation. |
|
Program: Header filen ppm.h. |
|
Program: Den tilsvarende fil ppm.c - en mulig implementation. |
|
|
Program: Et simpelt program der genererer og udskriver et PPM billede. |
|
Program: Makefilen som styrer oversættelsen af programmerne. |
|
|
Kapitel 6: Mere om Funktioner
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:59:10