Funkcije

Funkcije su sastavni delovi programa. Kad je reč o složenijim programskim modulima funkcije omogućavaju elementarizacija složenog problema tako što se proizvoljno strukturišu u kodu veće modularnosti. U dosadašnjim primerima naredbe koje se izvršavaju su sastavni deo funkcije  main() -osnovni deo koji sadrže sve programe, prva funkcija koja se poziva prilikom startovanje jednogprograma napisan u programskom jeziku  C++.

Funkcije predstavljaju skup naredbe koje se izvršavaju prilikom svakog njihovog poziva. Poziv funkcije je naredba koja procesoru signalizira da je potrebno prekinuti tok izvršavanje naredbe programa , upisati  lokaciju unutar programa i pozivati adekvatnu funkcije. Nakon završetka pozvane funkcije, program nastavlja sa izvršavanjem od mesta gde je funkcija pozvana.

Sintaksa za kreiranje funkcije:

tip ime(parametar1, parametar2, parametar3, parametar4, …)
{
    naredba1;
    naredba2;
    naredba3;
    …..
    naredbaN;
}

Pri čemu, tip je tip podatka koji se vraća kao rezultat funkcije  (ili void, ako funkcija ne vraća rezultat), parametar1, parametar2, …, su parametri za poyiv funkcije ,  (tip i ime), odvojeni zarezom, dok naredba1, naredba2, …, naredbaN,naredbe koje se izvršavaju prilikom svakok poziva funkcije.Lista parametara nije obavezna , primer funkcija  main().

Funkcija omogućava deljenje programa na sitnije delove – koji sami za sebe su veoma jednostavni za rešavanje.Kod strukturnog programiranja korišćenjem funkcija, umanjuje se složenost problema koji se rešava.

Pr.

Koristeći funkciju napravi program koji izraćunava N!?

Rešenje:

#include <iostream>
using namespace std;
int factorial(int n)
{
int res = 1;
for (int i=2; i<=n; i++)
res *= i;
return res;
}
int main()
{
int n = 4;
int f = factorial(n); //f = 24
cout << f << endl; //stampa '24' (1*2*3*4)
return 0;
}
Kao prvo,primećujemo da funkcija  factorial(int n) jе deklarirana pre funkcije  main(). Kad je C++ u pitanju , to je obavezno –nemože se pozvati funkcija koja predhodno nije deklarisana.
Unutar funkcije  main(), deklarišemo promenljivo f tipa int i dodeljujemo joj vrednost faktorijal(4). Očigledno  „factorial(4)“ nije ceo broj kao što smo očekibali prilikom dodeljivanja vrednost celobrojne promenljive, to je poziv do funkcije  factorial(int n). U tom momentu procesor upisuje dokle je stigao sa izvršavanjem naredbe i zatim poziva funkciju  factorial(int n). Pozivanje se vrši na taj način što sistem kopira vrednost sa kojom je pozvana funkcija  (4) u adekvatni parametar  (n). Zatim se ponavljaju naredbe funkcije factorial(int n).Ova funkcija deklariše novu promenljivu res, izračunava određene izraze i vraća rezultat izračunavanja. Zato što je promenljiva res deklarirana lokalno  može se upotrebljavati samo u ovu funkciju.
Napomena:
 C++ omogućava deklariranje promenljive na dva načina: globalno (izvan funkcije) i lokalno (unutar funkcije). Promenljive koje su deklarisane kao globalne  mogu se koristiti bilo gde u programu (unutar bilo koje funkcije ili blok). Promenljive koje su deklarirane lokalno mogu se koristiti samo u funkciju u kojoj su deklarisane (i to nakon deklarisanja).
Funkcija koja se poziva je definisana kao  „int factorial(n)“, znači treba da vrati rezultat ceo broj.  Rezultat izvršavanja funkcije upisuje se kao vrednost promenljive f ( definisana u main() funkciju). U gornjem primeru , 24, je rezultat izvršavanja funkcije  factorial(4), direktno se upisuje kao vrednost promenljive  f („int f = 24;“).

Ispis stringova

Ya ispis stringova se koriste dve bibliotečne funkcije printf()- ispisuje mešovite podatke i puts()-ispisuje samo stringovi.

#include <stdio.h>

#define naslov „osnovi programiranja“

main()

{

static char s1[]={Metode programiranja“};

puts(naslov);

puts(s1);

puts(“ Iovaj string prihvata puts()“);

}

Nakon izvršavanja programa dobija se:

osnovi programiranja

Metode programiranja

I ovaj string prihvata puts()

Funkcija strlen()- argument funkcije je string, a funkcija vraća broj znakova bez  znaka  NULL. Za njeno korišćenje neophodno je uključiti <string.h> zaglavje.

