Ladda ner presentationen
Presentation laddar. Vänta.
1
Anders Sjögren Funktioner något in och något annat ut
2
Anders Sjögren Funktioner ger en klarare bild tyvärr så klarar inte människan att ”hålla hur många bollar (hattar) i luften som helst” förmågan att se samband och konsekvenser mellan samtidiga skeénden är begränsad. Fundera t ex på hur många tal du kan memorera om någon räknar upp dem för dig. kanske klarar du 7 st men ofta hamnar man på 3-4 st. med funktioner kan man dela upp sin källkod i del- (under-) program för att få överblick, se samband och konsekvens varje delprogram ( funktion ) löser en avgränsad deluppgift
3
Anders Sjögren Funktioner Exempel nu kör vi ränteberäknings- programmet igen. De här bilderna har du sett förut!
4
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return 0; } många satser efter varandra gör programmet oöverskådligt - dela upp koden i funktioner
5
Anders Sjögren Att konstruera en funktion Funktionskonstruktion. Dela upp programmet m h a del- (under-) program.
6
Anders Sjögren Att konstruera en funktion /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return 0; } Klipp ut! Det är denna del av programmet som skapar tabellen - en avgränsad deluppgift.
7
Anders Sjögren Att konstruera en funktion /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); return 0; } OK!
8
Anders Sjögren Att konstruera en funktion printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } Definiera den nya funktionen! klistra in ! Denna kod klistras in sist i källkodsfilen, efter ”stommen” stomme
9
Anders Sjögren Att konstruera en funktion void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } Definiera den nya funktionen! En funktion har samma uppbyggnad som main(), som ju också är en funktion. lägg till! ändra!
10
Anders Sjögren Funktionens delar void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } Definiera den nya funktionen! funktionens returtyp - utdatatyp funktionens namn funktionens formella parametrar (argument) - indata funktionsprototyp, funktionshuvud
11
Anders Sjögren Funktionens delar void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } Definiera den nya funktionen! funktionens egen variabel, okänd utanför funktions- kroppen indatavariablerna, som bara är kända i funk- tionen används i funktionen
12
Anders Sjögren Att konstruera en funktion /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); TabellPaSkarmen( ANTAL_AR, kapital ); return 0; } lägg till funktions- deklaration och funktions- anrop här skall funktions- definitionen in
13
Anders Sjögren Att konstruera en funktion här skall funktions- definitionen in /* Beräknar kapitaltillväxt på x år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intar, antalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } ändradetta, man kan nu ange antal år vid exekveringen.
14
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler en översikts- bild av hela programmet /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; }
15
Anders Sjögren Att konstruera en funktion en översiktsbild av hela program- met /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } stommen, som ju också är en funktion. funktionen
16
Anders Sjögren Att konstruera en funktion en översiktsbild av hela program- met /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } funktionsdeklaration, för att kompilatorn skall kunna kontrollera att man använder funktionen rätt funktionsdefinition
17
Anders Sjögren Att konstruera en funktion /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } Å va bra! Nu tar jag en hatt åt gången!
18
Anders Sjögren Ett C-program byggs upp av satser i sekvens styrande satser –iteration –selektion funktioner flera filer (så småningom) /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; }
19
Anders Sjögren Funktionsanrop Hur anropas en funktion? Vad händer då en funktion anropas och exekveras?
20
Anders Sjögren Funktionsanrop exempel /* Beräknar kapitaltillväxt på x år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; }
21
Anders Sjögren Vad händer då man definierar ett minne ? /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; }
22
Anders Sjögren Datorns primärminne main() exekveras Maskinkod programmet Heap Stack Bytes antalAr=1 kapital=100 main() tid int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ? "); printf("(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } main’s ”egna” variabler skapas på stacken - aktiveringspost
23
Anders Sjögren Hur måste TabellPaSkarmen() se ut ? void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ? "); printf("(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ? "); printf("(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } funktionen anropas, (aktuella parametrar) dessa variabelnamn kan vara lika men behöver inte vara det.
24
Anders Sjögren Datorns primärminne TabellPaSkarmen() exekveras Maskinkod programmet Heap Stack Bytes antalAr=1 kapital=100 antalAr=1 kapital=100 main() ar=?? kapital=100 tidTabellPaSkarmen() antalAr=1 void TabellPaSkarmen(int antalAr, float kapital) { int ar ; void TabellPaSkarmen(int antalAr, float kapital) { int ar ; de aktuella para- metrarna anpassas och kopieras till funktionens formella parametrar
25
Anders Sjögren antalAr=1 kapital=100 ar=2 kapital=108.5 antalAr=1 Datorns primärminne TabellPaSkarmen() exekveras Maskinkod programmet Heap StackBytes tidTabellPaSkarmmen() for ( ar = 1; ar <= antalAr; ar++ ) kapital = kapital * ( 1 + RANTESATS/100 ); for ( ar = 1; ar <= antalAr; ar++ ) kapital = kapital * ( 1 + RANTESATS/100 ); antalAr=1 kapital=100 antalAr=1 kapital=100 ar=?? kapital=100 antalAr=1 kapital=100 ar=1 kapital=108.5 antalAr=1 main()main() satserna i funktionen utförs
26
Anders Sjögren Datorns primärminne TabellPaSkarmen() dör main() dör - exekvering slut tid antalAr=1 kapital=100 main() TabellPaSkarmen() Maskinkod programmet Heap StackBytes antalAr=1 kapital=100 ar=2 kapital=108.5 antalAr=1 main()
27
Anders Sjögren Värdeöverföring Talen 1 och 100 har värdeöverförts, kopierats in i funktionen TabellPaSkarmen() Att nu förändra kopian ändrar inte på originalet TabellPaSkarmen() main() antalAr=1 kapital=100 ar=?? kapital=100 antalAr=1
28
Anders Sjögren Rekursion en funktion anropar sig själv
29
Anders Sjögren Rekursion n-fakultet, ett klassiskt exempel AaBbCcDdEeFfGgHhIiJjKkLlMmNn 0! = 1 1! = 1 2! = 1 · 2 = 2 3! = 1 · 2 · 3 = 6.......... n! = 1 · 2 ·... (n-1) · n
30
Anders Sjögren Rekursion n-fakultet, ett klassiskt exempel #include int nfak( int ) ; int main( void ) { int fak, svar ; printf( "Ge fakultet --> " ); scanf("%d", &fak); svar = nfak(fak); printf("\nSvar: %d! = %d ", fak, svar ); return 0; } int nfak( int n ) { if (n<=0) return (1); else return ( n * nfak( n-1)); } anropar sig själv med n-1 slut NFAK1.EXE
31
Anders Sjögren Vad är det som händer? Stack Bytes Heap tid primärminnet main() fak3 fak=3, svar=?
32
Anders Sjögren Vad är det som händer? Stack Bytes Heap tid main()main() n=3 nfak(3) fak=3, svar=? 3 3
33
Anders Sjögren Vad är det som händer? Stack Bytes Heap tid main()main() n=3 nfak(3) main() nfak(3) n=2 nfak(2) fak=3, svar=? Heap 2 2
34
Anders Sjögren Vad är det som händer? Stack Bytes Heap tid main()main() n=3 nfak(3) main() nfak(3) n=2 nfak(2) main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) fak=3, svar=? Heap 1 1
35
Anders Sjögren Vad är det som händer? Bytes tid main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) fak=3, svar=?
36
Anders Sjögren Vad är det som händer? Bytes tid main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) n=0 nfak(0) fak=3, svar=? Heap 0
37
Anders Sjögren Vad är det som händer? Bytes tid main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) n=0 nfak(0) 1 fak=3, svar=?
38
Anders Sjögren Vad är det som händer? Bytes tid main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) n=0 nfak(0) main() n=3 nfak(3) n=2 nfak(2) n=1 1 1 fak=3, svar=? 11
39
Anders Sjögren Vad är det som händer? Bytes tid main() main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) n=0 nfak(0) main() n=3 nfak(3) n=2 nfak(2) n=1 1 1 n=3 nfak(3) n=2 nfak(2) 2 fak=3, svar=? 21
40
Anders Sjögren Vad är det som händer? Bytes tid main() main() main() n=3 nfak(3) n=2 nfak(2) n=1 1 n=3 nfak(3) n=2 nfak(2) fak=3, svar=? 2 n=3 nfak(3) 6 32
41
Anders Sjögren Vad är det som händer? Bytes tid main() main() main() 32 n=3 nfak(3) n=2 nfak(2) 2 n=3 nfak(3) 6 fak=3, svar=6fak=3, svar=? program- slut 63
42
Anders Sjögren Rekursion n-fakultet, ett klassiskt exempel #include int nfak( int ) ; int main( void ) { int fak, svar ; printf( "Ge fakultet --> " ); scanf("%d", &fak); svar = nfak(fak); printf("\nSvar: %d! = %d ", fak, svar ); return 0; } int nfak( int n ) { if (n<=0) return (1); else return ( n * nfak( n-1)); } variabeln svar behövs inte NFAK1.EXE nfak(fak)
43
Anders Sjögren Rekursion tillämpning man kan använda rekursion för att vända på dataföljder #include void SkrivBaklanges( int ); int main( void ){ printf("Skriv tecken ( avsluta med Enter )--> "); SkrivBaklanges( getchar() ); return 0; } void SkrivBaklanges( int tecken){ if (tecken != '\n') { SkrivBaklanges( getchar() ); putchar( tecken ); } return ; } SKRIVBAK.EXE
44
Anders Sjögren Slut Övningsuppgift, se anteckningar
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.