Vous êtes sur la page 1sur 49

OSNOVE C JEZIKA

1./*Napisati program koji na ekranu ispisuje poruku Zdravo svete!*/


#include<stdio.h>
void main()
{
printf("Zdravo svete!\n");
}

Funkcija void main() je glavna funkcija i postoji samo jedna ova funkcija u C programu.
“()”označava da main nema argumenata. printf je funkcija za štampanje poruke “Zdravo svete!.
Karakter ‘\n’ predstavlja oznaku za novu liniju. Svaki iskaz se mora završiti karakterom ’;’, koji
ima ulogu terminatora iskaza. Karakteri ‘{‘ i ‘}’ objedinjuju više pojedinačnih iskaza u jednu
programsku celinu i oni su obavezni jer se tu izvršava neka obrada.
scanf je funkcija slična printf. Razlika je što se argumenti funkcije printf prenose sa
vrednošću, dok se kod scanf prenose svojom adresom, jer se učitana vrednost mora vratiti u
pozivajući program. To se postiže navođenjem karaktera ’&’ (operator adresiranja) ispred
argumenta u listi argumenata. Npr.
scanf(“%d”,&x); -%d-broj koji se unosi je celobrojni.

Escape karakteri Konverzioni karakteri funkcije printf


\b – povratnik \v – vertikalni tab Konverz. kar. Konverzija izlaznog niza
\f – from feed \\ - obrnuta kosa crta c karakter
\n – nova linija \” – dvostuka navodnica d ceo broj
\r – carriage return \’ – jednostruke navodnice f realan broj
\t – horizontalni tab \ - nastavak linije s niz karaktera
\nnn – vrednost karaktera e realan br. u naučnoj notaciji

Osnovni tipovi podataka


Osnovni tipovi podataka su int, float, double i char.
Podaci tipa int su celobrojne vrednosti. Tu spadaju celobrojne konstante, promenljive, izrazi
i funkcije. Opseg celobrojnig vrednosti je različit i može se menjati primenom kvalifikatora long,
short i unsigned. Kvalifikator long povećava opseg vrednosti celobrojnih promenljivih.
Kvalifikator short ispred int smanjuje opseg celobrojnih promenljivih. Kvalifikator unsigned ispred
int deklariše promenljivu tako da može memorisati samo pozitivne vrednosti.
Promenlljive tipa float ili double memorišu vrednosti realnih brojeva, odnosno, vrednosti sa
decimalnim (pokretnim) zarezom. Promenljive daklarisane kao double mogu memorisati oko dva
puta više decimalnih cifara od promenljivih tipa float.
Promenljive i konstante tipa char memorišu karaktere. Konstante tipa char dobijaju se
stavljanjem karaktera između jednostrukih navodnica, npr. ‘A’, ‘1’, itd. ‘A’ treba razlikovati od
“A”, jer “A” predstavlja konstantni niz karaktera koji u C jeziku ima posebnu predstavu i tretman.

Aritmetički izrazi i operatori


Aritmetički operatori C jezika su +, -, *, / i % koji odgovaraju matematičkim operacijama sabiranja,
oduzimanja, množenja, deljenja i deljenja po modulu, respektivno. Ovi operatori su binarni, jer
zahtevaju dva operanda, sa izuzetkom operatora -, koji može biti i unaran. Operator deljenja po
modulu (%) daje ostatak posle celobrojnog deljenja.

1
Operator inkrementiranja i dekrementiranja
Operator inkrementiranja ++ i dekrementiranja -- su unarni operatori i javljaju se u
prefiksnom i postfiksnom obliku. Operator inkrementiranja ++ promenljivoj p dodaje vrednost 1,
dok operator dekrementiranja -- promeljivoj p oduzima vrednost 1, pa važi:
p++ je ekvivalentno p=p+1 p-- je ekvivalentno p=p-1 (postfiksni oblik)
++p je ekvivalentno p=p+1 --p je ekvivalentno p=p-1 (prefiksni oblik)

2. /*Primer za operatore inkrementiranja i dekrementiranja*/