pr: Koliko puta u stringu je yastupljen karakter x?

#include<stdio.h>
main()
{
char s[10],x,*pok;
int b=0;
printf(„Unesi karakter kako se broji\n“);
scanf(„%c“,&x);
printf(„Unesi strinf?\n“);
scanf(„%s“,s);

pok=s;

while(*pok)
{
/*printf(„proba%c“,*pok);*/
if (*pok++==x)
b++ ;

}
printf(„broj ponavljanja karaktera %c u stringu %s je %d\n „,x,s,b);
return 0;
}

pr.

 

Stringovi

String- jednodimenzionalni niz tipa char koji ne mora zauzimati sve elemente niza u kome se čuva. Da bi se znal gde se u nizu završava string dopisuje mu se završni ili NULL znak – „, koji je sastavni deo stringa.

Pr.

char poruka[10], *pokc;

poruka[0]=’z’;

poruka[1]=’d’;

poruka[2]=’r’

poruka[4]=’a’;

poruka[5]=’v’;

poruka[5]=’o’;

pokc=poruka;

while(*pokc!=“)

putchar(*pokc++);

Pored inicijalizacije „znak po znak“, strin se može inicijalizirati i string konstantom-niz znakova između znaka navodnika. Znaci između navodnika se plus završni znak se registruju u niz susednih memorijskih lokacija.  String konstanta „C“, nije ista sa znakovnom konstantom „C“, jer string konstanta sadrži i završni znak, “ „.

Stringovi se mogu inicijalizirati koriščenjem string konstante bilo da se čuvaju u statičkim, spoljašnim ili automatskim nzovima.

pr.

statik char s[]=“bah“

static char s[]={‘I’,’B’,’M’,“}(ako se izostavi znak  “, onda nije reč o stringu već o nizu znakova)

s- pokazivac na nulti element niza

s==&s[0], *s==’I’, *(s+1)=s[1]==’B’

Дводимензионални низови (матрице)- решени задаци!

Задатак1. Матрицом реда N дата је табела јесенјег дела фудбалског шампионата чији су елементи : 0– ако је екипа i изгубила од екипе ј; 1– ако је нересено; 2 ако је екипа i победила екипу ј. Написати програм којим се израчунава:

а) бројекипа који су имали више победе него пораза

б) број екипа које немају пораз у првенству

(садржај на главној дијагонали занемарите)?

Решење:

а)

#include<stdio.h>

int a[10][10];
int brojp[10];
int broji[10];
main()
{
int i,j,n,bp,bi;
bi=0;
bp=0;
printf(„Unesi broj ekipa“);
scanf(„%d“,&n);
/*Unos elemenata matrice*/
for (i=0;i<n;i++)
{
printf(„Rezultate ekipe[%d]“,i+1);
for (j=0;j<n;j++)

scanf(„%d“,&a[i][j]);
printf(„\n“);
}
/* ukupno pobeda i poraza ekipa */
for (i=0;i<n;i++)
{

for (j=0;j<n;j++)
if((i!=j) && (a[i][j]==2))
{
bp++;
}
else
{
if ((i!=j) && (a[i][j]==0))
bi++;
}
/*printf(„pobede ekipe[%d] %d\n“,i+1,bp);*/
/*printf(„porazi ekipe[%d] %d\n“,i+1,bi); */
brojp[i]=bp;
broji[i]=bi;
bp=0;
bi=0;

}
/*broj pobeda i poraza*/
for(i=0;i<n;i++)

{if (brojp[i]>broji[i])
bp++;
else
bi++;
}
if (bp>=bi)
printf(„Vise pobeda nego poraza imaju %d ekipe“,bp);
else
printf(„Ne postoje ekipe sa vise pobeda od poraza“);
return 0;
}

б) број екипа без пораза

#include<stdio.h>
int a[10][10];
int brojp[10];
int broji[10];
main()
{
int i,j,n,bp,bi;
bi=0;
bp=0;
printf(„Unesi broj ekipa“);
scanf(„%d“,&n);
/*Unos elemenata matrice*/
for (i=0;i<n;i++)
{
printf(„Rezultate ekipe[%d]“,i+1);
for (j=0;j<n;j++)

scanf(„%d“,&a[i][j]);
printf(„\n“);
}
/* ukupno pobeda i poraza ekipa */
for (i=0;i<n;i++)
{

for (j=0;j<n;j++)
if((i!=j) && (a[i][j]==2))
{
bp++;
}
else
{
if ((i!=j) && (a[i][j]==0))
bi++;
}
/*printf(„pobede ekipe[%d] %d\n“,i+1,bp);*/
/*printf(„porazi ekipe[%d] %d\n“,i+1,bi); */
brojp[i]=bp;
broji[i]=bi;
bp=0;
bi=0;

}
/*broj pobeda i poraza*/
for(i=0;i<n;i++)
{
if (brojp[i]>=n-1)
bp++;
}
printf(„Broj ekipa bey poraza je %d „,bp);
return 0;
}

