Странице

недеља, 2. фебруар 2014.

Programiranje 106: Funkcije

Funkcije su veoma... funkcionalne u programiranju. One se mnogo koriste za skraćivanje programa. Recimo da hoćemo naš program na deset različitih mesta izvrši neki duži algoritam, da bi smo to skratili, mi algoritam stavimo u funkciju i samo se pozovemo na tu funkciju kad god nam treba. Ovde ćemo koristiti primer kvadratne funkcije (f(x)=ax2+bx+c).
Sećate se kada u programiranju 101 main smo rekli da je funkcija, ali da ćemo o tome pričati kasnije? E pa sad je to kasnije. Funkcija u opstem obliku izgleda ovako:

<tip> f(argumenti)
{
kod;
return val;
}

Tip funkcije može biti bilo koj od tipova promenljivih. "f" je ime funkcije, u suštini može biti i šerpica, nije bitno, ono se u programu poziva kao:

<tip> vrednost;
vrednost=f(argumenti);

Bitno je da tip promenljive vrednost bude isti kao funkcija. Argumenata može imati i više od jednog ali zato nemora imati ni jedan. Argumenti se u zagradi pišu kao dekleracija promenljivih, s' tim što se nemogu pisati u nizu (int a,b,c) nego mora ovako:

int f(int a, int b, int c);

Ako bi ste hteli da vaš argument bude ceo niz to bi ste pisali ovako:

int f(int a[])

Deo gde piše kod; je ono što se dešava u funkciji (biće jasnije nakon drugog primera). Na kraju return val; označava koju vrednost funkcija vraća. Treba napomenuti i void. Tako smo deklerisali funkciju main. Funkcija main se poziva samo jedanput kada pokrenete program i nakon toga se program završava. Zato smo ubacivali dugme "start without debugging". Zato što je void ona ne vraća vrednost, zato joj i ne treba return. Kada bi recimo main bila tipa int morali bi smo da joj vraćamo vrednost (po standardu se uzima 0).
Hajde sada da napravimo našu kvadratnu funkciju, ako vas interesuje kako da rešite kvadratnu funkciju možete videti ovde. Napravićemo program u koji se unose tri koeficijenta (a,b i c), onda broj vrednosti koje želimo da unesemo (n) i onda n brojeva. Počnimo sa dekleracijom naše funkcije:

#include <iostream>
using namespace std;
int a,b,c;
int f(int x)
{
return a*x*x+b*x+c;
}
void main()
{
cin>>a>>b>>c;
}

Pretpostavljam da ste primetlili da je int a,b,c; napisano izvan main funkcije. Kada se tako napiše te promenljive su globalne. Mogu da se koriste u svakoj funkciji a ne samo za main. Suprotno tome kada deklešimo unutar funkcije nazivaju se lokalne. Ali zato recimo i u for petljama je lokalna za for petlju ali nije za funkciju main. Zato može samo u for petlji da se koristi.
Sada samo treba u main-u da unesemo broj promenljivih, da unesemo vrednosti i da ispišemo funkciju za svaku od vrednosti:

#include <iostream>
using namespace std;
int a,b,c;
int f(int x)
{
return a*x*x+b*x+c;
}
void main()
{
int n,x;
cin>>a>>b>>c;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>x;
cout<<f(x)<<endl;
}
}

Ovo je vrlo jednostavan primer za funkcije. Probajmo nešto komplikovanija. Hajde da napravimo funkciju koja proverava dali je broj prost! Prvo pogledajmo kada je broj prost, kada ima tačno dva različita delioca. Dakle treba da se proveri koliko ima delioca uneti broj, onda se proveri dali je taj broj delioca jednak dvojci, ako jeste vrati true u suprotnom vrati false.

#include <iostream>
using namespace std;
bool isprime(int n)
{
int k(0);
for(int i=1; i<=n; i++)
{
if(n%i==0)k++;
}
if (k==2) return true;
else return false;
}
void main()
{
int n;
cin>>n;
cout<<isprime(n)<<endl;
}

Funkcije mogu biti mnogo kompleksnije i duže. Postoje razne vrste funkcija i neke će mo uskoro prelaziti. Za sad znate osnove i to je dovoljno daću vam domaći, a ako vam nešto nije jasno možete slobodno pitati u komentarima, da pročitate ponovo ili da vidite programrianje 105.

  1. Napišite funkciju koja proverava dali je broj paran.
  2. Napišite funkciju koja nalazi minimum niza.
  3. Napišite funkciju koja vraća NZD i NZS (najveći zajednicki delilac i najveci zajednicki sadrzalac).
  4. Napišite funkciju koja za matricu m i brojeve ip, jp, np i mp određuje zbir svih članova podmatrice matrice m koja počinje od ip i jp i dimenzija je np i mp.
  5. Napišite funkciju koja proverava dali je broj palindrom.
  6. Napišite funkciju koja vraća argument u obrnutom poretku

Rešenja Prethodnog domaćeg:

/*1*/
int n,m,a[100],b[100],s(0);
cin>>n>>m;
for(int i=0; i<n; i++)cin>>a[i];
for(int i=0; i<m; i++)cin>>b[i];
for(int i=0; i<m; i++)s+=a[b[i]-1];
cout<<s<<endl;

/*2*/
int n,a[100],s(0);
cin>>n;
for(int i=0; i<n; i++)cin>>a[i];
for(int i=0; i<n; i+=2)s+=a[i];
cout<<s<<endl;

/*3*/
int n,a[100],s(0);
cin>>n;
for(int i=0; i<n; i++)cin>>a[i];
for(int i=0; i<n; i++)cout<<--a[i]<<' ';//--a prvo oduzme jedan od a pa ga onda koristi dok a-- koristi a, a nakon toga oduzme 1. mogli ste i da prodjete jedanput kroz niz da bi oduzeli svakom clanu po jedan pa onda opet prosli da bi ste ispisali, ali ovo je brzi nacin.
cout<<endl;

/*4*/
int n,m,a[100][100],s[100];
cin>>n>>m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cin>>a[i][j];
for(int i=0; i<n; i++)
{
s[i]=0;
for(int j=0; j<m; j++)
s[i]+=a[i][j];
}
for(int i=0; i<n; i++)cout<<s[i]<<' ';
cout<<endl;

/*5*/
int n,m,a[100][100],s(0),x1,x2,y1,y2;
cin>>n>>m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cin>>a[i][j];
cin>>x1>>y1>>x2>>y2;
for(int i=y1; i<=y2; i++)
for(int j=x1; j<=x2; j++)
s+=a[i-1][j-1];
cout<<s<<endl;

/*6*/
int n,m,a[100][100],s(1);
cin>>n>>m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cin>>a[i][j];
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(a[i][j]!=0)s*=a[i][j];
cout<<s<<endl;

Нема коментара:

Постави коментар