#include<stdio.h>
void main()
{
int a=0,b=0,c=0;
printf("\na=%d b=%d c=%d\n",a,b,c);
a=++b + ++c;
printf("a=%d b=%d c=%d\n",a,b,c);
a=b++ + c++;
printf("\na=%d b=%d c=%d\n",a,b,c);
a=++b + c++;
printf("\na=%d b=%d c=%d\n",a,b,c);
a=++c + c;
printf("\na=%d b=%d c=%d\n",a,b,c);
}
3. /*Napisati program kojim se obračunavaju troškovi putovanja ako je udaljenost S
kilometara, potrošnja automobila na 100 km L litara, a cena litra goriva C dinara.*/
#include<stdio.h>
void main()
{
float s,l,c,t;
printf("Rastojanje u kilometrima\n");
scanf("%f",&s);
printf("Potrosnja u litrima na 100 km\n");
scanf("%f",&l);
printf("Cena goriva u dinarima\n");
scanf("%f",&c);
t=2*s/100*l*c;
printf("Troskovi putovanja su %0.2f dinara\n",t);
}
4./*Napisati program koji datom prirodnom četvorocifrenom broju:
a) izračunava proizvod cifara;
b) izračunava razliku sume krajnjih i srednjih cifara broja;
c) izračunava sumu kvadrata cifara;
d) određuje broj koji se dobija ispisom cifara u obrnutom porektu.*/
a)
#include<stdio.h>
void main()
{
int n,a,b,c,d,proizvod;
printf("Uneti cetvorocifren broj\n");
scanf("%d",&n);
2
a=n%10;
b=((n%100)/10);
c=((n/100)%10);
d=n/1000;
proizvod=a*b*c*d;
printf("Proizvod cifara broja %d je: %d\n",n,proizvod);
}
b)
#include<stdio.h>
void main()
{
int n,a,b,c,d,razlika;
printf("Uneti cetvorocifren broj\n");
scanf("%d",&n);
a=n%10;
b=((n%100)/10);
c=((n/100)%10);
d=n/1000;
razlika=(a+d)-(b+c);
printf("Razlika sume krajnjih i srednjih cifara broja %d je: %d\n",n,razlika);
}
c)
#include<stdio.h>
void main()
{
int n,a,b,c,d,suma;
printf("Uneti cetvorocifren broj\n");
scanf("%d",&n);
a=n%10;
b=((n%100)/10);
c=((n/100)%10);
d=n/1000;
suma=a*a+b*b+c*c+d*d;
printf("Suma kvadrata cifara broja %d je: %d\n",n,suma);
}
d)
#include<stdio.h>
void main()
{
int n,a,b,c,d,suma;
printf("Uneti cetvorocifren broj\n");
scanf("%d",&n);
a=n%10;
b=((n%100)/10);
c=((n/100)%10);
d=n/1000;
suma=1000*a+100*b+10*c+d;
printf("Broj %d u obrnutom redosledu je: %d\n",n,suma);
}
3
5./*Napisati program u kome se unose vrednost ASCII koda (npr. 66) i štampa znak tog
koda.*/
#include <stdio.h>
void main()
{
int ascii;
printf("Uneti ASCII ko nekog znaka: ");
scanf("%d", &ascii);
printf("%d je ASCII kod za %c.\n", ascii, ascii);

If iskaz
if je kontrolna struktura za ostvarivanje programskih granjanja. Prosta forma ovog iskaza je:
if(izraz)
iskaz;
sledeci_iskaz;
Međutim, ako postoji višestruko granjanje koristi se:
if(izraz1)
iskaz1;
else if(izraz2)
iskaz2;
.....
else
iskazn;

6. /*Napisati program za izračunavanje apsolutne vrednosti celog broja*/


#include<stdio.h>
void main()
{
int broj,a_vred;
printf("Ukucajte ceo broj?");
scanf("%d",&broj);
a_vred=broj;
if(a_vred<0) a_vred=-a_vred;
printf("Apsolutna vrednost broja %d je %d\n", broj, a_vred);
}
7. /*Napisati program koji ispituje da li je karakter malo
ili veliko slovo, cifra ili specijalni karakter - if else iskaz*/
#include<stdio.h>
void main()
{
char c;
printf("Ukucajte karakter?");
scanf("%c",&c);
if(c>='a'&&c<='z')
printf("Karakter %c je malo slovo\n",c);
else if(c>='A'&&c<='Z')
printf("Karakter %c je veliko slovo\n",c);
4
else if(c>='0'&&c<='9')
printf("Karakter %c je cifra\n",c);
else
printf("Karakter %c je specijalni karakter\n",c);
}

8./*Izračunati površinu trougla zadatog stranicama x, y i z po formuli za površinu


s=sqrt(p*(p-x)*(p-y)*(p-z)), gde je p=(x+y+z)/2. */
#include<stdio.h>
#include<math.h>
void main()
{
double x,y,z,p,s;
printf("Unesite stranice\n");
scanf("%lf%lf%lf",&x,&y,&z);
if((x+y>z)&&(x+z>y)&&(y+z>x))
{
p=(x+y+z)/2;
s=sqrt(p*(p-x)*(p-y)*(p-z));
printf("Povrsina trougla je=%0.2f\n",s);
}
else printf("Ne moze se konstruisati trougao\n");
}

9. /*Napisati program koji za dati trocifreni prirodan broj n proverava da li je Armstrongov.


Broj je Armstrongov ako je jednak zbiru kubova svojih cifara.*/
#include<stdio.h>
void main()
{
int c1,c2,c3,n;
printf("Uneti trocifren broj\n");
scanf("%d",&n);
c1=n%10;
c2=n/10%10;
c3=n/100;
if(c1*c1*c1+c2*c2*c2+c3*c3*c3==n)
printf("Broj %d je Armstrongov\n",n);
else
printf("Broj %d nije Armstrongov\n",n);
}

Operator višestrukog izbora SWITCH


Omogućava grananje u programu izborom jednog između više operatora
switch (izraz)
{
case konstanta1: operator1
break;
case konstanta2: operator2
break;
5
...
default : operatorn
break;
}
10./*Napisati program koji će zamentiti u unetom tekstu . sa ! i slovo a sa A.*/
#include <stdio.h>
void main()
{
char ch;
int ct1 = 0;
int ct2 = 0;
while ((ch = getchar()) != '#')
{
switch(ch)
{
case '.' : putchar('!'); ++ct1; break;
case 'a' : putchar('A'); ++ct2; break;
default : putchar(ch);
}
}
printf("\n");
printf("Zamenjeno je %d . sa !\n", ct1);
printf("Zamenjeno je %d slova a with A\n", ct2);
}

11./*Napisati program koji za uneti broj meseca (na primer, 1=Januar, 2=Februar, itd.)
ispisuje njegov broj dana. U slučaju unete vrednosti 2 pitati korisnika da li je godina
prestupna.*/
#include<stdio.h>
void main()
{
int mesec;
char ch;
printf("Uneti redni broj meseca\n");
scanf("%d",&mesec);
switch(mesec)
{
case 1:case 3:case 5:case 7:case 8:case 10: case 12: printf("31 dan\n"); break;
case 4: case 6: case 9: case 11: printf("30 dana\n"); break;
case 2: printf("Da li je godina prestupna (d/n)?\n"); scanf("%c%c",&ch,&ch);
if((ch=='d')||(ch=='D'))
printf("29 dana\n");
else
printf("28 dana\n");
break;
default: printf("Nekorektan broj meseca\n");
}
}

6
While petlja
while(uslov_petlje)
while_iskaz;
sledeci_iskaz;

While iskaz se izvršava sve dok je uslov_petlje istinit (različit od nule), a kad je neistinit
onda se prelazi na sledeci_iskaz;. While_iskaz se izvršava jednom ili više puta, zavisno od
uslova_petlje.

12./*Program za štampanje tabele koja pretvara Fahrenheitove stepene u Celzijuse. Za


Fahrenheitove stepene koristiti redom brojeve od 0, 20, ..., 300. celsius=5*(fahr-32)/9*/
#include <stdio.h>
/* stampanje Fahrenheit-Celsius tabele
za fahr = 0, 20, ..., 300 */
void main()
{
int fahr, celsius;
int lower, upper, step;
lower = 0;
upper = 300;
step = 20;
fahr = lower;
while (fahr <= upper)
{
celsius = 5 * (fahr-32) / 9;
printf("%d\t%d\n", fahr, celsius);
fahr = fahr + step;
}
}
13. /*Program za određivanje srednje vrednosti n celih pozitivnih brojeva*/
#include<stdio.h>
void main()
{
int n, brojac=0;
float suma=0, x;
printf("Ukupno brojeva?\n");
scanf("%d",&n);
while(brojac<n)
{
printf("Ukucajte %d. broj?", brojac+1);
scanf("%f",&x);
suma+=x;
brojac+=1;
}
printf("Srednja vrednost ovih borjeva je %f\n",suma/n);
}

Do-while petlja
do
7
do_iskaz;
while(uslov_petlje)
sledeci_iskaz;
U do-while iskazu prvo se izvršava do-iskaz. Zatim se izvršava uslov_petlje. Ako je istinit,
petlja se nastavlja, inače se petlja završava i kontrola prenosi na sledeci_iskaz. Do-while iskaz se
koristi za slučaj da je petlju neophodno izvršiti najmanje jedanput.

14. /*Program za permutovanje cifara celog broja*/


#include<stdio.h>
void main()
{
int broj;
printf("Ukucajte ceo broj?\n");
scanf("%d",&broj);
printf("Permutovan broj je\n");
do
{
printf("%d",broj%10);
broj/=10;
}
while(broj);
printf("\n");
}

For petlja

for(pocetni_izraz;uslov_petlje;izraz_petlje)
programski_iskaz;
sledeci_iskaz;
pocetni_izraz, postavlja početne parametre petlje (može ih biti više, pri čemu se razdvajaju
zarezom). uslov_petlje predstavlja uslov koji je potreban da bi se petlja nastavila, a ako je
uslov_petlje jednak 0 (neistinit) telo petlje se ne izvršava i kontrola se prenosti na sledeci_iskaz.

15. /*Program za izračunavanje faktorijela*/


#include<stdio.h>
void main()
{
int i,n;
long fak=1;
printf("Izracunavanje n!\nUkucajte broj (<33)?");
scanf("%d",&n);
for(i=1;i<=n;i++)
fak*=i;
printf("%d!=%ld\n",n,fak);
}

8
16. /*Program za odredjivanje srednje vrednosti n celih pozitivnih brojeva-for iskaz*/
#include<stdio.h>
void main()
{
int n, brojac=1;
float suma=0, x;
printf("Ukupno brojeva?\n");
scanf("%d",&n);
for(;brojac<=n;++brojac,suma+=x) /*for(;...) - brojac je na pocetku postavljen na 1
{
printf("Ukucajte %d. broj?", brojac);
scanf("%f",&x);
}
printf("Srednja vrednost ovih brojeva je %f\n",suma/n);
}

FUNKCIJE

Definicija funkcije sastoji se od zaglavlja i tela funkcije. Zaglavlje funkcije sadrži


identifikator (ime funkcije), par zagrada ‘(‘ i ‘)’ sa opcionalnom listom argumenata funkcije i
definicije argumenata funkcije. Telo funkcije je skup izvršnih iskaza i deklaracija promenljivih
korišćenih u funkciji. Deklaracije promenljivih moraju se pisati pre izvršenih iskaza.
poruka()
{ /*Zaglavlje funkcije*/
printf(“Zdravo!\n”); /*Telo funkcije su svi iskazi izmedju { i }*/
}
Funkcija suma_kvadrata(n) je deklaracija funkcije, koja definiše ime funkcije (identifikator
suma_kvadrata), broj argumenata funkcije i njihova imena, i predstavljaju formalne argumente.
Ovde je definisan samo jedan argument n koji predstavlja formalni argument jer se koristi samo u
definiciji funkcije. Na kraju funkcije se nalazi return promenljiva; gde se kao rezultat funkcije vraća
vrednost promenljive. Funkcija se poziva tako što se u glavnom programu napiše ime funkcije sa
odgovarajućim argumentima funkcije. Kada se pozove funkcije, u zagradi stoje stvarni argumenti

17. /*Napisati program za izračunavanje sume kvadrata celih brojeva od 1 do n*/


#include<stdio.h>
suma_kvadrata(int n)
{
int i;
long suma=0;
for(i=1; i<=n;suma+=(long)i*i,++i);
printf("Suma kvadrata od 1 do %d je %ld\n",n,suma);
}
main()
{
suma_kvadrata(10);
suma_kvadrata(15);
suma_kvadrata(20);
}

9
18./*Napisati program u kome se definiše funkcija prost() koja ispituje da li je broj prost i
funkcija main() koja njenim korišćenjem štampa sve proste brojeve do datog prirodnog broja
n.*/
#include<stdio.h>
#include<math.h>
int prost(int n)
{
int i;
for (i=2;i<=sqrt(n);i=i+1)
if(n%i==0)
return 0;
return i;
}
void main()
{
int i,n;
printf("Uneti broj\n");
scanf("%d",&n);
printf("Prosti brojevi su\n");
for(i=2;i<=n;i=i+1)
if(prost(i)) printf("%d\n",i);
}

19./*Napisati program kojim se ispisuju parovi prijateljskih brojeva do n. Za dva broja


kažemo da su prijateljski, ako je jedan broj jednak sumi delioca drugog broja. U sumu delioca
ne ulazi sam taj broj. Sumu delioca računati korišćenjem funkcije Npr. prijateljski brojevi su:
220=1+2+4+71+142
284=1+2+4+5+10+11+20+22+44+55+110*/
#include<stdio.h>
#include<math.h>
int sumadelioca(int n)
{
int s=1,i;
for (i=2;i<=sqrt(n);i++)
if(n%i==0) s+=i+(n/i)*(i!=n/i); //uslov (i!=n/i) izost. duplir. faktora npr. za 36
return s;
}
void main()
{
int s,i,n;
printf("Uneti broj n\n");
scanf("%d",&n);
printf("Trazeno svojstvo do %d imaju:\n",n);
for(i=2;i<=n;i=i+1)
{
s=sumadelioca(i);
if(s<=i&&sumadelioca(s)==i) printf("%5d%5d\n",i,s);
}
}
10
20./*Napisati program za izračunavanje faktorijela zadatog broja n korišćenjem funkcije
fakt().*/
#include<stdio.h>
int fakt(int n)
{
int p=1,i;
for(i=2;i<=n;i++)
p*=i;
return p;
}
void main()
{
int n;
long broj;
printf("Uneti broj ciji faktorijel trazimo\n");
scanf("%d",&n);
broj=fakt(n);
printf("Faktorijel broja %d je: %ld\n",n,broj);
}

21./*Napisati program kojim se štampaju svi trocifreni brojevi (ako ih ima) koji su jednaki
sumi faktorijela svojih cifara.*/
#include<stdio.h>
int fakt(int n)
{
int p=1,i;
for(i=2;i<=n;i++)
p*=i;
return p;
}
void main()
{
int n,a,b,c;
printf("Trocifreni brojevi jednaki sumi faktorijela svojih cifara su:\n");
for(n=100;n<1000;n++)
{
a=n%10;
b=n/10%10;
c=n/100;
if(n==fakt(a)+fakt(b)+fakt(c)) printf("%d\n",n);
}
}

22./* Napisati program za rekurzivnu funkciju za izračunavanje n-tog stepena realnog broja
x0, ako je n ceo broj.*/
1, n  0
 n 1
x n
 x  x , n  0
1 / x n , n  0

može se izvršiti sledeća rekurzivna formula:

11
1 , n  0

stepen  x , n    x  stepen  x , n  1 , n  0
1 / stepen  x ,  n  , n  0

na osnovu ovoga se formira sledeća rekurzivna funkcija:


#include<stdio.h>
double stepen(double x, int n)
{
if (n==0) return 1;
if(n>0) return x*stepen(x,n-1);
if(n<0) return 1/stepen(x,-n);
}
void main()
{
int n;
double x;
printf("Uneti vrednosti realnog broja\n");
scanf("%lf",&x);
printf("Uneti vrednosti stepena\n");
scanf("%d",&n);
printf("Vrednost %d stepena broja %lf je %lf\n",n,x,stepen(x,n));
}

JEDNODIMENZIONALNI I VIŠEDIMENZIONALNI NIZOVI

Nizovi predstavljaju skup homogenih podataka. Nizove treba razlikovati od struktura koje
predstavljaju skup heterogenih podataka. Elementi niza su istog tipa, dok su elementi struktura
različitih tipova. Niz se obeležava:
int a[20];
gde int deklariše tip svih elemenata niza, kojih ima 20 (broj između uglastih zagrada). Da bi se
dodelila početna vrednost elementima niza na ovaj način, mora se staviti ključna reč static pre
deklaracije. Npr.:
static int ocena[5]={6,7,8,9,10};
deklariše celobrojni niz čije su početne vrednosti 6, 7, 8, 9, 10. Ili slično imamo:
static char slova[5]={‘a’,’e’,’i’,’o’,’u’};

23. /*Napisati program za unos i stampanje 10 ocena ucenika*/


#include<stdio.h>
void main()
{
int i,ocena[10];
printf("Uneti ocene ucenika\n");
for(i=0;i<10;i++)
scanf("%d",&ocena[i]);
printf("Unete ocene ucenika su:\n");
for(i=0;i<10;++i)
printf("%c ocena[%2d]=%2d",(i%5==0)?'\n':' ',i,ocena[i]);
printf("\n");
}
24. /*Program za sortiranje jednodimenzionalnih
nizova realnih brojeva od najmanjeg do najveceg*/

12
#include<stdio.h>
void main()
{
int n,i,j;
float priv, x[100];
do
{
printf("Koliko brojeva za sortiranje?[<100]:");
scanf("%d",&n);
}
while(n>=100||n<=0);
printf("\n");
/*Ucitavanje n brojeva*/
for(i=0;i<n;++i)
{
printf("? x[%2d]=",i);
scanf("%f",&x[i]);
}
/*Sortiranje*/
for(j=0;j<n-1;++j)
for(i=j+1;i<n;++i)
if(x[i]<x[j])
{
priv=x[j];
x[j]=x[i];
x[i]=priv;
}
/*Stampanje sortiranih brojeva*/
printf("\nSortiranji brojevi:\n");
for(i=0;i<n;++i)
printf("x[%2d]=%15.6e\n",i,x[i]);
}

25./*Napisati program za određivanje broja maksimalnih elemenata niza. U rešavanju


koristiti funkciju za unos članova niza.*/
#include <stdio.h>
void citaj(float a[],int n)
{
int i;
printf("Uneti niz \n");
for(i=0;i<n;i++)
{
printf("a[%d]=",i);
scanf("%f",&a[i]);
}
}

int BrojMax(float a[],int n)


{
13
float max;
int i,k;
max=a[0]; k=1;
for(i=1;i<n;i++)
if(a[i]>max)
{
max=a[i];
k=1;
}
else if(a[i]==max)
k++;
return k;
}
void main()
{
float a[100];
int n;
printf("Uneti broj elemenata niza\n");
scanf("%d",&n);
citaj(a,n);
printf("U nizu ima %d maksimalnih clanova\n", BrojMax(a,n));
}

26. /*Dat je niz realnih brojeva. Napisati funkciju koja:


a) izračunava sumu elemenata niza koji prethode prvoj nuli u nizu;
b) određuje broj elemenata koji prethode prvom negativnom elementu u nizu;
c) izračunava proizvod elemenata između prve i druge nule u nizu (niz ima bar dve
nule);*/
#include <stdio.h>
void citaj(float a[],int n)
{
int i;
printf("Uneti niz \n");
for(i=0;i<n;i++)
scanf("%f",&a[i]);
}
float suma(float a[],int n)
{
int i=0;
float s=0;
while(i<n&&a[i])
s+=a[i++];
return s;
}
int BrojPoz(float a[],int n)
{
int k=0,i;
for(i=0;i<n&&a[i]>=0;i++)
k++;
14
return k;
}
proizvod(float a[],int n)
{
int i,k=0;
float p=1;
for(i=0;i<n&&k<2;i++)
{
if(a[i]==0)k++;
if(k==1&&a[i]!=0)
p*=a[i];
}
return p;
}
void main()
{
float a[100];
int n;
printf("Uneti broj elemenata niza\n");
scanf("%d",&n);
citaj(a,n);
printf("Suma elemenata niza koji prethode prvoj nuli u nizu je %f\n", suma(a,n));
printf("Broj elemenata koji prethode prvom negativnom elementu je %d\n",BrojPoz(a,n));
printf("Proizvod elemenata niza izmedju prve i druge nule je %f\n",proizvod(a,n));

}
27./*Dat je niz realnih brojeva. Napisati program koji sažima niz uklanjanjem elemenata čija
je vrednost jednaka zadatom broju X.*/
#include <stdio.h>
void citaj(float a[],int n)
{
int i;
printf("Uneti niz \n");
for(i=0;i<n;i++)
scanf("%f",&a[i]);
}
void pisi(float a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%f\t",a[i]);
}

void main()
{
float a[100],x;
int k=-1,i,n;
printf("Uneti broj elemenata niza\n");
scanf("%d",&n);
15
printf("Uneti x\n");
scanf("%f",&x);
citaj(a,n);
for(i=0;i<n;i++)
if(a[i]!=x)
a[++k]=a[i];
n=k+1;
printf("Novi niz je\n");
pisi(a,n);
prinf("\n");
}
28. /*Dat je niz realnih brojeva. Napisati funkciju koja:
d) ispisuje sve elemente niza koji se u nizu pojavljuju tačno jedanput;
e) proverava da li u nizu postoji par jednakih elemenata;
#include <stdio.h>
void citaj(float a[],int n)
{
int i;
printf("Uneti niz \n");
for(i=0;i<n;i++)
scanf("%f",&a[i]);
}
void tacnojednom(float a[],int n)
{
int k,i,j;
for(i=0;i<n;i++)
{
k=0;
for(j=0;j<n;j++)
if(a[i]==a[j])
k++;
if(k==1)
printf("%f\n",a[i]);
}
}
void parjednakih(float a[],int n)
{
int k,i,j;
for(i=0;i<n-1;i++)
{
k=0;
for(j=i+1;j<n;j++)
if(a[i]==a[j])
k++;
if(k==1)printf("%f\n",a[i]);
}

}
void main()
16
{
float a[100];
int n;
printf("Uneti broj elemenata niza\n");
scanf("%d",&n);
citaj(a,n);
printf("Elementi koji se pojavljuju tacno jedanput su:\n");
tacnojednom(a,n);
printf("Par jednakih je \n");
parjednakih(a,n);
}

29./*Napisati program koji za uneti niz a od n elemenata, prebacuje negativne elemente na


kraj niza bez obzira na njihov poredak*/
#include <stdio.h>
void citaj(float a[],int n)
{
int i;
printf("Uneti niz \n");
for(i=0;i<n;i++)
{
printf("a[%d]=",i);
scanf("%f",&a[i]);
}
}
void uredi(float a[],int n)
{
float pom;
int i,j;
i=0; j=n-1;
while(i<j)
if(a[i]>0) i++;
else
{
if(a[j]>0)
{
pom=a[i];
a[i]=a[j];
a[j]=pom;
j--;
}
}
}
void pisi(float a[],int n)
{
int i;
printf("Formirani niz\n");
for(i=0;i<n;i++)
printf("a[%d]=%5.2f\n",i,a[i]);
17
}
void main()
{
float a[100];
int n;
printf("Uneti broj elemenata niza\n");
scanf("%d",&n);
citaj(a,n);
uredi(a,n);
pisi(a,n);
}
VIšEDIMENZIONALNI NIZOVI

Označavanje matrice M od i vrste i j kolona M[i][j], ili višedimenzionalnog vektora Z[i][j][k] itd.
Dvodimenzionalni vektori se inicijalizuju na sličan način kao jednodimenzionalni. Inicijalizacioni
elementi se naovde po vrstama. Vitičaste zagrade se mogu koristi za izdvajanje inicijalizacionih
elemenata jedne vrste od druge. Inicijalizacija matrice M je:
static int M[4][3]={
{13,-18,21},
{36,101,0},
{-5,0,-9},
{3,1,9}
};

30. /*Program za skalarno množenje matrica*/


#include<stdio.h>
void main()
{
int vrsta,kol;
float scalar;
static float matrica[3][5]={
{7.0,16.83,55.131,13.1,12.91},
{15.0,10.9,42.99,0.0,7.7},
{-2.2,1.1,2.2,4.4,9.9}
};
printf("Originalna matrica:\n");
for(vrsta=0;vrsta<3;++vrsta)
{
for(kol=0;kol<5;++kol)
printf("%10f",matrica[vrsta][kol]);
printf("\n");
}
printf("\n Scalar?\n");
scanf("%f",&scalar);
for(vrsta=0;vrsta<3;++vrsta)
for(kol=0;kol<5;++kol)
matrica[vrsta][kol]*=scalar;
printf("\n Matrica posle skalarnog mnozenja:\n");
for(vrsta=0;vrsta<3;++vrsta)
18
{
for(kol=0;kol<5;++kol)
printf("%10f\t", matrica[vrsta][kol]);
printf("\n");
}
}

31. /*Napisati program za sabiranje matrica a i b dimenzije n i štampanje rezultujuće matrice


c*/
#include <stdio.h>
void citaj(int a[][10],int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
void zbir(int a[][10],int b[][10],int c[][10],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
c[i][j]=a[i][j]+b[i][j];
printf("%d\t",c[i][j]);
}
printf("\n");
}
}
void main()
{
int a[10][10],b[10][10],c[10][10];
int n;
printf("Uneti broj vrsta i kolona matrice a i b\n");
scanf("%d",&n);
printf("Uneti elemente matrice a\n");
citaj(a,n);
printf("Uneti elemente matrice b\n");
citaj(b,n);
printf("Zbir matrica a i b je:\n");
zbir(a,b,c,n);
}

