Funktioner 1:
I A-kursen behandlades inte funktioner, men nu dyker de upp, redan i kapitel 1.
När man ska konstruera program som är lite större än de program du gjorde i A-kursen,
bör man dela upp programmen i flera delar. I c++ finns två slags byggstenar funktioner och klasser.
Klasser kommer du att möta i programmering C.
Du har tidigare använt standardfunktioner som cout<<, getch() och endl.
Vi börjar med att titta på funktioner som beräknar och returnerar ett värde.
En sådan funktion kan, av användaren, ses som en svart låda i vilken man stoppar in ett
eller flera utgångsvärden. Ut ur lådan kommer då ett resultat som är beroende av dessa utgångsvärden.
Här kommer ett exempel på en funktion som returnerar produkten av heltalen a och b.
Int
multiplicera (int a, int
b )
=>funktionshuvud
{
return a*b;
=>funktionskropp
}
Ovan ser du en s.k. funktionsdefinition, bestående av funktionshuvud och funktionskropp.
Funktionshuvudet talar om hur funktionen skall användas: funktionen ovan anropas med
funktionsnamnet mulitplicera, vid anropet ser du i parameterlistan att skall du skicka med
två heltal (int a, int b) och i retur kommer du att få ett heltal (returvärdet).
I funktionskroppen visas vad funktionen skall utföra.
Funktioner som returnerar ett värde bör alltid innehålla en retursats, exempelvis
return a*b
Returvärde.
Int
exempel (int a, int b
)
Funktionsnamn
Int
exempel (int a, int b
)
Parameterlista
Int
exempel (int a, int b
)
En funktion anropas alltid av en annan funktion -(main ( ) som du inleder
dina program med är ju också en funktion) i retur kommer funktionen exempel att skicka ett heltal (integer).
I ett program skulle
koden ovan kunna se ut så här:
#include
<cstdlib>
#include
<iostream>
using namespace
std;
int multiplicera (int a, int b ); //funktionsdeklaration
int main(int argc, char *argv[])
{
int x, y;
cout<<"Ge mig 2 heltal: "<<endl;
cin>>x>>y;
cout<<"produkten av dina tal =
"<<multiplicera(x,y);
system("PAUSE");
return EXIT_SUCCESS;
}
//funktionsdefinition
int multiplicera (int a, int b )
{
return
a*b;
}
I exemplet ovan ligger först en funktionsdeklaration , innan main( ).
Där talar du om att du vill använda en funktion som heter multiplicera.
Funktionsdefinitionen ligger sedan efter det egentliga programmet.
Du kan ha hur många funktionsdeklarationer som helst innan main och följaktligen lika många definitioner efter programkoden.
Funktionen skulle
kunna göras om så att returvärdet i stället sparades i en
variabel:
#include
<cstdlib>
#include
<iostream>
using namespace
std;
int multiplicera (int a, int b ); //funktionsdeklaration
int main(int argc, char *argv[])
{
int x, y;
cout<<"Ge mig 2 heltal: "<<endl;
cin>>x>>y;
int z= multiplicera(x,y);
//returvärdet sparas I z
cout<<"produkten av dina tal =
"<<z;
system("PAUSE");
return EXIT_SUCCESS;
}
//funktionsdefinition
int multiplicera (int a, int b )
{
return a*b;
}
Även denna variant är möjlig – mellanlagra
funktionens resultat i en variabel q.
#include
<cstdlib>
#include
<iostream>
using namespace
std;
int multiplicera (int a, int b ); //funktionsdeklaration
int main(int argc, char *argv[])
{
int x, y, z;
cout<<"Ge mig 2 heltal: "<<endl;
cin>>x>>y;
z=multiplicera(x,y);
cout<<"produkten av dina tal =
"<<z;
system("PAUSE");
return EXIT_SUCCESS;
}
//funktionsdefinition
int multiplicera (int a, int b )
{
int q= a*b;
return
q;
}
Uppgift: Prova nu att göra
några enkla funktioner. När du känner dig säker på hur funktioner
fungerar kan
du ge dig på att göra en funktion som vid
anrop skriver ut valfri multiplikationstabell.
Funktioner 2:
Metoder
I kapitel 1 presenteras klassen string. Vi kommer att gå djupare in på klasser i programmering C, där du kommer att skapa egna
klasser med tillhörande medlemmar och metoder (ett annat namn för funktioner).
En liten sammanfattning kommer här:
String är en inbyggd klass (datatyp) i c++.
Klasser innehåller data och metoder.
När du skapar en string ex: string minsträng; får ditt objekt minsträng tillgång till de fördefinierade metoder som finns i klassen sträng.
Man säger att ett objekt är en instans av en viss klass.
Exempel på metoder är length(), size(), find() o.s.v.
Ett objekt ur en klass får tillgång till metoderna m.h.a punktoperatorn: minsträng.length() returnerar antal tecken i strängen minsträng.
Funktioner 3: Void
En funktion som inte returnerar något värde har returtypen void.
En sådan funktion utför istället något t.ex ritar en gubbe på bildskärmen.
Void
ritaGladGubbe (
)
{
cout<<” :-) ”<<endl;
}
Som du ser är parameterlistan tom, parenteserna måste dock vara med för att visa att det är en funktion.
Det är inte nödvändigt med tom parameterlista. Exempelvis skulle x och y koordinater kunna skickas med
För att bestämma var på skärmen den glada gubben skall ritas ut.
Funktioner
4:
I exemplet under Funktioner 1:
Int multiplicera (int a, int b )
{
return a*b;
}
I de exempel vi hittills tittat på har den normala metoden för parameteröverföring använts, nämligen värdeparametrar
De värden du skickar med i parameterlistan kopieras och läses in i int a och int b:s minnesplatser.
Exempel:
Int addera (int
a)
{
a=a+5;
return a;
}
Ett anrop till funktionen ovan skulle kunna se ut så här:
int
S=10;
cout<<addera (S)<<endl;
15 då kommer att skrivas ut till skärmen men värdet på variabeln S förändras inte, det kopieras som sagt in i
minnesplatsen för funktionens lokala variabel a och operationen a=a+5 utförs på denna kopia.
MEN man kan även skapa funktioner som anropas ”by reference” med referensanrop.
Då skickas istället minnesadressen till den aktuella variabeln och uträkningen utförs på denna.
Funktionen ser då ut så här:
Int addera (int&
a)
{
a=a+5;
return a;
}
Den enda skillnaden är det lilla ”och”& -tecknet.
Ett anrop till funktionen ovan skulle kunna se ut så här:
int
S=10;
cout<<addera (S)<<endl;
15 då kommer att skrivas ut till skärmen och värdet på variabeln S kommer nu att förändras till 15.