71
daci za vežbu iz programskog jezika C – II kolokvijum IZVOD IZ ZBIRKE ZADATAKA „UVOD U PROGRAMIRANJE“ – M. ŠKARIĆ, V. RADOVIĆ

Masinski fakultet Beograd programiranje

Embed Size (px)

DESCRIPTION

Teorija i zadaci za ispit iz programiranja

Citation preview

Page 1: Masinski fakultet Beograd programiranje

Zadaci za vežbu iz programskog jezika C – II kolokvijum

IZVOD IZ ZBIRKE ZADATAKA „UVOD U PROGRAMIRANJE“ –– M. ŠKARIĆ, V. RADOVIĆ –

Page 2: Masinski fakultet Beograd programiranje

Funkcije i pokazivači

P o k a z i v a č i

Memoriju računara možemo da posmatramo kao niz sukcesivnih memorijskih lokacija obeleženih brojevima od 0 pa do kapaciteta memorije računara. Broj memorijske lokacije je memorijska adresa.

Kada smo u pedhodnim vežbama rekli da promenljiva zauzima memorijski prostor, pre svega smo mislili da zauzima jedan ili više sukcesivnih bajtova u memoriji. Koliko bajtova tačno promenljiva zauzima, zavisi od njenog tipa (char 1 bajt, int 4 bajta, double 8 bajtova).

Kada imamo promenljivu X tipa T, tada kažemo da promenljiva P pokazuje (referencira) na X ako je vrednost promenljive P adresa memorijske lokacije na kojoj se nalazi promenljiva X. U tom slučaju promenljiva P je tipa pokazivač na tip T. Vrednost promenljive P možemo menjati tokom izvršenja programa.

Da bismo pristupili samoj vrednosti na koju pokazuje P, koristimo operator dereferenciranja. Drugim rečima, ako P i dalje pokazuje na X, onda je *P isto što i X. Bitno je zapamtiti da oni nemaju jednake vrednosti već istu vrednost, tj. kada se promeni jedno menja se i drugo!

sizeof (x) veličina memorijskog prostora koji zauzimajupromenljiva ili tip

&x memorijska adresa promenljive x*p dereferenciranje pokazivača, tj. pristup mem. lokaciji na adresi p

F u n k c i j e

Do sada smo često koristili funkcije poput scanf, printf, abs i mnogih drugih. Te funkcije se nalaze u bibliotekama poput stdio.h i math.h i to su standardne biblioteke koje dobijamo uz programski jezik C.

Do sada smo razmatrali funkciju main, koja je glavni deo progama koja mora da postoji u svakom programu. Osim te funkcije, na sličan način možemo napisati dodatne funkcije:

tipf funkcija (tipa arg) { naredbe;

}

Ime funkcije može biti proizvoljno, s tim da važe ista pravila kao i za ime promenljive. T ip f j e tip povratne vrednosti (tj . rezultata) funkcije, dok je tipa tip argumenta koji funkcija prima. Funkcija može da ima veći broj argumenata s tim da se argumenti odvajaju zarezom ispred svakog argumenta mora da stoji njegov tip.

Funkcija vraća vrednost pomoću naredbe return. Kada funkcija ne vraća vrednost, treba staviti povratni tip void.

R e k u r z i j a

Rekurzija je pojava da unutar tela funkcije pozivamo istu funkciju. Ako bi takav poziv bio bezuslovan, rekurtija bi bila beskonačna. Pošto tako nešto nema smisla, potrebno je definisati izlazni kriterijum. tj. definisati kada treba stati sa rekurzivnim pozivima.

void beskonacnost {beskonacnost () ;

} Uglavnom je kriterijum izlaza trenutni broj ponavljanja ili preostali broj ponavljanja, ali može biti definisan i na drugi način (nema preostalih podataka u baferu, nema više fajlova na disku itd.)

Kada iz glavnog programa pozovemo funkciju primer za n=1, na ekranu se ispisuje 123321. Redosled izvršavanja naredabaje A1, A2, B1, B2, C1, C2, C3 B3, A3. Dakle, primer(n) čuva svoje parametre lokalne promenljive u memoriji i nastavlja da se izvršava nakon povratka iz funkcije primer(n+1).U opštem slučaju, kada jedna funkcija poziva drugu, prva nastavlja da se izvršava tek kada se završi druga. Cak kada pozivamo istu funkciju, možemo smatrati da su u pitanju dve različite funkcije koje imaju isti kod.

void primer (int n) {

A (1)(2)(3)

}

void primer (int n) {

B (1)(2)(3)

}

void primer (int n) {

C (1) printf("%d",n);(2)if(n<3) primer(n+l);(3)printf("%d",n);

}

Page 3: Masinski fakultet Beograd programiranje

√2+

P r i m e r i1. Napisati program koji ispisuje veći od dva broja koristeći funkciju max(a,b).

#include <stdio.h>int max(int a,int b) {

return ((a>b)?a:b);}int main(){

int a,b;scanf("%d%d", &a,&b);printf ("Najveci broj je : %d", max(a, b) ) ; retura 0;

}

2. Napisati funkciju kojom se na ekranu ispisuje ceo broj koji joj se prosleđuje kao argument.#include <stdio.h> void ispis(int broj) {

printf("Broj = %d",broj);int main(){

int a;scanf("%d",&a); ispis(a);retura 0;

}

3.Napisati funkciju odd(x) koja proverava da li je broj x neparan. Ako je x paran, funkcija kao rezultat treba da vrati 0, a 1 ako je x neprno.

I način:int odd(int broj) {

if(broj%2 == 0 ) return 0; else return 1;

}II način.int odd(int broj) { retura broi %2;}

4. Napisati funkciju prost(x) koja izračunava da li je broj x prost. Napisati glavni program koji poziva funkciju prost(x) za sve brojeve od 1 do N i ispisuje one koji su prosti.#include <stdio.h>

#include <math.h>

int prostf(int x) {

int i;

if(x==l) retura 0;

for(i=2;i<=sqrt(x);i++)

if(x%i==0) return 0;

return 1;

}int main() {

int i,n; scanf(n%d",&n);for (i=2;i<=n;i++)

if (prost (i) ) printf ('%d\n",i);return 0;

}

5. (Hanojska kula) Na ploči se nalaze tri stuba. Na levom se nalazi n diskova čiji poluprečnici opadaju idući ka vrhu. Napisati funkciju koja ispisuje koji su koraci potrebni da se diskovi prebace na krajnji desni stub tako da se u svakom koraku prebaci samo jedan disk. Zabranjeno je da veći disk ide preko manjeg.

void prebaci (int n,int sa,int na,int pom) { prebaci (n-1,sa,pom,na); printf("%d->%d\n",sa,na); prebaci(n-l,pom,na,sa);

}

6. Napisati rekurzivnu funkciju kija računa vrednost n!.int fakt(int n) {

if(n==0) return 1;else return n*fakt (n-1);

}

7. Napisati rekurzivnu i iterativnu funkciju koja računa razlomak:

Page 4: Masinski fakultet Beograd programiranje

double f_rek(int n) {if(n==l) return sqrt(2); return sqrt (2+f_rejc(--n) );

}

double f_iter(int n) {double i, sum=sqrt (2);for(i=l;i<n;i++)

sum=sqrt (2+sum);return sum;

}

8. Napisati funkciju swap(a,b) koja zamenjuje vrednosti promenljivama a b testirati je u glavnom programu

#include <stdio.h>void swap(int* a,int* b) {

int tmp=*a; *a=*b;*b=tmp;

}

int main () {

int a,b;scanf ("%d%d" &a, &b);printf("a=%d b=%d\n" ,a,b);swap(&a,&b);printf("a=%d b=%d\n" a,b);return 0;

}

9. Definisati funkciju min_max koja pronalazi najmanji i najveći od četiri broja. U glavnom programu je testirati tako što za uneta četiri broja treba ispisati zbir najvećeg i najmanjeg broja.

#include <stdio.h>void min_max(int a,int b, int c, int d, int* max, int* min) {

*max=a; *min=a; if(b>*max) *max=b;if(c>*max) *max=c; if(d>*max) *max=d; if(b<*min) *min=b; if(c<*min) *min=c;if(d<*min) *min=d;

}int main () {

int a,b,c,d; int max,min;scanf("%d%d%d%d",&a,&b,&c,&d); min_max(a,b,c.d,&max,&min);printf("Zbir je: %d",min+max); retura 0;

}

Z a d a c i

1. Izračunati sumu brojeva od 1 do N koristeći funkciju suma(N).2. Napisati program koji pomoću funkcije aritm_sr računa aritmetičku sredinu N brojeva koje unosi korisnik.3. Implementirati funkciju powl(a,n) i napisati program koji je testira.4. Napisati program koji za uneti prirodan broj veći od 1 određuje njegov najbliži prost broj. Ako su dva prosta broja na

istom rastojanju, štampati oba.5. Implementirati funkciju fabsx koja računa apsolutnu vrednost zadatog decimalnog broja x.6. Napisati funkciju povrsina koja računa površinu trougla. Poznati podaci su sve tri stranice trougla.

Napomena: Ako su nam date tri stranice trougla, a, b i c, površinu možemo izračunati pomoću Heronovog obrasca: P = SQRT(p(p -a)(p- b)(p – c)), gde je p poluobim trougla.

7. Napisati program koji pomoću funkcije merse proverava da li je dati prirodan broj Mersenov.Napomena: Broj je Mersenov ako je prost i ako se može napisati u obliku 2*p-1 gde je p prost broj.

8. Napisa funkciju koja izračunava dan u nedelji za Gregorijanski kalendar. U glavnom programu se unosi redni broj dana u mesecu, mesec i godina, a kao izlaz se spisuje koji dan u nedelji odgovara tom datumu.

Page 5: Masinski fakultet Beograd programiranje

Napomena: Da bismo dobili dan u nedelji, prvo treba da pronađemo Julijanski dan za zadati datum. Julijanski datum (JD) jeste vreme u danima od 1. januara 4713. godine p.n.e. u 12h po Griničkom vremenu (UT). Celobrojni deo Julijanskog datuma možemo dobiti pomoću formule:JDN = dan +(153+2)/5 + 365y+ y/4-y/100+y/400-32045, gde je [x] – ceo deo od x, konstante m i y se računaju pomoću formula

a = [14-mes/12], y = god + 4800-a, m = mes+12a-3. Dan u nedelji se dobija celobrojnim deljenjem sa 7: DN = JDN mod 7 +1.

9. Napisati funkciju koja računa najveći zajednički delilac (nzd) dva broja pomoću Euklidovog algoritma.

10. Program treba da proverava da li su dva prirodna broja blizanci. Brojevi su bilizanci ako su prosti i međusobno se razlikuju za 2. ( Brojevi 11 i 13 su blizanci).

11. Goldbah je dao hipotezu prema kojoj se svaki paran broj veći od 2 može predstavi i zbirom dva prosta broja. Napisati program koji pomoću funkcije goldbah ispisuje od kojih prostih brojeva se mogu dobiti parni brojevi iz intervala od M do N.

Napomena . Goldbahova pretpostavka je proverena za sve brojeve do 6*1016. Interesantno je da je u periodu od 2000. do 2002. godine postojala nagrada u iznosu od milion dolara za onoga ko dokaže pretpostavku, ali to još nikome nije pošlo za rukom, tako da je i danas pretpostavka ostala nedokazana.

12. Ispisai sve savršene brojeve od 1 do N. Broj je savršen ako je jednak sumi svojih delitelja izuzev njega samog.13. Napisati funkciju koja iscrtava pravougaonik od zvezdica ako se kao argument unese duzina stranica pravougaonika. U

glavnom program, koristeci ovu funkciju iscrtati pravougaonik za parameter koje unosi korisnik.14. Emirp je prost broj koji se pretvara u drugi prost broj kada mu se cifre izokrenu. (Emirp je prost broj čitan unazad, broj

37 je emirp jer je i 73 prost broj). Napisati program koji pomoću funkcije emirp proverava da li je broj emirp, a u glav- nom programu se ispisuje prvih N emirpa.Napomena: Evo nekoliko primera emirpa: 13, 17, 31, 37, 71, 79,107. 113...

15. Napisati program koji tekst sa standardnog ulaza prepisuje na izlaz pretvarajući početna slova rečenice u velika (pomoću funkcije toVelikoSlovo) . Pretpostaviti da se u tekstu znaci ? ! . pojavljuju kao markeri kraja rečenice.

16. Napisati rekurzivnu i iterativnu funkciju koja računa dati razlomak :

17. Napisati program koji ispisuje unetu reč unazad.

18. Napisati program koji ispisuje prvo samoglasnike, a zatim suglasnike u datoj reči.

19. Napisati funkciju koja ispisuje N-ti red Paskalovog trougla. Napomena: Prvih 6 redova Paskalovog trougla su:1

1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

20. Dat je potpis funkcije void f (int br, int *n) ;. Objasniti koji su od sledećih poziva funkcije neispravni i zašto? Promenljive k, n i br definisane su u glavnom programu.

a ) f ( k , n ) ;b ) f ( & k , & n ) ;c ) f ( 2 * n - l , & k ) ;d ) f ( k , n , b r ) ;

21. Sta se ispisuje kada se izvrši program s navedenim ulaznim parametrima.#include <stdio.h> void f (int *n) { *n++;

}int main () { int n;

scanf(%d",&n);f(&n);printf ("n= %d",n);return 0;

}

Page 6: Masinski fakultet Beograd programiranje

• Za n= 4 izlaz je:• Za n= -15 izlaz je:• Za n=123 izlaz je:

22. Šta se i pisuje kada se izvrši program s navedenim ulaznim parametrima.#include <stdio.h> void f(int *n) {

(*n)++;int main() {

int n;scanf("%d",&n); f (&n) ;printf("n= %d",n); return 0;

}

• Za n= 4 izlaz je:_______• Za n=-1 izlaz je: _____ . • Za n=123 izlaz je:______

23. Za unetih N brojeva napisati funkciju koja kao rezultat vraća koliko ima pamih i nepamih brojeva.

Zadaci za vežbu

24. Napisati funkciju max4 koja računa najveći od četiri broja25. Napisati funkciju koja određuje rastojanje između tačaka T1(X1,Y1) i T2(X2,Y2).26. Napisati uinkciju fakt koja računa faktorijel broja n.27. Za uneta četiri broja ispisati onaj čija je poslednja cifra najveća. Za rešavanje zadatka koristiti funkciju max4 koja

računa najveći od četiri broja.28. Proveriti da li je prost broj p Vilsonov pomocu funkcije vilson. Prost broj j je Vilsonov kada je (p-1)l!+ 1 deljivo sa p2.

Dana" su poznata samo tri Vilsonova broja: 5,13, 563.29. Napisati funkciju koja proverava da li je ceo broj p superprost. Broj je superprost ako je prost i ako se odbacivanjem

jedne po jedno cifre sa desne strane dobijaju prosti brojevi.30. Napisati program koji pomoću funkcije ab računa an-bn koristeći datu formulu:

n-1an -bn =(a-b)Ʃ an-k-1*bk

k=0

31. Napisati rekurzivnu funkciju koja ispisuje binarni ekvivalent broja N.32. Napisati rekurzivnu i iterattvnu funkciju kojom se izračunava zbir cifara zadatog prirodnog broja N.33. Napisati funkciju koja ispisuje Paskalov trougao.34. Funkcija kao argument dobija broj N i kao rezultat treba da vrati broj parnih i nepamih cifara u datom broju N

R e š e n j a

1.#include <stdio.h>; int int suma(int n) {

int i,sum=0;for (i=l;i<=n;i++)

sum+=i; return sum;

}int main(){

int n;scanf("%d",&n);printf(“Suma brojeva je: %d",suma (n));return 0;

}

2. #include <stdio.h> #include <math.h> double aritm_sr(int n) { int i,nl=n; double br,sum=0; while(n-->=l) {

printf ("Unesite broj : “);scanf ("%lf”,&br);sum+=br;

}

Page 7: Masinski fakultet Beograd programiranje

return sum/nl;}int main () {

int n; double ar_sum; scanf("%d”,&n); ar_sum=aritm_sr(n); printf("Aritmeticka suma je %f",ar_sum); return 0;

}

3.#include <stdio.h>int powl(int a, int n) {

int i p=l;for (i=l;i<=n;i++)

p*=a; return p;

}int main(){

int a,n;scanf("%d%d",&a,&n);printf("pow1(%d,%d)=%d" a,n,powl(a,n));return 0;

}

4.#include <stdio.h>#include <math.h> int prost(int x) {

int i;if(x==l) retum 0;for(i=2;i<=sqrt(x);i++)

if(x%i==0) return 0;return 1;

}int main(){

int i=l,n; scanf("%d",&n);while(!(prost(n+i) || prost(n-i)))

i++;if(prost(n+i)) printf("Broj %d \n",n+i); if(prost(n-i)) printf("Broj %d \n",n-i);return 0;

}

5.double fabsx (double x) {

return x<0 ? –x:x;

}

6.double povrsina(double a,double b,double c) {

double p=(a+b+c)/2;return sqrt (p*(p-a)*(p-b)*(p-c));

7.#include <stdio.h> #include <math.h>int prost(int br) {

int i,; if(x==l) return 0;

for(i=2;i<=sqrt(br);i++)if(br%i==0) retura 0;

return 1;} int merse(int br) {

if(prost(br) && prost((br+1)/2))return 1;

return 0;}int main() {

int i;for(i=l,-i<=1000;i++)

if (merse (i)) printf ("%d\n",1);return 0;

}

Page 8: Masinski fakultet Beograd programiranje

8.#include <stdio.h> #include <math.h>int JD(int g,int m,int d) {

double y,a,JDN ml; a=floor((double)(14-m)/12); y=g+4800-a;ml=m+12*a-3;JDN = d+floor((double)(153*ml+2)/5)+365*y+floor(y/4)- floor(y/100)+floor(y/400)-32045;return JDN;

}int main(){int mesec,dan,godina,rez;printf("Unesite dan: ");scanf("%d",&dan);printf("Unesite mesec: ");scanf("%d",&mesec);printf("Unesite godinu: ");scanf("%d",&godina);rez=JD(godina,mesec,dan);printf("Dan u nedelji je ");switch(rez%7+l) {

case 1: printf("Ponedeljak\n"); break; case 2: printf("Utorak\n"); break; case 3: printf("Sreda\n"); break; case 4 printf ("Cetvrtak\n"); break; case 5: printf ("Petak\n"); break; case 6: printf("Subota\n"); break; case 7: printf ("Nedelja\n"); break; default: printf("Doslo je do greske!"); return 1;

}return 0;

}9.

