FUNKCIJE U PROGRAMSKOM JEZIKU C/C++
Da bi ste pročitali članak o rekurzivnim funkcijama pređite na stranu: Rekurzivni algoritmi
1. Zamena mesta
Učitati dava cela broja X i Y. Napraviti funkciju koja menja mesta dve celobrojne promenljive. Upotrebiti ovu funkciju i zameniti vrednosti promenljivama X i Y.2. Da li je broj prost
Napraviti funkciju koja određuje da li je neki broj prost. Uneti prirodan broj i ispitati da li je prost.3. Ispisivanje niza
Učitati n. Zatim učitati niz od n elemenata. Napraviti posebnu metou za njegovo ispisivanje. Koristeći tu metodu ispisati elemente niza na ekranu.4. Izdvajanje parnih elemenata niza
Učitati niz od n elemenata. Broj n, kao i elemente niza unosi korisnik. Napraviti metodu koja prepisuje iz početnog niza parne elemente. Iskoristiti napravljenu metodu da bi ste iz početnog niza izdvojili parne elemente.5. Broj ponavljanja određenog karaktera
Uneti proizvoljan tekst sa tastature. Napraviti posebnu funkcija koja broji prosleđeni karakter. Iskoristiti funkciju za određivanje broja ponavljanja slova "p" u unetom tekstu.6. Računanje faktorijela od n
Napraviti funkciju koja racuna faktorijel broja n. Unutar glavne funkcije ucitati n i iskoristiti prethodnu napravljenju funkciju za izracunavanje faktorijela tog broja.Uneti broj, npr. 5. Pozvati novu funkciju koja računa faktorijel i proslediti joj n kao parametar. Funkcija Faktorijel: Proveriti da li je n == 0 i ako jeste vratiti 1 (jer je 0! = 1). U nastavku kreirati proizvod kroz petlju, tako da se u svakom ciklusu prethodni proizvod pomnoži sa tekućom vrednošću promenljive i. Kontrolnu promenljivu umanjivati za 1, počevši od n pa do 1.
#include <stdio.h>
/* Rešenje za programski jezik C (kompajlabilno u C89/C99 i novijim) */
int faktorijel(int n)
{
int f;
if (n == 0)
{
return 1;
if (n < 0)
{
return -1; /* indikator greške */
f = 1;
for (i = n; i > 0; i--)
{
return f;
int main(void)
{
printf("Unesite neki broj n: ");
if (scanf("%d", &n) != 1)
{
return 1;
if (n >= 0)
{
printf("Faktorijel iznosi %d\n", f);
else
{
return 0;
#include <iostream>
/* Rešenje za programski jezik C++ (kompajlabilno sa modernim C++ kompajlerima) */
unsigned long long factorial(int n)
{
if (n < 0) return 0ULL; /* indikator greške, ovde vraćamo 0 */
unsigned long long f = 1ULL;
for (int i = 1; i <= n; ++i)
{
return f;
int main()
{
std::cout << "Unesite neki broj n: ";<br>
if (!(std::cin >> n))
{
return 1;
if (n < 0)
{
return 0;
unsigned long long result = factorial(n);
std::cout << "Faktorijel iznosi " << result << std::endl;
return 0;
7. Zbir faktorijela prvih n prirodnih brojeva
Sabrati sve faktorijele od 1 do n, n unosi korisnik8. Dnevnice
Mihajlo je zaposlen honorarno i za svoj rad ostvaruje zaradu na dnevnom nivou. Datume i vrednost zarade toga dana on zapisuje u svoju svesku jer o tome vodi evidenciju. Napraviti program koji će pomoći Mihajlu da za učitane vrednosti datuma sa zaradom koje se unose tako da se u jednom redu može učitati po jedan datum sa dnevnom zaradom. Napraviti funkciju koja iz prosleđenog niza dnevne zarade izdvaja datume i zarade u dva posebna niza u kojima se ovi podaci definišu, datum kao string, a zarada kao realan broj. Datum se unosi u formatu dd_mm__gggg(datum, mesec,godina)Primer:
Ulaz:
12_2_2021 2045.33
23_8_2021 1034.66
15_4_2021 1567.99
Izlaz:
Niz1:
12.02.2021
23.08.2021
15.04.2021
Niz2:
2045.31
1034.66
1567.99
9. Logovanje
Napraviti metodu(funkciju) za logovanje korisnika na osnovu unošenja korisničkog imena i lozinke. Dozvoliti korisniku da najviše 3 puta pokuša unošenje lozinke. Metoda treba da da odgovor da li je korisnik uspešno ulogovan ili nije. Funkciju pozvati iz glavne (main) metode. Ako metoda vrati da je korisnik ulogovan, onda ispisati poruku: "Korisnik je uspešno ulogovan", u suprotnom napisati "Korisnik nije uspešno ulogovan". Poznato je da je tačna kombinacija korisničkog imena i lozinke: admin korisnik.
Primer:
Ulaz:
Uneste vaše korisničko ime i šifru:
"Mika"
"korisnik1"
Ponovite unos netačna lozinka
"admin"
"korisnik"
Izlaz:
Korisnik je uspešno ulogovan
10. Određivanje maksimuma
Napraviti funkciju koja određuje maksimum dva cela broja koji su prosleđeni kao parametri funkcije.Učitati dva cela broja i odrediti njihov maksimum koristeći prethodno definisanu funkciju.
Kreirati funkciju "maksimum()", koja kao parametre prima dva cela broja, a i b, a zatim, unutar funkcije ispitati koji je od njih veći.
Ako je "a" veći, funkcija treba kao povratnu vrednost da vrati podatak "a", a u suprotnom "b".
Unutar glavne(main) funkcije, uneti dva cela broja, a zatim pozvati prethodno kreiranu funkciju za određivanje maksimuma, da bi se on odredio. Odštampati tu vrednost u nastavku programa.
/*Rešenje za programski jezik C*/
int maksimum(int a, int b)
{
{
else
{
int main()
{
printf("a=?,b=?\n");
scanf("%d%d",&a,&b);
maxAB = maximum(a,b);
printf("Maksimum je %d",maxAB);
return 0;
11. Određivanje da li je broj prost
Napraviti funkciju koja ispituje da li je broj koji joj je prosleđen kao parametar, prost.Učitati ceo broj i odrediti da li je prost koristeći prethodno definisanu funkciju.
Više o prostim brojevima pročitajte na web strani: Prosti brojevi i faktorizacija
/*Rešenje za programski jezik C*/
int prost(int a)
{
if(a==1 || a==2){
int d=2;
while(d < a){
break;
d++;
int main()
{
printf("x=?\n");
scanf("%d",&x);
if(prost(x)){
else{
return 0;
12. Ispisivanje bitova sa leva na desno
Napisati funkciju koja ispisuje bitove od x sa leva na desno.Kreirati funkciju "bitovi()", koja kao parametar prima ceo broj "a".
Unutar funkcije upotrebom petlje kreirati stepene broja 2, počev od 215, a zatim smanjivati izložilac kroz cikluse.
Ispitati u svakom ciklusu, da li je taj stepen broja dva manji od ostatka broja, koji je u početku jednak celom poslatom broju "a".
Ako jeste, štampati 1 kao bit, ako nije štampati nulu. Preračunati ostatak broja koji ostane kad od prethodnog ostatka oduzmemo trenutni stepen broja 2.
U glavnoj "main" funkciji pozvati prethodno napravljenu funkciju da se izvrši.
/*Rešenje za programski jezik C*/
int bitovi(int a)
{
for(int i = 15;i >= 0;i--){
if(a <= ost){
ost=ost % a; //a=4, ost=7%4=3; a=2, ost=3%2=1; a=1, ost=1%1=0
else{
printf("\n");
int main()
{
printf("x=?\n");
scanf("%d",&x);
bitovi(x);
return 0;
13. Zaokruživanje na K decimala.
Napisati funkciju kojom se ispisuje količnik prirodnih brojeva M/N na k decimalaUčitati tri cela broja M,N i K.(npr. 13,3,2)
Naći količnik M/N,(npr.13/3=4.333333), a kao tip podataka odabrati double ili float, kako bi se sačuvale decimale.
Dobijeni broj pomnožiti sa 10K, a zatim taj broj pretvoriti u ceo broj, kako bi on sadržao i cifre rezultata i cifre koje treba da budu prikazane posle decimalne tačke(npr. 433).
Izvući iz ovog broja i celobrojni rezultat, deljenjem sa 10K, kao i decimalni deo traženjem ostatka deljenja sa 10K.
Ispisati prvo celobrojni deo, zatim staviti "." i u nastavku dodati decimalni deo.
/*Rešenje za programski jezik C*/
int main()
{
double rezD;
printf("M=?,N=?,K=?\n");
scanf("%d%d%d",&M,&N,&K); //13,3,2
rezD=(double)M/N; //4.333333
printf("rez=%f\n",rezD);
koef=(int)pow(10,K); //100
rez=rezD*koef; //433
rezD=(double)rez/koef; //4.3300000
printf("rez=%g\n",rezD);
int br,dec;
br=rez/koef;//4
dec=rez%koef;//33
printf("%d.%d\n",br,dec);
14. Računanje kombinacija.
S=Cnk-Cnk+1 +..+(-1)p*Cnk+p,
po formuli za računanje kombinacija
15. Bit na zadatoj poziciji.
Napisati funkciju koja izveštava da li je na poziciji poz, argumenta funkcije(parametra) X nalazi 1.Pozicije bitova su numerisane, s desna ulevo, počev od pozicije 1.16. Broj u inverznom poretku.
Ako je broj M1 dobijen od broja M zapisom njegovih cifara u inverznom poretku, napisati program kojim se štampaju svi parovi trocifrenih brojeva(a,b) koji imaju svojstvo: Ako je A*B=C, to je A1*B1=C1. Na primer:312 * 221 = 68952
213 * 122 = 25986
17. Najbliži broj koji zadovoljava uslov.
Ako S(n) označava zbir cifara u dekadnom zapisu broja n, odrediti n takav da je najbliži manji broj od 2003, za koji važi jednakost:n+S(n)+S(S(n))+S(S(S(n)))+S(S(....S(n)....)=2003
18. Slova u novom poretku.
U jednoj državi, u reformističkom rasploženju, izmenjen je redosled velikih slova alfabeta na sledeći način:"MILOSCGRABDEFHJKNPQTUVWXYZ"
a) Napisati funkciju koja prema novom poretku slova poredi dva stringa
b) testirati funkciju tako što će se niz imena novoimenovanih ambasadora štampati u poretku definisanom po novom alfabetu
Kombinovani zadaci sa upotrebom funkcija
Zadatak 1: Pomeri elemente niza ulevo (rotacija)
Napišite funkciju u C jeziku koja pomera sve elemente niza za jedno mesto ulevo (ciklična rotacija). Funkcija treba da modifikuje niz in-place i pri tome poslednji element treba da postane prethodno prvi element.
- Kreirajte funkciju
ciklus_levokoja prima parametreint A[]iint n. - U main funkciji: pročitajte veličinu n, unesite n elemenata niza, pozovite
ciklus_levoi zatim prikažite rezultat pozivom pomoćne funkcijestampaj_niz. - Obratite pažnju na ivične slučajeve: n <= 1 (niz se ne menja).
Kratko objašnjenje zadatka:
Cilj je da demonstrirate kako se niz menja direktno u funkciji (prosleđivanjem pokazivača na prvi element) i da razumete jednostavnu algoritamsku operaciju pomeranja elemenata (O(n) vremenska složenost).
Zadatak 2: Sortiranje niza metodom Bubble Sort
Napišite C program koji sortira niz celih brojeva koristeći standardni
Bubble Sort algoritam. Implementirajte funkciju
bubble_sort koja prima niz i njegovu dužinu i sortira elemente
in-place. U main-u pročitajte veličinu niza, učitajte elemente,
pozovite sortiranje i prikažite rezultat.
- Kreirajte funkciju
bubble_sort(int A[], int n). - Dodajte pomoćnu funkciju
stampaj_nizza ispis niza. - Optimizujte Bubble Sort da izlazi ranije ako je niz već sortiran (koristeći flag).
Kratko objašnjenje zadatka:
Bubble sort poredi susedne parove i, po potrebi, ih zamenjuje tako da se najveći element "izbubbles" na kraj u jednoj iteraciji. Ponoviti postupak dok niz nije sortiran. Algoritam je jednostavan za implementaciju (stabilan), ali ima vremensku složenost O(n²).
#include <stdio.h>#include <stdlib.h>/* Pomoćna funkcija za ispis niza */voidstampaj_niz(int A[], int n) {printf("stampaj_niz:\n"); for (int i = 0; i < n; i++) {} /* Bubble sort (optimizovana verzija sa flagom za raniji izlaz) */voidbubble_sort(int A[], int n) {printf("%d ", A[i]);} printf("\n");for (int pass = 0; pass < n - 1; pass++) {} intmain() {int swapped = 0; for (int i = 0; i < n - pass - 1; i++) {}// Ako je element na poziciji i veći od sledećeg, zamenimoif (A[i] > A[i + 1]) {} if (!swapped) {int temp = A[i]; A[i] = A[i + 1]; A[i + 1] = temp; swapped = 1;}// Nema zamena u ovoj prolazu — niz je već sortiranbreak;}int n; // Učitavanje veličine nizascanf("%d", &n); // Napomena: koristi se VLA (C99). Za starije standarde koristite malloc.int niz[n]; for (int i = 0; i < n; i++) {}printf("Unesi %d. element niza\n", (i + 1)); scanf("%d", &niz[i]);} // Sortiranjebubble_sort(niz, n); // Ispis sortiranog nizastampaj_niz(niz, n); return0;
Objašnjenje rešenja
- Princip: Bubble sort poredi susedne elemente i zamenom većeg sa manjim pomera veće elemente ka kraju.
- Optimizacija: Koristimo promenljivu
swappedkako bismo prekinuli izvođenje ako je u celom prolazu bilo nula zamena — to znači da je niz već sortiran i možemo ranije izaći. - In-place: Sortiranje menja sadržaj prosleđenog niza direktno (nije potrebna dodatna memorija osim privremenog
temp). - Stabilnost: Bubble sort je stabilan algoritam — relativni poredak jednakih elemenata se čuva.
- Vremenska složenost:
- Najgori i prosečni slučaj: O(n²).
- Najbolji slučaj (već sortiran niz, zahvaljujući flagu): O(n).
- Prostor:O(1) dodatne memorije (samo
tempi flag). - Napomena o kompatibilnosti C: ako želite portabilnost na stare C kompilatore, umesto VLA koristite malloc i free.
Proširenje (opciono): Implementirajte verziju koja sortira u opadajućem redosledu ili koja vraća broj prolaza potrebnih za sortiranje.
Zadatak 3: Obrni niz (reverse)
Napišite program u C koji implementira funkciju koja obrće elemente celobrojnog niza in-place. Funkcija treba da zameni elemente tako da prvi postane poslednji, drugi postane pretposlednji itd. U main-u pročitajte veličinu niza, unesite elemente, pozovite funkciju za obrtanje i prikažite rezultat.
- Kreirajte funkciju
obrni_niz(int A[], int n)koja menja niz direktno. - U main-u: učitajte n, popunite niz, pozovite
obrni_nizi zatim ispišite niz pomoćustampaj_niz. - Obratite pažnju na ivične slučajeve (n <= 1).
Kratko objašnjenje zadatka:
Cilj je demonstrirati manipulaciju elementima niza korišćenjem dva indeksa (levo/desno) i zamenu elemenata dok se ne pređu. Algoritam radi in-place sa O(1) dodatne memorije i vremenskom složenošću O(n).
#include <stdio.h>#include <stdlib.h>/* Pomoćna funkcija za ispis niza */voidstampaj_niz(int A[], int n) {printf("stampaj_niz:\n"); for (int i = 0; i < n; i++) {} /* Funkcija koja obrće niz 'in-place' koristeći dve pokazivačke pozicije */voidobrni_niz(int A[], int n) {printf("%d ", A[i]);} printf("\n");// Ako je niz prazan ili ima jedan element, nema šta da se menjaif (n <= 1) {} intmain() {return;} int levo = 0; int desno = n - 1; while (levo < desno) {int tmp = A[levo]; A[levo] = A[desno]; A[desno] = tmp; levo++; desno--;}int n; // Učitavanje veličine nizascanf("%d", &n); // Napomena: koristi se VLA (C99). Za starije standarde koristite malloc.int niz[n]; for (int i = 0; i < n; i++) {}printf("Unesi %d. element niza\n", (i + 1)); scanf("%d", &niz[i]);} // Poziv funkcije koja obrće nizobrni_niz(niz, n); // Ispis rezultatastampaj_niz(niz, n); return0;
Objašnjenje rešenja
-
Funkcija
obrni_nizkoristi dva indeksa: levo počinje od nultog indeksa, a desno od poslednjeg elementa. -
U while petlji dok god je levo < desno zamenjujemo vrednosti na tim pozicijama pomoću privremene promenljive
tmp, zatim pomeramo levo++ i desno--. Time je zagarantovano da svaki par bude zamenjen samo jednom. - Algoritam radi in-place (bez dodatnih velikih buffera) i koristi O(1) dodatne memorije. Vremenska složenost je O(n) jer svaki element učestvuje u najviše jednoj zamenI.
- Edge cases: ako je
n <= 1funkcija odmah vraća jer nema promena; ako jenveoma veliko razmotrite korišćenje dinamičke alokacije umesto VLA radi portabilnosti. - Prednosti pristupa: jednostavnost, efikasnost i mala potrošnja memorije. Pogodno za primenu kada treba brzo obrnuti redosled elemenata.
Proširenje (opciono): Napišite verziju koja vraća novi alocirani niz (ne menja original), ili generičku funkciju koja obrće niz tipa void* pomoću funkcije za zamenu elemenata (korisno za rad sa drugim tipovima).
| Prethodno |< Matrice primeri |
Sledeće Algoritmi-primeri >| |
