You are on page 1of 12

PROGRAMIRANJE II

A01 – Funkcije (1. dio)

dr Dražen Brđanin (bdrazen@etfbl.net)


Goran Banjac (goran.banjac@etfbl.net)
Danijela Banjac (danijela.banjac@etfbl.net)
Aleksandar Keleč (aleksandar.kelec@etfbl.net)

2016.
A01 FUNKCIJE
Napisati program koji učitava (neoznačen) broj n, a zatim izračunava i ispisuje n!. n! treba
da se računa u rekurzivnoj funkciji fakt.
Matematički opis rekurzije: #include <stdio.h>

n! = n * (n - 1)!, n > 1; 0! = 1, 1!=1 unsigned fakt(unsigned n)


{
if (n <=
return n 1)
<= 1 ? 1 : n * fakt(n - 1);
3! = 3 * 2! 3*2=6 } return 1;
else
int main()
return n * fakt(n - 1);
}
{
2! = 2 * 1! 2*1=2 unsigned n;
int
printf("n=");
main()
{ scanf("%u", &n);
unsigned n;
printf("%u!=%u\n", n, fakt(n));
printf("n=");
return 0;
1! = 1 } scanf("%u", &n);
printf("%u!=%u\n", n, fakt(n));
return 0;
} n=5
5!=120

Funkcije (1. dio) 2


A01 FUNKCIJE
Napisati program koji učitava niz od n realnih brojeva, a zatim ispisuje sumu brojeva datog
niza. Elementi niza treba da se sumiraju u rekurzivnoj funkciji suma.
#include <stdio.h>
#define MAX 100

double suma(double niz[], unsigned n)


{
if (n == 0)
return 0;
else
return niz[n - 1] + suma(niz, n - 1);
}

int main()
{ n=5
unsigned i, n; 1. broj: 1.1
double niz[MAX]; 2. broj: 2.2
do printf("n="), scanf("%u", &n); while (!n || n > MAX); 3. broj: 3.3
for (i = 0; i < n; i++)
4. broj: 4.4
{ printf("%d. broj: ", i + 1); scanf("%lf", niz + i); }
printf("Suma: %.2lf", suma(niz, n)); 5. broj: 5.5
return 0; Suma: 16.50
}

Funkcije (1. dio) 3


A01 FUNKCIJE
Napisati program koji učitava (neoznačen) broj n, a zatim ispisuje broj n u brojnom sistemu
sa osnovom bo (bo ≤ 10). Ispis (neoznačenog) broja n u brojnom sistemu sa osnovom bo
treba da se vrši u rekurzivnoj funkciji konv.
#include <stdio.h>

void konv(unsigned n, unsigned bo)


{
if (n / bo)
konv(n / bo, bo);
printf("%u", n % bo);
}

int main()
{
unsigned n, bo;
printf("n=");
scanf("%u", &n);
do printf("bo="), scanf("%u", &bo); while (bo < 2 || bo > 10);
konv(n, bo); n=13
return 0;
}
bo=2
1101

Funkcije (1. dio) 4


A01 FUNKCIJE
Napisati program koji učitava n (neoznačen broj) i a (realan broj), a zatim ispisuje n-ti
stepen broja a. n-ti stepen broja a treba da se računa u rekurzivnoj funkciji stepen.
#include <stdio.h>

double stepen(double a, unsigned n)


{
if (n == 0)
return 1;
else if (n % 2 == 0)
return stepen(a
a * stepen(a,
* a, n -
/ 1);
2);
} else
return a * stepen(a, n - 1);
int main()
}
{
int
double
main()
a;
{ unsigned n;
printf("a=");
double a; scanf("%lf", &a);
printf("n=");
unsigned n; scanf("%u", &n);
printf("%.2lf^%u=%.2lf",
printf("a="); scanf("%lf",
a,&a);
n, stepen(a, n));
return 0;
printf("n="); scanf("%u", &n); a=2.5
} printf("%.2lf^%u=%.2lf", a, n, stepen(a, n)); n=2
return 0; 2.50^2=6.25
}

Funkcije (1. dio) 5


A01 FUNKCIJE
Napisati program koji Euklidovim algoritmom određuje NZD (mjeru) dva broja. NZD dva
broja treba da se računa u rekurzivnoj funkciji nzd.
#include <stdio.h>
Npr. NZD(200,120)=?
unsigned nzd(unsigned x, unsigned y)
x y ostatak {
if (y == 0) return x;
else return nzd(y, x % y);
200 120 80 }

int main()
120 80 40 {
unsigned x, y;
do
0 {
80 40
printf("x="); scanf("%u", &x);
printf("y="); scanf("%u", &y);
}
40 0 while (!x || !y);
printf("NZD(%u,%u)=%u", x, y, x=200
nzd(x, y));
MJERA IZLAZNI return 0; y=120
KRITERIJUM } NZD(200,120)=40

Funkcije (1. dio) 6