#include <stdio.h>int nzd_iter(int a,int b) {

int tmp;while (b! =0) {

tmp=b;b=a%b;a=tmp;

}return a;

}int nzd_rek(int a,int b) {

if(b==0) return a;else return nzd_rek(b,a%b);

}int main () {

int a,b;scanf("%d%d",&a, &b);printf("nzd_iter(%d,%d)=%d\n",a,b,nzd_iter(a,b));printf ("nzd rek(%d,%d)=%d\n", a,b ,nzd_rek(a,b)); return 0;

}

10.#include <stdio.h> #include <math.h> #include <stdlib.h>int prost(int br) {

int i;if(br == 1) return 0;for (i=2;i<=sqrt(br);i++)

if(br%i==0) return 0; return 1;

}int blizanci(int brl,int br2) {

return prost (brl) && prost(br2) && abs (br2-brl) ==2}int main () {

int br1, br2;printf("Oneti dva broja "); scanf("%d%d", &brl,&br2); if(blizanci(brl,br2))

printf("Brojevi %d i %d su blizanci\n",brl,br2); else printf("Brojevi %d i %d nisu blizanci\n", brl,br2);

}

Page 9: Masinski fakultet Beograd programiranje

11.

#include <stdio.h>#include <math.h> #include <stdlib.h>int prost(int br) {

int i;if(br == 1) return 0;for(i=2;i<=sqrt(br);i++)

if(br%i==0) return 0;return 1;

}void goldbah (int br) {

int i,j;for(i=l;i<=br;i++);

for(j =1;j<=i;j++)if(prost(i) && prost(j) && (i+j)==br)

printf("Broj %d = %d + %d\n",br,i,j);}int main () {

int i,n,m;printf("Uneti interval [M,N]:"); scanf("%d%d",&m,&n);if(m%2) m++; // U slucaju da M nije paran broj for (i=m; i<=n; i+=2)

goldbah(i);}

12.#include <stdio.h>#include <math. h>int savrsen(int br) {int i sum=l; // Svi brojevi su deljivi sa 1 for(i=2;i<=br/2;i++)

if(br%i==0) sum+=i;

return sum==br;int main () { int i,n; scanf("%d",&n);for (i=2;i<=n;i++)

if (savrsen(i)) printf ("%d\n",i);}

13.#include <stdio.h>void iscrtaj pravougaonik (int a,int b) {

int j,i;for(i=l;i<=a;i++) {

for(j=l;j<=b;j++)if(i==l || i==a) printf ("*"); else if (j==1 || j==b) printf ("*");else printf (" “);

printf("\n");}

int main () {int a,b;

printf ("Uneti duzine a i b pravougaonika: ");scanf("%d%d",&a,&b); iscrtaj pravougaonik(a,b);

}

14.#include <stdio.h> #include <math.h>int prost(int br) {

int i;if(br == 1) retum 0;for (i=2;i<=sqrt(br);i++)

if(br%i==0) return 0;return 1;

}int emirp(int br) {

int noviBr=0; if (!prost(br)) retum 0;while(br) {

int ostatak = br%10; noviBr=10*noviBr+ostatak; br/=10;

}

Page 10: Masinski fakultet Beograd programiranje

return prost(noviBr));

}int main ()

int i,n; scanf("%d",&n);

if(!n%2) n--;for(i=10;i<=n;i++)

if(emirp(i)) printf("Emirp: %d\n",i); return 0;

}

15.#include <stdio.h>char toVelikoSlovc(char c) {

