Presentation laddar. Vänta.

Presentation laddar. Vänta.

Anders Sjögren Funktioner något in och något annat ut.

Liknande presentationer


En presentation över ämnet: "Anders Sjögren Funktioner något in och något annat ut."— Presentationens avskrift:

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!

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 ?(--> )--> "); 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 ?(--> )--> "); 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 ?(--> )--> "); 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 ?(--> )--> "); 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 ?(--> )--> "); 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 ?(--> )--> "); 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 ?(--> )--> "); 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 ?(--> )--> "); 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("(--> )--> "); 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("(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ? "); printf("(--> )--> "); 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 = 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


Ladda ner ppt "Anders Sjögren Funktioner något in och något annat ut."

Liknande presentationer


Google-annonser