Värmdö Gymnasium Datainstitutionen Programmering B ++ C++ Funktioner 1 Teori När programmen blir större och mer komplicerade är det bra att kunna dela upp programmet i olika delar som gör specifika saker, vilket kan göra programmet mer lättläst. Ett sätt är att använda funktioner, som är en mycket viktig "byggsten" i C++. En funktion kan ses som ett litet "program i programmet". Det är en programslinga som man anropar från huvudprogrammet, och eventuellt skickar med några invärden som funktionen ska jobba med. Funktionen utför då en uppgift eller returnerar ett svarsvärde. Man brukar dela in funktioner i några olika grupper. Funktioner som returnerar ett värde Vi är egentligen bara intresserade av att skicka information (ett eller flera värden) till en funktion som gör vissa beräkningar med hjälp av dessa värden och sen returnerar ett värde som är resultatet av dessa bearbetningar. En funktion är lite kod som gör något. Vi skickar in ett eller flera argument och funktionen returnerar ett värde. T.ex. kan koden se ut på följande sätt: int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Summa är funktionens namn, som man använder när man ropar på den från huvudprogrammet. Före funktionens namn står vilken typ av svar funktionen kommer att lämna, i vårt fall ett heltal (int). Efter funktionens namn skrivs inom parentes en lista på de invärden eller parametrar, som funktionen behöver för att kunna göra sitt jobb. I vår funktion är invärdena heltalen a och b. Return avslutar funktionen och skickar tillbaka det resultat som funktionen gav. Värdet som returneras av return ska vara av samma typ som funktionens typ, här int. Man ropar sedan på funktionen med dess namn och de parametrar som behövs. Du har redan använt dig av kompilatorns färdigskrivna funktioner i kursen, t.ex. har du anropat funktionen sqrt(x) för några lektioner sedan. Där är sqrt funktionens namn, och x är det invärde du ville att funktionen skulle ta roten ur (se s. 46). Ett fullständigt program skulle kunna se ut så här: #include <iostream> #include <stdlib.h> using namespace std; int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } //OBS! Inget semikolon efter funktionsdefinitionen. main() { int x, y, z; cout<<"Ge två tal: "; cin>>x>>y; z = summa(x,y); //Värdet från x kopieras över till a och y till b cout<<"Summan är "<<z; system("PAUSE"); } Variablerna a och b är bara synliga i funktionen, och existerar inte utanför den, t.ex. i main(). Att värdet från x kopieras över till a och y till b, kallas värdeanrop. Om vi skulle ändra värdet av a och b i funktionen summa, skulle alltså inte originalvärdena x och y ändras, bara kopiorna a och b. Motsatsen till värdeanrop är referensanrop, vilket innebär att a bara blir ett "alias" för x, fast de egentligen är samma värde i datorns minne. Det innebär att om jag ändrar a ändras också x o.s.v. Det ska vi titta på om några veckor. C++ Lektion Funktioner 1.doc Sida 1 Värmdö Gymnasium Datainstitutionen Programmering B ++ Ett annat sätt att skriva koden på är nedanstående, där vi gör en funktionsdeklaration (talar om namn, typ, och parametrar) INNAN huvudprogrammet så att vi i huvudprogrammet kan använda fast själva funktionsdefinitionen inte kommer förrän efter programmet. #include <iostream> #include <stdlib.h> using namespace std; int summa( int a, int b); // OBS! Semikolon efter funktionsdeklaration main() { int x, y, z; cout<<"Ge två tal: "; cin>>x>>y; z = summa(x,y); //Värdet från x kopieras över till a och y till b cout<<"Summan är "<<z; } int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp system("PAUSE"); } //OBS! Inget semikolon efter funktionsdefinitionen Funktioner som inte returnerar ett värde Funktionen ovan gav ett heltal till svar. Man kan naturligtvis skriva funktioner som returnerar double, char, long int etc, men man kan också skriva funktioner som inte returnerar något svarsvärde. Ett exempel: void meny() { cout<<"MENY"; } void står för "tomrum", så här ska inget värde returneras. Dessutom är parentesen för invärden tom, vilket är ett förkortat skrivsätt för void meny(void), d.v.s. inga argument skickas med när vi anropar funktionen. Läs Bifogat finns filen funktioner1.cpp, vilken du bör förstå innebörden av. Se även kapitlet funktioner i online-manualen (se v34). Extrafinesser för funktioner Nämligen default-värden på parametrar, d.v.s. att i funktionsdeklarationen ange värden för parametrarna som ska antas om inget värde lämnas vid funktionsanropet, samt funktioner som anropar sig själva, s.k. rekursiva funktioner. Rekursiva funktioner ligger på MVG-nivå. C++ Lektion Funktioner 1.doc Sida 2 Värmdö Gymnasium Datainstitutionen Programmering B ++ Övningar Övning 1 Skriv en funktion som multiplicerar två tal. Som returvärde ska funktionen ge resultatet, dvs produkten av talen. Skriv ett huvudprogram som utnyttjar funktionen. Övning 2 Skriv en funktion som adderar två tal och en annan funktion som subtraherar två tal. Skriv ett huvudprogram som läser in två tal och väljer vad du vill göra. Funktionerna ska givetvis utnyttjas på lämpligt sätt. Övning 3 Skriv ett program som fungerar som en miniräknare. Programmet ska först fråga efter vilket räknesätt du vill använda (+,--,* eller /), och sedan efter två tal. Svaret ska sedan beräknas och skrivas ut på lämpligt sätt. Detta ska upprepas tills användaren som räknesätt matar in "q". Programmet ska innehålla fyra funktioner addition, subtraktion, multiplikation och division, som alla tar två tal som parametrar. Dessa funktioner ska anropas då resultatet ska räknas ut. Övning 4 Utöka din miniräknare med följande funktioner: upphöjt xy roten ur sin x Övning 5 Ett primtal är ett tal som endast är jämnt delbart med 1 och med sig själv. Skriv en funktion som undersöker om ett givet tal är ett primtal. Övning 6 Som övning på användning av defaultvärden föreslår jag att du tittar på funktionen skriv_ut() i exempelprogrammet funktioner1.cpp. Hitta på någon egen variant av skriv_ut eller en annan funktion med defaultvärden som gör något kul och skriv sen ett huvudprogram som utnyttjar din funktion. Övning 7 Vill du testa på rekursion så kan du börja med att läsa om rekursion i online-manualen (se v34). Skriv (av) en funktion för att beräkna fakulteten och skriv sen ett huvudprogram som utnyttjar funktionen. Hitta gärna även på en egen funktion som fungerar att göra rekursion på. C++ Lektion Funktioner 1.doc Sida 3 Värmdö Gymnasium Datainstitutionen Programmering B ++ Minitest G-nivå: 1. Vilken av följande funktioner är korrekt och vad är fel i den felaktiga? Första funktionen: void forsta(int x) { x=x+1; return x; } Andra funktionen double andra(void) { double x=3; return x; } 2. Vad är händer i följande funktion vid anropet tal=tredje(2.5); (tal är en double) vad skulle skrivas ut vid cout<<tal; ?? int tredje(double x) { return x; } 3. Skriv en funktion som tar fyra tal som argument och returnerar medelvärdet av dessa. Skriv också ett program som utnyttjar din funktion. VG-nivå: 1. Skriv en funktion som man kan skicka två, tre eller fyra tal till som argument och som returnerar medelvärdet av dessa. Skriv också ett program som utnyttjar din funktion och visa att alla varianter fungerar. Läxa Läs igenom detta häfte. Studera det bifogade programmet så att du förstår de olika delarna och utnyttja dessa när du själv ska skapa ett program. Lös så många uppgifter som möjligt (minst de fyra första). C++ Lektion Funktioner 1.doc Sida 4 Värmdö Gymnasium Datainstitutionen Programmering B ++ funktioner1.cpp #include <iostream> using namespace std; //********funktionsdeklarationer********* double medelvarde ( ); double max (double tal1, double tal2); void meny ( ); char las_in_alternativ( ); void skriv_ut(double tal, int n=1); //********huvudfunktionen********* int main () { double tal1, tal2, resultat; char svar='1'; while (svar!='0') { meny(); svar=las_in_alternativ(); system("cls"); if (svar=='1') { resultat=medelvarde( ); cout << " Medelvarde : " << resultat << endl; skriv_ut(resultat); cout << endl; skriv_ut(resultat, 4); } else if (svar=='2') { cout << " Ange två tal: " ; cin >> tal1 >> tal2; cout << endl; resultat=max(tal1,tal2); cout << " Maxvarde : " << resultat << endl; } } cout << endl << " HEJ DÅ" << endl; system("PAUSE"); return 0; } C++ Lektion Funktioner 1.doc Sida 5 Värmdö Gymnasium Datainstitutionen Programmering B ++ //alla funktioner //****************************************************** double medelvarde ( ) { double tal1, tal2; cout << " Ange två tal: " ; cin >> tal1 >> tal2; cout << endl; return (tal1+tal2)/2.0; } //****************************************************** double max (double tal1, double tal2) { if (tal1 > tal2) return tal1; else return tal2; } //****************************************************** void meny ( ) { cout << endl << endl; cout << "***** MENY *****" << endl; cout << "################" << endl<<endl; cout << " 1 beräkna medelvärde" << endl; cout << " 2 beräkna maxvärde" << endl; cout << " 0 AVSLUTA" << endl; cout << endl; } //****************************************************** char las_in_alternativ( ) { char svar; cout << endl << " Ange alternativ: " ; cin >> svar; return svar; } //****************************************************** void skriv_ut(double tal, int n) { for ( int i=1; i<=n; i++) cout << tal << " "; } //****************************************************** C++ Lektion Funktioner 1.doc Sida 6