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.