Informatyka I - wykład 6

Funkcje

Slajd 1

Informatyka I – wykład 6

G.P.Korbaś

Program 1. - Funkcja wypisująca gwiazdki

#include <iostream>

using namespace std;

//jakiś zygzak

void gwiazdki()

{

const int maxx=5;

const int maxy=15;

int x=0,dx=1;

for (int i=0; i<maxy;i++)

{

for (int ii=0;ii<x;cout<<' ',ii++); cout<<"*"<<endl; x+=dx;

if (x==maxx-1 || x==0) dx=-dx;

}

return;

}

Slajd 2

Informatyka I – wykład 6

G.P.Korbaś

int main()

{

gwiazdki();

cout<<"Dzień dobry"<<endl; gwiazdki();

cout<<"To jest program z gwiazdkami"<<endl; gwiazdki();

system("PAUSE");

return 0;

}

Slajd 3

Informatyka I – wykład 6

G.P.Korbaś

Uwagi do programu 1.

●

void gwiazdki() – prototyp funkcji o nazwie gwiazdki. Funkcja nie pobiera żadnych argumentów i nic nie zwraca.

Slajd 4

Informatyka I – wykład 6

G.P.Korbaś

Program 2. - Funkcja zwracająca liczbę losową od 0 do 99

#include <iostream>

#include <ctime>

using namespace std;

int losuj0do100()

{

int los=int(rand()*101/RAND_MAX);

if (los==101) los=100;

return los;

}

int main()

{

srand(time(0)*1000);

for (int i=0;i<10;i++)

cout<<losuj0do100()<<endl; system("PAUSE");

return 0;

}

Slajd 5

Informatyka I – wykład 6

G.P.Korbaś

Uwagi do programu 2.

●

int losuj0do100() – prototyp funkcji o nazwie losuj0do100.

Funkcja nie pobiera żadnych argumentów i zwraca liczbę całkowitą.

Slajd 6

Informatyka I – wykład 6

G.P.Korbaś

Program 3. - Funkcja zwracająca liczbę powiększoną o 2

#include <iostream>

using namespace std;

int dodaj2(int a)

{

a=a+2;

return a;

}

int main()

{

int u=1;

cout << u << endl; // 1

cout << dodaj2(u) << endl; // 3

cout << u << endl; // 1

cout << dodaj2(10) << endl; // 12

return 0;

}

Slajd 7

Informatyka I – wykład 6

G.P.Korbaś

Uwagi do programu 3.

●

int dodaj2(int a) – prototyp funkcji o nazwie dodaj2. Funkcja pobiera (przez wartość) liczbę całkowitą i zwraca liczbę całkowitą.

Pobieranie argumentów przez wartość oznacza, że wykonywana jest kopia zmiennej. W ramach funkcji można posługiwać się zmienną argumentem ale nie ma to wpływu na żadną zmienną poza funkcją.

Przy takim podawaniu parametrów można podać wartość wprost – bez pośrednictwa zmiennej.

Slajd 8

Informatyka I – wykład 6

G.P.Korbaś

Program 4. - Funkcja zwracająca liczbę powiększoną o 2 – argument przez referencję

#include <iostream>

using namespace std;

int dodaj2(int &a)

{

a=a+2;

return a;

}

int main()

{

int u=1;

cout << u << endl; // 1

cout << dodaj2(u) << endl; // 3

cout << u << endl; // 3

return 0;

}

Slajd 9

Informatyka I – wykład 6

G.P.Korbaś

Uwagi do programu 4.

●

int dodaj2(int &a) – prototyp funkcji o nazwie dodaj2. Funkcja pobiera (przez referencję) liczbę całkowitą i zwraca liczbę całkowitą.

Pobieranie argumentów przez referencję oznacza, że do funkcji przekazywany jest adres zmiennej w pamięci. Wszelkie zmiany wykonywane na zmiennej w ramach funkcji wpływają na zmienną przekazaną.

Przy takim podawaniu parametrów nie można podać wartość wprost – bez pośrednictwa zmiennej.

Slajd 10

Informatyka I – wykład 6

G.P.Korbaś

Dotychczasowe przykłady pokazywały jak od razu deklarować i definiować funkcje w jednym miejscu programu.

Deklaracja oznacza wskazanie kompilatorowi, że istnieje funkcja o podanym prototypie.

Definicja oznacza określenie jak funkcja działa.

Można jednak deklarować i definiować funkcję osobno. Dalszy przykład pokazuje jak zadeklarować funkcję na początku i zdefiniować pod koniec kodu programu.