32./*Program za množenje dve zadate matrice*/


#include<stdio.h>
void citaj(float m[][10],int n)
{
int i,j;
19
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",&m[i][j]);
}
void mnozenje(float m1[][10], float m2[][10],float m3[][10],int n)
{
int i,j,k;
for(i=0;i<n;++i)
for(j=0;j<n;++j)
for(m3[i][j]=0,k=0;k<n;++k)
m3[i][j]+=m1[i][k]*m2[k][j];
}
void pisi(float m[][10],int n)
{
int i,j;
for(i=0;i<n;++i)
{
for(j=0;j<n;++j) printf("%5.2f\t",m[i][j]);
printf("\n");
}
}
void main()
{
float m1[10][10],m2[10][10],m3[10][10];
int n;
printf("Uneti dimenziju matrica \n");
scanf("%d",&n);
printf("Uneti elemente matrice m1\n");
citaj(m1,n);
printf("Uneti elemente matrice m2\n");
citaj(m2,n);
printf("\n\nProizvod matrica m1*m2\n");
printf("...................................\n");
mnozenje(m1,m2,m3,n);
pisi(m3,n);
}

20
33./*Program za transponovanje matrice a dimenzije n*/
#include <stdio.h>
void citaj(int a[][10],int n)
{
int i,j;
printf("Uneti elemente matrice \n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
void transponovana(int a[][100],int n)
{
int i,j,p;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
p=a[i][j];
a[i][j]=a[j][i];
a[j][i]=p;
}
}
void pisi(int a[][10],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d",a[i][j]);
printf("\n");
}
}
void main()
{
int a[100][100];
int n;
printf("Uneti broj vrsta i kolona matrice\n");
scanf("%d",&n);
citaj(a,n);
transponovana(a,n);
pisi(a,n);
}