if(c>=`a` || c<=`z') return c-32;

else return c;

}int main(){

char ch,pch=EOF;while((ch=getchar()) !=EOF) {

if(pch == '.' ||pch== '!' || pch =='?' || pch==EOF)putchar (toVelikoSlovo (ch));

else putchar(ch); pch=ch;

}return 0;

}

16.#include <stdi.h> #include <math.h> double f_rek(int i, int n) {

if (i==n) return sqrt(i); return sqrt(i+f_rek(i+2,n));

}double f_iter(int n) {

double i,sum=sqrt(2*n-l);for(i=2*n-3;i>0;i=i-2)

sum=sqrt(i+sum);return sum;

}int main () {

int n;scanf("%d",&n);printf ("Iter : %f\n",f_iter(n);printf("%Rek:%f\n”,f rek(1,2*n-l));return 0;

}

17.

#include <stdio.h>void f_rek i) {

char ch=getchar();if (ch! =`\n`) f_rek();putchar(ch);

}int main(){

f_rek (); return 0;

}

18.

#include <stdio.h>

void f_rek () {char ch=getchar(); if(ch!='\n') {

if(ch=='a' || ch=='e' || ch=='i' || ch=='o' || ch=='u')putohar(ch);

f rek();if(ch! ='a' && ch!='e' && ch! ='i' && ch!='o' && ch! ='u') putchar(ch);

}

}int main(){

f_rek(); return 0;

}

Page 11: Masinski fakultet Beograd programiranje

19.#include <stdio.h>int pascal(int n,int i) { //n - red, i- kolona

if (n==l |[ i==l || i==n) return 1; return pascal(n-l,i)+pascal(n-l,i-l);

}int main () {

int i;for(i=l;i<=6;i++)

printf(“%4d",pascal(6,i));

}

20.Jedini ispravan poziv je pođ c) f(2*n-l,&k);.Poziv funkcije pod a) je neispravan jer se ne prenosi adresa drugog argumerta već njegova brojna vrednost. U slučaju poziva pod b) prenosi se adresa promenljive k a ne njena vrednost kako se očekuje. Poziv funkcije pod d) ima jedan argument više.

21.Izlaz je identičan ulaznom parametru n, jer se u funkciji f ne menja vrednost parametra n, već se vrednost pokazivača uvećava za 1 tj. vrednost memorijske adrese, pa se zatim pristupa toj vrednosti bez menjanja njenog sadržaja. U slučaju da menjamo sadržaj program bi mogao da padne ako pokušamo da pristupimo delu memorije koji nam nije dozvoljen ili ga koristi neki drugi program.• Za n= 4 izlaz je 4• Za n=-15 izlaz je -15• Za n=123 izlaz je 123

22.U programu se, zahvaljujući funkciji f, vrednost promenljive n uvećava za 1 pošto se prvo pristupi vrednosti promenljive n, pa se nakon toga ona uveća. • Za n= 4 izlaz je 5• Za n=-15 izlaz je -14• Za n=123 izlaz je 124

23.

#include <stdio.h> void par_nepar(int n, int* br_p, int* br_n) {

int broj;*br_p=*br_n=0;while(n--) {

printf("Uneti broj : “);scanf("%d",&broj);if(broj %2) (*br_n)++ else(*br_p)++;

}}int main(){int n,br_p,br_n; s c a n f ( “ % d ’ , & n ) ;par_nepar(n,&br_p,&br_n);

printf ("Broj parnih je %d\nBroj neparnih je %d" br_p,br_n);return 0;

}

Page 12: Masinski fakultet Beograd programiranje

N i z o v i i m a t r i c e

N i z o v i

U programiraiiju, niz;" određen >rc sukcesivnih memorijskih lokacija koje imaju isti naziv. Pojedinačflim vrednosti- ma pristupamo pomoću različitih i deksa. Indeksi niza u programskom jeziku C pišu se u uglastim zagradama i numeraci- ja počinje uvek od 0.

Ako nam treba niz deset celih brojeva, možemc da ga deklarišemo kac itA[10]. Time smo deklarisali da se niz zove A; prvi element je A[0], a poslednj A.[9], Uobičajna početnička greška je da se koristi elemeni A[10] koji nismo deklarisali — greška se zove ,,off by one"

Postoji bliska veza između nizova pokazivača, tj. možemo da kažemo da je A pokazivač na svoj nulti element (A[0] je isto što i *A). Takođe, koristeći pokazi- vačku aritmetiku, *(A+7) predstavlja memorijsku lokaciju udaljenu 28 bf ova od A[0] (svaki ceo broj, int, zauzima 4 bajta na većini arhitektura), što otlčno zapisu- jemo kao A[7]. Pošto je *(A+7) isto što i *(7+A), programskom jeziku C će se podjednako svideti i da napišete 7[A] koliko god da to bilo nepraktično

Pošto niz ima jednu „dimenziju" po kojoj se ređaju elementi (ima jedar. ndeks), za prolazak kroz niz neophodna nam je jedna petlja for.

S o r t i r a n j e n i z o v a

Postoji veliki broj algoritama za sortiranje koji omogućavaju da elemente n:~a rasporedimo u željenom poretku. Ovde su prikazani algoritmi koji se najčesće koriste, a implementirani su u zadacima od 20 do 24. U sledećim opisima algori- tama pretDOStavlja se rastući redosled. Za onadajući redosled, postupak je analo- gan.

Selectiort sorti. Sukcesivno traži najmanji element od ostatka niza i stav a ga na tekuću poziciju. Postoji skraćena varijanta ovog algoritma koja se češće upotreb- ljava u praksi.

Insertion sort. U svakom trenutku izvršavanja ovog algoritma, levo od tekućeg elementa su sortirani elementi, dok su ne sortirani desno. Ideja je da se tekući ele- ment ubaci na pravu poziciju u sortiranorfi levom delu.

Bubble sort: Specifičnost ovog algoritma je da pri jednom prolazu ispituje samo susedne elemente; ako nisu u odgovarajućem poretku, bivaju zamenjeni. Prolazi se ponavljaju dok god se elementi zamenjuju. Simulacijom ovog algoritma može se primetiti da mal_ »rednosti „isplivavaju" na početak, dok. velike vrednosti ,4spli- vavaju" na kraj kao mehurići (engl. bubble).

Merge sort. Ideja je da se od dva sortirana izvora podataka (niza) napravi rezul- tantni niz koji takođe treba da bude sortiran.

Da bismo dobili ulazne nizove, početni niz delimo rekurzijom dok ne dobijemo nizove veličine jedan. Ti nizovi su automatski sortirani. Svi ostali delovi se dva po dva kombinuju u nove nizove tako aa se očuva sortiran poredak.

Nizovi se spajaj'i tako što se uvek,u rezultantni niz prvo dodaje manji od dva elementa koja su po redu u ulazni| :lemei ma. Nakon toga se upoređuje preostali element sa sledećim elementom u niz iz koga smo uzeli element itd.

Quick sort: Ovaj algoritam je poznat po svojoj žfikasnosti, pa otuda njegov naziv. On takođe rekurzivno deli niz na manje celine u kojima se bira određena vrednost - pivot. U svakoj celini, jednim prolaskom kroz elemente prebacujemo one manje od pivota levo od njega a veće elemente desno od njega.

T: 1 prebacivanjem nismo elemente još uvek sortirali, ali smo izolovali dve grupe nad kojima možemo ponovo rekurzivno primeniti ovaj algoritam.

U zadacima u kojima nije posebno naglašeno koji algoritam treba upotrebiti, savetujemo upotrebu skraćenog algoritma selection sort. On se najsporije izvršava, ali se najlakše implementira, pa se smanjuje mogućnost pogrešnog kodiranja

Page 13: Masinski fakultet Beograd programiranje

M a t r i c e

Dvodimenzionalni niz se drugačije naziva ma-trica. Matrice imaju veliku ulogu pre svega u čuvanju i obradi tabelarnih podataka. Da bismo dobro vladali matricama, moramC' odlično poznavati višestruke petlje for.

Frolazak kroz matricu je šablonski postupaksvodi se na upotrebu dve petlje for, od kojih je spoljna petlja za redove, a unutrašnja za kolone. Tako prolazimo kroz matricu red po red.

Postoje dva načina za definisanje matrica, mada se najčešće upotret avaj - ravo- ugaor matrice. Pravougaona matrica celih broieva k"'a ima 10 redova i 10 kolo- na deklariše se na sledeći larm:

int a [10] [10] ,-Prvi broj u deklaraciji matrice je ukupan broj redova, dok je drugi ukupan broj kolona. Elementu ove matrice koji se nalazi u redu 3 (četvrti red) i koloni 4 (peta kolona) pristupamo sa a[3][4], Pošto je brojanje od nule, ne postoje ni red, ni kolona sa indeksom 10!

Programski jezik C sve.redove ovako deklarisane matrice stavlja u memoriju:dan za Irugim, kao da je'u pitanju niz od 100 elemenata. U našem primeru, na svakih 10 elemenata počinje novi red, a ime matrice je pokazivač na taj niz! Uzev- ši to u obzir, element a[5][7] nalazi se na poziciji 5*10+7 u memoriji iza prvog elementa.

Važno je zapamtiti da zbog toga pri prenosu matrice kao argumenta funkcije možemo izostaviti prvu dimenziju, kao kod niza, ali moramo precizirati kolika je druga dimenzija inače kompjuter neće moći da nađe pravi element!

Primer:void fn(int a[] [10], int n, int m)

Pri prenosu višedimenzionalnih nizova, sve dimenzije osim prve moraju biti pre- cizirane. Drugi način za definisanje matrica jeste kao niz pokazivača na nizove.

P r i m e r i

1. Napisati program koji izračunava srednj vrednost niza od n elemenata (n < 100).#include <stdio.h> #define MAX_SIZE 100 int main() {

int n,i,x[MAX_SIZE],suma=0;printf("Unesite dimenziju niza: " );scanf("%d",&n);if(n > MAX_SIZE) {

printf("Uneli ste pogresnu dimenziju n<100!\n");retum 1;

}for (i=0;i<n;i++){

printf(“\na[%d] = “,i); scanf("%d”,&x[i]); suma+=x[i];

}printf("\nSrednja vrednost niza je \n %f",(double) suma)/n);return 0;

}

2. Naći najveći element niza od najviše 100 elemenata indeks tog elementa, pa ispisati njihovu vrednost na standardni izlaz:

I način:

#include <stdio.h> #define MAX_SIZE 100 void ucitaj_niz(int *a,int n) {

int i;for(i=0;i<n;i++) {

printf("Unesite a[%d]= ",i); scanf("%d",(a+i));

Page 14: Masinski fakultet Beograd programiranje

}}int main() {

int n,i,max_i=0, max, x[MAX_SIZE];printf("Unesite dimenziju niza: " ); scanfi(“%dn,&n); if (n > MAX_SIZE) {

printf ("Uneli ste pogresnu dimenziju n<100!\n"); return 1;

}ucitaj_niz(x,n);max = x [0];for (i=l;i<n;i++)

if(x[i]>max) { max=x[i];max_i=i;

}printf("\nNajveci broj u nizu je %d",max); printf("Njegov indeks je %d\n",max_i);return 0;

}

II način:#include <stdio.h> #define MAX_SIZE 100 int mair () {

int n,i,max_i=0,x[MAX_SIZE],max; printf("Unesite dimenziju niza: " ); scanf("%d",&n); if (n > MAX_SIZE) {

printf("Uneli ste pogresnu dimenziju n<100!\n"); return 1;

}printf("\na[0] = "); scanf("%d",&x[0]); max = x[0]; for(i=l;i<n;i++) {

printf("\na[%d] = ",i);scanf("%d",&x[i]);if(x[i]>max) {

max=x [i]; max_i=i;

}}printf("\nNajveci broj u nizu je %d",max); printf ("Njegov indeks je %d\n" max_i+l); return 0;

}

3. Napisati program koji od datog niza an formira nizove b i c, tako da su elementi niza b pami članovi niza a, a elementi niza c neprni članovi.

#include <stdio.h> #define MAX_SIZE 100void ispisi_niz(int a[],int n) {

int i;for(i=0;i<n;i++);

printf("%d. element je %d\n",i,a[i]);}int main() {

int a[MAX_SIZE],b[MAX_SIZE],c[MAX_SIZE];int i,n_a,n_b=0 n_c=0;printf("Uneti dimenziju niza ");scanf("%d",&n_a)if(n_a>MAX_SIZE) {

printf("Greska pri unosu dimenzije niza! "); return 1;

}for(i=0;i<n_a;i++) {

printf("Unesite a[%d]= ",i); scanf("%d",&a[i]); if(a[i]%2==0) b[n_b++]=a[i]; else c[n_c++]=a[i];

}printf("Niz b : \n"); ispisi_niz(b,n_b); printf("Niz c :\n");

Page 15: Masinski fakultet Beograd programiranje

ispisi_niz (c,n_c); return 0;

}

4. Napisati program koji učitava i ispisuje matricu dimenzije NxM.

#include <stdio.h> #define MAX_SIZE 100void unesi_matricu(int mat[][MAX_SIZE],int n,int m) {

int i,j;printf("Unesite clanove matrice\n "); for(i=;,i<n;i++)

for(j=0;j<m;j++) {printf("\n[%d][%d] = ",i,j); scanf("%d",&mat[i],[j]);

}}void ispisi_matricu (int mat[][MAX_SIZE],int n,int m) {

int i,j;for (i=0;i<n;i++){

for(j=0;j<m;j++)printf("%4d ",mat [i][j]);

printf("\n");}

}int main() {

int mat[MAX_SIZE][MAX_ IZE];int n,m; v.printf("Unesite n i m \n");scanf("%d",&n);scanf("%d",&m); unesi_matricu(mat,n,m); ispisi_matricu(mat,n,m); return 0;

}

5. Formirati i ispisati kvadratnu matricu tako da je 1 na glavnoj dijagonali, 2 iznad glavne dijagonale, a 3 ispod glavne dijagonale.

#include <stdio.h> #define MAX_SIZE 100void ispisi_matricu(int mat[][MAX_SIZE],int n) {

int i,j;for(i=0;i<n;i++){

for(j=0;j<n;j++)printf("%d",mat[i][j]);

printf("\n");}

}int main () {

int mat[MAX_SIZE][MAX_SIZE]; int n,i,j;printf("Unesite n \n"); scanf(“%d",&n);for (i=0;i<n;i++)

for(j=0;j<n;j++)if(i==j) mat[i][j]=l;else if(i>j) mat [i] [j]=3;else mat [i] [j]=2;

ispisi_matricu(mat,n); return 0;

}

6. Sta radi sledeća tunkcija::float funkcija(int *x,int p) {

int i,pr, *pok; pr=0; pok=&p;for(i=0;i<*pok;pr+=*(x+i),i++); return((float)pr/(*pok));

}Funkcija izračunava aritmetičku sredinu niza x. Pokazivač pok pokazuje na promenljivu, tj. dimenziju niza x (jer u ciklusu for indeksi idu od 0 do *pok, odnosno p) Promenljiva pr je zbir elemenata niza x, uzima početnu vrednost 0 i u svakom koraktu ciklusa uvećava se za vrednost *(x+i), odnosno za naredni element u nizu, pošto su svi elementi niza smešteni u memoriji jedan do drugog. Na kraju, funkcija vraća aritmetičku sredinu tako što deli zbir (pr) sa ukupnim brojem elemenata u nizu (*pok).

Page 16: Masinski fakultet Beograd programiranje

Z a d a c i :

1. Ocene studenta se unose kao elementi niza. Napraviti program koji izračunava prosek za svaku godinu studiranja ukupan prosek studija, ako studije traju 4 godine student nema više od 15 predmeta po godini.

2. Napisati program koj: računa koliko u nizu c„ ima parnih brojeva većih od une-tog broja p.

3. Ispisati broi ponavljanja svake cifre u datom broju n.

4. Napisati program koji od datog niza a2„ formira nizove b„ i c„ tako da su ele- menti niza b: a[l],a[3],a[5],...,a[2n-l] , a niza c: a[0],a[2],a[4],a[6],...,a[2n].

5. Napisati program koji na osnovu datog niza an formira niz bn tako da važi

b[i]= a[i]/a[i + 1]6. Na osnovu niza a2n formirati niz bn po formuli:

b[i]=a[i]+a[i+1]-a[2n-1-i] / 2

7. Na osnovu niza o„ formirati niz s„ čiji se element s[j] dobija kao srednja vred- nost niza a iz koga je izbačen element naj'-toj poziciji.

8. Dato je n intervala pomoću nizova a i b: (a[0],b[0]), (a[l],b[l]), (a[2],b[2]) , ..., (a[n-ll,b[n-l]). Formirati niz c u kome se nalaze indeksi intervala kojima pripada tačka C, odrediti koji od njih je najkraći ispisati ga.

9. Napisati funkciju koja parne elemente niza a premešta na početak, a neparne na kraj.10.Napisati program koji na osnovu unetog niza a fcrmira niz b koj sadrži sve elemente niza a cirkulamo pomerene ulevo

za n mesta.

11.Napisati program koji na osnovu unetog niza a formira niz b sastavljen od elemenata niza a kojima su cifre poređane obmutim redosledom.

12.Napisati program koji na osnovu unetog niza c, formira niz b sastavljen od elemenata niza a koji sadrže cifru C.

13.U datom nizu a ođrediti broj promena znaka ako nulu računamo kao neutralan element.

14.Pomoću funkcije provera proveriti da li su /aka dva susedna elementa niza a različita. Napisati glavni program u kome će se unositi niz a i proveravati da li su mu susedni elementi različiti.

15.Dat je niz realnih brojeva. Potrebno je odrediti zbir elemenata koji prethode prvom pojavljivanju datog realnog broja P u nizu.

16. Korisnik unosi celobrojni niz a i cefobrojne vrednosti x\y. Odrediti proizvod elemenata u nizu a koji se nalaze između prve-pojave vrednosti x u nizu prve pojave vrednosti y u nizu."

17 Ako je polinom P(x) = a0+a1x + a2x2+...+anxn dat nizom svojih koeficijenata, napsati program koji izračunava

vrednost polinoma za dato x.

18.Ako su dva polinoma P(x) i Q(x) dati nizom svojih koeficijenata, napisati program koji računa njihov zbir i proizvod pomoću odgovarajućih funkcija.

19.Napisati funkciju koja proverava da li je niz sortiran i, ako jeste, ispisuje kojim redosledom je sortiran.

20.Napisati funkciju koja implementira algoritam bubble sort.

21.Na sati funkciju koja implementira algoritam selection sort. 2: .

22.Na sa funkciju koja implementira algoritam insertion sort.

23.Napisati funkciju koja implemntira algoritam quick sort.

24.Napisati funkciju koja implementira algoritam merge sort.

25. Napisati funkciju koja ubacuje broj R u sortiran niz a.26.Napisati program koji uneti niz a sortira tako da elementi na prnim indeksima budu sortirani u rastućem, a neparni u

opadajućem poretku.

27.Na osnovu unetog niza a, formirati niz b koji se sastoji iz prostih članova niza a sortiranih u opadajućem poretku.

28.Napisati funkciju koja istovremeno vraća najmanju i najveću vrednost niza.

29.Napisati fiinkciju koja istovremeno računa aritmetičku sredinu parnih članova aritmetičku sredinu prostih članova unetog niza a.

Šta radi sledeća fiinkcija (30-36):

Page 17: Masinski fakultet Beograd programiranje

30.void funkcija (float *a,int n) {

int i,j;for{i=0;i<n-l;i++)

for(j =i+l;j <n;j++)if(*(a+i)>*(a+j))

pom_f(a+i,a+j;

}

Void pom_f(float *a,float *b) { float pr;pr=*a;*a=*b;*b=pr;

}

31.void fuiikcija (int* a ,int n) { int pom,i;pom=*a;for(i=l;i<n;*(a+i-1)=*(a+i),i++); *(a+n-1)=pom;

}

32.void funkcija (int n, int m,int *q,int * r) { int i,j=0,*pom=&j;*q=*pom; *r=*pom;for (i=m;i<=n;i++) {

*q+=i*i; *r+=i*i*i;

}}

33.void funkcija (int *a,int pr, int *kol) { int i,*pom; pom=&pr;*kol=*a;for(i=l;i<*pom;i++)

if (* (a+i) > *kol) *kol=* (a+i);}

34.void funkcija (int *b,int x,int *srv) { int i,*pom; pom=&x; *srv=*b;for(i=l;i<*pom;i++)

if(*(b+i) < *srv) *srv=*(b+i);}

35.void funkcija (int *a,int pr,int *kol) { int i,*pom; pom=&pr; *kol=0;for (i=0;i<*pom;*kol+=*(a+i),i++);

}

36.void funkcija(int *a,int pr, int *kol) { int i,*pom; pom=&pr;kol=1;for(i=*pom-l;i>=0;*kol*=*(a+i),i--);

}

Page 18: Masinski fakultet Beograd programiranje

37. Sjaj zvezda (i nebesidh tela) iskazuje se u magnitudama. Što je telo sjajnije, to je magnituda manja (Sjaj Sunca je -26.8, punog Meseca -24.6, najsjajnije zvezde na nebu, Sirijusa 1.4, a nešto manje sjajne zvezde Deneb1,.25). U nizu a[n] nala- ze se magnitude n nebeskih tela. Potrebno ga je ispisati sortiranog od najsjajnijeg ka najmanje sjajnom telu i ispisati 4 najsjajnija objekta.

38. Ispisati zbir elemenata kvadratne matrice.39. Napisati. program koji na osnovu unete matrice an,m formira matricu b čiji su elementi ili 1 ili 0 i to, ako je element a[i]

[j] paran tada je b[i][j] jednak 0, a ako je neparan h[i][j] onda je jednak

40. Napisati program kojim se na osnovu kvadratne matrice a formira matrica b tako da su joj sporedna glavna dijagonala jednake sporednoj i glavnoj dijagonali matrice a, dok su ostali elementi jednaki 0.

41. Data je matrica prirodnih brojeva dimenzije NxM. Napisati funkciju koja u matrici određuje najveći i najmanji element.

42. Data je matrica prirodnih brojeva dimenzije NxM. Napisati funkciju koja u matrici određuje zbir elemenata sa nepamim indeksom i i parnim indeksom j.

43. Napisati funkciju koja proverava da li je kvadratna matrica simetrična u odnosu na glavnu dijagonalu.

44. Napisati funkciju koja menja matricu a tako što k-ti red zamenjuje odgovarajućim elementima niza b.

45. Napisati program koji matricu an,m menja tako da joj k-ti i p-ti red zamene mesta.

46. Formirati niz b od elemenata kvadratne natrice an,m koji predstavljaju najveće vrednosti odgovarajućeg reda matrice i niz c koji sadrži najmanje vrednosti odgoarajućeg reda matrice a.

47. Napisati program koji u niz b ubacuje proste članove matrice dimenzije NxM i zatim ga ispisuje sortiranog rastućim redosledom.

48. Napisati program kojim se formira niz b čiji su elementi redom jednaki proizvodu elemenata kolone kvadratne matrice a

49. Korisnik unosi matricu an,m Pronaći koliko elemenata u matrici su istovremeno najveći u svom redu i najmanji u svojoi koloni i ispisati njihove indekse.

50. Napisati program koji za odgovarajuće N formira i ispisuje kvadratnu matricu sledećeg oblika, npr zaN=4:

Z a d a c i z a v e ž b u :

51. Napisati program koji računa proizvod elemenata niza an.52. Učitati niz od n elemenata ispisati koliko u njemu ima negativnih, a koliko pozitivnih brojeva.53. Program treba da ispiše koja se cifra u datom broju TVnajviše puta ponovila.54. Napisati program koji na osnovu unetog niza a formira niz b koji se satoji iz aritmetičke sredine tri elemenata niza a, i

to na sledeći način: b[i]=(a[i]+a[i+l]+a[i+2])/3.

55. Na osnovu niza an i bn formirati niz cn po sledećoj formuli: c[i] = a[i]+b[n-l-i].56. Napisati funkciju koja uklanja sve elemente niza b koji su jednaki datom elementu i kao rezultat vraća izmenjeni niz.

57. Napisati program koji računa proizvod elemenata matrice anm.58. Za datu kvadratnu matriu an,m napisati program koji pomoću odgovarajućih funkcija računa:

1.zbir elemenata ispod glavne dijagonale2.zbir elemenata iznad sporedne dijagonale

59. Za unetu kvadratnu matricu a, ispisati zbir svih neparnih elemenata koji se nalaze na mestima gde je zbir indeksa i i j jednak datom broju k, to jest i+j=k.

60. Napisati program koji ispisuje koliko se puta određeni broj pojavio u matrici an,m. Matrica a treba da sadrži samo brojeve ižmeđu 0 i 9.

61. Potrebno je popuniti kvadratnu matricu a na zadati način. Npr. za unetu dimenziju 4 treba formirati ispisati matricu oblika:

1 2 3 42 3 4 13 4 1 24 1 2 3

62. Na osnovu kvadratne matrice a formirati kvadratnu matricu b koja predstavlja matricu a u ogledalu (krajnja leva kolona matrice a treba da bude krajnja desna matrice b itd.).

63. Napisati program koji menja datu matricu a tako što sortira elemente u svakom redu i to elemente u prvom redu rastućim redosledom, elemente u drugom opadajućim, elemente u trećem rastućim itd.

1 2 3 412 13 14 511 16 15 610 9 8 7

Page 19: Masinski fakultet Beograd programiranje

R e š e n j a :1. #include <stdio.h>

#define MAX_SIZE 15void ucitaj_niz(int *a,int n) { int i;for(i=0;i<n;i++) {

printf("a[%d]= ",i); scanf("%d"; (a+i));

}}double arit_sr(int *a,int n) { int idouble sum=0.0 for(i=0;i<n;i++)

sum+=*(a+i); return sum/n;

}int main() {int I[MAX_SIZE],II[MAX_SIZE],III[MAX_SIZE],IV[MAX_SIZE];int n_i,n_ii,n_iii,n_iv; double pI,pII,pIII,pIV,prosek;printf("Unesite broj predmeta na I godini studija: "); scanf("%d",&n_i);printf("Ocene na I godini :\n"); ucitaj_niz (I,n_i);printf("Unesite broj predmeta na II godini studija: ");scanf("%d",&n_ii);printf("Ocene na II godini: \n");ucitaj_niz(II,n_ii);printf("Unesite broj predmeta na III godini studija: ");scanf ("%d",&n_iii);printf("Ocene na III godini :\n");ucitaj_niz(III,n_iii);printf("Unesite broj predmeta na IV godini studija: ");scanf("%d",&n_iv);printf ("Ocene na IV godini: \n");ucitaj_niz(IV,n_iv);pI=arit_sr(I,n_i);pII=arit_sr(II,n_ii); pIII=arit_sr(III n_iii); pIV=arit_sr(IV, n_i I; prosek=(pI+pII+pIII+pIV)/4.0;printf ("Prosek po godinama je:\n");

printf("I:%.2f,II:%.2f,III:%.2f i IV:%.2f\n",pI,pII,pIII,pIV);printf("Ukupan prosek na studijama je %5. 2f: ",prosek);return 0;

}

2. #include <stdio.h> #define MAX_SIZE 100void ucitaj_niz (int *a, int n) {

int i;for(i=0;i<n;i++) {

printf("a[%d]= ",i); scanf ("%d",(a+i) );

}}int main() {

int a[MAX__SIZE];int br_p=0,p,n,i;printf("Unesite dimenziju niza "); scanf("%d",&n);if (n>MAX_SIZE) {

printf("Dimenzija je prevelika! "); return 1;

}printf("Uneti broj p ");scanf("%d",&p); ucitaj_niz(a,n); for(i=0;i<n;i++)

if(a[i]%2==0 && a[i]>p) br_p++; printf("Broj parnih brojeva vecih od %d je %d",p,br_p);return 0;

}

3. #include <stdio.h> int main () {

int i,broj;int cifre[] = {0,0,0 0 0 0,0 0 0 0};

Page 20: Masinski fakultet Beograd programiranje

printf ("Unesi broj "); scanf (" %d",&broj ); while(broj) {

cifre [broj %10] ++; broj/=10;

}for(i=0;i<10;i++)

printf("Cifra %d se ponovila %d puta \n",i,cifre[i]); return 0;

}

4.#include <stdio.h> #define MAX_SIZE 100 void ucitaj_niz(int *a,int n) {

int i;for(i=0;i<n;i++) {

printf("a[%d]= ",i;scanf("%d", (a+i));

}}void ispisi_niz(int *niz,int n) {

int i;for(i=0;i<n;i++)

printf("%d ",*(niz+i));}int main() {

int i,ib=0,ic=0,dim,a[MAX_SIZE],b[MAX_SIZE],c[MAX_SIZE];scanf("%d",&dim); ucitaj_niz(a,dim);for(i=0;i<dim;i++)

if(i%2 == 0) c[ic++]=a[i]; else b [ib++] =a [i];

printf("Niz b : "); ispisi_niz(b,ib);printf(" \nNiz c " ); ispisi_niz(c,ic); return 0;

}5.#include <stdio.h>

#define MAX_SIZE 100 void ucitaj_niz(int *a,int n) {

int i;for(i=0;i<n;i++) {

printf("a[%d] = " ,i); scanf("%d",(a+i));

}}void ispisi_niz(double *niz,int n) {

int i;for(i=0;i<n;i++)

printf("%f ",*(niz+i));}int main () {

int a[MAX_SIZE],i; double b[MAX_SIZE-1];int n;scanf("%d",&n); ucitaj_niz(a,n); for(i=0;i<n-l;i++)

b[i]=(double)a[i]/a[i+1];printf("Niz b :\n");ispisi_niz(b,n-l); return 0;

}6.#incluae <stdio.h>

#define MAX_SIZE 100 void ucitaj_niz(int *a,int n) {

int i;for(i=0;i<n;i++) {

printf( "a[%d] = ",i); scanf(%d",(a+i));

}}void ispisi_niz(double *niz,int n) {

int i;for (i=0;i<n;i++) printf("%f ", *(niz+i));

}

Page 21: Masinski fakultet Beograd programiranje

int main() {int a[MAX_SIZE],i; double b[MAX_SIZE/2];int n;scanf("%d",&n);ucitaj_niz(a,n); for(i=0;i<n/2;i++)

b[i]=(double)(a[i]+a[i+1]-a[n-l-i])/2;printf("Niz b :\n"); ispisi_niz(b,n/2);return 0;

}

7.#include <stdio.h> #define MAX_SIZE 100 void ucitaj niz(int *a,int n) {

int i;for(i=0;i<n;i++) {

printf("a[%dn = ",i); scanf("%d",(a+i);

}}void ispisi_niz(double *niz,int n) {

int i;for(i=0;i<n;i++)

printf("%f ", * (niz+i));}double aritm_sr(int *a,int n,int k) {

int i;double sum=0.0; for(i=0;i<n;i++)

if(i!=k) sum+=*(a+i); return sum/(n-1);

}int main() {

int a[MAX_SIZE],i,n; double s[MAX_SIZE]; scanf("%d",&n) ucitaj_niz(a,n); for(i=0;i<n;i++)

s[i]=aritm_sr(a,n,i); printf("Niz S :\n"); ispisi_niz(s,n); return 0;

}

8. #include <stdio.h> #define MAX_SIZE 100void ucitaj_intervale(int *a,int *b,int n) {

int i;for(i=0;i<n;i++) {

printf("Unesite %d interval [a,b]: " i+1); scanf ("%d%d",a+i,b+i);

}}void ispisi_niz(int *niz,int n) {

int i;for(i=0;i<n;i++)

printf("%d ",* (niz+i));int main() {

int a[MAX_SIZE],b[MAX_SIZE],c[MAX_SIZE];int C,i,n,n_c=0,min_i,min;printf("Unesite broj intervala : ");scanf("%d",&n);ucitaj_intervale(a,b,n);printf("Unesite broj C: ");scanf("%d",&C);min_i=0;min = 0;for(i=0;i<n;i++)

if(a[i]<C && b[i]>C) { c[n_c++]=i;if((b[i]-a[i]) < min) {

min=b[i]-a[i]; min_i=i;

}}

ispisi_niz(c,n_c);

Page 22: Masinski fakultet Beograd programiranje

printf("\nNajmanji interval koji sadrzi %d je (%d,%d)\n",C,a[min_i],b[min_i]);return 0;

}9.#include <stdio.h>

#define MAX_SIZE 100void ucitaj_niz(int *a,int n) {

int i;for(i=0;i<n;i++) {

printf("a[%d] = ",i); scanf("%d",(a+i));

}}void ispisi_niz(int *a,int n) {

int i;for(i=0;i<n;i++)

printf("%d",*(a+i));}void swap(int *a,int *b) {

int tmp=*a; *a=*b; *b=tmp;}int main() {

int a[MAX_SIZE],i,n,j; scanf("%d",&n); ucitaj_niz (a,n); i=0; j=n-l; while(l) {

while(a[i]%2==0 && i<j) i++;while(a[j]%2 && j>i) j--;if(i<j) swap(&a[i],&a[j]) else break;

}ispisi_niz(a,n);return 0;

}

10. #include <stdio.h>#define MAX_SIZE 100void ucitaj_niz(int *a,int n) {...} //Funkcije se mogu videti void ispisi_niz(int *a,int n) {... //u zadacima od 1 do 9int mam () {

int a[MAX_SIZE],b[MAX_SIZE],dim,n,i; printf("Uneti dimenzije niza a: "); scanf("%d",&dim);ucitaj_niz(a,dim);printf(Unesite za koliko treba pomeriti elemente niza: ");scanf("%d",&n);for(i=0;i<dim;i++)

b[(i+n)%dim]=a[i]; printf("Niz a: \n"); ispisi_niz(a,dim); printf("Niz b :\n");

ispisi_niz(b,dim); return 0;

}

11. #include <stdio.h>#define MAX_SIZE 100 void ucitaj_niz(int *a,int n) {...} voiđ ispisi_niz(int *a,int n)

int obrni(init br) { int noviBr=0; while(br) {

int ostatak = br%10;noviBr=10*noviBr+ostatak;br/=10;

}return noviBr;

}int main() {

int a[MAX_SIZE],b[MAX_SIZE],n,i; scanf("%d",&n); ucitaj_niz(a, n); for(i=0;i<n;i++)

b[i]=obrni(a[i]); printf("Niz a : \n");ispisi_niz(a,n); printf("Niz a : \n"); ispisi_niz(b,n);

return 0;

Page 23: Masinski fakultet Beograd programiranje

}

12. #include <stdio.h> #define MAX_SXZE 100 voiod ucitaj_niz(int *a,int n) {...} void ispisi_niz(int *a,int n) { ... } int sadrzi_cifru(int br, int cif) {

int korak=10; while(br) {

int c = br%10; if(c==cif) return 1; br/=korak;

}return 0;

}int main() {

int a[MAX_SIZE],b[MAX_SIZE]; int n_b=0,n,i,c; scanf("%d",&n);ucitaj_niz(a,n);printf("Unesite trazenu cifru : "); scanf("%d",&c); for(i=0;i<n;i++)

if(sadrzi_cifru(a[i],c)) b[n_b++]=a[i]; printf("Niz a : \n"); ispisi_niz(a,n); printf("Niz a: \n"); ispisi_niz(b,n_b); return 0;

}13. #include <stdio.h>

#define MAX_SIZE 100void ucitaj_niz(int *a,int n) {. .}int main () {

int a[MAX_SIZE]; int n,i,br=0; scanf("%d",&n); ucitaj_niz (a,n); for(i=0;i<n-l;i++)

if(a[i]>0 && a[i+l]<0)||(a[i]<0 && a[i+l]>0)) br++; printf("Broj promene znaka je %d",br); return 0;

}

14. #include <stdio.h>#define MAX_SIZE 100void ucitaj_niz(int *a,int n) {. .}int provera(int a[],int n);

int i;for(i=0;i<n-l:i++)

if(a[i] ==a[i+1]) return 0;return 1;

}int main () {

int a[MAX_SIZE]; int n,i,br=0; scanf("%d",&n); ucitaj_niz(a,n); if(provera(a,n))

printf("Svaka dva susedna elementa su razlicita"); else printf("Postoje susedni elementi koji si identicni"); return 0;

}

15. #include <stdio.h> #define MAX_SIZE 100void ucitaj_niz(double *a,int n) {

int i;for(i=0;i<n;i++) {

printf("a[%d]= " ,i); scanf("%1f",(a+i));

}}int main() {

double a[MAX_SIZE];int n,i;double p,sum=0.0;scanf ("%d",&n);ucitaj_niz(a,n);

Page 24: Masinski fakultet Beograd programiranje

printf("Unesite broj P: ");scanf("%lf",&p);for(i=0;i<n && a[i]!=p;i++)

sum+=a[i];printf("Zbir elemenata do broja %f je %f",p,sum); return 0;

}

16. #include <stdio.h> #define MAX_SIZE 100void ucitaj_niz(int *a,int n) {...}

int pronadji_prvo (int *a,int n,int x, int pos) { int i;if(pos>n) return -1; for(i=pos;i<n;i++)

if(*(a+i)==x ) return i; return -1;

}int main() {

int a[MAX_SIZE];int n,i,pr=l,x,y,p_pos,l_pos ;scanf(" %d",&n);ucitaj_niz(a,n);printf("Unesite brojeve ciji se proizvod racuna");scanf("%d%d",&x,&y); p_pos=pronadji_prvo(a,n x,0);l_pos=pronadji_prvo(a,n,y,p_pos); for(i=p_pos+l;L<l_pos;i++)

pr*=a[i];printf("Proizvod elemenata izmedju %d i %d je %d",x,y,pr);return 0;

}

17. #incluđe <stdio.h> #include <math.h> #define MAX_SIZE 100void ucitaj_coef(int *pol,int deg) {

int i;for(i=0;i<=deg;i++) {

printf("Uneti %d. koeficijent: ",i); scanf("%d",(pol+i));

}}void ispisi_pol(int *pol,int deg) {

int i;printf("P(x)="); for(i=0;i<=deg;i++)

printf("%dx^%d%c",*(pol+i),i,(i==deg?' ':' + ')); printf("\n");

}int vrednost_pol(int* pol,int deg int x) {

int i,sum=0.0; for(i=0;i<=deg;i++)

sum+=pol[i]*pow(x,i); return sum;

}int main() {

int pol[MAX_SIZE]; int deg,x;printf("Uneti stepen polinoma: ");scanf("%d",&deg);ucitaj_coef(pol,deg);ispisi_pol(pol,deg);printf("Unesite X : ");scanf("%d",&x);printf("P(%d)=%d",x,vrednost_pol(pol,deg,x)); return 0;

}

18. #include <stdio.h> #define MAX_SIZE 100void ucitaj_coef(int *pol,int deg) {

int i;for(i=0;i<=deg;i++) {printf("Uneti %d. koeficijent: ",i); scanf("%d",(pol+i));}

}

Page 25: Masinski fakultet Beograd programiranje

void ispisi(int *pol,int deg) { int i;printf("P(x)="); for (i=0;i<=deg;i++)

printf("%dx^%d%c",*(pol+i),i,(i==deg?' ':'+')); printf("\n");

void saberi(int *p,int *q,int deg_p,int deg_q,int* r,int *deg) { int i;*deg=deg_p>deg_q?deg_p:deg_q; for(i=0;i<=*deg;i++)

r[ij =0; for (i=0;i<=deg_p;i++)

r[i]+=p[i]; for(i=0;i<=deg_q;i++)

r[i]+=q[i];}void pomnozi(int *p,int *q,int deg_p,int deg_q,int* r,int *deg) {

int i,j;*deg=deg_p+deg_q;for(i=0;i<=*deg;i++)

r[i]=0; for(i=0;i<=deg_p;i++)

for(j=0;j<=deg_q;j++) r[i+j]+=p[i]*q[j];

}int main() {

int p[MAX_SIZE],c[MAX_SIZE],rez[MAX_SIZE;]int degp,degq,deg; 'printf("Uneti stepen polinoma p: "); scanf("%d",&degp);printf ("Uneti stepen polinoma q: ");scanf("%d",&degq);printf("Uneti koeficijente polinoma p: \n"); ucitaj_coef(p,degp);printf("Uneti koeficijente polinoma q:\\n");ucitaj_coef(q,degq)printf("Zbir polinoma p i q \n");saberi(p,q,degp,degq,rez,&deg);ispisi(rez,deg);printf("Proizvod polinoma p i q\n"); pomnozi(p,q,degp degq,rez,&deg); ispisi(rez,deg); return 0;

}19. #include <stdio.h>

#include <stdlib.h> #define MAX_SIZE 100void ucitaj_niz(int *a,int n) {...} int sig(int x) {

return x==0? 0 : x/abs (x);}int isSort(int *a,int n) {

int i,poredak=0,t; for(i=0;i<n-l;i++) {

t=sig(a[i+1]-a[i]); if(poredak==0) poredak=t; if(t==0 || t==poredak) continue; else return 2;

}return poredak;

}int main() {

int a[MAX_SIZE];int p,n;scanf("%d",&n) if(n<=l) {

printf("Broj elemenata mora biti veci od 1"); return 1;

}ucitaj_niz(a,n); p=isSort(a,n); switch(p) {

case -1: printf("Niz je nerastuci!"); break; case 1: printf("Niz je neopadajuci!"); break; case 2: printf("Niz nije sortiran"); break; case 0: printf("Svi elementi su jednaki");

}return 0;

}

Page 26: Masinski fakultet Beograd programiranje

20. void bubble(int a [], int n) {int ponovo,i,temp; do {

ponovo=0;for(i=l;i<n;i++)

if(a[i]<a[i-l]) { temp=a[i]; a[i]=a[i-1]; a[i-1]=temp; ponovo=l;

}} while (ponovo);

}

21. void selection(int a[],int n) { int i,j,minidx,temp; for(i=0;i<n-l;i++) {

minidx=i;for(j=i+l; j<n; j++)

if(a[j]<a[minidx]) minidx=j; if(i!=minidx) {

temp=a[i]; a[i]=a[minidx]; a[minidx]=temp

}}

}void compactselection(int a[],int n) {

int i,j temp; for(i=0;i<n-l;i++)

for(j=i+l;j<n;j++)if(a[j]<a[i]) {

temp=a[i]; a[i]=a[j];a[j]=temp;

}}

22. void insertion(int a[],int n) { int i,j value;for(i=0;i<n;i++) {

value=a[i];for(j=i-l;j>=0 && a[j]>value; j--)

a[j+l]=a[j];

a[j+1] =value;}

}23. int partition ( int a[], int l, int r) {

int pivot,i,j,t; pivot = a [l];i = 1; j = r+1 while( l) {

do ++i; while( a[i] <= pivot && i <= r ); do --j; while( a[j] > pivot ); if ( i >= j )break; t = a[i]; a[i] = a[j]; a[j] = t;

}t = a[l]; a[l] = a[ j ]; a[j] = t; return j; j

}void quick( int a[], int l, int r) {

int j;if( l - r ) {

j = partition( a, 1, r); quick( a, l, j-1); quick( a, j+l, r);

}}

24. void combine (int a[], int prvi, int poslednji) { int i, j, k, b[100],m=(prvi+poslednji)/2; for(i=prvi;i<=poslednji; i++)

b[i]=a[i]; i=prvi; j=m+l; k=prvi; while (i<=m && j<=poslednji)

if(b[i]<=b[j])a[k++]=b[i++];

Page 27: Masinski fakultet Beograd programiranje

elsea[k++]=b[j++];

while (i<=m)a[k++]=b[i++];

}void merge(int a [], int prvi, int poslednji){

if(prvi<poslednji) {int m=(prvi+poslednji)/2; merge(a, prvi, m);merge(a, m+l, poslednji);combine(a, prvi , poslednji);

}}

25. #include <stdio.h> #đefine MAX_SIZE 100void ucitaj_niz(int *a,int n) {...} void ispisi_niz(int *a,int n) {...}void ubaci(int *a, int n, int p) {

int i;for(i=n-l;i>=0;i--)

if(a[i]>p)a[i+1]=a[i];

else break; a[i+1]=p

}int main() {

int a[MAX_SIZE]; int n,p;printf(Unesite dimenziju niza : "); scanf("%d",&n); ucitaj_niz (a,n);printf("Unesite broj koji treba da se ubaci u niz:");scanf("%d",&p);ubaci(a,n,p);ispisi_niz(a,n+1);return 0;

}

26. #include <stdio.h> #define MAX_SIZE 100void ucitaj_niz(int *a,int n) {---} void ispisi_niz(int *a,int n) {...}void swap(int *a,int *b){

int tmp=*a; *a=*b; *b=tmp;

}void sort(int *a,int n) {

int i,j;for(i=0;i<n-1;i+=2)

for(j=i+2;j<n;j+=2)if(*(a+i)>=*(a+j)) swap(a+i,a+j);

for(i=l;i<n-l;i+=2)for(j=i+2;j<n;j+=2)

if(*(a+i)<=*(a+j)) swap (a+i; a+j);}int main() {

int a[MAX_SIZE],n;printf("Unesite dimenziju niza ");scanf("%d",&n);ucitaj_niz (a,n);sort(a,n);ispisi_niz(a,n);return 0;

}

Page 28: Masinski fakultet Beograd programiranje

27. #include <stdio.h>#define MAX_SIZE 100void ucitaj_niz(int *a,int n {...} void ispisi_niz(int *a,int n){...}int prost(int br) {

int i;if(br == 1) return 0; for(i=2;i<=sqrt(br);i++)

if(br%i==0) return 0; return 1;

}void sort(int *a,int dim) {

int i,j;for(i=0;i<dim-l;i++)

for(j=i+l;j<dim;j++) if(a[j]>a[i]) {

int tmp=a[j ]; a[j]=a[i]; a[i]=tmp;

}int main() {int a[MAX_SIZE], b[MAX_SIZE];

int i,n,p,n_b=0;printf("Unesite dimenziju niza: ");scanf("%d",&n);ucitaj_niz (a,n);for(i=0;i<n;i++)

if(prost(a[i])) b[n_b++]=a[i]; sort(b,n_b); printf("Niz b: \n"); ispisi_niz (b,n_b); return 0;

}

28. #include <stdio.h>#define MAX_SIZE 100void ucitaj_niz(int *a,int n) {…}void min_max(int *a,int n,int *min,int *max) {

int i;*min=*max=a[0]; // Mogli smo da stavimo i *a umesto a[0] for(i=l;i<n;i++) {

if(*(a+i)>*max) *max=*(a+i); if(*(a+i)<*min) *min=*(a+i);

}}int main() {

int a[MAX_SIZE] n,min,max;printf("Unesite dimenziju niza ");scanf("%d",&n);ucitaj_niz(a,n);min_max(a,n,&min,&max);printf("Minimum niza je %d",min);printf("\nMaksimum niza je %d" max);return 0;

}

29. #incluđe <stdio.h> #đefine MAX_SIZE 100voiđ ucitaj_niz (int *a,int n) {…}int prost(int br) {

int i;if(br == 1) retum 0;for(i=2;i<=sqrt(br);i++)

if(br%i==0) return 0;return 1;

}void aritm_sredine(int *a,int n,double *sr_parni,double *sr_rosti){

int i,br_parni=0,br_prosti=0; *sr_parni=*sr_prosti=0.0; for(i=0;i<n;i++) {

if(a[i]%2==01 {*sr_parni+=a[i]; br_parni++;} if(prost(a[i]){*sr_prosti+=a[i]; br_prosti++;}

}*sr_parni/=br_parni; *sr_prosti/=br_prosti;

}

Page 29: Masinski fakultet Beograd programiranje

int main() {int a[MAX_SIZE],n;double sr_parni,sr_prosti;printf("Unesite dimenziju niza: ");scanf("%d",&n);ucitaj_niz(a,n);aritm_sredine(a,n,&sr_parni,&sr_prosti); printf("Aritmeticka sredina prostih %f",sr_prosti);printf("\nAritmeticka sredina parnih %f" sr_parni);return 0;

}

30. Funkcija sortira niz a dimenzije n i tipa float. pom_f se korist kao swap funkcija koja zamenjuje mesta dva elementa tipa float. Njoj se prosleđuju vrednosti odgovarajućih elemenata u nizu pomoću pokazivačke aritmetike.

31. Funkcija pomera ciklično sve elemente niza a tako da prvi element dođe na kraj

32. Funkcija računa zbir kvadrata i kubova brojeva između m i n. Zbir kubova se smešta u promenljivu r, a zbir kvadrata u promenljivu q.

33. Funkcija traži maksimum niza a čija dimenzija je smeštena u promenljivu pr (odnosno pom). Maksimum niza se smešta u promenljivu kol.

34. Funkcija traži minimum niza b čija dimenzija je smeštena u promenljivu x (to jest pom). Minimum niza se smešta u promenljivu srv

35. Funkcija računa zbir elemenata u nizu a, dimenzije pr. Zbir elemenata se smešta u promenljivu kol.

36. Funkcija računa proizvod elemenata u nizu a, dimenzije pr. Proizvod elemenata se smešta u promenljivu kol. U petlji for se kreće od poslednjeg elementa ka prvom, to jest prvom elementu u nizu a.

37. #include <stdio.h>

#define MAX_SIZE 100void ucitaj_objekte(double *a,int n) {

int i;for(i=0;i<n;i++) |

printf("Unesite magnitudu %d. objekta = ",i+l); scanf("%lf",(a+i));

}}int sort(double* a,int n) {

int i,j;for(i=0;i<n-l;i++)

for(j=i+l;j<n;j++)if(*(a+i)>*a+j)) {

double tmp=*(a+i); *(a+i)=*(a+j); *(a+j)=tmp;

}}void ispisi_objekte(double* a,int n) {

int i;for(i=0;i<n;i++)

printf("%lf\n",a[i]);}int main() {

double objekti[MAX_SIZE]; int n;printf("Unesite broj objekata "); scanf("%d",&n); ucitaj_objekte(objekti,n); sort(objekti,n);printf("Sortirani objekti :\n"); ispisi_objekte(objekti,n); printf("Najsjajniji objekti su: \n"); printf("%lf\n”,objekti[0]);printf("%lf\n",objekti[l]);printf("%lf\n",objekti[2]); printf("%lf\n',objekti[3]); return 0;

}

34.35.36.37,

Page 30: Masinski fakultet Beograd programiranje

38. #include <stdio.h> #define MAX_SIZE 100void unesi_matricu (int a[][MAX_SIZE],int n,int m) {

int i,j;printf("Unesite clanove matrice "); for(i=0;i<n;i++)

for(j=0;j<m;j++) {printf("\na[%d][%d] = ",i,j); scanf("%d",&a[i][j])

}}void ispisi_matricu(int a[][MAX_SIZE],int n,int m) {

int i,j;for(i=0;i<n;i++){

for(j=0;j<m;j++)printf("%d ",a[i][j]);

printf("\n");}

}int suma(int mat[][MAX_SIZE],int n,int m) {

int i,j,sum=0; for(i=0;i<n;i++)

for(j=0;j<m;j++)sum+=mat[i][j];

return sum;}int main() {

int mat[MAX_SIZE][MAX_SIZE]; int n,m;printf("Unesite n i m : \n"); scanf("%d%d",&n,&m); unesi_matricu(mat,n,m);printf("Suma elemenata u matrici je %d\n",suma(mat,n,m)); ispisi_matricu(mat,n,m); return 0;

}

39. #include <stdio.h> #define MAX_SIZE 100void unesi_matricu (int a[][MAX_SIZE],int n,int m) {...} void ispisi_matricu (int a[] [MAT_SIZE],int n,int m) {...}int main() {

int a[MAX_SIZE][MAX_SIZE]; int b[MAX_SIZE][MAX_SIZE]; int i,j,n,m;printf ("Unesite dimenzije matrice a: "); scanf("%d%d",&n,&m); unesi_matricu(a,n,m);for(i=0;i<n;i++)

for(j=0;j<m;j++)if(a[i][j]%2) b[i][j]=0; else b[i][j]=l;

ispisi_matricu(b,n,m); return 0;

}

40. #include <stdio.h> #define MAX_SIZE 100void unesi_matricu (int a[][MAX_SIZE],int n,int m) {...} void ispisi_matricu (int a[][MAX_SIZE],int n,int m) {...}int main() {

int a[MAX_SIZE][MAX_SIZE]; int b[MAX_SIZE][MAX_SIZE];int i,j,n;printf("Unesite dimenzije kvađratne matrice a: "); scanf("%d",&n); unesi_matricu(a,n,n); for(i=0;i<n;i++)

for(j=0;j<n;j++)if( i==j) b[i][i]=a[i][i]; else if(j==n-l-i) b[i][j]=a[i][j]; else b[i][j]=0;

ispisi_matricu(b,n,n); return 0;

}

Page 31: Masinski fakultet Beograd programiranje

41.#include <stdio.h>#define MAX_SIZE 100void unesi_matricu (int a[][MAX_SIZE],int n,int m) {...} void ispisi_matricu (int a[][MAX_SIZE],int n,int m) {...}void min_max(int a[][MAX_SIZE],int n,int m,int* min,int* max) {

int i,j;*min=*max=a[0][0]; for(i=0;i<n;i++)

for(j=0;j<m;j++) {if(a[i][j]>*max) *max=a[i][j]; if(a[i][j]<*min) *min=a[i][j];}

}int main() {

int a[MAX_SIZE][MAX_SIZE],i,j,rn,m,min,max; printf("Unesite dimenzije matrice a: "); scanf("%d%d",&n,&m);unesi_matricu(a,n,m); min_max(a,n,m,&min,&max);printf("Minimum matrice je %d, a maksimum %d" min,max); return 0;

}

42. #include <stdio.h> #define MAX_SIZE 100void unesi_matricu(int a[][MAX_SIZE],int n,int m) {...} void ispisi_matricu(int a[][MAX_SIZE],int n,int m) {...}int sum (int a[][MAX_SIZE],int n,int m) {

int i,j,sum=0; for(i=1;i<n;i+=2)

for(j=0;j<m;j+=2) sum+=a[i][j];

return sum;}int main () {

int a[MAX_SIZE][MAX_SIZE],i,j,n,m; printf("Unesite dimenzije matrice a: "); scanf("%đ%d",&n,&m); unesi_matricu(a,n,m); printf("Suma je = %d",sum(a,n,m)); return 0;

}

43. #include <stdio.h> #define MAX_SIZE 100void unesi_matricu (int a[][MAX_SIZE],int n,int m) {...} void ispisi_matricu (int a[][MAX_SIZE],int n,int m) {...}

int simetricna (int a[][MAX_SIZE],int n) { int i,j;for(i=0;i<n;i++)

for(j=0;j<i;j++)if(a[i][j]!=a[j][i] ) return 0;

return 1;}int main() {

int a[MAX_SIZE][MAX_SIZE],n;printf("Unesite dimenzije kvadratne matrice a: "); scanf("%d",&n); unesi_matricu(a,n,n);if(simetricna(a,n)) printf("Matrica je simetricna""); else printf("Matrica nije simetricna"); return 0;

}

44. #include <stdio.h> #define MAX_SIZE 100void unesi_matricu (int a[][MAX_SIZE],int n,int m) {...} void ispisi_matricu (int a[][MAX_SIZE],int n,int m) {...} void ucitaj_niz(int *a,int n) {...}void promeni(int a[][MAX_SIZE],int *b,int n,int k) {

int i;for(i=0;i<n;i++)

a[i][k] =b[k];}int main() {

int a[MAX_SIZE][MAX_SIZE],b[MAX_SIZE],m,n,k; printf("Unesite dimenzije matrice a: ");

Page 32: Masinski fakultet Beograd programiranje

scanf("%d%d",&n,&m); unesi_matricu(a,n,m); ucitaj_niz(b,n); printf("Unesite k : "); scanf("%đ",&k); promeni(a,b,n,k);ispisi_matricu(a,n,m); return 0;

}

45. #include <stdio.h>#define MAX_SlZE 100void unesi_matricu (int a[][MAX_SIZE],int n,int m) {...} void ispisi_matricu(int a[][MAX _SIZE],int n,int m) {...} void swap_c (int a[][MAX_SIZE],int n,int k,int p) {

int i,tmp; for(i=0;i<n;i++) {

tmp=a[k][i]; a[k][i]=a[p][i]; a[p][i]=tmp;

}int main () {

int a[MAX_SIZE][MAX_SIZE],b[MAX_SIZE][MAX_SIZE];int m,n,k p;printf("Unesite dimenzije matrice a: "); scanf("%d%d",&n,&m); unesi_matricu(a,n,m); printf ("Unesite k i p:"); scanf("%d%d",&k,&p)swap_c(a,m,k,p);ispisi_matricu(a,n,m);return 0;

}

46. #include <stdio.h> #define MAX_SIZE 100void unesi_matricu (int a[][MAX_SIZE],int n,int m) {...} int max_niza(int *a,int n) {

int i,max=*a; for(i=l;i<n;i++)

if(*(a+i)>max) max=*(a+i); return max;

}int min_niza(int *a,int n) {

int i,min=*a; for(i=l;i<n;i++)

if(*(a+i)<min) min=*(a+i); return min;

}void j spisi_niz(int *a,int n) {...} int main(){

int a[MAX_SIZE][MAX_SIZE]; int b[MAX_SIZE],c[MAX_SIZE];int i,m,n;printf("Unesite dimenzije matrice a: "); scanf("%d%d",&n,&m); unesi_matricu(a,i,m); for(i=0;i<n;i++) {

b[i]=max_niza(a[i],m);c[i]=min_niza(a[i],m);

}printf("Niz b :\n"); ispisi_niz(b,m);printf("Niz c : \n"); ispisi_niz(c,n); retum 0;

}

47. #include <stdio.h> #include <math.h> #define MAX_SIZE 100void unesi_matricu (int a[][MAX_SIZE],int n,int m) {...} int prost(int br) {

int i;if(br == 1) return 0;for(i=2;i<=sqrt(br);i++)

if(br%i==0) return 0; return 1;

}

Page 33: Masinski fakultet Beograd programiranje

void ispisi_niz(int *a,int n) {...} void sort(int *a,int n) {

int i,j tmp; for(i=0;i<n-l;i++)

for(j=i+l;j<n;j++)if(a[i]>a[j]) {

tmp=a[i]; a[i]=a[j]; a[j]=tmp;

}}int main() {

int a[MAX_SIZE][MAX_SIZE]; int b[MAX_SIZE];int n_b=0,i,j,m,n;printf("Unesite dimenzije matrice a: "); scanf("%d%d",&n,&m); unesi_matricu(a,n,m); for(i=0;i<n;i++)

for(j=0;j<m;j++)if(prost(a[i][j])) b[n_b++]=a[i][j];

sort(b,n_b); ispisi_niz(b,n_b); return 0;

}

48. #include <stdio.h> #define MAX_SIZE 100void unesi_matricu (int a[][MAX_SIZE],int n,int m) {...} void ispisi_niz(int *a,int n) {...} int main()

int a[MAX_SIZE][MAX_SIZE];int b[MAX_SIZE];int i,j,n;printf("Unesite dimenzi]e matrice a: "); scanf("%d",&n) unesi_matricu(a,n,n); for(i=0;i<n;i++) {

int p=l;for(j=0;j<n;j++)

p*=a[j][i] b[i]=p;

}ispisi_niz(b,n);return 0;

}

49. #include <stdio.h> #define MAX_SIZE 100 %void unesi_matricu (int a[][MAX_SIZE],int n,int m) {...} int najveci_u_redu(int vrednost, int red,int mat [][MAX_SIZE],int n,int m) {

int i;for(i=0;i<m;i++)

if(mat[red][i]>vređnost) retura ;return 1;}

int najmanji_u_koloni(int vređnost,int kolona,int mat [][MAX_SIZE],int n,int m) {int i;for(i=0;i<n;i++)

if(mat[i][kolona]<vređnost) return 0; return 1;

}int main () {

int mat[MAX_SIZE][MAX_SIZE];int n,m,i, j ,kol,red,br=0;printf("Unesite dimenzije matrice: \n");scanf("%d%d",&n,&m); 'unesi_matricu(mat n,m);for(i=0;i<n;i++)

for(j=0;j<m;j++) {if(najveci_u_redu(mat[i][j],i,mat,n,m) && najmanji_u_koloni(mat[i][j],j,mat,n,m) ) {

printf("%d na mestu %d,%d\n",mat[i][j],i,j); br++

}}

printf("ukupno ih je %d",br); return 0;

}

Page 34: Masinski fakultet Beograd programiranje

50. #include <stdio.h> #define MAX_SIZE 100 int main() {

int mat[MAX_SIZE],[MAX_SIZE],n,m,i,j;int deltax[4]={l,0,-1,0};int deltay[4]={0,1,0,-1}; int posx=0, posy=l, pravac=0;printf("Unesite n i m : \n"); scanf("%d%d",&n,&m); for(i=0;i<=n+l;i++)

for(j=0;j<=m+l;j++) {if(i==0 || i== n+1 || j==0 || j==m+l) mat[i][j]=l; else mat[i][j]=0;

}for(i=l;i<=m*n;i++) {

if(mat[posy+deltay[pravac]][posx+deltax[pravac]]!=0) pravac=(pravac+1)%4;mat[posy+deltay[pravac]][posx+deltax[pravac]]=i; posx+=deltax[pravac]; posy+=deltay[pravac];

}for(i=l;i<=n;i++){

for(j=l;j<=m;j ++)printf("%d\t",mat[i][j]);

printf("\n");

}return 0;

}

Page 35: Masinski fakultet Beograd programiranje

Stringovi

S t r i n g o v i

Za reč ili rečenicu potpuno prirodno kažemo da je niz slova ili, u opštem slu čaju, niz znakova (string). U programskom jeziku C upravo ćemo ih tako i deklarisati.

char a [100];char *b="Ovo je neki niz znakova" char c []="Opet neki niz znkova"

Ovim primerima smo deklarisali da je a niz od 100 znakova, b i c su stringovi koji u startu sadrže po rečenicu, a razlikuju se samo vizuelno pošto je svejedno da li ćemo pri deklaraciji koristiti * ili [].

Bitno je zapamtiti da je na kraju stringa uvek znak `\0` jer je to znak za terminaciju stringa, to jest za njegov kraj. Ugrađene fiunkcije koje rade sa stringovima očekuju da se terminalni znak nalazi na kraju; ako ga nema program pada, a ako se nalazi u sredini, ostatak stringa će biti zanemaren.

Stringovi se takođe ne mogu sabirati kao što se to može raditi u nekim drugim jezicima, već se spajaju posebnom funkcijom i pri tom se mora voditi računa da odredišni string ima dovoljno mesta!

Funkcije za učitavanje i ispisivanje stringova:

printf ("%s" , a); ispisuje string a

scanf ("%s" , a); učitava string a; ispred a se ne piše &, jer je a već pokazivač! Ova funkcija učitava tekst do prvog razmaka.

gets (a); takođe učitava string a, ali do kraja redaputs (a); ispisuje string a

Često se previdi da je &s[4j takođe string koji počinje od petog znaka (prvi je sa indeksom 0). To je korisno kada želimo da nađemo npr. sledeću pojavU nekog podstringa i tada kao argument funkcije strstr možemo umesto s da stavimo &s[4] ili samo s+4 (primer upotrebe pokazivačke aritmetike), što se može videti u mnogim urađenim zadacima.Često se upotrebljava NULL vrednost (to je makro definisan u stdio.h) koji označava da pokazivač ne pokazuje ni na šta. Primer je funkcija strstr koja vraća NULL ako se string t ne nalazi u stringu s.

Page 36: Masinski fakultet Beograd programiranje

A r g u m e n t i k o m a n d n e linije

Kao što funkciji prosleđujemo parametre, nekada želimo da odmah prosledimo neke parametre programu koji smo pokrenuli. Primer je program COPY koji možemo pokrenuti s komandne linije. Kada ga pokrećemo, pišemo razmak, ime fajla koji treba kopirati, pa razmak ime novog fajla u koji se sadržaj kopira. Da bismo mogli da pišemo slične programe, moramo znati kako da primimo te para-metre (argumente) u programu.

Do sada smo navikli da funkciju main pišemo kao:

int main( ) { . . .}

Međutim, main ima i svoj drugi zapis koji omogućava čitanje parametara koji su prosleđeni programu s komandne linije:

int main( int argc, char **argv)

U ovom zapisu, argv je niz stringova veličine agrc. Dakle, svaki parametar je string, a nulti parameter je ime programa.

Primer i

1. Napisati program koji ispisuje dati string u direktnom i inverznom poretku.

#include <stdio.h> int main() {

char str [100]; char *pok;printf ("Unesite string ");pok=gets(str);printf("String u direktnom poretku I: \n");printf("%s\n",str);printf ("String u direktnom poretku II: \n");while(*pok!='\0’) // Cesto cemo pisati i kao while(*pok)

putchar (*pok++);printf("\nString u inverznom poretku \n");while(--pok>=str)

Funkcije za rad sa znakovima (ctype.h):

isalpha(c) ispituje da li je c slovo

isnumeric(c) ispituje da li je c broj

isalnum(c) ispituje da li je c slovo ili broj

isspace(c) ispituje da li je c neki od sledećih znakova ' ', '\t', '\n`, '\v`, `\f`, ili `\r`, ili neka belina

isupper(c) ispituje da li je c veliko slovo

islower(c) ispituje da li je c malo slovo

ispunct(c) ispituje da li je c znak interpunkcije

tolower(c) pretvara c u malo slovo

toupper[c) pretvara c u veliko slovo

Funkcije za rad sa stringovima (string.h)

strcpy(d,s) kopira string s u string d, unapred pretpostavljajući i da u stringu d ima dovoljno mesta

strncpy(d,s,n) kopira n znakova stringa s u string d

strcat(d,s) nadovezuje string s na string d

strncat (d, s n) nadovezuje n znakova stringa s na string d

strcmp(a,b) upoređuje stringove a i b i vraća -1,0 ili 1 za a<b, a=b i a>b

strncmp (a,b n) upoređuje prvih n znakova stringova a i b

strcmpi(a,b) ista kao funkcija strcmp samo što se sva slova pretvaraju u mala radi poređenja

strchr(s,c) vraća pokazivač na prvu pojavu znaka c u stringu s

strstr(s,t) vraća pokazivač na prvu pojavu stringa t u stringu s

strlen(s) vraća dužinu stringa sstrpbrk(s,t) vraća pokazivač na prvu pojavu bilo kog znaka stringa t u stringu s, ili NULL ako nema takvih

Page 37: Masinski fakultet Beograd programiranje

putchar(*pok);return 0;

}

