Funktioner - 1 Teknik för stora program #include<iostream.h> #include<... >......... cout << Blabla... ; z=pow(x,y)... Borland libraries Third party libraries Own libraries Funktionens deklaration Funktioner - 2 Deklaration» [ returtyp ] funktionsnamn( [ parameterlista ] );» Returtyp kan vara vilken datatyp som helst, t ex double eller int. Returtypen kan också deklareras void vilket innebär att funktionen inte returnerar något värde. Utelämnas returtyp förutsätter kompilatorn att funktionen returnerar ett värde av typen int» Parameterlistan beskriver antalet och typen på indata som behövs. Parameterlistan kan vara tom.» Funktionsnamnet och parameterlistan måste tillsammans bilda en unik signatur för funktionen i fråga.
Funktionens definition Funktioner - 3 Definition» [ returtyp ] funktionsnamn( [ parameterlista ] ) sekvens av satser; [ return returvärde; ]» Om inte returtypen är void måste funktionen returnera ett värde med returnsatsen.» En funktion måste alltid definieras, men behöver inte alltid deklareras. Om den inte deklareras måste definitionen komma före alla anrop till funktionen. Fig 3.10 Using a programmer-defined function Funktioner - 4 // A programmer-defined square funktion //-Function declaration----------------------------------------- int square(int); //function prototype //-main---------------------------------------------------------- main() for (int x=1; x<=10; x++) cout << square(x) << " "; cout << endl; return 0; //-Function definition------------------------------------------- int square(int y) // y är en formell parameter. Den finns inte // förrän funktionen anropas från main med ett return y * y; // verkligt värde som kopieras från den // aktuella (verkliga) parametern x.
Funktioner - 5 Standardbiblotekens funktioner och direktivet #include Biblioteksfunktionerna har sina prototyper samlade i så kallade "header"-filer. Dessa filer finns samlade i katalogen i INCLUDE och kallas också för inkluderingsfiler. För att infoga dessa prototyper i programmet ger vi direktiv till preprocessorn att inkludera prototyperna Exempel: /* för cout och cin */ #include <math.h> /* för pow() */ main() double x; cout << "Specify one side of the cube: "; cin >> x; cout << "The volyme is "<< pow(x,3); // Är deklarerad i math.h Värdeanrop (Call by value) Funktioner - 6 void thestupidfunktion(int jtal) // jtal är en kopia av det parametervärde som jtal++; // funktionen anropas med. Därför ändras inte ital. cout << "Inside function: " << jtal << endl; int ital = 3; cout << "ital:s value before function call: " << ital << endl; thestupidfunktion(ital); cout << " ital:s value after function call: " << ital << endl; thestupidfunktion(8*ital+3);
Referensanrop (Call by reference) Funktioner - 7 void thestupidfunktion(int &jtal) // OBS!=> &jtal <=OBS referens! // jtal refererar till samma parametervärde som jtal++; // funktionen anropas med. Därför ändras även ital. cout << "Inside function: " << jtal << endl; int ital = 3; cout << "ital:s value before function call: " << ital << endl; thestupidfunktion(ital); cout << " ital:s value after function call: " << ital << endl; thestupidfunktion(8*ital + 3); //Går det här bra? cout << " Vilket värde har ital nu?: " << ital << endl; Referensanrop med constdeklaration Funktioner - 8 void thestupidfunktion(const int &j) // error C2166: l-value specifies const object j++; // Genererar ett kompileringsfel på grund av att j är const- // deklarerad får därför inte tilldelas ett nytt värde! cout << Inside function: << j << endl; int i = 3; cout << i:s value before function call: << i << endl; thestupidfunktion(i); cout << i:s value after function call: << i << endl; thestupidfunktion(8*i+3);
Funktioner - 9 Referensparametrar, exempel void calc_sum_avg(int, int, int&, double&); int tal1 = 1, tal2 = 2, sum = 0; double medel = 0.0; calc_sum_avg(tal1, tal2, sum, medel); cout << "sum = " << sum << "\tmedel = " << medel << endl; void calc_sum_avg(int x, int y, int& sum, double &avg) sum = x+y; avg = sum / 2.0; Funktioner - 10 Default-parametrar double potens(double x, int y=2); void main(void) // y tilldelas ett defaultvärde // Defaultvärden måste tilldelas // från HÖGER mot VÄNSTER cout << Anrop 1: << potens(4.73, 5) << endl; cout << Anrop 2: << potens(4.73) << endl; //OBS! en paramenter! double potens(double x, int y) // Det är endast i deklarationen // som parametrar kan tilldelas double temp = 1.0; // defaultvärden. for (int i=1; i<=y; i++) temp *= x; return temp;
Funktioner - 11 Räckvidd (Scope) double x = 17.5; // Global variabel, räckvidd i hela program-filen int i=1; // Lokal variabel, räckvidd inom main() int j = 2; // Räckvidd inom blocket (...) cout << i << j << endl; int k = 3; // Räckvidd från här och resten av blocket cout << x << k << endl; cout << i << x << endl; cout << j << k << endl; //OK! inom variablernas räckvidd //Kompileringsfel!! Funktioner - 12 Räckvidd och for-satser int main(void) for (int i=1; i<5; i++) cout << "Första loopen : " << i << endl; for (int i=1; i<5; i++) //KOMPILERINGSFEL! "i" tillhör det yttre //blocket och är redan deklarerad cout << "Andra loopen : " << i << endl; return 0;
Funktioner - 13 Synlighet (Visibility) double x = -43.7; // int main() int x=4; cout << Out 1: << x << endl; Programmet ger följande utskrift: Out 1: 4 Out 2: 2.5 Out 3: 4 Out 4: -43.7 double x = 2.5; cout << Out 2: << x << endl; cout << Out 3: << x << endl; cout << Out 4: << ::x << endl; return 0; //Här används ::,den så kallade // räckviddsoperatorn Funktioner - 14 Variablers livstid (Lifetime), ex 1 double global = 1; void print() auto int lokal = 1; lokal++; global++; cout << "Global = " << global << " Lokal = " << lokal << endl; Programmet ger följande utskrift: Global = 2 Lokal = 2 Global = 3 Lokal = 2 Global = 4 Lokal = 2 Global = 5 Lokal = 2 for (int i=0; i<5; i++) print();
Funktioner - 15 Variablers livstid (Lifetime), ex 2 double global = 1; void print() static int lokal = 1; lokal++; global++; cout << "Global = " << global << " Lokal = " << lokal << endl; Programmet ger följande utskrift: Global = 2 Lokal = 2 Global = 3 Lokal = 3 Global = 4 Lokal = 4 Global = 5 Lokal = 5 for (int i=0; i<5; i++) print(); Funktioner - 16 Rekursiva anrop //Iterativ lösning double potens(double x, int y) double temp = 1.0; for (int i=1; i<=y; i++) temp *= x; return temp; //Rekursiv lösning double potens(double x, int y) if (y == 0) // Basfallet, måste alltid finnas! return 1; else // rekursivt fall return x * potens(x, y-1);
Funktioner - 17 Överlagrade funktioner int max(int, int); int max(int, int, int); double max(double, double); double max(double, double, double); int main(void) cout << Störst av 23 och 17 är: << max(23,17) << endl; cout << Störst av 2, 3 och 1 är: << max(2,3,1) << endl; cout << Störst av 2.3 och 1.7 är: << max(2.3,1.7) << endl; cout << Störst av 2.3, 1.7 och -0.4 är: << max(2.3,1.7,-0.4) << endl; return 0; Inline funktioner Funktioner - 18 inline int max(int a, int b) return (a > b)? a : b; inline int fac(int n) return n < 2? 1 : n*fac(n-1); int main(void) cout << "Störst av 23 och 17 är: " << max(23,17) << endl; // vad händer igentligen vid det här funktionsanropet? cout << "Fakulteten av 10 är: " << fac(10) << endl; return 0;
'XVNDNXQQD«Funktioner - 19.XQQD VNDSD RFK DQYlQGD HJQD IXQNWLRQHU.XQQD DQYlQGD GH IlUGLJD IXQNWLRQHUQD L PDWKK ) UVWn EHJUHSSHQ µulfnylggµ µv\qoljkhwµ RFK µolyvwlgµ.xqqd DQYlQGD UHIHUHQVHU NXQQD DQYlQGD UHNXUVLRQ.XQQD VNDSD SDUDPHWHU OLVWRU PHG GHIDXOWYlUGHQ