34./*Napisati program koji u matrici realnih brojeva a određuje:


a) maksimalni element;
b) sumu elemenata ispod glavne dijagonale;
c) sumu elemenata iznad sporedne dijagonale.*/
#include <stdio.h>
void citaj(float a[][10],int n)
{
21
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
}
float maksimalni(float a[][10],int n)
{
int i,j;
float max=a[0][0];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(max<a[i][j]) max=a[i][j];
return max;
}
float sumaispodgd(float a[][10],int n)
{
float s=0;
int i,j;
for(i=1;i<n;i++)
for(j=0;j<i;j++)
s+=a[i][j];
return s;
}
float sumaiznadsd(float a[][10],int n)
{
float s=0;
int i,j;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
s+=a[i][j];
return s;
}
void main()
{
float a[10][10];
int n;
printf("Uneti broj vrsta i kolona matrice a \n");
scanf("%d",&n);
printf("Uneti elemente matrice a\n");
citaj(a,n);
printf("Maksimalni element matrice a je: %f\n\n",maksimalni(a,n));
printf("Suma elemenata ispod glavne dijagonale je: %f\n\n",sumaispodgd(a,n));
printf("Suma elemenata iznad sporedne dijagonale je: %f\n\n",sumaiznadsd(a,n));
}

22
POKAZIVAČI (POINTERI)

Pokazivači omogućavaju formiranje složenih dinamičkih struktura podataka (liste, magacini,


stabla, redovi i dr.) i s tim u vezi dinamičko dodeljivanje memorije, prenos argumenata funkcije
referisanjem, efikasniji rad sa vektorima i prenos funkcija kao argumenata u druge funkcije.
Proizvoljna programska promenljiva memorisana je u određenom memorijskom bloku, na određenoj
programskoj lokaciji ili adresi. Pokazivači omogućavaju indirektni način za pristupanje
programskim promenljivim, korišćenjem i manipulacijom adresama promenljivih. U C jeziku
možemo deklarisati promenljivu, prom:
int *prom;
koja omogućava da se indirektno pristupi vrednosti promenljive prom. Karakter zvezdica ‘*’
deklariše promenljivu kao pokazivač, a tip int da je promenljiiva prom pokazivač na celobrojnu
promenljivu, što znači, ovo predstavlja indirektan pristup celobrojnim promenljivim. Adresni
operator & se koristi u funkciji scanf za prenos učitane vrednosti u pozivajuću funkciju main().
Operator indirekcije * omogućava indirektno pristupanje promenljivoj koristeći pokazivač na
tu promenljivu. Ako je x deklarisana kao int, tada se iskazom
x=*prom;
promenljivoj x dodeljuje vrednost promenljive na koju pokazivačj prom ukazuje. Operatori * i &
su inverzni.
U C jeziku postoji specijalni operator za indirektnu selekciju članova strukture. To je operator ->.
Operator -> je operator selekcije članova strukture sa pokazivačem na strukturu.
Dinamičke strukture podataka
Dinamičke strukture zahtevaju eksplicitno rezervisanje i oslobađanje memorije. U sistemskoj
biblioteci svakog C prevodioca postoje funkcije malloc, calloc, realloc i free, kojima se rezerviše i
oslobađa mimorijski blok. Definicija ovih funkcija je sledeća:
1. char *malloc(size). Rezerviše memorijski blok veličine size bajtova, koji se inicijalizuje na
0. Argument size je unsigned. U slučaju uspešne rezervacije malloc vraća pokazivač na
rezervisani memorijski blok. U protivnom, vraća 0.
2. char *calloc(n, size). Rezerviše memorijski blok dovoljan za memorisanje n elemenata
svaki veličine size bajtova, znači n*size. Rezervisan memorijski blok je inicijalizovan na 0.
U slučaju uspešne rezervacije calloc vraća pokazivač na char, koji pokazuje na rezervisan
memorijski blok. U protivnom, vraća 0.
3. void free(pokaz). Oslobađa memorijski blok, koji je rezervisan funkcijama calloc i malloc.
Argument pokaz je pokazivač na char, koji pokazuje na memorijski blok za oslobađanje.
Funkcija free ne vraća nikakvu vrednost.
4. char *realloc(pokaz, size). Oslobađa rezervisani memorijski blok i rezerviše novi veličine
size bajtova. Argument pokaz je pokazatelj na char i defimniše memorijski blok, koji se
realocira. Argument size je unsigned i određuje veličinu realociranog memorijskog bloka.
Ako je realociranje uspoešno realloc vraća pokazivač na char, koji pokazuje na memorijski
blok. U protivnom, realloc vraća 0.

35./*Izračunati zbir i razliku dva broja koristeći pokazivače na funkciju*/


#include<stdio.h>
int zbir(int *a,int *b)
{
return *a+*b;
}
int razlika(int *a,int *b)
{
23
return *a-*b;
}
void main(void)
{
int a=10, b=5, r_zbir, r_razlika;
int (*pointer[2])(int *,int *);
pointer[0]=zbir;
pointer[1]=razlika;
r_zbir=(*pointer[0])(&a,&b);
r_razlika=(*pointer[1])(&a,&b);
printf("zbir =%d razlika=%d\n",r_zbir,r_razlika);
}

36./*Stranice a i b pravougaonika su prirodni brojevi. Odrediti, na koliko se kvadrata


maksimalne površine može iseći dati pravougaonik. Ispisati dimenzije kvadrata. Na primer za
a=12 i b=7 se ispisuje:
1 kvadrata stranice: 7
1 kvadrata stranice: 5
2 kvadrata stranice: 2
2 kvadrata stranice: 1
#include<stdio.h>
void razmeni(int *a, int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void main()
{
int a,b;
printf("Uneti stranice pravougaonika\n");
scanf("%d%d",&a,&b);
if(a==b)
printf("Jedan kvadrat stranice %d\n",a);
else
while(a)
{
if(a<b) razmeni(&a,&b);
printf("%d kvadrata stranice: %d\n",a/b,b);
a=a%b;
}
}
37. /*Nizovi i pokazivaci*/
#include<stdio.h>
void main()
{
float a,b,c,fniz[5]={0.01,0.1,0.5,1.0,10.0};
float *p_fniz;
24
char tekst[]={"Ovo je znakovni niz\n"};
char *p_tekst;
int i;
p_fniz=fniz;
a=*p_fniz;
b=*(p_fniz+2);
p_fniz=&fniz[2];
c=*(p_fniz+2);
printf("a=%f b=%f c=%f\n",a,b,c);
for(i=0;tekst[i]!='\0';++i)putchar(tekst[i]);
for(p_tekst=tekst;*p_tekst!='\0';++p_tekst)putchar(*p_tekst);
}

38. /*Program za odredjivanje duzine stringa*/


#include<stdio.h>
int duzina(char *p_string);
void main(int argc,char *argv[])
{
char *p_text={"ovo je znakovni niz\n"};
int i;
for(i=1;i<argc;i++)
printf("argument%d%s\n",i,argv[i]);
i=duzina(p_text);
printf("duzina stringa je %d\n",i);
}
int duzina(char *p_string)
{
int l=0;
char*p;
p=p_string;
while(*p!='\0')
{
++l;
++p;
}
return l;
}

39./*Data je kvadratna matrica celih brojeva a dimenzije n i prirodan broj k<n. Napisati
program koristeći funkciju koja realizje simetrično preslikavanje u odnosu na sporednu
dijagonalu, trougla određenog pozicijama (0,0), (0,k-1) i (k-1,0) u odgovarajući trougao i
obrnuto.*/
#include <stdio.h>
void citaj(int a[][10],int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
25
}

void razmeni (int *x,int *y)


{
int p;
p=*x; *x=*y; *y=p;
}

void f(int a[][10],int n, int k)


{
int i,j;
for(i=0;i<k;i++)
for(j=0;j<k-i;j++)
razmeni(&a[i][j],&a[n-1-j][n-1-i]);
}
void pisi(int a[][10],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
}
void main()
{
int a[10][10];
int n,k;
printf("Uneti broj vrsta i kolona matrice a \n");
scanf("%d",&n);
printf("Uneti elemente matrice a\n");
citaj(a,n);
printf("Uneti k \n");
scanf("%d",&k);
printf("Dobijena matrica je:\n");
f(a,n,k);
pisi(a,n);
}