2. Napisati funkciju koja vraća pokazivač na prvo pojavljivanje znaka u stringu i glavni program koji ju testira.

#include <stdio.h>

// U string.h je definisana funkcija strchr koja radi isto sto i // funkcija vrati_pok char* vrati_pok(char* s, char c) {

char* pok=s; while(*pok)if (*pok++==c) return –pok;return NULL;

}int main() {

char str [100];char* pok,ch;printf !"Unesite string : ");

gets(str);printf("Unesite karakter ciju poziciju trazite : "); fflush(stdin);scanf("%c", &ch); pok=vrati_pok(str,ch);printf ("Ostatak stringa od te pozicije je: %s", (pok==NULL)?"Nema rezultata":pok);return 0;

}

3. Napisati funkciju izbaci_praznine koja iz stringa str izbacuje sve praznine.

#include <stdio.h> #define MAX_SIZE 100

void izbaci_praznine(char* s,char* rez) { while (*s) {

if(*s==’ ’||*s=='\t`) s++; else *rez++=*s++;

}*rez= \0';

}

int main() {char rez [MAX_SIZE], str[MAX_SIZE]; if(gets (str) ==NULL) return 1; izbaci_praznine(str, rez); printf("%s\n",rez);return 0;

}4. Napisati program koji pomoću funkcije sort_str sortira učitani niz stringova po alfabetskom redosledu.

#include <stdio.h> #include <string.h>#define MftX_SIZE 100void sort_str (char* niz_str[], int n) {

int i,j;for(i=0; i<n-l;i++)

for(j=i+l;j<n;j++)if(strcmpi(niz_str[i],niz_str[j])>0) { char* tmp=niz_str[i]; niz_str[i]=niz_str[j];niz_str[j]=tmp;

}}int main() {char niz_str [MAX_SIZE] [MAX_SIZE];char* pok [MAX_SIZE] int i,j n;do {

printf ("Koliko stringova ucitavate: “);scanf ("%d",&n);if(n>MAX_SIZE)

printf("Vrednost je prevelika, pokusajte ponovo!");

}

while(n>MAX_SIZE);

fflush(stdin); ;

Page 38: Masinski fakultet Beograd programiranje

for(i=0;i<n;i++) {printf ("\nUnesite %d. string ",i); gets(niz_str [i] );pok[i] =niz_str[i];

}

sort_str (pok,n);

for(i=0;i<n;i++)

puts(pok[i]); return 0;

}

5. Kao ulaz se unose dva stringa, sl i s2. Kao rezultat treba pisal string koji je nastao nadovezivanjem stringa s2 na kraj stringa sl.

#include <stdio.h>int main() {char strl[100],str2 [100],str [200];char* sl,*s2;int i=0;printf ("Unesite prvi string: ");gets(str1);

printf ("Unesite drugi string: ");gets(str2);

sl=strl;s2=str2;while(*sl)

str [i++]=*sl++; while(*s2)

str [i++]=*s2++;

str[i] ='\0`;

printf("Rezultujuci string je: %s",str);return 0;

}

