Funkcije u jeziku C/C++ – primeri

Strana 10 od 11 · Osnovni primeri

Da biste pročitali članak o rekurzivnim funkcijama pređite na stranu: Rekurzivni algoritmi

Pre nego što počneš: pročitaj lekcije Funkcije u jeziku C, Funkcije u jeziku C++.
Kako da vežbaš: prvo pokušaj sam/a da rešiš zadatak (makar na papiru), zatim otvori uputstvo, a rešenje tek na kraju. Rešenja su najčešće u jeziku C ili C++; ako učiš Javu ili Python, prepiši ideju u svoj jezik.
ZADATAK 01

Zamena mesta

Učitati dva cela broja X i Y. Napraviti funkciju koja menja mesta dve celobrojne promenljive. Upotrebiti ovu funkciju i zameniti vrednosti promenljivama X i Y.

ZADATAK 02

Ispisivanje niza

Učitati n. Zatim učitati niz od n elemenata. Napraviti posebnu metodu za njegovo ispisivanje. Koristeći tu metodu ispisati elemente niza na ekranu.

ZADATAK 03

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 biste iz početnog niza izdvojili parne elemente.

ZADATAK 04

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.

ZADATAK 05

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.

ZADATAK 06

Zbir faktorijela prvih n prirodnih brojeva

Sabrati sve faktorijele od 1 do n, n unosi korisnik

ZADATAK 07

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

ZADATAK 08

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

ZADATAK 09

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.

ZADATAK 10

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

ZADATAK 11

Ispisivanje bitova sa leva na desno

Napisati funkciju koja ispisuje bitove od x sa leva na desno.

ZADATAK 12

Zaokruživanje na K decimala

Napisati funkciju kojom se ispisuje količnik prirodnih brojeva M/N na k decimala

ZADATAK 13

Računanje kombinacija

Napisati program kojim se za date prirodne brojeve n,k,p izračunava
S=Cnk-Cnk+1 +..+(-1)p*Cnk+p,
po formuli za računanje kombinacija

ZADATAK 14

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.

ZADATAK 15

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

ZADATAK 16

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

ZADATAK 17

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 18

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_levo koja prima parametre int A[] i int n.
  • U main funkciji: pročitajte veličinu n, unesite n elemenata niza, pozovite ciklus_levo i zatim prikažite rezultat pozivom pomoćne funkcije stampaj_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 19

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_niz za 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>

/* Pomoćna funkcija za ispis niza */
void stampaj_niz(int A[], int n)
{
    for (int i = 0; i < n; i++)
        printf("%d ", A[i]);
    printf("\n");
}

/* Bubble sort sa zastavicom: ako u prolazu nema zamena, niz je sortiran */
void bubble_sort(int A[], int n)
{
    for (int prolaz = 0; prolaz < n - 1; prolaz++)
    {
        int bilo_zamena = 0;
        for (int i = 0; i < n - prolaz - 1; i++)
        {
            if (A[i] > A[i + 1])          /* susedi u pogrešnom redosledu */
            {
                int temp = A[i];
                A[i] = A[i + 1];
                A[i + 1] = temp;
                bilo_zamena = 1;
            }
        }
        if (!bilo_zamena)                 /* niz je već sortiran */
            break;
    }
}

int main()
{
    int n;
    scanf("%d", &n);
    int niz[n];                           /* niz promenljive dužine (C99) */
    for (int i = 0; i < n; i++)
        scanf("%d", &niz[i]);

    bubble_sort(niz, n);
    stampaj_niz(niz, n);
    return 0;
}

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 swapped kako 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 temp i 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 20

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_niz i zatim ispišite niz pomoću stampaj_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>

void stampaj_niz(int A[], int n)
{
    for (int i = 0; i < n; i++)
        printf("%d ", A[i]);
    printf("\n");
}

/* Obrće niz na licu mesta: menja prvi sa poslednjim, drugi sa pretposlednjim... */
void obrni_niz(int A[], int n)
{
    int levo = 0, desno = n - 1;
    while (levo < desno)
    {
        int tmp = A[levo];
        A[levo] = A[desno];
        A[desno] = tmp;
        levo++;
        desno--;
    }
}

int main()
{
    int n;
    scanf("%d", &n);
    int niz[n];
    for (int i = 0; i < n; i++)
        scanf("%d", &niz[i]);

    obrni_niz(niz, n);
    stampaj_niz(niz, n);
    return 0;
}

Objašnjenje rešenja

  • Funkcija obrni_niz koristi 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 <= 1 funkcija odmah vraća jer nema promena; ako je n veoma 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 primeriSledeće
Algoritmi-primeri >|

Česte greške i saveti
  • Funkcija koja nije void mora u svakom slučaju da vrati vrednost naredbom return.
  • Parametar se prenosi kao kopija; da bi funkcija promenila promenljivu iz main, u C++-u koristi referencu (int &x), a u C-u pokazivač.
  • Dobra funkcija radi jednu stvar i ima ime koje to kaže: jeProst(n), zbirCifara(n).

Proveri znanje

Otvori kviz

Mini kviz: funkcije

1. Šta je povratni tip funkcije koja samo ispisuje tekst?




2. Funkcija void uvecaj(int x) { x++; } se pozove sa uvecaj(a), gde je a = 5. Koliko je a posle poziva?



3. Kada je bolje deo programa izdvojiti u funkciju?