26
STRINGOVI
Standardni fajlovi zaglavlja
Prototipovi bibliotecnih funkcija su dati u nekoliko standardnih fajlova zaglavlja. Npr. standardni
fajlovi su:
stdio.h-sadrzi definisane funkcije printf , scanf , putchar i getchar
assert.h-assertions
ctype.h-definisane su funikcije za ispitivanje karaktera
float.h-ograničenja sistema za realne tipove podataka
limits.h-ograničenja sistema za celobrojne tipove podataka
math.h - matematicke funkcije
setjmp.h-nelokalni skokovi
signal.h-javljanje grešaka i signala
stdarg.h-lista parametara promenljive dužine
stdlib.h-utility functions; number conversions, memory allocation, exit and system, Quick Sort
string.h-funkcije stringova
time.h-vremenske i datumske funkcije

Nizovi karaktera su jednodimenzionalni vektori tipa char.

U standardnom zaglavlju stdio.h definisane su sledeće funkcije:


getchar() - čita sledeći znak, uključujući i bele znakove, preko tastature. Vrednost funkcije je
kod pročitanog znaka ili simbolička konstanta EOF (end of file) ukoliko je pročitan signal za kraj
datoteke kao i u slučaju greške u toku čitanja.
putchar(c) - funkcija za ispisivanje znaka c na ekranu.
gets(s) - funkcija za čitanje jednog reda teksta
puts(s)-funkcija za ispisivanja jednog reda teksta
getc(c)-unos jednog karaktere
putc(c)-štampanje jednog karaktera
stdin-standardni ulazni tok
stdout-standardni izlazni tok
stderr-standardne greške
EOF-end of file
printf(“format”, arg1,...)-štampanje formatiranih podataka
sprintf(s,“format”, arg1,...)-štampanje u string s
scanf(“format”, &ime1,...)-unos formatiranih podataka
sscanf(s,“format”, &ime1,...)-unos iz stringa s
FILE *fp-deklaracija pokazivača na fajl
fopen(“ime”,”mod-režim”)-pokazivač na ime fajla (mod: r-čitanje, w-upis, a-dodavanje)
fprintf(fp,“format”,arg1,...)-upis u fajl
fscanf(fp,“format”,arg1,...)-čitanje iz fajla
fclose(fp)-zatvaranje fajla
ferror(fp)-nenulta vrednost ukoliko je greška
feof(fp)-nenulta vrednost ukoliko je kraj datoteke
fgets(s,max,fp)-čita liniju u string s (< max karaktera) iz datoteke fp
fputs(s,fp)-ispisuje string s u datoteku fp

U standardnom zaglavlju string.h definisane su sledeće funkcije:


strlen(cs)-vraća duzinu cs-a.

27
strcmp(cs,st)-upoređuje niz cs sa nizom ct; vraća <0 ako je cs<ct, 0 ako je cs=st ili >0 ako je
cs>ct.
strcpy(s, c)-kopira niz c u niz s.
strcpy(s, c,n)-kopira niz c u niz s prvih n karaktera.
srtcat(s, c)-povezuje niz karaktera c iza niza s
srtcat(s, c,n)-povezuje niz karaktera c iza niza s počevši od n-tog karaktera
srtcmp(s, c)-upoređuje niz karaktera s sa nizom c
srtcmp(s, c)-upoređuje prvih n karaktera niza s sa nizom c
strchr(s, c)-pokazivač na prvi karakter niza c u nizu s
strrchr(s, c)-pokazivač na poslednji karakter niza c u nizu s
memcpy(s, c, n)-kopira n karaktera iz niza c u niz s
memmove(s, c, n)-kopira n karaktera iz niza c u niz s sa mogućnošću preklapanja
memchr(s, c, n)-pozakizvač na prvi c u privih n karaktera u nizu s
memset(s, c, n)-smešta c u prvih na karaktera niza s

U standardnom zaglavlju ctype.h definisane su sledeće funkcije:


isalnum(c)-ispituje da li je c alfanumerički karakter
isalpha(c)-ispituje da li je c alfabetski karakter
isalnum(c)-ispituje da li je c alfanumerički karakter
iscntrl(c)-ispituje da li je c kontrolni karakter
isdigit(c)-ispituje da li je c cifra
isgraph(c)-ispituje da li je c štampani karakter (ne uključuje prezninu)
islower(c)-ispituje da li je c malo slovo
isprint(c)-ispituje da li je c karakter (samo da nije praznina)
ispunct (c)- ispituje da li je c izuzimajući praznine, slovo ili broj
isspace(c)-ispituje da li je c praznina, formfeed, nova linija, vertikalni, horizontalni karaker
isupper(c)-ispituje da li je c veliko slovo
isxdigit(c)-ispituje da li je c heksadecimalni broj
tolower(c)-pretvara c u malo slovo
toupper(c)-pretvara c u veliko slovo

40. /*Prikazivanje tablice ASCII kodova*/


#include<stdio.h>
void main()
{
char c; int i;
printf("\t\t Tablica ASCII kodova\n\n");
for(c=' ';c<' '+19;++c){
for(i=0;i<95;i+=19)
printf("%3d %c ",c+i,c+i);
putchar('\n');
}
}

41/*Napisati program kojim se ucitavaju znaci sve dok se ne unese # i onda daje izvestaj o
broju ucitanih praznina, novih linija i broju svih ostalih ucitanih karaktera.*/
#include <stdio.h>
void main()
{
28
char ch;
int praznina = 0, nl = 0,ostalo = 0;
while ((ch = getchar()) != '#')
{
if (ch == ' ')
praznina++;
else if (ch == '\n')
nl++;
else
ostalo++;
}
printf(" Broj praznina: %d\n Novih linija: %d\n Ostali karakteri: %d\n", praznina, nl, ostalo);
}

42. /*Program za odredjivanje duzine nizova karaktera*/


#include<stdio.h>
unsigned strlen(s)
char *s;
{
unsigned i;
for(i=0;*s!='\0';++s,++i);
return(i);
}
main()
{
char demo[]="Uvod u C jezik";
printf("Duzina niza demo je %d\n",strlen(demo));
}

43. /*Program za ilustraciju brojanja reci u nizu karaktera*/


#include<stdio.h>
unsigned wc(s)
char *s;
{
unsigned n=0;
while(*s)
{
while(*s==' '||*s=='\n'||*s=='\t')
++s;
if(*s)
{
++n;
while(*s!=' '&&s!='\n'&&*s!='\t'&&*s!='\0')
++s;
}
}
return(n);
}
main()
29
{
static char string[]="Ilustracija procesiranja nizova\t karaktera\n\t\n";
printf("Broj reci je %u\n",wc(string));
}

return l;
}

44./*Napisati program za odredjivanje broja velikih i malih slova u unetom tekstu.*/