W praktyce większość deklaracji znajduje się w tzw. plikach nagłówkowych .h a większość definicji w plikach .cpp.

Slajd 11

Informatyka I – wykład 6

G.P.Korbaś

Program 5. - Funkcja zwracająca liczbę powiększoną o 2 – rozbita deklaracja i definicja

#include <iostream>

using namespace std;

int dodaj2(int a);

int main()

{

int u=1;

cout << u << endl; // 1

cout << dodaj2(u) << endl; // 3

cout << u << endl; // 1

cout << dodaj2(10) << endl; // 12

return 0;

}

int dodaj2(int a)

{

a=a+2;

return a;

}

Slajd 12

Informatyka I – wykład 6

G.P.Korbaś

Uwagi do programu 5.

●

int dodaj2(int a); – przy samodzielnej deklaracji zaraz za prototypem funkcji pojawia się średnik!

Slajd 13

Informatyka I – wykład 6

G.P.Korbaś

Program 6. - Funkcja zwracająca największą z trzech liczb i program ją wykorzystujący

#include <iostream>

using namespace std;

int maxi(int a, int b, int c)

{

int m;

if (a>b)

if (a>c) m=a; else m=c;

else

if (b>c) m=b; else m=c;

return m;

}

int main()

{

int u,v,w;

cin >> u >> v >> w;

cout << maxi(u,v,w);

return 0;

}

Slajd 14

Informatyka I – wykład 6

G.P.Korbaś

Uwagi do programu 6.

●

int maxi(int a, int b, int c) – prototyp funkcji o nazwie maxi.

Funkcja pobiera (przez wartość) trzy liczby całkowite i zwraca liczbę całkowitą.

Slajd 15

Informatyka I – wykład 6

G.P.Korbaś

Program 7. - Funkcja normująca wektor

#include <iostream>

#include<cmath>

using namespace std;

void normuj(double &x, double &y, double &z); int main()

{

double T[3];

cin >> T[0] >> T[1] >> T[2]; normuj(T[0],T[1],T[2]);

cout << T[0] << ' ' << T[1] << ' ' << T[2]; return 0;

}

void normuj(double &x, double &y, double &z)

{

double d=sqrt(x*x+y*y+z*z);

x=x/d;

y=y/d;

z=z/d;

}

Slajd 16

Informatyka I – wykład 6

G.P.Korbaś

Uwagi do programu 7.

●

void normuj(double &x, double &y, double &z) – prototyp funkcji normuj pobierający przez referencję trzy liczby rzeczywiste.

Funkcja nie zwraca żadnej wartości (void) Slajd 17

Informatyka I – wykład 6

G.P.Korbaś

Program 8. - normująca wektor z argumentem tablicowym

#include <iostream>

#include<cmath>

using namespace std;

void normuj(double X[])

{

double d=sqrt(X[0]*X[0]+X[1]*X[1]+X[2]*X[2]); X[0]=X[0]/d; X[1]=X[1]/d; X[2]=X[2]/d;

}

int main()

{

double T[3];

cin >> T[0] >> T[1] >> T[2]; normuj(T);

cout << T[0] << ' ' << T[1] << ' ' << T[2]; system ("pause");

return 0;

}

Slajd 18

Informatyka I – wykład 6

G.P.Korbaś

Uwagi do programu 8.

W podanym programie funkcja została zadeklarowania jako otrzymująca tablicę. Kopia tablicy nie jest wykonywana – w przypadku tablic przekazywany jest zawsze adres, co oznacza, że tablice przekazuje się zawsze przez referencję!

Slajd 19

Informatyka I – wykład 6

G.P.Korbaś

Program 9. - Funkcja zwracająca liczbę powiększoną o ...

#include <iostream>

using namespace std;

void dodaj(int &a, int d=1)

{

a=a+d;

}

int main()

{

int u=1;

cout << u << endl; // 1

dodaj(u); cout << u << endl; // 2

dodaj(u,5); cout << u << endl; // 7

return 0;

}

Slajd 20

Informatyka I – wykład 6

G.P.Korbaś

Uwagi do programu 9.

●

void dodaj(int &a, int d=1) – prototyp funkcji o nazwie dodaj.

Funkcja pobiera (przez referencję) liczbę całkowitą i ewentualnie (przez wartość) drugą liczbę całkowitą, dla której podano wartość domyślną jeśli nie zostanie podana. Funkcja nic nie zwraca.

Slajd 21

Informatyka I – wykład 6

G.P.Korbaś