Задатак2. Направите програм који креира јединичну матрицу А(nxn), за n<10?

Решење:

(матрица је јеинична ако ван главне дијагонале има нуле, а на дијагонали јединице)

#include<stdio.h>;
int a[10][10];
main()
{
int i,j,n;
printf(„Unesite broj vrst(kolona)matrice?“);
scanf(„%d“,&n);
/*Kreiranje jedinecne matrice reda n*/
for (i=0;i<n;i++)
a[i][i]=1;
/*Prikaz jedinicne matrice*/
for(i=0;i<n;i++)
{
for (j=0;j<n;j++)
printf(„%d“,a[i][j]);
printf(„\n“);
}
return 0;
}

Задатак3. дата је матрицакоја има м редова и н колона, Направите програм који сумира елементе матрице на дијагонали?

Решење:

#include<stdio.h>
float a[10][10];
main()
{
int i,j,m,n;
float suma=0.0;
printf(„Unesite broj vrsta\n“,m);
scanf(„%d“,&m);
printf(„Unesi broj kolona\n“,n);
scanf(„%d“,&n);
/*Unos elemenata matrice*/
for (i=0;i<m;i++)
{
printf(„Unesi elemente %d vrste\n“,i+1);
for (j=0;j<n;j++);
scanf(„%f“,&a[i][j]);

}
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
suma+=a[i][i];
}
printf(„zbir elemenata matrice a na glavnoj dijagonali je%d „,suma);
return 0 ;
}

 

Вишедимензионални низови

Много проблема могу веома ефикасно да се реше ако се употребе вошедимензионални низови. Пр. табела са две или више колоне може да се представи као дводимензионални низ, а више табела као тродимензионални низ.

пр. Потребно је да се у метеролошком заводу обради статистика месечних падавина за прва три месеца у години за неког града за период од 5 године (од 199101995). Циљ обраде је просечне месечне и годишње падавине. Да би се обрадили просечне падавине треба сумирати податке у одговарајућој врсти и поделити са 3, а за месечне падавине треба сабрати податке по колони за дати месец и затим поделити са 5.

Година јан
0
феб
1
март
2
Просек
91-0 xx xx xx
92-1 xx xx xx
93-2 xx xx xx
94-3 xx xx xx
95-4 xx xx xx
Просек

Матрица, појам који се користи у математици,  дводимензионални низ ; приказије се унутар угластих заграда и дефинисана је са бројем редова и колона.  Приступ елементима матрице је преко индекса редова и колона.

Значи, предходни пробле се своди на  дводимензионалну матрицу реда 5*3, 3 врсте и 3 колоне.

За решавање проблема користе се низ низова. Основни низ има 5 елемената, који су низови од 3 елемената. Декларишемо на сл. начин:

kisa[5][3]; 

Елемент матрице kisa[1][3] оперише са количуном падавина за јануар 1992год. Променом дригог индекса кретанје је по врсти, а променом првог индекса кретанје је по колони. Збир количине падавина за март 1991 и 1994 се представлја као klasa[0][3]+klasa[3][3].

Иницијализација дводимензионалних низова- иницијализовани елементи се наводе по врстама.

пр.

static int tabela[3][4]={{1,1,1,1}, {2,2,2,2},{3,3,3,3}}  ili

static int tabela[3][4]={

{1,1,1,1},

                                                        {2,2,2,2},

                                                        {3,3,3,3},

                                                         };

пр.

static int A[2][3]={

{1,2},

{3,4},

};

Реч је о матрици А чији су елементи 1 2 0

                                                                                3 4 0

Пр.

Декларација матрице А 2*3  са елементима 1 2 3

                                                                                    4 0 0

Static int A[2][3]={1,2,3,4}

Решење примера :

#include<stdio.h>
#include<math.h>
float kisa[5][12];
main()
{

/* deklaracija dvodimenzionalnog niza*/

/*deklaracija jednogdimenzionalnog niza*/
static float mesecp[12],godp[5];
int i, j;
mesecp[0]=0;
godp[0]=0;

printf(„Unesite podatke iz tabelu vrstu po vrstu“);
for (i=0;i<3;i++)
{
printf(„podaci za %d godinu\n“,i+1991);
for (j=0;j<3;j++)
{
scanf(„%f“,&kisa[i][j]);
mesecp[j]+=kisa[i][j];
godp[i]+=kisa[i][j];

}
godp[i]+=kisa[i][j];
godp[i]/=3;
}
printf(„godisnji proseci su:\n“);
for (i=0;i<5;i++)
printf(„Za %d g prosek %15.3f\n“,i+1991,godp[i]);
printf(„Mesecni proseci su :\n“);
for (j=0;j<3;j++)
printf(„za %d mesec prosek %15.3f\n“, j+1,mesecp[j]/5);
return 0;
}

