Presentation laddar. Vänta.

Presentation laddar. Vänta.

Anders Sjögren Enkelt program med funktion /* two_func.c - a program that uses two functions in one file */ /* from Stephen Prata C Primer Plus ISBN 1-57169-161-8.

Liknande presentationer


En presentation över ämnet: "Anders Sjögren Enkelt program med funktion /* two_func.c - a program that uses two functions in one file */ /* from Stephen Prata C Primer Plus ISBN 1-57169-161-8."— Presentationens avskrift:

1 Anders Sjögren Enkelt program med funktion /* two_func.c - a program that uses two functions in one file */ /* from Stephen Prata C Primer Plus ISBN 1-57169-161-8 */ #include #include void butler(void); /* ANSI C function prototype */ int main( void) { printf("I will summon the butler function.\n"); butler(); printf("Yes. Bring me some tea.\n"); system("PAUSE"); return 0; } void butler(void) /* start of function definition */ { printf("You rang, sir?\n"); }

2 Anders Sjögren Funktioner något in och något annat ut Parametrar Returvärde Funktion

3 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

4 Anders Sjögren Funktioner Exempel nu kör vi ränteberäknings- programmet igen. De här bilderna har du sett förut!

5 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); } system("PAUSE"); return 0; } många satser efter varandra gör programmet oöverskådligt - dela upp koden i funktioner

6 Anders Sjögren Att konstruera en funktion Funktionskonstruktion. Dela upp programmet m h a del- (under-) program.

7 Anders Sjögren Klipp ut! /* 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); } system("PAUSE"); return 0; } Klipp ut!

8 Anders Sjögren Kvar i main … /* 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); system("PAUSE"); return 0; } OK!

9 Anders Sjögren Klistra in! 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

10 Anders Sjögren Definiera den nya funktionen. 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! lägg till! ändra!

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 returtyp - utdatatyp funktionens namn funktionens formella parametrar (argument) - indata funktionsprototyp, funktionshuvud

12 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

13 Anders Sjögren Funktionsdeklaration och funktionsanrop /* 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 i stommen, main() - funktionen

14 Anders Sjögren Parameter i stället för konstant 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; } Ändra detta, man kan nu ange antal år vid exekveringen.

15 Anders Sjögren Översikt – hela programmet en översiktsbild 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); } system(”PAUSE”); return; } stommen funktionen

16 Anders Sjögren Översikt, funktionsdeklaration och funktionsdefinition 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 En hatt i taget … /* 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 Funktionsanrop Hur anropas en funktion? Vad händer då en funktion anropas och exekveras?

19 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 ); system("PAUSE"); return 0; }

20 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; }

21 Anders Sjögren Main’s aktiveringspost på ”stacken” 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

22 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.

23 Anders Sjögren Aktuella och formella parametrar 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

24 Anders Sjögren antalAr=1 kapital=100 ar=2 kapital=108.5 antalAr=1 Funktionens aktiveringspost 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

25 Anders Sjögren Aktiveringsposterna tas bort 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()

26 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

27 Anders Sjögren Rekursion en funktion som anropar ”sig själv”

28 Anders Sjögren Fakultetsfunktionen – ett klassiskt exempel 5! = 5  4  3  2  1 5! = 5  4! 4! = 4  3! 3! = 3  2! 2! = 2  1! 0! = 1 Värdeöverföringen, ”kopiorna”, möjliggör rekursion … int nfak( int n ) { if (n<=0) return (1); else return ( n * nfak( n-1)); } anropar sig själv med n-1 slut

29 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 ); system("PAUSE") return 0; } int nfak( int n ) { if (n<=0) return (1); else return ( n * nfak( n-1)); }

30 Anders Sjögren Vad är det som händer? Stack Bytes Heap tid primärminnet main() fak3 fak=3, svar=?

31 Anders Sjögren Vad är det som händer? Stack Bytes Heap tid main()main() n=3 nfak(3) fak=3, svar=? 3 3

32 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

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) main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) fak=3, svar=? Heap 1 1

34 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=?

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) main() n=3 nfak(3) n=2 nfak(2) n=1 nfak(1) n=0 nfak(0) fak=3, svar=? Heap 0

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) 1 fak=3, svar=?

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) main() n=3 nfak(3) n=2 nfak(2) n=1 1 1 fak=3, svar=? 11

38 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

39 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

40 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

41 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 nfak(fak)

42 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() ); system("PAUSE"); return 0; } void SkrivBaklanges( int tecken){ if (tecken != '\n') { SkrivBaklanges( getchar() ); putchar( tecken ); } return ; }

43 Anders Sjögren Provkör på övningen … /* backwards.c Reprints what you type but backwards */ /* recursive function */ #include #include void SkrivBaklanges( int); int main(void) { printf( "Skriv tecken ( avsluta med Enter ) --> "); SkrivBaklanges( getchar() ); printf("\n"); system("PAUSE"); return 0; } void SkrivBaklanges( int tecken) { if (tecken != '\n') SkrivBaklanges( getchar()); putchar( tecken ); }

44 Anders Sjögren C:s minnessegment


Ladda ner ppt "Anders Sjögren Enkelt program med funktion /* two_func.c - a program that uses two functions in one file */ /* from Stephen Prata C Primer Plus ISBN 1-57169-161-8."

Liknande presentationer


Google-annonser