Académique Documents
Professionnel Documents
Culture Documents
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.
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)
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;
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.
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.
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.
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
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);
}
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
x0, ako je n ceo broj.*/
1, n 0
n 1
x n
x x , n 0
1 / x n , n 0
11
1 , n 0
stepen x , n x stepen x , n 1 , n 0
1 / stepen x , n , n 0
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’};
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]);
}
}
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);
}
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}
};
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);
}
22
POKAZIVAČI (POINTERI)
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
}
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
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
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);
}
return l;
}
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++]));
}
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);
}
}
#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);
#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
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);
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);
}
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));
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;
}
#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");
}
}
#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