6. Napisati program koji ispisuje broj argumenata i parametre komandne linije.

#include <stdio.h>int main(int argc,char** argv){

int i;printf("Broj argumenata komandne linije je %d\n",argc); printf("Parametri komandne linije: \n");for(i=0;i<argc;i++)

printf("%s\n" argv[i]);return 0;

}

Z a d a c i

1. Napisati fiinkciju koja vraća poziciju prvog pojavljivanj i stringa s2 u stringu s1. Ako se string s2 ne nalazi u s1, funkcija kao rezultat vraća -1.

2. Napisati program koji dati string str menja tako što mala slova pretvara u velika, a velika slova u mala.3. Napisati program koji ispisuje koja slova se pojavljuju u stringu i koliko puta.4. Napisati funkciju koja iz stringa s briše svako pojavljivanje znaka c.5b. Napisati funkciju del koja iz stringa str briše d znakova, počevši od pozicije poz testirati je u glavnom programu. Pri brisanju

voditi računa o tome da li u stringu ima d znakova od pozicije poz.6. Napisati funkciju koja ispisuje indeks stringa s1 na kojem se pojavljuje string s2. Uraditi to za svako pojavljivanje stringa s2.7. Napisati program koji pomoću funkcije zamenjuje svako pojavljivanje stringa str1 u stringu s, stringom str2.8. Napisati funkciju za šifrovanje Cezarovom šifrom pomoću fiinkcije cesar. Tekst šifrovati tako da se svako slovo ciklično

