1 / 44

Enkelt program med funktion

Enkelt program med funktion.

gayora
Télécharger la présentation

Enkelt program med funktion

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Enkelt program med funktion /* two_func.c - a program that uses two functions in one file *//* from Stephen PrataC Primer Plus ISBN 1-57169-161-8 */#include <stdio.h> #include <stdlib.h> 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. Funktionernågot in och något annat ut Parametrar Funktion Returvärde

  3. Funktionerger 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 sinkällkod i del- (under-) program för att få överblick, se samband och konsekvens • varje delprogram ( funktion ) löseren avgränsad deluppgift

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

  5. 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 <stdio.h> #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { float kapital ; int ar ; 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. Att konstruera en funktion Funktionskonstruktion.Dela upp programmet m h a del- (under-) program.

  7. Klipp ut! /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include <stdio.h> #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { float kapital ; int ar ; 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. Kvar i main … /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include <stdio.h> #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { float kapital ; int ar ; printf("Insatt kapital? "); scanf("%f", &kapital); system("PAUSE"); return 0; } OK!

  9. Klistra in! Definiera den nya funktionen! 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); }

  10. Definiera den nya funktionen. Definiera den nya funktionen! lägg till! 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; } ändra!

  11. Funktionens delar Definiera den nya funktionen! funktionens returtyp - utdatatyp 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; } funktionsprototyp,funktionshuvud funktionens formella parametrar (argument) - indata funktionens namn

  12. Funktionens delar funktionens egen variabel, okänd utanför funktions-kroppen 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; } indatavariablerna, som bara är kända i funk-tionen används i funktionen

  13. Funktionsdeklaration och funktionsanrop /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include <stdio.h> #define RANTESATS 8.5 #define ANTAL_AR 10 void TabellPaSkarmen( int , float ); int main ( void ) { float kapital ; int ar ; printf("Insatt kapital? "); scanf("%f", &kapital); TabellPaSkarmen( ANTAL_AR, kapital ); return 0; } i stommen, main()- funktionen lägg till funktions-deklaration och funktions-anrop här skall funktions-definitionen in

  14. Parameter i stället för konstant /* Beräknar kapitaltillväxt på x år framåt eller bakåt */ #include <stdio.h> #define RANTESATS 8.5 #define ANTAL_AR 10 void TabellPaSkarmen( int , float ); int main ( void ) { float kapital ; int ar , 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. här skall funktions-definitionen in

  15. Översikt – hela programmet /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include <stdio.h> #define RANTESATS 8.5 void TabellPaSkarmen( int , float ); int main ( void ) { float kapital ; int antalAr; 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; } en översiktsbild av hela programmet stommen funktionen

  16. Översikt, funktionsdeklaration och funktionsdefinition en översiktsbild av hela program- met /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include <stdio.h> #define RANTESATS 8.5 void TabellPaSkarmen( int , float ); int main ( void ) { float kapital ; int antalAr; 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. En hatt i taget … /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include <stdio.h> #define RANTESATS 8.5 void TabellPaSkarmen( int , float ); int main ( void ) { float kapital ; int antalAr; 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. Funktionsanrop • Hur anropas en funktion? • Vad händer då en funktion anropas och exekveras?

  19. Funktionsanropexempel /* Beräknar kapitaltillväxt på x år framåt eller bakåt */ #include <stdio.h> #define RANTESATS 8.5 void TabellPaSkarmen( int , float ); int main ( void ) { float kapital ; int antalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); system("PAUSE"); return 0; }

  20. Vad händer då man definierar ett minne ? /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include <stdio.h> #define RANTESATS 8.5 void TabellPaSkarmen( int , float ); int main ( void ) { float kapital ; int antalAr; printf("Insatt kapital och antal år ?(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; }

  21. tid Main’s aktiveringspost på ”stacken” Bytes Maskinkod programmet • main() exekveras int main ( void ) { float kapital ; int antalAr; printf("Insatt kapital och antal år ? "); printf("(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } Heap main’s ”egna” variabler skapas på stacken - aktiveringspost kapital=100 Stack main() antalAr=1

  22. 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; } dessa variabelnamn kan vara lika men behöver inte vara det. int main ( void ) { float kapital ; int antalAr; printf("Insatt kapital och antal år ? "); printf("(-->1000 10)--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } funktionen anropas, (aktuella parametrar)

  23. tid Aktuella och formella parametrar Bytes Maskinkod programmet void TabellPaSkarmen(int antalAr , float kapital) { int ar ; • TabellPaSkarmen() exekveras Heap TabellPaSkarmen() antalAr=1 kapital=100 ar=?? de aktuella para-metrarna anpassas och kopieras till funktionens formella parametrar kapital=100 kapital=100 Stack main() antalAr=1 antalAr=1

  24. Bytes Maskinkod programmet Heap Stack tid Funktionens aktiveringspost • TabellPaSkarmen() exekveras for ( ar = 1; ar <= antalAr; ar++ ) kapital = kapital * ( 1 + RANTESATS/100 ); satserna i funktionen utförs TabellPaSkarmmen() antalAr=1 antalAr=1 antalAr=1 kapital=100 kapital=108.5 kapital=108.5 ar=?? ar=1 ar=2 kapital=100 kapital=100 kapital=100 main() main() kapital=100 antalAr=1 antalAr=1 antalAr=1 antalAr=1

  25. Bytes Maskinkod programmet Heap Stack tid Aktiveringsposterna tas bort • TabellPaSkarmen() dör • main() dör - exekvering slut TabellPaSkarmen() antalAr=1 kapital=108.5 ar=2 kapital=100 kapital=100 main() main() antalAr=1 antalAr=1

  26. 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 antalAr=1 TabellPaSkarmen() kapital=100 ar=?? main() kapital=100 antalAr=1

  27. Rekursionen funktion som anropar ”sig själv”

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

  29. Rekursionn-fakultet, ett klassiskt exempel #include <stdio.h> 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. Vad är det som händer? Bytes primärminnet Heap Stack fak=3, svar=? fak3 main() tid

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

  32. Vad är det som händer? Bytes Heap 2 Heap 2 nfak(2) n=2 nfak(3) nfak(3) Stack n=3 n=3 fak=3, svar=? fak=3, svar=? fak=3, svar=? main() main() main() tid

  33. Vad är det som händer? Bytes Heap 1 Heap 1 nfak(1) n=1 nfak(2) nfak(2) n=2 n=2 nfak(3) nfak(3) nfak(3) Stack n=3 n=3 n=3 fak=3, svar=? fak=3, svar=? fak=3, svar=? fak=3, svar=? main() main() main() main() tid

  34. Vad är det som händer? Bytes nfak(1) n=1 nfak(2) n=2 nfak(3) n=3 fak=3, svar=? main() tid

  35. Vad är det som händer? Bytes 0 Heap nfak(0) n=0 nfak(1) nfak(1) n=1 n=1 nfak(2) nfak(2) n=2 n=2 nfak(3) nfak(3) n=3 n=3 fak=3, svar=? fak=3, svar=? main() main() tid

  36. Vad är det som händer? Bytes nfak(0) n=0 1 nfak(1) nfak(1) n=1 n=1 nfak(2) nfak(2) n=2 n=2 nfak(3) nfak(3) n=3 n=3 fak=3, svar=? fak=3, svar=? main() main() tid

  37. Vad är det som händer? Bytes 1 1 nfak(0) n=0 1 nfak(1) nfak(1) n=1 n=1 n=1 1 nfak(2) nfak(2) nfak(2) n=2 n=2 n=2 nfak(3) nfak(3) nfak(3) n=3 n=3 n=3 fak=3, svar=? fak=3, svar=? fak=3, svar=? main() main() main() tid

  38. Vad är det som händer? Bytes 2 1 nfak(0) n=0 1 nfak(1) n=1 n=1 1 nfak(2) nfak(2) nfak(2) n=2 n=2 n=2 2 nfak(3) nfak(3) nfak(3) n=3 n=3 n=3 fak=3, svar=? fak=3, svar=? fak=3, svar=? main() main() main() tid

  39. Vad är det som händer? Bytes 3 2 n=1 1 nfak(2) nfak(2) n=2 n=2 2 nfak(3) nfak(3) nfak(3) n=3 n=3 n=3 6 fak=3, svar=? fak=3, svar=? fak=3, svar=? main() main() main() tid

  40. Vad är det som händer? Bytes 3 6 3 2 nfak(2) n=2 2 nfak(3) nfak(3) n=3 n=3 6 fak=3, svar=? fak=3, svar=? fak=3, svar=6 main() main() main() program-slut tid

  41. Rekursionn-fakultet, ett klassiskt exempel #include <stdio.h> 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. Rekursiontillämpning #include <stdio.h> 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 ; } • man kan använda rekursion för att vända på dataföljder

  43. Provkör på övningen … /* backwards.c Reprints what you type but backwards *//* recursive function */#include <stdio.h>#include <stdlib.h>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. C:s minnessegment

More Related