background image

Informatyka I - wykład 6

Funkcje

Slajd 1

Informatyka I – wykład 6

G.P.Korbaś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś

background image

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ś