pomeri za k mesta udesno. Npr. za k=2 a->c.9. Napisati funkciju koja iz datog stringa str briše svaki znak koji odgovara bilo kom znaku stringa str2.10. Napisati funkciju kojom se ispisuju svi podstringovi datog stringa str uključujući i njega samog.11. Unose se dva stringa. Napraviti treći string na sledeći način: "beo"+"crn" treba da daju "bceron".12. Napisati funkciju koja formira string s2, pri čemu je s2 string s1 kome su uklonjeni svi znakovi smešteni između zagrada (...)

Pretpostaviti da nema zagrada unutar zagrada.

Page 39: Masinski fakultet Beograd programiranje

13. Napisati program koji za uneti broj ispisujc tekstualno njegove cifre. Npr. ako je broj 123, program treba da napravi string , “jedan dva tri" i ispiše ga.

14. Napisati funkciju reci koja ispisuje sve reči koje se pojavljuju u zadatom stringu str.15. Napisati program koji izračunava vrednost postfiksnog izraza koji se unosi kao string str. Operandi u izrazu su prirodni

brojevi, razdvojeni belinom, a operacije su + - * / (gde je / celobrojno deljenje). Pretpostavlja se da je izraz unet korektno.Primer: 3 5 * je ekvivalentno izrazu 3*5, a izraz 3 5 7 + * 2 / odgovara izrazu (3* (5+7) ) /2.

16. Napisati program koji omogućava sabiranje i množenje velikih brojeva koji se unose kao stringovi.17. Napraviti igricu Vešala. Igricu napraviti tako da se iz niza reči napisanih malim slovima na slučajan način bira reč koju igrač

treba da pogodi. Na samom početku se ispisuje koliko izabrana reč ima slova i njen zapis pomoću zvezdica. Korisnik unosi slova (bilo velika ili mala) i ako se uneto slovo nalazi u reči, treba ga upisati umesto odgovarajuće zvezdice. Kada korisnik pogodi reč, ispisati koliko pokušaja mu je bilo potrebno.

18. Napisati orogram Koji ispisuje reči koje se unose kao argumenti komandne linije; ako nema unetih reči, ispisuje odgovarajuću poruku na ekran.

19. Napisati program koji ispisuje zbir dva broja koji se zadaju kao parametri komandne linije.

20. Rečenica se unosi kao argument komandne linije. Ispisati reči koje se pojavljuju u rečenici sortirane alfabetskim redosledom

21. Kao argument komandne linije navodi se opcioni argument (prethodi mu znak -") i reč r. Napisati program koji omogućava korisniku da unosi tekst i u zavisnosti od opcionog argumenta obavlja odgovarajuće radnje. Ako je dat opcioni argument -n, ispisati svaki red teksta koji korisnik unese zajedno sa njegovim rednim brojem. Ukoliko je naveden argument t, ispisuje se samo redni broj reda ali ne i njegov sadržaj osim ako je navedena reč r. Ako je naveden argument -x, potrebno je u datom tekstu pretvoriti sva mala slova u velika obratno.

Z a d a c i z a v e ž b u

1. U stringu itr odrediti broj praznina i interpunkcijskih znakova.2. Implementirati funkciju int strlen(char* str).3. Napisati funkciju koja iz stringa str eliminiše svaku pojavu dekadnih cifara.4. Napisati funkciju koja ispisuje sve reči u datom stringu Reči ispisivati po jednu u redu.5. Pomoću funkcije izbaci () eleminisati sve komentare oblika / / iz redova koje unosi korisnik i zatim ih ispisati.

Rešenja 1.

#include <stdio.h> #include <string.h>int pozicija1(char* sl, char* s2) { //prvi nacin

if(strstr(sl,s2; ==NULL)return -1;

elsereturn strstr(sl1,s2)-1l;

}

int pozicija2(char* s1, char* s2) { //drugi nacin char *p=s1, *q=s2; while(*p) {

if (*p==*q) q++; else q=s2; if(*q==`\0`)

return p-sl1-(q-s2)+1;p++,

}

return -1;

}

int main() {char s1 [100], s2 [100];printf("Unesite string: "); gets (s1);printf("Unesite string ciju poziciju trazite: "); gets(s2);printf("Pozicija : %d\n", pozicija1(&s1, &s2)); printf ("Pozicija : %d\n" pozicija2(&s1, &s2)); return 0;

}

2.

Page 40: Masinski fakultet Beograd programiranje

#include <stdio.h> #include <ctype.h>int main() {

char str[100] ;char* s;printf("Uneti string: ");gets (str);s=str;while(*s) {

if(isupper(*s)) *s=tolower(*s);else if(islower(*s)) *s=toupper(*s);s++;

}printf("String : %s",str);return 0;

}

3.include <stdio.h> include <ctype.h> int main() {

int slova[26], i;char str [100] ;char* s;printf("Unesite string ");gets(str);s=str;for(i=0:i<26;i++)

slova[i]=0;' / /Popunjavamo broj slova nulama while(*s) {

if(isupper(*s)) slova[(*s)-'A']++; else if(islower(*s)) slova[(*s)-'a']++; s++;

}for(i=0; i<26;i++)

if (slova[i] ! =0)printf("%c se pojavilo %d puta\n", 'A`+i,slova[i]);

retura 0;}

4.void brisi(char* s, char c) {

char* sl=s; while(*sl) {

if(*sl!=c) *s++=*sl;s1++;

}*s='\0';

}

5.#include <stdio.h>int del (char* s, int poz, int d) { //prvi nacin

if(poz+d > strlen(s)) retura 0;strcpy(s+poz.s+poz+d);retura 1;

}int del2 (char* s,int poz, int d) { //drugi nacin

char *p=s+poz, *q=s+poz+d;if(poz+d > strlen(s)) return 0;while(*q)

*p++=*q++;*p='\0`; return 1;

}int main () {

char str[100];int poz,d;printf("Oneti string: ");gets (str);printf'"Unesite poziciju od koje treba obrisati znakove: ");scanf( 1 %d",&poz);printf("Unesite koliko znakova treba obrisati: "); scanf("%d" &d);if(!del(&str,poz,d)) printf("Prevelik broj znakova");else printf ("Novi string je : %s", str);return 0;

}

Page 41: Masinski fakultet Beograd programiranje

6.#include <stdio.h> #include <string.h>#define MAX_SIZE 100void ispisi_mesta_pojavljivanja(char* sl, char* s2) {

char* p=sl-l;while((p=strstr(p+1, s2))>0)

printf("Pozicija: %d\n",p-sl);

}int main() {

char str [MAX_SIZE], str2 [MAX_SIZE] ;printf ( "Unesite string : ");gets(str);printf("Unesite string koji se trazi; "); gets(str2);ispisi_mesta_pojavljivanja(&strl, &str2);return 0;

}

7.#include <stdic.h> #include <string.h> #define MAX_SIZE 100void zameni1(char* str, char* sSta, char* sCim) {

char buffer[MAX_SIZE], *p=str; int nsta=strlen(sSta),ncim=strlen(sCim);while((p=strstr(p,sSta))!=NULL) {

strcpy(buffer,p+nsta);strcpy(p,sCim); strcpy(p+ncim,buffer); p+=ncim;

}}void zameni (char* str, char* strl, ehar* sSta, char* sCim) {

char *p = str *e; int nsta=strlen (sSta); str1 [0] = '\0 ';while ((e=strstr(p,sSta))!=NULL) {

strncat(strl, p, e-p); strcat(strl, sCim); p=e+nsta;

}strcat(strl p);

int main(){char s[MAX_SIZE],str1[MAX_SIZE],str2[MAX_SIZE];char rez[MAX_SIZE];printf("Unesite string: ");gets (s);printf("Unesite string koji se zamenjuje: "); gets(strl);printf("Unesite cime se zamenjuje: ");gets(str2);printf("Funkcija zameni: \n"); zameni(&s,&rez,&strl,&str2); puts(rez);printf("Funkcija zameni1: \n"); zameni1(&s,&strl,&str2);puts(s);return 0;

}

8. #include <stdio.h.> #include <ctype.h.> #define MAX_SIZE 100 void cezar(char* tekst,int k) { int t;while(*tekst) {

if(isalpha(*tekst)) {t=isupper(*tekst)? 'A':'a'; *tekst=(*tekst-t+k)%26+t;

}tekst++;

}}int main() {char s[100]; int k;printf("Unesite string ");

Page 42: Masinski fakultet Beograd programiranje

gets(s);printf ("Unesite k: ");scanf("%d",k);cezar(&s,k);printf("%s",s);return 0;

}

9. #include <stIio.h.> #include <string.h> #define MAX_SIZE 100void brisi(char* str, char* str2) { int n=strlen(str),i,x=0; for(i=0;i<n;i++) {

str[i-x =str[i]; if(strchr(str2,str[i]))

x++;}str[i-x] ='\0';

}int main() {char s1[MAX_SIZE],s2[MAX_SIZE]; printf("Unesite string: "); gets(s1);printf("Unesite drugi string; "); gets(s2);brisi(&sl,&S2); printf("%s”,s1); return 0;

}

10. #include <stdio. h>#include <string.h> #define MAX_SIZE 100void ispisi_n_slova(char* str, int n) { int i;for(i=0;i<n;i++)

putchar(str[i]);putchar('\n');

void ispisi_podstringove(char* str) { int i,j,n=strlen(str); for(i=0;i<n;i++)

for(j=i;j<n;j++)ispisi_n_slova(&str[i],j-i+1);

}int main() {

char str[MAX_SIZE]; printf("Unesite string: "); gets(str);ispisi_podstringove(&str); return 0;

}

11. #include <stdio.h> #include <string.h> #define MAX_SIZE 100int main () {

char a[MAX_SIZE],b[MAX_SIZE],c[MAX_SIZE]; char *ta=a, *tb=b, *tc=c;int i=0;printf("Unesite prvi string: ");gets(a);printf("Unesite drugi string: "); gets(b);while(*ta && *tb) {

*tc++=*ta++; *tc++=*tb++;

}while(*ta) *tc++=*ta++; while(*tb) *tc++=*tb++; *tc= '\0'Printf(“ Rezultat: "); puts(c); return 0;

}

12. void izbaci(char* sl,char *s2) { char *pom,*pom2; while(pom=strstr(s1,"(")) {

pom2=strstr(sl,")");

Page 43: Masinski fakultet Beograd programiranje

if(pom2==NDI,L) break; strcpy(pom,pom2+l);

}strcpy(s2,s1);

}

13. #include <stdio.h> #include <string.h>#define MAX_SIZE 100void strins(char* s, char *t) { char buf[MAX_SIZE];strcpy(buf,s); strcpy(s,t); strcat(s,buf);

}int main () {int broj,add=0, i=0; char s_broj[MAX_SIZE];printf("Unesite broj : "); scanf(“%d”,&broj); while(broj) {

switch(broj%10) {case 0: strings(s_broj,”nula ”); break;case 1: strings(s_broj,”jedan ”); break;case 2: strings(s_broj,”dva ”); break;case 3: strings(s_broj,”tri ”); break;case 4: strings(s_broj,”cetiri ”); break;case 5: strings(s_broj,”pet ”); break;case 6: strings(s_broj,”sest ”); break;case 7: strings(s_broj,”sedam ”); break;case 8: strings(s_broj,”osam ”); break;case 9: strings(s_broj,”devet ”); break;

}broj/=10;

}printf("Broj : %s\n", s_broj); return 0;

}

14. #include <stdio.h> #include <string.h>#define MAX_SIZE 100void reci(char* s) { int i;for(i=0;i<strlen(s);i++)if(s[i]==’ ') putchar(” \n'); else putchar(s[i]);

}int main () {

CHAR S[MAX_SIZE];printf("Unesite string ");gets(s);reci(&s);return 0;

}

15. #include <stdio.h> #include <ctype.h>#define MAX_SIZE 100int main() {char izraz[MAX_SIZE],*iz; int st[MAX_SIZE],i=0 printf("Unesite izraz "); gets(izraz); iz=izraz;while(*iz) {

if(isdiait(*iz)) { int br=0;while(isdigit(*iz)) {

br=10*br+*iz-‘0’;iz++;

}st[i++]=br;continue;

}switch(*iz) {

Page 44: Masinski fakultet Beograd programiranje

case ‘+’ : st[i-2]=st[i-2]+st[i-1]; i--; break;case ‘*’ : st[i-2]=st[i-2]*st[i-1]; i--; break;case ‘-’ : st[i-2]=st[i-2]-st[i-1]; i--; break;case ‘/’ : st[i-2]=st[i-2]/st[i-1]; i--; break;

}iz++;

}printf(“Rezultat je: %d",st[0]); return 0;}

16. #include <stdio.h> #include <ctype.h> #include <string.h>#define MftX_SIZE 100int cif(char* str, int n) {if(n>=strlen(str)) return 0; return str[n]–‘0 ';

}void okreni_str(char* p) {char *q=p+strlen(p)-1,tmp; while(p<q){

tmp=*p; *p=*q; *q=tmp; p++;q--;

}}

void zbir(char* brl, char* br2, char *rez) { int a,b,c,i=0,p=0; while(1) {

a=cif(br1,i); b=cif(br2,i); c=a+b+p; if (!c) break; rez[i]=c%10+'0'; p=c/10;i++;

}rez[i]='\0';

}voiđ proizvod(char* brl, char* br2, char *rez) { int a,b,c,i,j;int d1=strlin(brl),d2=strlen(br2), for(i=0; i<dl+d2; i++)

rez[i]='0'; for(i=0;i<d1;i++)

for(j=0;j<d2;j++) { a=cif(brl,i);b=cif(br2,j);c=cif(rez,i+j)+a*b; rez[i+j]=c%10+'0';rez[i+j+1]=cif(rez,i+j+1)+c/10+'0';

}if(rez[i+j-l]=='O')

rez[i+j-1]='\0';else rez[i+j]='\0';

}int main () {char br1[MAX_SIZE],br2[MAX_SIZE];char rez[MAX_SIZE];printf("Unesite prvi broj: "); gets(brl);// okrecemo tako da su na poziciji 0 jedinice okreni_str(brl);printf ("Unesite drugi broj; "); gets(br2);// okrecemo tako da su na poziciji 0 jediniceokreni_str(br2;)zbir(&brl,&br2,&rez);// vracamo rezultat da bismo ga ispisali okreni_str(rez);printf("Zbir brojeva je %s\n",rez);proizvod(&brl,&br2,&rez);// vracamo rezultat da bismo ga ispisali okreni_str(rez);printf ("Proizvod brojeva je %s\n" rez);retura 0;

}

Page 45: Masinski fakultet Beograd programiranje

17. #include <stdio.h> #include <ctype.h>#include <string.h>#include <stdlib.h> #include <time.h>#define MAX_SIZE 100 int main() {char* reci[]={"kruska",”jabuka","malina","dud","banana","ananas”,”lubenica","kokos","kajsija","breskva”};char rec[50], korisnik_rec [50];int dim_rec,i br_pok=l; srand(time(0));strcpy(rec,reci[rand()%10]); dim_rec=strlen(rec); for(i=0;i<dim_rec;i++)

*(korisnik_rec+i)= '*'; korisnik_rec[i]='\0';printf("Diroenzija nepoznate reci je: %d\n",dim_rec); while(l) {

char ch,*tmp=rec;printf("%d:REC -> %s\n";br_pok,korisnik_rec); printf("Unesite prvo slovo "); fflush(stdin); scanf("%c",&ch); if(!isalpha(ch)) {

printf("Niste uneli slovo probajte ponovo! “); continue;

}if(isupper(ch)) ch=tolower(ch); while((tmp=strchr(tmp,ch))!=NULL) {

korisnik_rec[tmp-rec]=ch; tmp+=l;

}if(strcmp(rec,korisnik_rec)==0)

break; br_pok++;

}printf("Pogodili ste rec %s u %d pokusaja!",korisnik_rec,br__pok); return 0;

}

18. #include <stdio.h> #include <stdlib.h>int main(int argc,char** argv) { int i;if(argc==l) {

printf("Nema unetih reci!"); return 1;

}for(i=l;i<argc,i++)

printf("%s\n",argv[i]; return 0;

}

19. #incluđe <stdio.h> #include <stdlib.h> int main(int argc,char** argv) {

int a,b; if(argc < 3) {

printf("Nema dovoljno ulaznih parametara! ");return 1;

}a=atoi(argv[l]); // Funkcija atoi pretvara string u broj b=atoi(argv[2]); // Nalazi se u stdlib.h printf("Zbir unetih brojeva je: %d" a+b); return 0;

}

20. #include <stdio.h> #include <string.h> #define MAX_SIZ 100void sort_str(char* niz_str[],int n) { int i,j;for(1=0;i<n-l;i++)

for (j=i+i;j<n;j++)if(strcmpi(niz_str[i],niz_str[j])>0) {

char* tmp=niz_str[i]; niz_str[i]=niz_str[j];

Page 46: Masinski fakultet Beograd programiranje

niz_str[j]=tmp;}

}int main(int argc,char** argv) { int i;sort_str(argv,argc);for(i=0;i<argc;i++)

puts(argv[i]); retum 0;

}

21. #include <stdio.n> #include <string.h> #define MAX_SIZE 100int getline(char line [], int max_size) { int dim; char ch;for(dim=0;dim<max_size-1 &&(ch=getchar()!=EOF && ch!='\n',-++dim)line[dim]=ch; if(ch=='\n')

line[dim++]=ch; line[dim] ='\0'; return dim;

}//Funkcija koja pretvara mala slova u velika i velika c malavoid change(char* str) {whlle(*str) {