A01 FUNKCIJE
Napisati program koji učitava prirodan broj n, a zatim ispisuje n-ti član Fibonačijevog niza.
n-ti član Fibonačijevog niza treba da se računa u rekurzivnoj funkciji fib.
#include
f0 = 1, f1 <stdio.h>
=1 fn = fn-1 + fn-2, n = 2, 3, 4, ...
#define MAX 100
1, 1, 2, 3,fib(unsigned
unsigned 5, 8, 13, 21, 34,n)55, 89, 144, 233, ...
{
unsigned fib(unsigned n)
{ if (n <= 1) F(5)
static
return unsigned
1; memo[MAX] = { 1, 1 }; 8
if
else(memo[n])
F(4) F(3)
return memo[n];
fib(n - 1) + fib(n - 2);
} else 5 3
return memo[n] = fib(n - 1) + fib(n - 2); F(2) F(1)
F(3) F(2)
int main()
}
3 2 2 1
{
int main()
{ unsigned n; F(2) F(1) F(1) F(0) F(1) F(0)
unsigned
printf("n=");n; 2 1 1 1 1 1
do
scanf("%u",
{ &n);
printf("f%u=%u",
printf("n="); n, fib(n)); F(1) F(0)
return
scanf("%u",
0; &n); 1 1
} } while (n >= 100);
printf("f%u=%u", n, fib(n)); n=5
return 0; f5=8
}

Funkcije (1. dio) 7


A01 FUNKCIJE
Napisati program koji učitava (neoznačene) brojeve n i k (k≤n), a zatim ispisuje vrijednost
binomnog koeficijenta. Računanje vrijednosti binomnog koeficijenta treba da se vrši u
rekurzivnoj funkciji bin_koef.

int main()
{
unsigned n, k;
#include <stdio.h> do
{
unsigned bin_koef(unsigned n, unsigned k) printf("n="); scanf("%u", &n);
{ printf("k="); scanf("%u", &k);
if (!k) }
return 1; while (k > n);
else printf("C(%u,%u)=%u",n=15
return bin_koef(n - 1, k - 1) * n / k; k=8
n, k, bin_koef(n, k));
} return 0; C(15,8)=6435
}

Funkcije (1. dio) 8


A01 FUNKCIJE
Napisati program koji učitava prirodan broj n i niz od n prirodnih brojeva, a zatim ispisuje
najmanji zajednički sadržilac unesenih brojeva. Najmanji zajednički sadržilac treba da se
računa u rekurzivnoj funkciji nzs.
#include <stdio.h>
#include <stdlib.h>
unsigned nzs(unsigned *niz, unsigned n) {
if (n == 1) return niz[0];
unsigned nzsp = nzs(niz, n - 1), rez = nzsp;
while (rez % niz[n - 1] != 0)
rez += nzsp;
return rez;
}
int main() {
unsigned n, *niz, i;
do printf("n="), scanf("%u", &n); while (!n);
n=5
niz = (unsigned *)calloc(n, sizeof(unsigned)); 1. broj: 3
for (i = 0; i < n; i++) { 2. broj: 4
printf("%d. broj: ", i + 1); 3. broj: 5
do scanf("%u", &niz[i]); while (!niz[i]); 4. broj: 2
} 5. broj: 6
printf("NZS: %u", nzs(niz, n)); free(niz);
NZS: 60
return 0;
}

Funkcije (1. dio) 9


A01 FUNKCIJE
Kule Hanoja: Prebaciti svih n prstenova sa kule A na kulu B, pri čemu:
1. u jednom potezu može da se prebaciti samo jedan prsten,
2. manji prsten može da se stavi samo na veći prsten,
3. za premještanje je dozvoljeno koristiti pomoćnu kulu P.

A B P A B P

Funkcije (1. dio) 10


A01 FUNKCIJE
Kule Hanoja: Prebaciti svih n prstenova sa kule A na kulu B, pri čemu:
1. u jednom potezu može da se prebaciti samo jedan prsten,
2. manji prsten može da se stavi samo na veći prsten, A B P

3. za premještanje je dozvoljeno koristiti pomoćnu kulu P.


#include <stdio.h> A B P

void prebaci(unsigned n, char sa, char na, char preko)


{
if (n == 1) A B P

printf("%c -> %c\n", sa, na); n=3


else A -> B
{ A -> P A B P

prebaci(n - 1, sa, preko, na);


B -> P
printf("%c -> %c\n", sa, na);
prebaci(n - 1, preko, na, sa);
A -> B A B P

} P -> A
} P -> B
int main() A -> B A B P

{
unsigned n;
do printf("n="), scanf("%u", &n); while (!n); A B P

prebaci(n, 'A', 'B', 'P');


return 0;
} A B P

Funkcije (1. dio) 11


A01 ZADACI ZA VJEŽBU
1. Napisati program koji učitava (neoznačen) broj n, a zatim ispisuje sumu cifara broja n.
Računanje sume cifara treba da se vrši u rekurzivnoj funkciji suma_cifara.
2. Napisati program koji učitava (neoznačen) broj n, a zatim ispisuje cifre broja n počevši
od najteže. Ispis cifara treba da se vrši u rekurzivnoj funkciji cifra.
3. Napisati program koji učitava prirodan broj n, a zatim ispisuje n-ti član niza:
f1 = 1, f2 = 2, f3 = 3 fn+3 = fn+2 + fn+1 + fn, n > 0
n-ti član datog niza treba da se računa u rekurzivnoj funkciji clan.
4. Napisati program koji učitava (neoznačen) broj n, a zatim ga ispisuje u faktoradiks
brojnom sistemu. Faktoradiks je brojni sistem kod kojeg težina cifre na poziciji k (k≥0)
iznosi k!. Dodatno još važi ck ≤ k, gdje je ck cifra na poziciji k. Ispis cifara u faktoradiks
brojnom sistemu treba da se vrši u rekurzivnoj funkciji factoradic.
Primjer:
Neka je n=13 Rezultat: 2010
Provjera: 2*3! + 0*2! + 1*1! + 0*0! = 2*6 + 1 = 12 + 1 = 13

Funkcije (1. dio) 12

You might also like