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ś
{
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ś
●
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ś
●
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ś
●
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ś
●
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ś
●
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ś
●
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ś
●
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ś
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ś
●
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ś