if(isupper(*str)) *str=tolower(*str); else if(islower(*str)) *str=toupper(*str);str++;

}}int main(int argc,char **argv) { char line[MAX_SIZE], *rec; int br_line=0; int dira_o; if(argc < 3) {

printf("Nedovoljno ulaznih argumenata!"); return 1;

}rec=argv[2]; dim_o=strlen(argv[1]);i f ( a r g v [ l ] [ 0 ] | | dim_o==0 || dim_o>2 ) {

printf("Nisu korektno uneti opcioni argumenti!"); return 2;

}while(getline(line MAX_SIZE)) {

br_line++; *switch(argv[l][1]) {

case 'n' : printf("%d : %s", br_line,line); break; case 'x' : change(&line); puts(line); break; case 't' :

if(strstr(line,rec)!=N0LL)printf("%d : %s",br_line,line);

else printf("%d\n",br_line); break;

default:printf("Unet je pogresan opcioni argument\n"); return 3;

}}return 0;

}

Page 47: Masinski fakultet Beograd programiranje

Strukture i fajloviS t r u k t u r e

struct Osoba { char ime [20 ] ; char prezime[20]; int godiste; char telefon[10]; };struct Osoba pera, mika, zika;

Strukture koristimo kada opisujemo složene pojmove, npr. osobu za koju navodimo dosta podataka poput imena, prezimena, godišta, telefona i drugih. Podaci mogu biti ugrađenih tipova koji su razmotreni u prethodnim poglavljima ili nove strukture sa svojim podacima.

Ovako definisane osobe pera, mika i zika imaju svoja imena, prezimena i ostale podatke koji su definisani u strukturi osoba, a za pristup pojedinačnim podacima koristi se tačka, npr. mika.ime, pera.telefon ili zika.godiste. Ovo je prirodan način jer tačno znamo kojoj osobi pripada koji detalj i ne postoji mogućnost mešanja.

Strukture takođe podržavaju operator dodele kao i drugi tipovi, pa zato možemo da napišemo mika=zika. Takođe, možemo dobiti adresu pomoću operatora &. Strukture nadalje možemo da koristimo kao i sve druge ugrađene tipove.

S t r u k t u r e i t y p e d e f

Nepraktično je svaki put pisati struct Osoba kada treba da deklarišemo neke nove promenljive tipa Osoba. Srećom postoji elegantan način da se to zaobiđe pomoću typedef.

typedef struct { char ime[20 ] ; char prezime[20]; int godiste; char telefon[10];

} Osoba;Osoba pera, mika, zika

F a j l o v i

Fajlovi su bitni u svakom programskom jeziku jer omogućavaju da trajno sačuvamo vrednosti i time omogućimo kasniji nastavak rada sa tim istim podacima. Zanimljiv primer je adresar koji ne bi bio praktičan ako bismo pri svakom pokretanju sve podatke ponovo unosili.

Fajl otvaramo funkcijom fopen koja nam vraća pokazivač na strukturu FILE. Sve ostale funkcije za rad sa fajlovima koriste taj pokazivač umesto imena fajla. Sve funkcije osim fopen vraćaju int vrednost.

Mnoge funkcije za rad sa fajlovima (videti u tabeli) vraćaju konstantu EOF (End Of File) ukoliko nastane greška pri izvršavanju ili ako se dođe do kraja fajla.

Funkcija opis .fopen(ime, rezim) Otvaranje fajla datog imena. Režim "w"- pisanje, "r" - čitanje, "a" - dodavanjefclose(f) Zatvaranje fajla. (rezultat 0=uspešno, EOF neuspešno)feof(f) Ispitivanje da li je došlo do kraja fajla. (rezultat 0=nije kraj, >0 kraj)fseek(f, kol, odakle) Pozicioniranje.

Odakle: SEEK _SET od početka, SEEK_CUR od trenutne pozicije i SEEK_END od kraja fajlaftell(f) Trenutna pozicija u fajlu. (viaća int vrednost ili -1 za grešku)ferror(f) Ispitivanje greške u prethodnoj operaciji. (0=nema greške)getc(f) Citanje znaka iz fajla. (vraća int ili EOF u slučaju greške)putc(znak, f) Upisivanje znaka u fajl. (isti karakter ili EOF u slučaju greške)fgetc(f) Čitanje znaka iz fajla. (isto kao getc) fputc(znak, f) Upisivanje znaka u fajl. (isto kao putc) fgets(f, kol., string) Čitanje stringa iz fajla. NULL ako nema više podataka.fputs(string, f) Upisivanje stringa u fajl. (vraća >0 ili EOF u slučaju greške)fscanf(f,maska,prom.) Čitanje promenljivih iz fajla. Vraća broj pročitanih znakova, negativnu vrednost za grešku ili

EOF ako nema podataka.fprintf(f,maska,prom.) Upisivanje promenljivih u fajl. Vraća broj upisanih znakova il negativnu vrednost u slučaju

greškefflush(f) Pražnjenje bafera. (0=uspešno, EOF neuspešno)

Page 48: Masinski fakultet Beograd programiranje

Tok je izvor ili odredište podatka, on se najčešće povezuje sa diskom, ekranom ili nekim drugim periferijskim uređajem. Tok se povezuje sa fajlom ili uređajem tako što prvo otvori tok, a na kraju ga zatvori. Nakon svakog pokretanja programa, automatski se otvaraju tri toka: stdin, stderr, stdout. Tok stdin se vezu za tastaturu, a stdout i stderr za ekran. Sledeća dva izraza su ekvivalentna:

printf (" Zdravo ! ") ; <=> fprintf (stdout, " Zdravo!") ;

F u n k c i j e s y s t e m ( ) i e x i t ( )

Funkcija system omogućava da izvršimo neku sistemsku funkciju poput npr. kopiranja ili brisanja fajla ili izrade direktorijuma. Dobar primer je system( ''PAUSE'') koji zaustavlja rad programa dok korisnik ne pritisne neki taster.

Funkcija exit dovodi do prekida izvršavanja programa. Ona zatvara sve fajlove otvorene pomoću fopen. Kao indikator načina završetka programa mogu se koristiti vrednosti EXIT_FAILURE (nastala je greška) i EXIT_SUCCESS (normalan završetak programa).

Obe funkcije su definisane u stdlib.h.

P r i m e r i

1. Napisati program Koji učitava ime, prezime godište dve osobei ispisuje podatke mlađe.

#include <stdio.h> typedef struct {

char ime[20];char prezime[20] ; int god;

} osoba; int main() {

osoba o1,o2,m;printf("Unesite ime i prezime prve osobe: "); scanf ("%s%s",&o1.ime,&o1.prezime); printf("Unesite godiste prve osobe: "); scanf("%d", &o1.god);printf("Unesite ime i prezime druge osobe: "); scanf ("%s%s",&o2.ime,&o2 .prezime); printf("Unesite godiste druge osobe: "); scanf("%d", &o2.god);m=o1.god > o2.god?o1:o2printf("Ime i prezime: %s %s God.: %d\n", m. ime,m.prezime, m.god);return 0;

}

2. Iz fajla out.txt učitati dva prirodna broja a i b i ispisati vrednost izraza ab

#include <stdio.h>#include <stdlib.h.>#include <math.h>int main() {

FILE* tile;int a,b;if ((file=fopen( "C. \\out.txt","r") ) ==NULL) {

fprintf (stderr. "Greska pri otvaranju fajla");exit (EXIT_FAILURE)

}if(feof(file)) {

fprintf (stderr, "Podaci su nekorektno zapisani");exit (EXIT_FAILUKE) ;

}fscanf(file,"%d",&a);fscanf (file, "%d",&b) ;printf ("%d^%d = %. 01f ", a,b,pow(a,b));fclose(file); 'return 0;

}

3. Odrediti broj redova u tekstualnom fajlu čije ime unosi korisnik.

#include <stdio.h> #include <stdlib.h> #include <math.h>int main() {

FILE* file;

char ime [100], ch;

Page 49: Masinski fakultet Beograd programiranje

int br_redova=0;

printf ("Unesite putanju do fajla: ");

scanf("%s", ime);

if((file=fopen(ime,"r")) ==NULL) {fprintf(stderr,"Greska pri otvaranju fajla!");exit(EXIT_FAILURE) ;

}while((ch=fgetc(file))!=EOF)

if(ch=='\n ' ) br_redova++;

printf("Broj redova u fajlu %s je %d\n", ime,br_redova) ;fclose(file) ;return 0;

}

4. Napisati program koji preko komandne linije prima putanju do dva fajla, i kopira sadržaj prvog u drugi fajl bez brisanja postojećih podataka u drugom fajlu.

I način:#include <stdio.h> #incluđe <stdlib.h> #incluđe <math.h>int main(int argc,char **argv) {

FILE* in, *out;char ch;if(argc<3) {

fprintf(stderr, "Nema dovoljno argumenata!"); exit(EXIT_FAILURE) ;

}in=fopen(argv[1] , "r") ;out=fopen(arg [2],"a"); if(in==NULL || out==NULL) {

fprintf(stderr, "Greska pri otvaranju fajla!");exit(EXIT_FAILURE);

}while ( (ch=fgetc (in) ) ! =EOF)

fputc(ch,out); fclose (in) ;fclose (out);return 0;

}II način:#include <stdio.h> #include <stdlib.h> #define MAX_LINE 1000int main(int argc,char **argv) {

FILE* in,*out; char s[MAX_LINE];if(argc<3] {

fprintf(stderr,"Nema dovoljno argumenata!"); exit (EXIT_FAILURE);

}in=fopen(argv[1] , "r");out=fopen(argv[2],"a"); if(in==NULL || out==NULL) {

fprintf(stderr,"Greska pri otvaranju fajla!");exit (EXIT_FAILURE);

}while (fgets (s,MAX_LINE, in) ! =NULL)

fputs(s,out); fclose (in);fclose(out);return 0;

}

Z a d a c i :

1. Napisati program Koji omogućava izračunavanje rastojanja između dve tačke, da li data prava prolazi kroz tačku i površinu trougla određenog sa tri tačke.

2. Učitati n osoba i ispisati ih sortirane alfabetskim redosledom po prezimenu.

Page 50: Masinski fakultet Beograd programiranje

3. Omogućiti da program može da radi sa pravougaonicima. Pravougaonik je određen ako su date dve tačke x I y gde je x donji levi ugao, a y gornji desni ugao pravougaonika. Omogućiti izračunavanje obima, površine i da li data tačka z pripada pravougaoniku. U glavnom programu se unosi niz pravougaonika, kao rezultat je potrebno ispisati koji pravougaonici sadrže tačku z, ali tako da budu sortirani rastućim redosledom po površini.

4. Napisati program koji prepisuje sadržaj fajla u fajl g tako što svaki red ispisuje u fajl g zajedno sa njegovim rednim brojem.

5. U tekstualnom fajlu čije ime j dato preko argumenata komandne linije, odrediti najduži red i ispisati ga. Ukoliko se u fajlu nalazi više najdužih redova, ispisati ih sve.

6. Napisati program koji omogućava da se uporedi sadržaj dva fajla koji se unose preko komandne linije. Ukoliko su fajlovi jednaki, program ispisuje da su dati fajlovi istovetni, a ako nisu, treba da ispiše prvi red u kome se oni međusobno razlikuju.

7. Argumenti komandne linije su imena dve datoteke i prirodan broj n. Napisati program koji prvih n redova prve datoteke upisuje na kraj druge datoteke. Pretpostaviti da redovi nisu duži od 100 znakova.

8. Napisati funkciju koja šifruje tekst u fajlu f Cezarovom šifrom i funkciju koja radi obmuto (dešifruje tekst), i testirati ih u glavnom programu.

9. Napisati program kojl preko komandne linije prima putanju do datoteke u kojoj se nalazi niz celih brojeva (svaki broj se nalazi u posebnom redu ukupno in ima manje od 100). Potrebno je ispisati sve brojeve sortirane rastućim redosledom.

10. Napisati program koji iz fajla datum.txt učitava datume u obliku dd.mm.gggg. i ispisuje na ekran datume koji pripadaju tekućoj godini (korisnik unosi koja je tekuća godina)

11. Iz fajla koji se zadaje preko argumenata komandne linije učitati niz osoba (najviše 100) oblika: ime prezime godiste, i ispisati na ekran samo osobe rođene nakon 1980. godine.

12. U fajlu recnik.txt nalazi se n (pretpostavljamo da je n manje od 1000) reči sa odgovarajućim značenjem (u svakom redu se nalazi posebna reč, a reč i njeno značenje odvojeni su razmakom). Napisati program koji omogućava ubacivanje nove reči u rečnik, pronalazak značenja date reči i ispis rečnika u fajl f, tako da su reči sortirane alfabetskim redosledom.

13. U fajlu studenti.txt nalazi se spisak studenata i osvojenih poena na kolokvijumima (svaki student je u posebnom redu, a zapisani su u sledećem obliku: ime prezime index kolokvijuml kolokvijum2 ). Svaki kolokvijum nosi 50 poena. Student je položio ispit ako na svakom kolokvijumu ima više od 24, a u zbiru više od 55 poena. Program treba da u fajl rezultati.txt upiše one studente koji su položili ispit, ali sortirane po opadajućem redosledu ukupnog broja poena.

14. U fajlu čije ime unosi korisnik nalaze se podaci o proizvodima koji se prodaju u supermarketu. Za svaki proizvod postoje sledeći podaci (redni_broj bar kod ime cena). Svaki proizvod je u posebnom redu i pretpostavlja se da ih nema više od 1000. Korisnik u glavnom programu unosi redne brojeve kupljenih artikala (najviše 500 artikala) i njihovu količinu, a na ekran treba da se ispišu podaci o kupljenim proizvodima i ukupna cena.

15. Napisati program koji iz fajla zadatog kao argument komandne linije učitava niz direktorijuma koje treba napraviti na lokaciji koju unosi korisnik.

Napomena: Komanda za pravljenje direktorijuma je mkdir ime_direktorijuma.

Z a d a c i z a v e ž b u

16. Napisati program koji proverava da li su date tri tačke x, y, z kolinearne. Ako nisu, određuje površinu trougla koji formiraju središnjo tačke duži xy, yz, zx.

17. Omogućiti da program može da radi sa trouglovima. Trougao je određen ako su date koordinate svih njegovih temena. Omogućiti izračunavanje obima, površine trougla i da li data tačka c pripada trouglu. U glavnom programu se unosi niz trouglova, a kao rezultat je potrebno ispisati koji trouglovi sadrže datu tačku z (ukoliko je naveden opcioni argume: -a). Ukoliko nije, treba pronaći koji trougao ima najveću površinu.

18. Unose se podaci o n knjiga (naslov, autor, ISBN, godina izdanja). U zavisnosti od opcija koje izabere korisnik, potrebno je generisati sledeće izveštaje:• za unetu godinu spisati sve autore koji su te godine izdali knjigu• za unetog autora ispisati sve njegove knjige• ispisati podatke o knjizi sa datim ISBN-om• za unet naslov knjige treba ispisati ime autora.• ispisati autora koji je date godine objavio najviše knjiga

21. Napisati program koji prepisuje sadržaj fajla f u fajl g tako što svaku reč ispisuje u posebnom redu.

22. Sifrovati tekst u fajlu f tako što se svako malo slovo zamenjuje velikim, a svaki razmak tabulatorom, i tako dobijen rezultat upisati u fajl g.

23. Napisati program koji preko komandne linije prima putanju do fajla u kome se nalazi niz celih brojeva (brojevi su odvojeni razmacima ukupno ih ima manje od 100). Potrebno je ispisati najveći broj i broj koji se najviše puta pojavio.

24. Napisati program koji izračunava sumu prirodnih brojeva zapisanih u datoteci čije ime unosi korisnik.

Page 51: Masinski fakultet Beograd programiranje

25. Napisati program koji iz fajla brojevi.txt učitava n velikih brojeva kao rezultat ispisuje najveći među njima.

26. Program treba da olakša korisniku kopiranje fajlova. Kao argumenti komandne linije daju se putanje do dva fajla. U prvom redu prvog fejla nalazi se putanja do direktorijuma gde su smešteni fajlovi koji se kopiraju. U ostalim redovima prvog fajla nalazi se spisak imena fajlova za kopiranje (svaki fajl se nalazi u posebnom redu). U drugom fajlu je spisak lokacija u koje treba kopirati fajlove iz prvog fajla, i to tako da prvom fajlu odgovara prva lokacija itd.

Rešenja:

1.#include <stdio.h> #include <stdlib.h> #include <math.h>typedef struct {

int x,y; } tacka;void ucitaj_tacku(tacka* t) {

printf("Unesi x koordinatu tacke "); scanf("%d",&t->x); printf("Unesi y koordinatu tacke "); scanf("%d",&t->y);

}double rastojanje(tacka tl,tacka t2) {

int dx=t2.x-t1.x,dy=t2.y-t1.y; return sqrt (dx*dx+dy*dy) ;

}int sadrzi_T (tacka t,int k,int n) {if(t.y==k*t.x+n) return 1; else return 0;}double p_trougla(tacka tl,tacka t2.tacka t3) {

//Povrsinu trougla racunamo pomocu Heronovog obrascadouble a=rastojanje(t1,t2),b=rastojanje(t2,t3);double c=rastojanje(t1,t3);double p = (a+b+c)/2;return sqrt(p*(p-a)*(p-b)*(p-c));

}int main () {

tacka t1,t2,t3; double k,n;printf("Prva tacka: \n");ucitaj_tacku(&t1);printf("Druga tacka \n"); ucitaj_tacku(&t2);printf("Treca tacka \n"); ucitaj_tacku(&t3);printf ("Rastojanje izmedju(%d, %d) i (%d,%d)",t1.x,t1.y, t2.x,t2.y); printf(" je % 2.1f\n",rastojanje(t1,t2));printf("Unesite podatke vezane za pravu (k,n): "); scanf ("%1f%1f",&k,&n) ;if(sadrzi_T(t1,k,n))

printf("Prava y=%.21fx+%.21f sadrzi tacku (%d,%d)\n", k,n,t1.x,t1.y);else

printf("Prava y=%.21fx+%.21f ne sadrzi tacku (%d,%d)\n", k,n,t1.x,t1.y);printf ("Povrsina trougla je %.21f\n",p_trougla(t1,t2,t3));

return 0;}

2. #include <stdio.h>#include <stdlib.h> #define MAX 100typedef struct {