#include <stdio.h>
void main()
{
int ch;
int uct = 0,lct = 0;
while ((ch = getchar()) != EOF)
if (isupper(ch))
uct++;
else if (islower(ch))
lct++;
printf("\n");
printf("velikih slova: %d\n", uct);
printf("malih slova: %d\n", lct);

45./*Napisati program za odredjivanje ukupnog broja karaktera u unetom tekstu.*/


#include <stdio.h>
int main(void)
{
int ch;
int ct = 0;

while ((ch = getchar()) != EOF)


ct++;
printf("\n");
printf("Uneto je %d karaktera\n", ct);
}

46./*Napisati program kojim se iz stringa s briše svaki znak koji odgovara bilo kom znaku
stringa t.*/
#include <stdio.h>
#include <string.h>
void main()
{
char s[50], t[50];
int i,j;
gets(s);
gets(t);
for(i=j=0;s[i];i++)
30
if(!strchr(t,s[i]))
s[j++]=s[i];
s[j]='\0';
puts(s);
}

47./*Napisati program koji iz datog stringa s izbacuje sve komentare oblika /*...*/, s tim što u
komentaru nema komentara*/
#include <stdio.h>
#include <string.h>
void main()
{
char s[100], *p,*q;
gets(s);
while(p=strstr(s,"/*"))
{
q=strstr(s,"*/");
strcpy(p,q+2);
}
puts(s);
}

48./*Napisati program koji iz datog stringa s određuje prosečan broj slova u rečima parne
dužine*/
#include <stdio.h>
void main()
{
char s[100];
int i,k=0,br=0;
float q=0;
gets(s);
for(i=0;s[i];i++)
if(s[i]!=' ') k++;
else
if(k>0)
{
if(k%2==0)
{
br++; q+=k;
}
k=0;
}
if(k>0)
if(k%2==0)
{
br++;
q+=k;
}
printf("Prosecan broj simbola u recima parne duzine je %f\n",q/br);
31
}
49. /*Napisti program za ucitavanje neuredjenog spiska imena prekog glavnog ulaza, po jedno
ime iz svakog reda, sve dok umesto prezimena i imena ne procita dve tacke sa znakom
razmaka izmedju. Po zavrsetku citanja imena treba urediti i potom ispisati na glavnom izlazu,
po jedno ime u svakom redu*/

#include<stdio.h>
#include<string.h>
#define N 100
#define D 40
void main()
{
char ljudi[N][D+1];
int i, n=0;
/*Citanje neuredjenog niza imena*/
printf("Neuredjen niz prezimena i imena?\n\n");
do
gets(ljudi[n]);
while(strcmp(ljudi[n++],". .")!=0);
n--;
/*Uredjivanje niza imena*/
for(i=0; i<n-1;i++){
int j,m=i;
for(j=i+1;j<n;j++)
if(strcmp(ljudi[j],ljudi[m])<0)m=j;
if(m!=i){
char osoba[D+1];
strcpy(osoba , ljudi [i]);
strcpy(ljudi[i],ljudi[m]);
strcpy(ljudi[m],osoba );
}
}
/*Ispisivanje uredjenog niza imena*/
printf("\nUredjeni niz imena:\n\n");
for(i=0;i<n;puts(ljudi[i++]));
}

50. /*Program za konverziju niza ASCII cifara u celobrojnu vrednost*/


#include<stdio.h>
int isspace(c)
char c;
{
return(c==' '||c=='\t'||c=='\n');
}
int isdigit(c)
char c;
{
return(c>='0'&&c<='9');
}
32
int atoi(s)
char *s;
{
int value=0,sign=1;
char c;
if(*s=='-')
{
++s;
sign=-1;
}
else if(*s=='+')
++s;
while(isspace(*s))
++s;
while(isdigit(c=*s++))
value=10*value+c-'0';
return(sign*value);
}
void main()
{
char niz[81];
printf("Ukucajte broj:\n");
scanf("%s",niz);
printf("\"%s\"=%d\n",niz,atoi(niz));
}

33
STRUKTURE PODATAKA

Strukture su skupovi heterogenih elemenata (jedan elemenat je char, drugi je int itd.). U C
jeziku postoji mogućnost grupisanja logički povezanih promenljivih različitog tipa u jednu celinu,
strukturu. Koristeći ključnu reč struct možemo definisati strukturu datum sa tri celobrojne
komponente, koje predstavljaju dan, mesec i godinu. Ovo se deklariše:
struct datum {
int dan;
int mesec;
int godina;
};
Struktura datum sadrži tri elementa tipa int: dan, mesec i godina, koji se nazivaju
članovima strukture. Ključna reč struct definiše strukturu tako da promenljive mogu biti deklarisane
kao tip struct datum. Za selekciju članova strukture koristi se operator .(tačka), tako što se
specificira ime promenljive, operator tačka i ime člana. Operator . ima najviši prioritet među
operatorima C jezika i istog je prioriteta sa operatorom selekcije elementa vektora (uglaste zagrade).
Selekcija člana strukture ima opštu formu
ime_promenljive.ime_clana
Inicijalizacija strukture je slična inicijalizaciji vektora. Inicijalizacione vrednosti se navode
između vitičasti zagrada razdvojene zarezom.
51. /*Program koji za za zadato tekuće vreme određuje naredno vreme.*/
#include<stdio.h>
void main()
{
struct vreme{
int sat;
int minut;
int sekund;
}tekuce_vreme,naredno_vreme;
printf("Unesite tekuce vreme?[cc:mm:ss]");
scanf("%d:%d:%d",&tekuce_vreme.sat,
&tekuce_vreme.minut,
&tekuce_vreme.sekund);
naredno_vreme=tekuce_vreme;
if(++naredno_vreme.sekund==60)
{
naredno_vreme.sekund=0;
if(++naredno_vreme.minut==60)
{
naredno_vreme.minut=0;
if(++naredno_vreme.sat==24)
naredno_vreme.sat=0;
}
}
printf("Naredno vreme je %02d:%02d:%02d\n", naredno_vreme.sat,
naredno_vreme.minut, naredno_vreme.sekund);
}

34
52. /*Napisati program za formiranje strukture student sa karakteristikama Ime, Prezime,
broj indeksa, srednja ocena. Za uneti broj studenata n, sortirati studente prema srednjoj oceni
i ispisati na ekranu*/
#include<stdio.h>
typedef struct student{
char Ime[20],Prezime[20];
int broj_indeksa;
float srednja_ocena;
};
void razmeni(struct student *a, struct student *b)
{
struct student pom;
pom=*a;
*a=*b;
*b=pom;
}
void sort(struct student STF[], int n)
{
int i, j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(STF[i].srednja_ocena<STF[j].srednja_ocena)
razmeni(&STF[i],&STF[j]);
}

void main()
{
int n;
int i;
struct student STF[100];
printf("Unesite broj studenata: \n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Unesi ime: \n");
scanf("%s",STF[i].Ime);
printf("Unesi prezime: \n");
scanf("%s",STF[i].Prezime);
printf("Unesi broj indeksa: \n");
scanf("%d",&STF[i].broj_indeksa);
printf("Unesi srednju ocenu: \n");
scanf("%f",&STF[i].srednja_ocena);
}
sort(STF,n);
for(i=0;i<n;i++)
{
printf("student broj %d\n",i+1);
printf("Ime:%s\n",STF[i].Ime);
printf("Prezime:%s\n",STF[i].Prezime);
35
printf("Broj indeksa: %d\n",STF[i].broj_indeksa);
printf("Srednja ocena: %5.2f\n\n\n",STF[i].srednja_ocena);
}
}

53. /*Program za prevodjenje srpskih reci na engleske (srpsko-engleski recnik)*/


#include<stdio.h>
struct element {
char srpski[20];
char engleski[50];
};
int strcmp(char*s1,char*s2)
{
while(*s1==*s2)
{
if(!*s1)
return(0);
++s1;
++s2;
}
return(*s1-*s2);
}
int bin_search(struct element recnik[],char*ukaz_niz,unsigned n)
{
int low=0;
int mid,high=n-1;
int result;
while(low<=high)
{
mid=(low+high)/2;
result=strcmp(ukaz_niz,recnik[mid].srpski);
if(result<0)
high=mid-1;
else if(result>0)
low=mid+1;
else
return(mid+1);
}
return(0);
}
void main(){
static struct element recnik[100]=
{{"baba","old woman,grandmother"},
{"babica","widwife"},
{"badem","almond"},
{"bager","dredge"},
{"bajka","fairytale"},
{"bakalin","grocer"}};
unsigned j;
36
int n=10;
char rec[20];
printf("Ukucajte rec:\n");
scanf("%s",rec);
j=bin_search(recnik,rec,6);
if(!j)
printf("Zalim, rec %s nije u recniku\n",rec);
else
printf("%s\n",recnik[j-1].engleski);
}
54./* Napisati program koji pravi rang listu studenata koji su polagali prijemni ispit. Sa standardnog
ulaza se unose sledeci podaci: ime studenta, cetiri ocene iz prethodnog skolovanja i broj bodova na
prijemnom ispitu.*/

