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