char ime [50];char prezime [50];int godiste;

} osoba;void ucitaj_osobu(osoba* o) {

printf("Unesite ime osobe "); gets(o->ime);printf("Unesite prezime osobe : "); gets(o->prezime);printf("Koje godine je osoba rodjena: "); scanf ("%d", &o->godiste);

}void sort (osoba o [] , int n) {

int i,j;for (i=0; i<n-1;i++) !

for (j=i+1; j<n,j++) *if (strcmpi (o [i] .prezime o [j ] .prezime) >0) {

Page 52: Masinski fakultet Beograd programiranje

osoba tmp=o[i]; o[i]=o[j] ; o [j] =tmp;

}}void ispisi_osobu (osoba o) {

printf("%s %s %d\n"', o.prezime, o. ime, o .godiste);}int main () {

int n,i; osoba o [MAX];printf("Unesite broj osoba (<100) "); scanf ("%d",&n);if(n>=100) {

fprintf (stderr, “Uneli ste preveliko n!"); exit (EXIT_FAILURE);

}for (i=0 ;i<n,-i++) {

fflush(stdin);printf("Unesite %d. osobu\n",i);ucitaj_osobu(&o [i]) ;

}sort(o,n);f or (i=0; i<n; i++)

ispisi_osobu(o[i]); return 0;

}

3. #include <stdio.h>#include <stdlib.h> typedef struct {

int x,y; } tacka;typedef struct {

tacka t1,t2; } Pravougaonik;int povrsina(Pravougaonik p) {

int a=p.t2.x-p.t1.x; int b=p.t2 .y-p.t1.y; return a*b;

}int obim (Pravougaonik p) {

int a=p.t2.x-p.t1.x; int b=p.t2.y-p.t1.y; return (2*a+2*b);

}int pripada(Pravougaonik p, tacka t) {

int b1=t.x>=p.t1.x && t.x<=p.t2.x; int b2=t.y>=p.t1.y && t.y<=p.t2.y; return (b1 && b2) ;

}void ucitaj_tacku(tacka* t) {

printf ("Unesite x koordinatu: ") ; scanf ("%d", &t->x);printf ("Unesite y koordinatu: "); scanf ("%d", &t->y);

}void ucitaj_pravougaonik (Pravougaonik* p) {

printf("Unesite tacku u donjem levom uglu: \n"); ucitaj_tacku(&p->t1);printf ("Unesite tacku u gornjem desnom uglu: \n");

ucitaj_tacku(&p->t2);}void ispisi_pravougaonik(Pravougaonik p) {

printf("Donji levi: (%d,%d) ",p.t1.x,p.t1.y); printf("Gornji desni: (%d, %d) \n", p.t2.x, p.t2.y);

}int main () {

Pravougaonik p[100],p1[100]; int i,j,n,dim=0; tacka t;printf ("Koliko pravougaonika ucitavate: “); scanf ("%d" , &n); for (i=0;i<n;i++) {

printf ( " %d\n" , i); ucitaj_pravougaonik(&p[i]);

}printf("Unesi tacku : "); ucitaj_tacku(&t); for (i=0; i<n; i.++)

Page 53: Masinski fakultet Beograd programiranje

if (pripada (p [i] , t) ) p1[dim++] =p [i] ; for(i=0;i<dim-l;i++)

for(j=i+1; j<dim;j++)if(povrsina(p1[i]) < povrsina(p1[j])) {

Pravougaonik t=p1[i]; p1[i]=p1[j]; p1[j]=t;}

for (i=0;i<dim; i++)ispisi_pravougaonik(p1[i]);

return 0;}

4. #include <stdio,h>#include <stdlib.h>#define MAX 1000;int getline (FILE *f,char line []) {

int i=0; char ch;while((ch=fgetc(f))!=E0F && ch!='\n')

line[i++]=ch; if(ch==' \n') line[i++]=ch; line [i] ='\0'; retum i;

}int main() {

char f_ime [50] ,red[100] ,g_ime[50];int br_reda; FILE* f, *g;printf("Fajl iz koga kopiramo sadrzaj: ");gets(f_ime);printf ("Fajl u koji kopiramo sadrzaj: ");gets(g_ime); \f=fopen(f_ime, "r" ); 'g=fopen(g_ime,"w");if(f==NULL || g==NULL) {

fprintf(stderr,"Greska pri otvaranju fajlova!"); exit (EXIT_FAILURE);

}br_reda=0;while(getline(f,&red) > 0)

fprintf(g,"%d: %s",br_reda++,red) ;fclose(f);fclose(g); return 0;

}

5. #include <stdio.h> #include <stdlib.h> #include <string.h>int getline(FILE *f, char line[]) {

int i=0; char ch;while [ (ch=fgetc (f) ) !=E0F && ch! = '\n')

line [i++] =ch; if(ch=='\n') line[i++] =ch; line [i] =' \0';return i;

}void obrisi(char* max[100],int n) {

int i;for (i=0; i<n; i++)

max[i]= '\0';}int main (int argc char"* argv) {

FILE* f;char max_[100] [100]; char lin[100];int max=0,br=0,m,i;if( argc < 2 ) {

fprintf(stderr,"Nema dovoljno argumenata!"); exit (EXIT_FAILURE)

}if((f=fopen(argv[1],"r"))==NULL) {

fprintf (stderr. "Greska pri otvaranju fajla!"); exit (EXIT_FAILURE);

}whilei(m=getline(f,lin)) > 0 ) {

if(m==max)

Page 54: Masinski fakultet Beograd programiranje

strcpy(max_[br++] ,&lin) ;else if (m>max) {

max=m;obrisi(&max,br); br=0;strcpy (max_[br++], &lin);

}}printf("Najduzi red ima %d znakova \n", br);printf("To su: \n"); for (i=0 ;i<br;i++)

printf ("%s\n", max_ [i] );return 0;

}

6. #include <stdio.h> #incluđe <stdlib.h>#include <string.h>#define MAX 1000;int getline(FILE *f, char line[]) {

int i=0; char ch;while( (ch=fgetc(f) ) !=E0F && ch! = '\n')

line[i++]=ch;if(ch== '\n' )

line [i++] =ch;line [i] =' \0 '; return i;

}int main(int argc, char** argv) {

char red1 [100] red2 [100]; FILE* f, *g;if(argc < 3 ) {

fprintf(stderr,"Nema dovoljno argumenata!"); exit (EXIT_FAILURE)

}f=fopen(argv[1],"r"); g=fopen(argv [2] , "r"); if(f==NULL || g==NULL) {

fprintf(stderr, "Greska pri otvaranju fajlova!"); exit (EXIT_FAILTTRE)

}while(1) {

int br1, br2; br1=getline(f ,&red1);br2=getline[g, &red2); if(br1==0 || br2==0) {

if (brl !=0) {printf ("Fajl 1 je duzi!"); exit (EXIT_SUCCESS);

}if (br2 !=0) {

printf("Fajl 2 je duzi!"); exit (EXIT_SUCCESS) ;

}break;}if(strcmp(&red1,&red2, != 0) {

printf ("Fajlovi se razlikuju! \n");printf("Fajl 1 : %s\n" , red1);printf("Fajl 2 %s",red2); exit (EXIT_ "SUCCESS) ;

}}printf ("Fajlovi su identicni"); exit (EXIT_SUCCESS);

}

7. #include <stdio.h> #include <stdlib.h> #include <string.h>int getline (FILE *f, char line [] ) {

int i=0; char ch;while((ch=fgetc(f)) !=EOF && ch!= ' \n')

line[i++]=ch; if(ch=='\n') line[i++]=ch;

Page 55: Masinski fakultet Beograd programiranje

line [i] = '\0'; return i;int main(int argc,char** argv) {

FILE* f.*g; char red[100] ; int n;if(argc < 4 ) {

fprintf(stderr. "Nema dovoljno argumenata!"); exit (EXIT_FAILURE) ;

}f=fopen(argv[1],"r"); g=fopen(argv[2],"a");if(f= =NULL || g==NULL) {

fprintf(stderr,"Greska pri otvaranju fajlova!"); exit (EXIT_FAILURE) ;

}n=atoi(argv [3]); while(n--) {

if(!getline(f, red) > 0) break; fprintf(g,"%s", red)

}exit (EXIT_SUCCESS);

}

8. #include <stdio.h>#include <stdlib.h>#include <string.h>void sif_cezar(FILE* f, FILE* o,int k) {

int pom,ch;while( (ch=fgetc (f) ) !=EOF) {

if (isalpha(ch)) {pom=isupper(ch)? 'A': 'a'; ch=(ch-pom+k) %26+pom;

}fputc (ch, o) ;

}}void desif_cezar(FILE* f,FILE* o,int k) {

int pom, ch;while((ch=fgetc(f) )!=EOF) {

if(isalpha (ch)) {pom=isupper (ch) ? 'A': ' a';ch= (ch-pom-k) %26+pom;

} fputc (ch, o) ;

}}int main() {

FILE* in., * out;char* f_ime="C:\\in.txt" , *out_ime="C:\\out.txt"; if ( (in=fopen (f_ime, "r ")) ==NUL {

fprintf (stderr, "Greska pri otvaranju fajla in.txt");exit (EXIT_FAILURE);

if((out=fopen(out_ime,"w"))==NULL) {fprintf(stderr, "Greska pri otvaranju fajla out.txt");exit (EXIT_FAILURE) ;

}sif_cezar(in,out,3);desif_cezar (out, in, 3);exit(EXIT_SUCCESS);

}

9. #include <stdio.h> #include <stdlib.h>void sort(int* a,int dim) {

int i, j;for(i=0; i<dim-l;i++)

for (j=i+l; j <dim; j++);if (a[i] > a[j]) {

int tmp=a[i];a[i] =a [ j ] ; a [j] =tmp;

}}int main(int argc, char** argv) {

int niz [100],br=0,i; char s [50] ; FILE* f;

Page 56: Masinski fakultet Beograd programiranje

if(argc<2) {fprintf(stderr,"Nema dovoljno argumenata!"); exit (EXIT_ FAILURE) ;

}if ((f=fopen (argv[l] , "r" ) ==NULL) {

fprintf (stderr, "Greska pri otvaranju fajla"); exit (EX IT_FAILURE);

}while((fgets(s,51,f)) !=NULL)

niz[br++]=atoi(s); sort(niz,br); for (i=0;i<br,-i++)

printf ("%4d ",niz[i]);printf("\n"); exit(EXIT_SUCCESS) ;

}

10. #include <stdio.h> #include <stdlib.h>int main() {

char* f_ime="C:\\datum.txt"; cchar datum[15] ; FILE* f; int godina;printf("Unesite tekucu godinu: ");scanf ("%d" , &godina) ;if ( (f=fopen (f_ime "r"))==NULL) {

fprintf(stderr,"Greska pri otvaranju fajla"); exit (EXIT_FAILURE);

}while ( (fgets (datum, 15, f) ) =NULL) {

int f_god=atoi(datum+6);if(f_ 3d==godina) fprintf(stdout, "%s\n", datum);

}exit (EXIT_SUCCESS) ;

}

11. #include <stdio.h> #include <stdlib.h> typedef struct {

char ime[50];char prezime[50]; int godiste

} Osoba;void ispisi_osobu(Osoba o) {

printf('Ime : %s Prezime: %s Godiste: %d\n",o.ime,o.prezime,o.godiste);}int main(int argc, char** argv) {

FILE* f; int br=0; Osoba o[100]; if(argc<2) {

fprintf (stderr, "Nema dovoljno argumenata! ”) ; exit (EXIT_FAILURE);

}if((f=fopen(argv[1],"r")]==NULL) {fprintf(stderr, "Greska pri otvaranju fajla! "); exit (EXIT_FAILURE);

}while( fscanf(f,"%s %s %d", &o[br].ime, &o[br] .prezime, &o [br] godiste)>0) {

if (o [br] .godiste > 1980] ispisi_osobu (o [br]) ; br++

}exit(EXIT_SUCCESS)

}

12. #include <stdio.h>#include <stdlib.h> #include <string.h> tvpedef struct {

char rec[50]; char znacenj e[50];

} Recnik;void upisi_u_fajl(Recnik r[],int n) {

FILE* out; int i;char out_ime[50];

Page 57: Masinski fakultet Beograd programiranje

printf("Unesite putanju do izlaznog fajla: \n"); gets(out_ime);if ( (out=fopen (out_ime, "w") ) ==NULL) {

fprintf (stderr, "Greska pri otvaranju fajla"); exit (EXIT_FAILURE);

}for (i=0; i<n; i++)

fprintf(out,"%s %s\n",r[i].rec,r[i].znacenje); fclose(out);

}void sort (Recnik r[], int n) {

int i, j;for(i=0;i<n-1;i++)

for(j=i+l;j <n;j++)if (strcmpi (r [i].rec,r[j].rec)>0) {

Recnik tmp=r[i]; r[i]=r[j]; r[j]=tmp;int main() {

FILE* in;Recnik r[1000];int n=0,i;char ch= ΄d΄, *in_ime="C:\\recnik.txt"; if((in=fopen(in_ime,"r"))==NULL) {

fprintf(stderr, "Greska pri otvaranju fajla"); exit (EXIT FAILURE) ;

}while(fscanf(in,"%s %s",&r[n].rec,&r[n].znacenje)!=EOF)

n++;fclose(in) ;if((in=fopen(in_ime,"a"))==NULL) {

fprintf(stderr, "Greska pri otvaranju fajla"); exit (EXIT_FAILURE)

}do {

int izbor, p=0;char rec[50], znacenje [50] ;printf("Meni:\n");printf(“'l. Ubaciti novu rec u recnik\n"); printf("2. Pronaci znacenje reci\n"); printf("3. Ispis recniika (sort) u fajl \n"); printf(" Unesite vas izbor:: (1,2 3)\n"); scanf (“%d”, &izbor) ;fflush(stdin);switch(izbor) {

case 1:printf('Rec koju ubacujete u recnik: \n") ;gets (rec) ;printf ("Unesite njeno znacenje:\n"); gets (znacenje);fprintf(in,"%s %s\n",rec znacenje); break;

case 2:printf(“Rec cije znacenje trazite \n");gets (rec);for (i=0; i<n; i++)

if (strcnpi (rec, r [i]. rec)==0) {printf(Znacenje reci %s je %s\n", rec,r[i].znacenje);p=l; break;

}if(!p) printf(“Rec nije pronadjena\n"); break;

case 3:sort (r, n); upisi_u_fajl (r, n); break;

default:printf ("Pogresili ste pri unosu opcije\n"); continue ;

}printf("Da li zelite jos neku opciju? (d\\n)\n"); fflush(stdin); scanf("%c", &ch);

} while(ch==΄ d΄ || ch==΄D΄); exit (EXIT_SUCCESS);

}

13. #include <stdio.h> #include <stdlib.h> #include <string.h>typedef struct {

Page 58: Masinski fakultet Beograd programiranje

char ime [50] ; char prezime[50] ; char index[10] ; int kol1; int kol2;int ukupan_br_poena;

} Student;void sort (Student s[],int n) {

int i,j;for(i=0; i<n-l;i++)

for(j =i+l j<n;j++)if(s[i] .ukupan_br_poena < s[j].ukupan_br_poena) {

Student tmp=s[i]; s [i] =s [j ] ; s [j] =tmp;

}}int main() {

FILE* f_stud; Student stud[1000]; int n=0,i;

char* f_ime="C: \\studenti . txt" ;if ( (f_stud=fopen (f_ime, "r") ) ==NULL) {

fprintf( (stderr,"Greska pri otvaranju fajla!"); exit (EXIT_FAILURE) ;

}while(fscanf (f_stud, "%s %s %s %d %d", stud[n].ime, &stud[n].prezime, &stud [n].index,

&stud[n].kol1,&stud [n].kol2) !=EOF) {stud[n],ukupan_br_poena=stud[n].kol1+stud[n].kol2; n++:

}fclose(f_stud);f_ime="C:\\rezultati.txt"if ((f_stud=fopen(f_ime,"w"))==NULL) {

fprintf(stderr, "Greska pri otvaranju fajla!"); exit(EXIT_FAILURE);

}sort(stud,n);for(i=0;i<n;i++) {

if (stud[i].ukupan_br_poena > 55 && stud[i].kol1>=25 && stud[i].kol2>=25)fprintf(f_stud,"%s %s %s %d %d %d\n", stud[i].ime,stud[i].prezime,stud[i].index,stud[i].kol1,stud[i].kol2,

stud[i].ukupan_br_poena);}exit (EXIT_SUCCESS) ;

14. #include <stdio.h) #include <stdlib.h)#include <string.h>typedef struct {

int r_broj; char bar_kod[10]; char ime[20]; int cena; int kol;

} Proizvod;int main() {

Proizvod p [1000], kupljeni [1000];FILE* f;char f_ime[50];int n=0, ukupna_cena=0int i,dim=0;printf("Uneti putanju do fajla sa podacima: \n"); gets(f_ime); |if((f=fopen(f_ime,"r"))==NULL {

fprintf(stderr,"Greska pri otvarnju fajla!"); exit (EXIT_FAILURE) ;

}while(fscanf(f,"%d %s %s %d", &p[n].r_broj, &p [n].bar_kod, &p[n].ime, &p[n].cena ) !=E0F) p[n++].kol=l;while(1) {

int rbr, kol;printf("Unesite redni broj proizvoda ili 0 za kraj: ");scanf("%d", &rbr);if(rbr==0) break;printf(" Unesite kolicinu: ");scanf("%d", &kol);for(i=0;i<n;i++)

if (p[i].r_broj==rbr) { kupljeni [dim] =p [i] ;

Page 59: Masinski fakultet Beograd programiranje

kupljeni [dim++].kol=kol;}

}

for(i=0;i<dim;i++) {int cena=kupljeni [i].cena*kupljeni[i].kol; printf("Proizvod:%s Kolicina: %d Cena %d\n", kupljeni[i].ime,kupljeni[i].kol,cena); ukupna_cena+=cena;

}

printf("UKUPNO: %d\n", ukupna_cena);exit (EXIT_SUCCESS) ;

}

15. #include <stdio.h> #include <stdlib.h> #include <string.h>int main(int argc, char** argv) {

char putanja[50] ; char komanda[200]; char ime_dir[50];FILE* f;if(argc < 2) {

fprintf(stderr,"Nema dovoljno argumenata"); exit (EXIT_FAILURE) ;

}printf("Putanja gde treba napraviti direktorijume:\n"); gets (putanja);if ((f=fopen(argv[l] ,”r”))==NULL) {

fprintf (stderr, "Greska pri otvaranju fajla!");exit (EXIT_FAILURE);

}while((fgets(ime_dir, 50, f) ) !=NULL) {

komanda[0]='\0'; strcat (komanda, "mkdir "); strcat(komanda,putanja); strcat (komanda, "\\"); strcat (komanda, ime_dir); system(komanda);

}return 0;

}