#include<stdio.h>
#define DIM 10
typedef struct student{
char ime[20];
int brBodova;/*Ukupna suma bodova svakog studenta: ocene + prijemni*/
};
void razmeni(struct student *a, struct student *b){
struct student tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
void sort(struct student niz[], int n){
int i, j;
for(i=0; i<n-1; i++)
for(j=i; j<n; j++)
if(niz[i].brBodova<niz[j].brBodova)
razmeni(&niz[i], &niz[j]);
}
void main(){
struct student nizStudenata[DIM];
int n, i, j;
static int ocene[5];
int bodovi;
static int sumaOcena[DIM];/*Suma ocena iz prethodnog skolovanja*/
printf("Uneti broj studenta koji je polagao prijemni: ");
scanf("%d", &n);
for(i=0; i<n; i++){
printf("Uneti ime studenta: ");
scanf("%s", &nizStudenata[i].ime);
printf("Uneti cetiri ocene iz prethodnog skolovanja: ");
for(j=0; j<4; j++){
scanf("%d", &ocene[j]);
sumaOcena[i]+=ocene[j];
//printf("Suma ocena je: %d\n", sumaOcena[i]);
}
printf("Uneti broj bodova sa prijemnog: ");
scanf("%d", &bodovi);

37
nizStudenata[i].brBodova=sumaOcena[i]+bodovi;
printf("Ukupna suma bodova svakog studenta: ocene + prijemni je: %d\n",
nizStudenata[i].brBodova);
}
sort(nizStudenata, n);
printf("Rang lista studenata je:\n\n");
for(i=0; i<n; i++)
printf("%s\t%d\n", nizStudenata[i].ime, nizStudenata[i].brBodova);

55. /*Definisati strukturu GRAD sa podacima clanovima: ime, broj_stanovnika,


prosecan_dohodak_radnika. Napisati program kojim se unose podaci o gradovima u Srbiji i stampati
na standardnom izlazu ime grada sa najvecim brojem stanovnika. Izracunati ukupan dohodak svih
unetih gradova.*/

#include<stdio.h>
#define DIM 10
typedef struct grad{
char ime[20];
int brStan;
float dohodak;
};
void main(){
struct grad nizGradova[DIM];
int i, n;
float ukupanDohodak=0.0;
int najveci;
int indeksNajvecegGrada;
printf("Uneti koliko gradova ima: ");
scanf("%d", &n);
for(i=0; i<n; i++){
printf("Uneti ime grada: ");
scanf("%s", &nizGradova[i].ime);
printf("Uneti broj stnovnika: ");
scanf("%d", &nizGradova[i].brStan);
printf("Uneti dohodak: ");
scanf("%f", &nizGradova[i].dohodak);
ukupanDohodak+=nizGradova[i].dohodak;
}
printf("Ukupan dohodak svih gradova je: %6.2f\n", ukupanDohodak);
najveci=nizGradova[0].brStan;
indeksNajvecegGrada=0;
for(i=0; i<n; i++){
if(nizGradova[i].brStan>najveci){
najveci=nizGradova[i].brStan;
indeksNajvecegGrada=i;
}
}
printf("Grad sa najvise stanovnika je %s\n", nizGradova[indeksNajvecegGrada].ime);
}

38
56. /*Napisati program za formiranje strukture podataka telefonski_imenik sa poljima: prezime, broj
i adresa. Napisati program za sortiranje imenika prema prezimenu pretplatnika.*/
#include<stdio.h>
#define DIM 10
typedef struct telefonski_imenik{
char prezime[20];
char broj[10];
char adresa[20];
};
void razmeni(struct telefonski_imenik *a, struct telefonski_imenik *b){
struct telefonski_imenik tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
void sort(struct telefonski_imenik niz[], int n){
int i, j;
for(i=0; i<n-1; i++)
for(j=i; j<n; j++)
if(niz[i].prezime<niz[j].prezime)
razmeni(&niz[i], &niz[j]);
}
void main(){
struct telefonski_imenik nizImenik[DIM];
int n, i;
printf("Uneti broj telefonskih pretplatnika: ");
scanf("%d", &n);
for(i=0; i<n; i++){
printf("Uneti prezime pretplatnika: ");
scanf("%s", &nizImenik[i].prezime);
printf("Uneti broj telefona pretplatnika: ");
scanf("%s", &nizImenik[i].broj);
printf("Uneti adresu pretplatnika: ");
scanf("%s", &nizImenik[i].adresa);;
}
sort(nizImenik, n);
printf("\nTelefonski imenik sortiran po prezimenu pretplatnika je:\n\n");
for(i=0; i<n; i++)
printf("%s\t%s\t%s\n", nizImenik[i].prezime, nizImenik[i].broj, nizImenik[i].adresa);

39
RAD SA DATOTEKAMA

Datotekama se pristupa korišćenjem pokazatelja na strukturu FILE, koja je definisana u


include datoteci stdio.h. Datoteka stdio.h se uključuje u program iskazom #include. U stdio.h
definisane su i konstante EOF i NULL. Konstanta EOF označava kraj datoteka i najčešće ima
vrednost -1. Konstanta NULL ima vrednost 0, i vraća se kao rezultat nekih funkcija za upravljanje
datotekama u slučaju neuspešnog izvršavanja funkcija.
fopen vraća pokazatelj na strukturu FILE, koji se dodeljuje promenljivoj in_file istog tipa. U
slučaju neuspešnog otvaranja fopen, vraća vrednost NULL. Iz tog razloga neophodno je ispitati
vraćenu vrednost, odnosno, dodati iskaz
if(in_file==NULL)
printf(“Datoteka file1 ne moze biti otvorena\n”);
Da bi se izvršila neka operacija datoteka mora biti otvorena, pozivanjem odgovarajuće
funkcije i specificiranjem imena datoteke. Prilikom otvaranja datoteke, mora se specificirati tip
željene ulalzno/izlazne operacije. Npr. ako se želi pročitati sadržaj datoteke, specificira se režim
čitanja "r"(eng. read mode); ako se neki sadržaj upisuje u datoteku, specificira se režim upisa "w"
(eng. write mode); ako se želi dodati neki sadržaj, specificira se režim dodavanja "a" (eng. append
mode). Da bi se ažurirao sadržaj datoteke (naizmenično čitanje i pisanje), prethodnim oznakama se
dodaje znak +, nezavisno koji je osnovni režim rada. Pri radu sa binarnim datotekama prethodnim
oznakama se dodaje i slovo b.
Zatvaranje datoteke vrši se funkcijom fclose čija je deklaracija:
int fclose(FILE *dat);
dat je pokazivač datoteke koji je pridružen datoteci koja se zatvara. Vrednost funkcije je nula u
slučaju uspeha, a smibolička konstanta EOF u slučaju otkrivanja greške.
Funkcija koja čita iz datoteke dat najviše br podataka veličine vel bajtova u memoriju počev
od adrese niz:
int fread(void *niz, int vel, int br, FILE *dat);
Primer za čitanje niza od najviše n_max celobrojnih podataka iz datoteke podaci:
n=fread(vektor, sizeof(int), n_max, podaci);
int fwrite(const void *niz, int vel, int br, FILE *dat);
Funkcije za štampanje i unos podataka:
fprintf-za štampanje podataka u datoteci (fajlu)
sprintf-za štampanje znakovnog niza
fscanf-za unos podataka u datoteku
sscanf-za unos znakovnog niza.
Funkcija getc() učitava jedan karakter iz specificirane datoteke. Ova funkcija je vrlo slična
već opisanoj funkciji getchar, s tom razlikom što se učitavanje ne obavlja sa terminala nego iz
datoteke. getc vraća vrednost EOF, ako je dosegnut kraj datoteke.
Funkcija putc upusuje karakter u specificiranu datoteku. Zaglavlje funkcije je
int putc(c,file_pointer)
char c;
FILE*file_pointer;
Na pr. pozivom putc(‘z’,in_file); u datoteku in_file upisujemo karakter ‘z’.
Pozicioniranje na mesto u datoteci dat čija je udaljenost pomeraj bajtova od označene
reperne tačke data je funkcijom:
int fseek(FILE*dat, long pomeraj, int reper);
Moguće reperne tačke obeležavaju se sibmoličkim konstantama SEEK_SET (početak datoteke),
SEEK_CUR (trenutna pozicija u datoteci) ili SEEK_END (kraj datoteke). Sledeće čitanje ili pisanje

40
vršiće se počevši od ovako odabrane pozicije u datoteci. Funkcija za pozicioniranje na početak
datoteke dat je:
void rewind(FILE *dat);

57. /*Odrediti broj linija u tekstualnom fajlu sa imenom knjiga.txt.*/


#include<stdio.h>
void main()
{
int k=0;
FILE *fp;
char s[256];
if((fp=fopen("knjiga.txt","r"))==NULL)
{
perror("Greska");
return;
}
while(fgets(s,256,fp)!=NULL)k++;
printf("Fajl ima %d linija\n",k);
fclose(fp);
}

58. /*Napisati program kojim se sadržaj fajla test.dat formiran od velikih slova alfabeta
šifriran šalje u fajl sifra.dat. Znak se šifrira tako što se zamenjuje sledećim ASCII znakom, a
znak Z zamenjuje sa A.*/
#include<stdio.h>
void main()
{
int c;
FILE *inf,*outf;
inf=fopen("test.dat","r");
outf=fopen("sifra.dat","w");
while((c=fgetc(inf))!=EOF)
{
if('A'<=c&&c<'Z')
c++;
else c='A';
putc(c,outf);
}
fclose(inf);
fclose(outf);
}

59. /*U tekstualnom fajlu odrediti najdužu liniju. Ako ima više linija najveće dužine odrediti
prvu među njima.*/
#include<stdio.h>
#include<string.h>
void main()
{
unsigned k=0,maxl;
41
char s[256],maxs[256];
FILE *fp;
if((fp=fopen("test.txt","r"))==NULL)
{
printf("Greska\n ");
return;
}
maxl=0;
while(fgets(s,256,fp)!=NULL)
if(strlen(s)>maxl)
{
maxl=strlen(s);
strcpy(maxs,s);
}
printf("Najduza linija\n%s\n ima duzinu %d\n",maxs,maxl);
fclose(fp);
}

60. /*Napisati program koji poredi dva fajla i ispisuje prvu liniju u kojoj se razlikuju.*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXLINE 100
void main()
{
FILE *fp1;
FILE *fp2;
void filecomp(FILE *fp1, FILE *fp2);
if((fp1=fopen("prvi.txt","r"))==NULL)
{
perror("Ne moze se otvoriti prvi.txt");
return;
}
if((fp2=fopen("drugi.txt","r"))==NULL)
{
perror("Ne moze se otvoriti drugi.txt");
return;
}
filecomp(fp1,fp2);
fclose(fp1);
fclose(fp2);
}
void filecomp(FILE *fp1,FILE *fp2)
{
char line1[MAXLINE], line2[MAXLINE];
char *lp1,*lp2;
do
{
lp1=fgets(line1, MAXLINE, fp1);
42
lp2=fgets(line2, MAXLINE, fp2);
if(lp1==line1&&lp2==line2)
{
if(strcmp(line1,line2)!=0)
{
printf("Prva razlika je u liniji\n%s\n",line1);
lp1=lp2=NULL;
}
}
else
if(lp1!=line1&&lp2==line2)
printf("Kraj prvog fajla u liniji \n%s\n",line2);
else
if(lp1==line1&&lp2!=line2)
printf("Kraj drugog fajla u liniji \n%s\n",line1);
}
while(lp1==line1&&lp2==line2);
}

61./*Napisati program za učitavanje datoteke pod imenom ulaz.dat i formiranje datoteke sa


nazivom izlaz.dat koja sadrži samo one redove ulazne datoteke ulaz.dat u kojima se nalazi reč
“fakultet”.*/
#include<stdio.h>
#include<string.h>
void main()
{
FILE *ulaz;
FILE *izlaz;
char buffer[80];
char trazenaRec[]="fakultet";
if((ulaz=fopen("ulaz.dat","r"))==NULL)
printf("Datoteka ulaz.dat nije otvorena.");
if((izlaz=fopen("izlaz.dat","w"))==NULL)
printf("Datoteka izlaz.dat nije otvorena.");
while(!feof(ulaz)){
fgets(buffer,80,ulaz);
if(strstr(buffer,trazenaRec)!=NULL){
printf("%s",buffer); /*stamanje na ekranu*/
fprintf(izlaz,"%s",buffer);
}
}
fclose(ulaz);
fclose(izlaz);
}

62. /*Napisati program koji cita podatke iz datoteke ULAZ.TXT (ime studenta, broj bodova na
prijemnom ispitu), broji sve studente koji imaju broj bodova veci od proseka i upisuje podatke o
takvim studentima u datoteku IZLAZ.TXT.*/

43
#include<stdio.h>
#define DIM 10
typedef struct student{
char ime[20];
int brBodova;
};
int main(){
struct student nizStudenata[DIM];
int i;
int brojStudenata=0;
int suma=0;
float prosek;
FILE *ulaz;
FILE *izlaz;
ulaz=fopen("ulaz.txt", "r");
if(ulaz==NULL){
printf("Ulazna datoteka nije otvorena!\n");
return 1;
}
izlaz=fopen("izlaz.txt", "w");
if(izlaz==NULL){
printf("Izlazna datoteka nije kreirana!\n");
return 1;
}
while(!feof(ulaz)){
fscanf(ulaz, "%s%d", &nizStudenata[brojStudenata].ime,
&nizStudenata[brojStudenata].brBodova);
suma+=nizStudenata[brojStudenata].brBodova;
brojStudenata++;
}
prosek=(float)suma/brojStudenata;
for(i=0; i<brojStudenata; i++)
if(nizStudenata[i].brBodova>prosek)
fprintf(izlaz, "%s\t%d\n", nizStudenata[i].ime, nizStudenata[i].brBodova);
fclose(ulaz);
fclose(izlaz);
return 0;
}

63. /*Napisati program za nalazenje i stampanje na ekranu zbira ASCII kodova svih znakova zadate
datoteke pod imenom ULAZ.TXT*/

#include<stdio.h>
#include<string.h>
int main(){
FILE *in;
int ascii;
int suma=0;
in=fopen("ulaz.txt", "r");
if(in==NULL){
printf("Ulazni fajl nije otvoren!");
return 1;
}

44
while(!feof(in)){
ascii=fgetc(in);
suma+=ascii;
printf("%c=\t%d\n",ascii, ascii);
//putc(fgetc(in), stdout);
}
printf("Suma svih znakova je: %d\n",suma);
fclose(in);
return 0;
}

64. /*U datoteci IMENIK.TXT nalaze se sledeci podaci: ime, prezime i broj telefona telefonskog
pretplatnika. Napisati program koji vrsi sortiranje imenika prema prezimenu pretplatnika i za zadato
prezime prikazuje telefonski broj pretplatnika na standardnom izlazu.*/

#include<stdio.h>
#include<string.h>
#define DIM 10
typedef struct telefonski_imenik{
char ime[10];
char prezime[20];
char broj[10];
};
void razmeni(struct telefonski_imenik *a, struct telefonski_imenik *b){
struct telefonski_imenik tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
void sort(struct telefonski_imenik niz[], int n){
int i, j;
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
if(niz[i].prezime<niz[j].prezime)
razmeni(&niz[i], &niz[j]);
}
int main(){
struct telefonski_imenik nizImenik[DIM];
int n, i;
FILE *in;
char trazi[20];
in=fopen("imenik.txt", "r");
if(in==NULL){
printf("Ulazni fajl nije otvoren!");
return 1;
}
i=0;
while(!feof(in)){
fscanf(in, "%s%s%s", &nizImenik[i].ime, &nizImenik[i].prezime, &nizImenik[i].broj);
i++;
}
fflush(in);
n=i+1;

45
sort(nizImenik, n);
printf("\nTelefonski imenik sortiran po prezimenu pretplatnika je:\n\n");
for(i=0; i<n; i++)
printf("%s\t%s\t%s\n", nizImenik[i].prezime, nizImenik[i].ime, nizImenik[i].broj);
printf("Ukupan broj telefonskih pretplatnika je: %d\n",n);
printf("Zadati prezime pretplatnika: ");
scanf("%s", &trazi);
for(i=0; i<n; i++){
if(strcmp(nizImenik[i].prezime,trazi)==0){
printf("Broj telefoma trazenog pretplatnika je:\n");
printf("%s\t%s\t%s\n", nizImenik[i].prezime, nizImenik[i].ime, nizImenik[i].broj);
}
}
fclose(in);
return 0;
}

65. /*Datoteka sadrzi proizvoljan broj tacaka u ravni predstavljenih (x, y) koordinatama. Napisati
program koji za ucitanu tacku odredjuje minimalno rastojanje od tacaka u navedenoj datoteci.*/

#include<stdio.h>
#include<math.h>
int main(){
FILE *in;
double rastojanje;
int x0, y0, x, y;
int brojacTacaka=0;
double minimalnoRastojanje;
int i;
double nizRastojanja[100];
in=fopen("tacke.txt", "r");
if(!in){
printf("Ulazna datoteka ne postoji!\n");
return 1;
}
printf("Uneti x i y koordinatu referentne tacke: ");
scanf("%d%d", &x0, &y0);
while(!feof(in)){
fscanf(in, "%d%d", &x, &y);
if(x0<x && y0<y)
rastojanje=sqrt(pow(x-x0, 2) + pow(y-y0, 2));
else if(x0>x && y0>y)
rastojanje=sqrt(pow(x0-x, 2) + pow(y0-y, 2));
else if(x0<x && y0>y)
rastojanje=sqrt(pow(x-x0, 2) + pow(y0-y, 2));
else if(x0>x && y0<y)
rastojanje=sqrt(pow(x0-x, 2) + pow(y-y0, 2));

nizRastojanja[brojacTacaka]=rastojanje;/*Rastojanje svake tacke od referentne pamtimo u


nizu*/
printf("Rastojanje od %d tacke je: %8.4le\n", brojacTacaka+1, nizRastojanja[brojacTacaka]);
brojacTacaka++;
}

46
minimalnoRastojanje=nizRastojanja[0];/*Pretpostavimo da je minimalno rastojanje izmedju prve
tacke*/
for(i=0; i<brojacTacaka; i++){
if(nizRastojanja[i]<minimalnoRastojanje)
minimalnoRastojanje=nizRastojanja[i];
}
printf("Rastojanje najblize tacke od referentne je: %8.4le\n", minimalnoRastojanje);
fclose(in);
return 0;
}

66. /*Dodavanje novih zapisa u datoteku o stedisama*/ stednovi.c


#include<stdio.h>
typedef struct{char prezime[16], licno_ime[16];} Ime_i_prezime;
typedef struct{Ime_i_prezime ime; double stanje;} Stedisa;
void main(){
FILE *stednja;
Stedisa stedisa;
Stedisa prazno={0};
unsigned int sifra;
unsigned int veldat;
/*Otvaranje datoteka o stedisama*/
if ((stednja=fopen("stedise.dat","r+b"))==NULL)
/*Datoteka postoji, citanje broja zapisa u datoteci*/
fread(&veldat, sizeof veldat, 1, stednja);
else{
/*Datoteka ne postoji, stvaranje prezne datoteke*/
stednja=fopen("stedise.dat","w+b"); veldat=0;
fwrite(&veldat, sizeof veldat, 1, stednja);
}
/*Dodavanje zapisa o novim stedisama*/
while(1){
/*Citanje podataka o stedisi*/
printf("\nSifra stedise? "); scanf("%d",&sifra);
if(sifra==0) break; /*Zavrsetak programa*/
printf("Prezime stedise? ");
scanf("%s", stedisa.ime.prezime);
printf("Licno ime stedise? ");
scanf("%s", stedisa.ime.licno_ime);
stedisa.stanje=0;
/*Priprema za upisivanje podataka u datoteku*/
if(sifra>veldat){
/*Novi zapis je iza kraja datoteka, promena velicine datoteke*/
fseek(stednja, 0L, SEEK_END);
while(++veldat<sifra) fwrite(&prazno, sizeof prazno, 1, stednja);
veldat=sifra;
}else
/*Novi zapis je pre kraja datoteke, nalazenje njegovog mesta*/
fseek(stednja, (sizeof veldat)+(long) (sifra-1)*(sizeof stedisa),
SEEK_SET);
47
/*Upisivanje podataka u datoteku*/
fwrite(&stedisa, sizeof stedisa, 1, stednja);
rewind(stednja); fwrite(&veldat, sizeof veldat, 1, stednja);
}
}

67. /*Ispisivanje sadrzaja datoteke o stedisama*/ stedpisi.c

#include<stdio.h>
#include"stedisa.h"
typedef struct{char prezime[16], licno_ime[16];} Ime_i_prezime;
typedef struct{Ime_i_prezime ime; double stanje;} Stedisa;
void main(){
FILE*stednja;
Stedisa stedisa;
unsigned int sifra;
unsigned int veldat;
unsigned int i, k;
/*Otvaranje datoteke o stedisama*/
if((stednja=fopen("stedise.dat","r+b"))==NULL) exit(1);
fread(&veldat, sizeof veldat, 1, stednja);
/*Ispisivanje podataka o pojedinim stedisama*/
for(sifra=1;sifra<=veldat;sifra++){
/*Citanje sledeceg zapisa iz datoteke*/
printf("%3d", sifra);
fread(&stedisa, sizeof stedisa, 1, stednja);
if(stedisa.ime.prezime[0]!='\0'){
/*Prikaz podataka o postojecem stedisi*/
k=printf("%s%s", stedisa.ime.prezime, stedisa.ime.licno_ime);
for(i=k; i<34; i++) putchar(' ');
printf("%8.2f\n",stedisa.stanje);
}else
/*Prazan zapis, stedisa ne postoji*/
printf("***Ne postoji stedisa sa ovom sifrom***\n");
}
}

68. /*Azuriranje zapisa u datoteci o stedisama*/ stedazur.c

#include<stdio.h>
typedef struct{char prezime[16], licno_ime[16];} Ime_i_prezime;
typedef struct{Ime_i_prezime ime; double stanje;} Stedisa;
void main(){
FILE*stednja;
Stedisa stedisa;
unsigned int sifra;
unsigned int veldat;
double promena;
/*Otvaranje datoteke o stedisama*/
48
if((stednja=fopen ("stedise.dat", "r+b"))==NULL) exit(1);
fread(&veldat, sizeof veldat, 1, stednja);
/*Azuriranje stanja uloga pojedinih stedisa*/
while(1){
/*Citanje sifre sledeceg stedise za obradu*/
printf("\nSifra stedise?", " ");
scanf("%d",&sifra);
if(sifra==0)break;
if(sifra<=veldat){
/*Citanje zatecenih podataka o stedisi iz datoteke*/
fseek(stednja, (sizeof veldat)+(long)(sifra-1)*(sizeof stedisa), SEEK_SET);
fread(&stedisa, sizeof stedisa, 1, stednja);
if(stedisa.ime.prezime[0]){
/*Prikazivanje zatecenih podataka o stedisi*/
printf("Stedisa=%s %s\n",stedisa.ime.prezime, stedisa.ime.licno_ime);
printf("Staro stanje=%8.2f\n", stedisa.stanje);
/*Citanje promene stanja uloga*/
printf("Promena stanja? ");
scanf("%lf",&promena);
stedisa.stanje+=promena;
/*Upisivanje novog sadrzaja zapisa o stedisi u datoteku*/
fseek(stednja, -(long) (sizeof stedisa), SEEK_CUR);
fwrite(&stedisa, sizeof stedisa, 1, stednja);
}else
printf("***Ne postoji stedisa sa tom sifrom***\n");
}else
printf("***Ne postoji stedisa sa tom sifrom***\n");
}
}

49

Vous aimerez peut-être aussi