Index over opgaver i denne lektion   Alfabetisk indeks   Kursets hjemmeside   

Opgaver
Mere om Funktioner


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:

  1. En funktion f fra double til double. f er en pointer til en funktion.
  2. Et heltal n der angiver hvor mange gange f skal kaldes.
  3. En double s, som angiver den værdi som f bliver kaldt på første gang (i det 'inderste' kald).

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:

  1. En funktion f fra double til double
  2. En funktion g fra double til double
  3. Et heltal n der angiver hvor mange gange f og g skal kaldes
  4. En double s, som angiver den værdi som g bliver kaldt på første gang (i det 'inderste' kald).

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