Funkcije i nizovi!

zad. Koliko je učesnika takmičenja imalo natprosečne rezultate?

Rešenje:

Rasčlanjujemo problem na sledeće module:

1. Učitavanje vrednosti elemenata niza

2. Izračunavanje prosečnog rezultata

3. Prebrojavanje natprosečnih reyultata

4. Izveštaj!

Za izračunavanje proseka koristimo funkciju prosek(); deklaracija x[] u funkciji kreira ne niz  već pokazivač na niz

#include <stdio.h>
/*deklaracija niza*/

float prosek(int x[],int n)
{
int i, suma;
suma=0;
for(i=0;i<n,suma+=x[i];i++);
return((float)suma/n);
}

main()
{
int n,i,broj, ocena[50];
float prosek;

printf(„Uunesi broj takmicara?“);
scanf(„%d“,&n);
/*Ucitavanje elemente niza*/
for(i=0;i<n;i++);
{
printf(„ocena[%d]=“,i);
scanf(„%d“,&ocena[i]);
}
/* Prebrojavanje nadprosecnih rezultata*/
broj=0;
for(i=0;i<n;i++)
{

if (ocena[i] >prosek(ocena,n))
broj++;
};
Printf(„Prosecni rezultat je %f\n“,prosek(ocena,n));
printf(„Nadprosecne rezultate je imalo %dtakmicara \n“,broj);

return 0;
}

Prenos jednodimenzionalnog niza se ostvaruje navodjenjem imena niza u poyivu funkcije bez indeksa. Oni se prenose iskljucivo po adresi. Prenos nizova  kao vrednosnih  parametara nije moguć u C-u

 

Spoljasne promenljive

Promenljive deklarisane van funkcije nazivaju se spoljašnje promenljive. Spoljašna promenljiva se može deklarisati i u funkcii navodeči rezervisanu reč extern.

pr:

int a;

char c;

double x;

main();

{

extern int a;

extern char c;

}

grupa exter deklaracije se može izostaviti ako su izvorne deklaracije promenljivih ispred funkcije koja ih koristi. Navođenje rezervisane reči extern spoljašnja promenljiva postaje dostupna funkcii definisanoj bilo gde u tom ili u drugom fajlu.

pr1.

#include<stdio.h>
/*globalna deklaracija*/
int a=1;

main()
{
/*lokalna deklaracija*/
int x=10;
printf(„%d“,x);
return 0;
}

U toku izvršavanja funkcije važeča je vrednos lokalne promenljive x, tako da se ispisuje 10 , a ne 1.

 

Statističke promenljive

Promenljive koje postoje i kada se izvrši funkcija nazivaju se statističke.

Kao i automatske i statističke promenljive su lokalne u funkcii u kojoj su deklarisane, razlika je u tome što statističke promenljive ne isčezavaju kada funkcija koja ih sadrži prekine izvršavanje. Kompajler čuva njihove vrednosti od poziva do poziva.

Deklaracija statističkih promenljivih

{

static int a=1;

static int b=2;

float c=0.0;

}

Razmislite! Dali su sve promenljive statističke?

Pr.

#include<stdio.h>
static int a=1;
static int b=2;
float c=0.0;
int uvecaj()
{
static int x=0;
x++ ;
printf(„%d\n“,x);
return(x);
}
main()
{
uvecaj();
uvecaj();
uvecaj();
return 0;
}
Nakon izvršavanja programa ispisuje se ,1, 2, 3

U programu se funkcija uvecaj() poziva tri puta. U njoj se statistička promenljiva x, kojoj je dodeljena inicijalna vrednost 0, samo jedanput  inicijalizira, kasnije promenljivoj  x se dodeljuje vrenost sačuvana nakon poziva funkcije.

Inicijalizacija promenljive se realizuje tokom kompajliranj, to znači da kompajler rezerviše prostor u memoriji za statističku promenljivu i tamu smešta inicijalnu vrednost. Kada program započne sa izvršavamjem, promenljiva vec ima vrenost.

 

Ako nije predviđena inicijalna vrednost za promenljivu, kompajler sam dodeljuje i to za promenljivu tip int-0, chr-.