6.1 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?
6.2 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).
6.3 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.
6.4 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.
6.5 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).
6.6 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).
Genereret: Mandag 9. maj 2022, 13:59:10