![]() ![]() ![]() | Funktioner |
Nøgleordet i dette og de følgende afsnit er abstraktion. I C udgøres den primære abstraktionsmekanisme af funktioner.
Ideen i dette kapitel er at introducere og motivere abstraktioner og funktioner via analogier fra gastronomien. Programmer kan opfattes som opskrifter på beregninger. Vi taler i denne sammenhæng om algoritmer. I den gastronomiske verden kender vi også til opskrifter, nemlig opskrifter på det at lave mad.
Vi studerer således indledningsvis en lasagne opskrift. God appetit!
|
10.1. Lasagne al forno
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
Herunder viser vi en opskrift på lasagne al forno. Vi kan karakterisere den som en sekvens af trin, som vi antager vil kunne udføres af en mad fortolker. Uheldigvis har vi ikke (endnu) en automatiseret fortolker, som kan eksekvere opskriften. Vi må give den til en kyndig person (en kok, f.eks.) for hvem de enkelte trin giver mening. Vi vil her antage, at de enkelte trin er tydelige og klare for den person eller maskine, som effekturerer opskriften til en varm og lækker ret.
|
Alle som har lavet lasagne vil vide, at denne ret laves af kødsovs, hvid sovs, og pasta. Vi ser det således som en svaghed, at disse abstraktioner ikke har fundet indpas i opskriften. Indførelse af abstraktioner vil være vores næste træk.
10.2. Struktureret lasagne
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
Struktureret lasagne er nok ikke på menukortet i mange restauranter. Men strukturerede lasagneopskrifter, ala den vi viser i program 10.1 er almindelige i mange kogebøger.
I en mere struktureret opskrift indgår delopskrifter på lasagneplader, hvid sovs og kødsovs |
1 2 3 4 5 6 7 8 9 | Lav en dobbelt portion lasagneplader. Lav en portion hvid sovs. Lav en portion kødsovs. Bland nu lagvis pastabaner, kødsovs og hvid sovs. Drys med paramesanost. Gratiner retten i ovnen 15 minutter ved 225 grader. | |||
|
De tre fremhævede linier aktiverer abstraktioner (delopskrifter) for hhv. det at lave lasagneplader (for vi køber dem nemlig ikke færdige i Bilka), hvid sovs, og kødsovs. Vi tænker på de sidste to trin som basale trin, der kan genkendes fra opskriften i afsnit 10.1.
Men vi skal naturligvis også beskrive, hvad det vil sige at lave plader, hvid sovs og kødsovs. Hver delopskrift indkapsler en række madlavningstrin. Vi viser de tre madlavningsabstraktioner i hhv. program 10.2, program 10.3 og program 10.4.
1 2 3 | Bland og ælt 500 g durum hvedemel, 5 æg, lidt salt og 2 spsk olie; Kør pastaen gemmen en pastamaskine i tynde baner; | |||
|
1 2 3 | Smelt 3 spsk smør, og rør det sammen med 3 spsk mel; Spæd med med 5 mælk og kog sovsen under svag varme; | |||
|
1 2 3 4 5 6 7 | Svits 2 hakkede løg med 500 g hakket oksekød, samt salt og pebber; Tilsæt 3 spsk tomatpuré, en ds. flåede tomater og 3 fed knust hvidløg; Kog kødsovsen 10 minutter; | |||
|
Vi kunne forsøge at strække analogien lidt længere. For det første kunne vi forsøge os med en generalisering af en delopskrift til at dække forskellige retter med fælles kendetegn. En realistisk og brugbar generalisering kunne være omfanget af delretten (enkelt portion, dobbelt portion, etc.).
For det andet kunne vi forsøge os med opskrifter, som skulle bruge en given delopskrift mere end én gang. Dette er måske urealistisk i den gastronomiske verden, i det mindste relativ til denne forfatters begrænsede gastronomiske forestillingsevner.
Anvendelser af delopskrifter højner abstraktionsniveauet og muliggør genbrug af basale opskrifter. Delopskrifter svarer til procedurer i programmeringssprog. Brug af parametre generaliserer en opskrift så den bliver mere alsidig. |
10.3. Lasagne ala C
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
Lad det være sagt klart og tydeligt allerede her - du får aldrig lasagne ud af din C compiler og fortolker. Alligevel forsøger vi os i program 10.5 med et C lignende program for den strukturerede lasagneopskrift, vi nåede frem til i afsnit 10.2.
I program 10.5 ser vi tre såkaldte funktionsprototyper lige efter include. Disse annoncerer at der er abstraktioner som hedder make_lasagne_plates make_white_sauce, og make_meat_sauce. Disse er nødvendige for at kunne anvende funktionerne i hovedopskriften. Så kommer hovedprogrammet, som altid i C hedder main. Efter denne ser vi implementeringen af de tre annoncerede funktioner.
At vi har forfattet program 10.5 på engelsk betyder naturligvis ikke alverden. Som regel foretrækker jeg at angive navne, kommentarer mv. i programmer på engelsk, for at opnå den bedste mulige helhed ift. selve programmeringssproget. Men det er udtryk for 'smag og behag'.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <stdio.h> void make_lasagne_plates(void); void make_white_sauce(void); void make_meat_sauce(void) int main(void) { make_lasagne_plates(); make_white_sauce(); make_meat_sauce(); mix plates, meat sauce, and white sauce; sprinkle with paramesan cheese; bake 15 minutes at 225 degrees; return 0; } void make_lasagne_plates(void) { mix flour, egs, salt and oil; process the pasta in the pasta machine; } void make_white_sauce(void) { melt butter and stir in some flour; add milk and boil the sauce; } void make_meat_sauce(void){ chop the onion, and add meat, salt and pebber; add tomatos and garlic; boil the sauce 10 minutes; } | |||
|
Det er hermed slut på det gastronomiske kvarter. I kapitel 11 fortsætter vi vores indledende udforskning af abstraktioner og funktioner i en meget simpel grafisk verden.