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.

Slides:



Advertisements
Liknande presentationer
void hittaMax(int tal[], int antal, int *pmax) { int i; ??=tal[0]; for(i=1;i??) ??=tal[i]; } int main() { int v[]={1,2,3,4,2}; int.
Advertisements

Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
Datavetenskap för teknisk kemi 10p, moment 1
Funktioner och programorganisation
2D1311 Programmeringsteknik med PBL
Föreläsning 3 Repetition Operatorer Styrstrukturer Deklaration och anrop av metoder.
De fundamentala datatyperna
#include void fun(char s[]) { int i=-1; while(s[++i]!=0) { if('a'
Algoritmer och datastrukturer
Föreläsning 4 Python: mera om funktioner och parametrar
C-programmering ID120V William Sandqvist Länkad lista
Välkommen Vahid Mosavat
Programmeringsteknik K och Media
Programkodens uppbyggnad
Grundläggande programmering
Föreläsning 4 Python: Definiering av egna funktioner Parametrar
i olika programmeringsspråk
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Pekare och speciell programstruktur i inbyggda system
Ali Ghodsi Variabler En variabel är en sorts behållare som man kan placera data i Man måste ange typ och namn för alla variabler.
Pointers. int a=5; int f(int b) { a--; b++; return b; } int main() { int a=3; printf("%d,",f(a)); printf("%d",a); return 0; }
int res2=Math.max(tal1,tal2);
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: Trådprogrammering i Java - Avbrott (”interrupts”) - Metoden join() -
William Sandqvist C:s minnesmodell.
1 Föreläsning 3 programmeringsteknik och Matlab 2D1312/ 2D1305 Matlab fortsättning Funkioner, styrstrukturer, manipulering av matriser.
Problemlösning Veckodagsproblemet Gissa talet Siffersumman.
Anders Sjögren Mer om datatyper. Anders Sjögren const det finns ett elegantare sätt att skapa konstanter i C än sättet med makro som vi använt tidigare.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser -Att definiera egna klasser -Klassvariabler -Klassmetoder.
Modulär programutveckling
Anders Sjögren Pekare. Anders Sjögren Skapa ett program som byter plats på två heltal Pekare.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Namnrum, räckvidd och rekursion Linda Mannila
Funktioner Linda Mannila Vad kan vi nu? Primitiva datatyper Tal, strängar, booleska värden Samlingsdatatyp Listan Utskrift Indata Felhantering.
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Anders Sjögren ANSI - standard ?. Anders Sjögren ANSI - standard ? Om man skriver ett bra C-program och kompilerar fram ”exe”-filen så vore det ju trevligt.
INTRODUKTION TILL PROGRAMMERING
Anders Sjögren Bitfält exempel Nu kommer ett förbättrat program. Det är funktions- uppdelat och kan lägga till poster som lagras på fil.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 2 ( ) INNEHÅLL: -Variabler och datatyper -Tilldelning av variabler -Aritmetiska.
Problemlösningsmetodik
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 5 ( ) INNEHÅLL: -Metoder.
F4 - Funktioner & parametrar 1 Programmeringsteknik, 4p vt-00 Modularisering ”svarta lådor” Väl definierade arbetsuppgifter Enklare validering Enklare.
William Sandqvist C-programmering ID120V Stack och Kö William Sandqvist
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
Rekursion. En metoddefinition som innehåller ett anrop av sig själv kallas rekursiv.
F6 - Pekare 1 Programmeringsteknik, 4p vt-00 Pekare & adresser Alla variabler är knutna till en viss adress i minnet int i; adressen till denna fås med.
Anders Sjögren Deklarationsområde och funktioner.
F2 1 Programmeringsteknik, 4p vt-00 Kommentarer Allt mellan /* och */ Varje kommentar byts ut mot en blank av kompilatorn /* Exempel på uttryck, tilldelningsoperatorn.
Procedurellt potpurri Dagens samtalsämnen –Klipp (Cut) –If-then-else –fail/0 –repeat/0 Att läsa –The Art of Prolog, kapitel 11 –Relevant avsnitt i Learn.
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2003 Datastrukturer och algoritmer Gruppövning 0.
William Sandqvist Funktionsbibliotek När man utvecklat en funktion så långt att den är "färdigutvecklad" kan man lika gärna spara den på.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: -Exekveringstrådar.
-Repetition -Variabler -Primitiva typer (+ boolean) -Operatörer +, ++, --, -Typ konvertering -Wrapper klasser -Jämförelse operatörer,(==, =,,!=, !) -String.
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
-Repetition -Variabler -Primitiva typer (+ boolean) -Operatörer +, ++, --, -Typ konvertering -Wrapper klasser -Jämförelse operatörer,(==, =,,!=, !) -String.
Föreläsning4 Repetition slingor Metoder. while-sats består av följande delar: 1. while 2. Villkor-sats (condition) 3. uttryck (statement) while-sats int.
Anders Sjögren Mer om datatyper. Anders Sjögren const det finns ett elegantare sätt att skapa konstanter i C än sättet med makro som vi använt tidigare.
Program indata ? utdata 1/20 Vahid Mosavat, Nada, KTH.
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
Anders Sjögren Minnen, variabler, att lagra i primärminnet forts. Den här bilden känner ni igen sedan tidigare. Vi skall fortsätta att prata variabeltyper.
Språket för inbyggda system. C:s verktygslåda är välfylld! William Sandqvist
Anders Sjögren Modulär programutveckling. Anders Sjögren Ett programmeringsprojekt, flera personer utvecklar ett program Vi ska utveckla ett ränteberäkningsprogram.
Anders Sjögren Programmering i ANSI-C Ett första program för att se vart vi ska...
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
Anders Sjögren Funktioner något in och något annat ut.
KPP053, HT2015 MATLAB, Föreläsning 4
Presentationens avskrift:

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 */ #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"); }

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

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

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

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

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

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!

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!

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

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!

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

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

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

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 ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } Ändra detta, man kan nu ange antal år vid exekveringen.

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 ?(--> )--> "); 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

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 ?(--> )--> "); 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

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 ?(--> )--> "); 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!

Anders Sjögren Funktionsanrop Hur anropas en funktion? Vad händer då en funktion anropas och exekveras?

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

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

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("(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } main’s ”egna” variabler skapas på stacken - aktiveringspost

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.

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

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

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()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

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

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

Anders Sjögren C:s minnessegment