26
Uvod u programiranje 1 #include <stdio.h> 2 3 int main() 4 { 5 printf("Zdravo, svete!\n"); 6 return 0; 7 } Nemanja Mićović SystemPro Maj 2016

Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

  • Upload
    hadat

  • View
    244

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

Uvod u programiranje

1 #include <stdio.h>2

3 int main()4 {5 printf("Zdravo, svete!\n");6 return 0;7 }

Nemanja Mićović

SystemProMaj 2016

Page 2: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

Sadržaj

Sadržaj 1

1 Prvi programerski koraci 31.1 Istorijat programskog jezika C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2 Od čega se sastoji C program? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.3 Naš prvi C program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.4 Pisanje na standardni izlaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.5 Čitanje sa standardnog ulaza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2 Karakteri 52.1 Osnovno o karakterima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2 Funkcije za rad sa karakterima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.3 Primeri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3 Petlje 9

4 Funkcije 114.1 Zašto su nam funkcije potrebne? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.2 Šta čini jednu funkciju? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.3 Korisničke funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

5 Nizovi 15

6 Niske 17

7 Tekstualne datoteke 197.1 O tekstualnim datotekama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207.2 Korisne funkcije iz programskog jezika C . . . . . . . . . . . . . . . . . . . . . . . . . 207.3 Rad sa tekstualnim datotekama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Bibliografija 25

1

Page 3: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

Sadržaj

Zdravo svete!

Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima prve godine školeračunara SystemPro iz programskog jezika C. Najnovija verzija skripte je dostupna na Veb adresi:www.github.com/termninja/uopc.

Tekst je izrađen u LATEX- u, i ukoliko vas interesuje sam LATEX, savetujem da pogledate [2].Izvorni kod tex dokumenta je dostupan na gore navedenoj github stranici.

Ovom prilikom bih se zahvalio svojim učenicima koji su mi tokom nastave ukazali na raznepropuste i greške i time učinili ovu skriptu znatno boljom. .

Skripta je u izradi.

Kontakt: [email protected].

Autor

2

Page 4: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

POGLAVLJE 1Prvi programerski koraci

3

Page 5: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

1. Prvi programerski koraci

1.1 Istorijat programskog jezika C

1.2 Od čega se sastoji C program?

1.3 Naš prvi C program

1.4 Pisanje na standardni izlaz

1.5 Čitanje sa standardnog ulaza

4

Page 6: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

POGLAVLJE 2Karakteri

5

Page 7: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

2. Karakteri

2.1 Osnovno o karakterima

Karakteri su jedan od osnovnih tipova podataka koji su dostupni u programskom jeziku C. Deklaracijapromenljive čiji je tip karakter se može ostvariti na sledeći način:

1 char x = ’t’;2 char y = ’abc’; // GRESKA! Karakter moze biti samo JEDAN

Primetimo da se promenljiva čiji je tip karakter označava sa char, što je skraćeno od engleskereci character, a sam karakter se navodi pod jednostrukim navodnicima.

U programskom jeziku C, karakteri su reprezentovani svojim kodiranjem, koje je najčešće reali-zovano korišćenjem ASCII kodne šeme koja je prikazana na slici 2.1.

Osnovna ideja kodiranja jeste da se karakterima dodeli numerička vrednost koja ih jedinstvenoodređuje, čime dobijamo mogućnost da bilo koji karakter reprezentujemo brojem. Računar možedati karakter prikazati u obliku koji mi prepoznajemo koristeći kodnu šemu poput ASCII šeme.

Promenljiva tipa char zauzima 1 bajt (8 bita). 1 bajt može da reprezentuje brojeve [0, 255] ili[−128, 127], a možemo primetiti da ASCII tabela sadrži tačno 128 karaktera.

Kako da zapišemo reč zdravo korišćenjem ASCII kodiranja?

122 100 114 097 118 111z d r a v o

Testirajmo sledeći C program:

1 #include <stdio.h>2 int main() {3 char a1 = ’z’; char b1 = 122;4 char a2 = ’d’; char b2 = 100;5 char a3 = ’r’; char b3 = 114;6 char a4 = ’a’; char b3 = 97;7 char a5 = ’v’; char b5 = 118;8 char a6 = ’o’; char b6 = 111;9 char a7 = ’!’; char b7 = 33;

10 printf("Karakteri: %c%c%c%c%c%c%c\n", a1, a2, a3, a4, a5, a6, a7);11 printf("ASCII kodovi: %c%c%c%c%c%c%c\n", b1, b2, b3, b4, b5, b6, b7);12 return 0;13 }

Rezultat rada programa je sledeći:Karakteri: zdravo!ASCII kodovi: zdravo!

Možemo primetiti da promenljivama čiji je tip char se može direktno dodeliti ASCII kod karak-tera koji želimo da upišemo.

Sledeći primer ilustruje kako možemo prikazati ASCII kodove samih karaktera:

6

Page 8: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

2.1. Osnovno o karakterima

1 #include <stdio.h>2 int main() {3 char a1 = ’z’;4 char a2 = ’d’;5 char a3 = ’r’;6 char a4 = ’a’;7 char a5 = ’v’;8 char a6 = ’o’;9 char a7 = ’!’;

10 printf("ASCII kodovi: %d %d %d %d %d %d %d\n", a1, a2, a3, a4, a5, a6, a7);11 return 0;12 }

Rezultat rada programa je sledeći:ASCII kodovi karaktera: 122 100 114 097 118 111 33

Slika 2.1: ASCII tabela

7

Page 9: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

2. Karakteri

2.2 Funkcije za rad sa karakterima

2.3 Primeri

1 #include <stdio.h>2 int main()3 {4 char c1 = ’a’, c2 = ’5’;5 char c3 = ’#’;6 printf("%c %c %c\n’, c1, c2, c3);7 return 0;8 }

8

Page 10: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

POGLAVLJE 3Petlje

9

Page 11: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima
Page 12: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

POGLAVLJE 4Funkcije

11

Page 13: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

4. Funkcije

4.1 Zašto su nam funkcije potrebne?

Često nam se u kodu javlja potreba da neke stvari uradimo ponovo, odnosno, kod je svuda ili sličanili isti, i nema potrebe da ponovo pišemo istu stvar. Šta ako pogrešimo jos prvi put, a isti kod smokoristili u još 4 dela programa? Ili šta ako nam isti kod treba na još par mesta? Prirodno je dapokušamo da navedeni kod uopštimo i izdvojimo, dodelimo mu ime, i onda ga koristimo po potrebi.Ako postoji greška u takvom kodu, potrebno ju je otkloniti na samo jednom mestu.

Funkcija je kratak1 niz instrukcija koje imaju neki cilj, a sama funkcija ima svoje ime kako bimogla biti pozvana.

Na primer, potrebno je da sortiramo niz brojeva u programu, i to 3 puta. Jedan od pristupa bibio da implementiramo algoritam sortiranja svaki put kada to bude neophodno, a drugi da imple-mentiramo funkciju sortiranja i onda kada god nam je potrebno sortiranje izvršimo njen poziv.

Sledeći kod ilustruje primenu naših korisnički definisanih funkcija koje sabiraju brojeve i ste-penuju broj.

1 #include <stdio.h>2

3 int saberi(int a, int b)4 {5 int rezultat c = a + b;6 return rezultat;7 }8

9 int stepenuj(int x, int k)10 {11 int rezultat = 1;12 while (k > 0) {13 rezultat = rezultat + rezultat * x;14 k--;15 }16 return rezultat;17 }18

19 int main()20 {21 printf("10 + 2 = %d\n", saberi(10, 2));22 printf("2^5 = %d\n", stepenuj(2, 5));23 int z = saberi(99, 1);24 printf("99 + 1 = %d\n", z);25 return 0;26 }

Prednosti korišćenja funkcija:

• Smanjuje se ponavljanje koda

• Korisnik funkcije ne mora da zna kako funkcija radi

1Pojam kratak je relativna stvar, funkcija može imati i 1 naredbu, a možda i 200. Ne postoji precizno pravilo udužini funkcije.

12

Page 14: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

4.2. Šta čini jednu funkciju?

• Omogućava se lakši timski rad

• Lakše je deljenje koda

• Lakše je održavanje programa

• Kod je mnogo čitljiviji

• Funkcije se mogu grupisati u biblioteku funkcija (npr. stdlib.h, stdio.h)

4.2 Šta čini jednu funkciju?

Osnovni delovi jedne funkcije su:

• Ime funkcije

• Argumenti funkcije

• Povratna vrednost funkcije

• Definicija funkcije

• Deklaracija funkcije

Ime funkcije je slično imenu promenljive. Dodeljujemo ime funkciji kako bismo mogli da je po-zovemo u kodu kada nam bude bila potrebna.

Argumenti funkcije su promenljive koje funkcija dobija za svoj rad. Na primer, funkcija zasabiranje kao argumente dobija dva broja (npr tipa int), a funkcija za sortiranje niza dobijaniz i njegovu dužinu.

Povratna vrednost funkcije nam govori da li funkcija ima povratnu vrednost, i ako ima, kojaje. Povratna vrednost nam omogućava da sačuvamo rezultat funkcije. Na primer, povratnavrednost funkcije saberi je tipa int.

Definicija funkcije predstavlja niz instrukcija koje definišu kako funkcija radi. Na primer, zasabiranje to predstavlja samo sabiranje brojeva, a za sortiranje, to predstavlja kako se sortiraniz.

Deklaracija funkcije predstavlja sve gore navedeno bez definicije i koristi se da nekome stavimodo znanja kako da koristi našu funkciju. Da li smo do sada morali da znamo kako radifunkcija printf?

1 int saberi(int a, int b);2 int oduzmi(int a, int b);3 void predstaviSe(char ime[], char prezime[]);4 void sortirajNiz(int a[], int duzinaNiza);5 double sqrt(double x);

13

Page 15: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

4. Funkcije

4.3 Korisničke funkcije

Kada pišemo našu funkciju, potrebno je da definišemo njene osnovne delove koji su navedeni uprethodnom delu teksta.

Pretpostavimo da pišemo funkciju koja računa rastojanje između dve tačke.

Ime funkcije može biti rastojanjeTacaka jer odgovara tome šta funkcija radi.

Argumenti funkcije će biti 4 realna broja, odnosno koordinate tačaka. Nazovimo ih x1, y1, x2 iy2 i uzmimo da je njihov tip double.

Povratna vrednost funkcije treba da bude izračunato rastojanje između zadatih tačaka.Tip rastojanja treba da bude realan broj, odnosno double ili float, no biramo double jer sunam argumenti toga tipa.

Definicija funkcije će predstavljati niz naredbi u C-u kojim računamo rastojanje između datihtačaka.

Deklaracija funkcije će obuhvatiti gore navedeno i biće prikazana u kodu koji sledi.

Kada smo odgovorili na navedeno, onda se pristupa implementaciji funkcije.

1 // deklaracija funkcije2 double rastojanjeTacaka(double x1, double y1, double x2, double y2);3

4 // implementacija same funkcije5 double rastojanjeTacaka(double x1, double y1, double x2, double y2)6 {7 double d = sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );8 return d;9 }

Ukoliko nam u kodu kasnije zatreba rastojanje između tačaka, sve što treba je da pozovemokreiranu funkciju. Jedan jednostavan C programi bi mogao izgledati na sledeći način.

1 #include <stdio.h>2 #include <math.h>3

4 double rastojanjeTacaka(double x1, double y1, double x2, double y2)5 {6 double d = sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );7 return d;8 }9

10 int main()11 {12 double x1, y1, x2, y2;13 scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);14 double rastojanje = rastojanjeTacaka(x1, y1, x2, y2);15 printf("Rastojanje izmedju unetih tacaka je: %.2lf\n", rastojanje);16 return 0;17 }

14

Page 16: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

POGLAVLJE 5Nizovi

15

Page 17: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima
Page 18: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

POGLAVLJE 6Niske

17

Page 19: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima
Page 20: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

POGLAVLJE 7Tekstualne datoteke

Poglavlje ce nas upoznati sa korišćenjem tekstualnih datoteka kroz programski jezik C.

19

Page 21: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

7. Tekstualne datoteke

7.1 O tekstualnim datotekama

Tekstualne datoteke su datoteke koje u sebi sadrže niz karaktera. Često su im pridružene ekstenzijetxt. Primetimo da je izvorni kod c programa ništa drugo do tekstualna datoteka sa ekstenzijom c(npr deleteHardDrive.c, helloWorld.c).

Karakteri mogu biti slova, cifre, specijalni simboli, znakovi interpunkcije i slično. Znajući daračunar razume samo binarni brojevni sistem, potrebno je da nekako umemo da zapišemo potrebnekaraktere korišćenjem brojeva, i za to koristimo razna kodiranja poput ASCII i UTF-8.

Slika 2.1 prikazuje ASCII tabelu. Podsetimo se da programski jezik C koristi ASCII kodiranje zareprezentovanje karaktera te je numerička vrednost proizvoljnog karaktera uvek jednaka njegovomASCII kodu. Na primer, numerička vrednost karaktera ’a’ je 97 dekadno.

7.2 Korisne funkcije iz programskog jezika C

Biće navedeno 5 najkorisnijih funkcija za rad sa fajlovima koje ćemo koristiti, no naravno postojijoš. U delu ?? je ilustrovana njihova primena.

1 // Otvara fajl cije je ime ’ime_fajla’ u rezimu ’rezim_otvaranja’2 FILE* fopen(char ime_fajla[], char rezim_otvaranja[]);3

4 // cita iz fajla na koji pokazuje ’fajl_koji_se_cita’, ... oznacavaju5 // da se ostatak funkcije koristi kao funkcija scanf6 int fscanf(FILE* fajl_koji_se_cita, ...);7

8 // pise u fajl na koji pokazuje ’fajl_u_koji_pisemo’, ... oznacavaju9 // da se ostatak funkcije koristi kao funkcija printf

10 int fprintf(FILE* fajl_u_koji_pisemo, ...);11

12 // provarava da li smo stigli do kraja fajla na13 // koji pokazuje ’fajl_ciji_kraj_proveravamo’14 int feof(FILE* fajl_ciji_kraj_proveravamo);15

16 // zatvara fajl na koji pokazuje ’fajl_koji_zatvaramo’17 void fclose(FILE* fajl_koji_zatvaramo);

7.3 Rad sa tekstualnim datotekama

Otvaranje i zatvaranje datotekeOtvaranje datoteke se realizuje korišćenjem funkcije fopen, a zatvaranje datoteke, korišćenjemfunkcije fclose.

Argumenti funkcije fopen su:

• Putanja ka fajlu koji se otvara

• Režim u kome se fajl otvara

Putanja ka fajlu je string kojim program zna da locira fajl na disku.

20

Page 22: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

7.3. Rad sa tekstualnim datotekama

Na primer (Windows), C:/Program Files/Programming/C/Itanimulli/ulaz.txt ili(Linux) /home/systempro/zadaci.txt.

Režim otvaranja fajla je string koji govori šta želimo da radimo sa fajlom. Može biti:

• r - fajl samo čitamo• w - u fajl pišemo (ako postoji brišemo mu sadržaj)• a - u fajl želimo da dodajemo sadržaj (na kraj fajla)

Kako da naš program zna sa kojom datotekom radimo? Potrebno je da imamo neku promenljivukoja će na neki način da pokazuje na fajl sa kojim radimo. Navedeno realizujemo koristeći tippodataka FILE*.

Pogledajmo sledeći primer (pretpostavimo da se u folderu gde se nalazi navedeni program, nalazii tekstualni fajl ulaz.txt.

1 #include <stdio.h>2

3 int main()4 {5 // deklarisemo promenljivu tipa FILE*6 FILE* ulazni_fajl;7

8 // promenljivu vezujemo na zeljeni tekstualni fajl9 // u rezimu za citanje (r - read)

10 ulazni_fajl = fopen("ulaz.txt", "r");11

12 // proveravamo da li je uspelo otvaranje fajla13 if (ulazni_fajl == NULL) {14 printf("Neuspelo otvaranje fajla!\n");15 exit(EXIT_FAILURE);16 }17

18 // ...19 // neke operacije nad fajlom...20 // ...21

22 // nakon sto nam fajl vise ne treba, zatvaramo ga23 fclose(ulazni_fajl);24 }

Šta znači karakter * u tipu FILE*? * označava da je promenljiva pokazivač na tip FILE. Šta jeonda pokazivač?

Pokazivač je promenljiva koja kao svoj sadržaj ima adresu iz RAM memorije koja ukazujena neku drugu adresu. Korišćenjem pokazivača možemo indirektno pristupiti lokaciji na koju pokazi-vač pokazuje.

Ili primenjeno na fajlove, pokazivač na fajl nas indirektno vezuje na potrebni fajl i omogućavanam da vršimo operacija nad fajlom kao što su čitanje, pisanje i slično.

Pokazivači su izuzetno bitna tema, no ona nije deo gradiva kojim se bavi ova skripta,te je o njima potrebno jedino znati prethodne dve rečenice. Jedino mesto gde će sepojavljivati jeste kada budemo radili sa tekstualnim datotekama.

21

Page 23: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

7. Tekstualne datoteke

Čitanje

Čitanje iz tekstualne datoteke realizujemo korišćenjem funkcije fcanf, koja se ponaša jako sličnofunkciji scanf, osim što kao prvi argument prima pokazivač na fajl čiji je tip FILE*.

Sledeći kod ilustruje kako iz tekstualne datoteke ulaz.txt možemo pročitati dva broja, i potomnjihov zbir ispisati na standardni izlaz.

1 #include <stdio.h>2 int main()3 {4 FILE* ulazni_fajl = fopen("ulaz.txt", "r");5 if (ulazni_fajl == NULL) {6 printf("Neuspelo otvaranje fajla!\n");7 exit(EXIT_FAILURE);8 }9 int a, b;

10 fscanf(ulazni_fajl, "%d", &a);11 fscanf(ulazni_fajl, "%d", &b);12 printf("Zbir: %d\n", a+b);13 fclose(ulazni_fajl);14 return 0;15 }

Pisanje

Pisanje iz tekstualne datoteke realizujemo korišćenjem funkcije fprintf, koja se ponaša jako sličnofunkciji printf, osim što kao prvi argument prima pokazivač na fajl čiji je tip FILE*.

Sledeći kod ilustruje kako u izlaznu datoteku izlaz.txt možemo upisati celi broj, realni broj, stringi karakter.

1 #include <stdio.h>2 int main()3 {4 FILE* izlazni_fajl = fopen("izlaz.txt", "w");5 if (izlazni_fajl == NULL) {6 printf("Neuspelo kreiranje/pisanje u fajl!\n");7 exit(EXIT_FAILURE);8 }9 int a = 5;

10 float b = 5.5;11 char c = ’$’;12 char d[] = "Na vrh vrba brda mrda.";13 fprintf(izlazni_fajl, "%d %f %c %s\n", a, b, c, d);14 fclose(izlazni_fajl);15 return 0;16 }

22

Page 24: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

7.3. Rad sa tekstualnim datotekama

Provera da li smo stigli do kraja fajlaŠta ukoliko je potrebno da pročitamo celokupan sadržaj fajla? Kako možemo znati da li smo stiglina sam kraj fajla? Postoji interni mehanizam kako se navedeno realizuje, no nećemo se time bavitiovde, već ćemo koristiti funkciju feof.

Funkcija feof kao argument prima promenljivu tipa FILE* pomoću koje proverava da li se stiglodo kraja samog fajla. Ako nismo stigli do kraja fajla, funkcija vraća 0, a ukoliko jesmo, vraća neštošto nije 0.

To nam omogućava da elegantno proverimo da li smo stigli do kraja fajla jednostavnom kon-strukcijom:

1 ...2 FILE* ulazni_fajl = ("ulaz.txt", "r");3 ...4 if (feof(ulazni_fajl)) {5 printf("Stigli smo do kraja fajla.\n");6 exit(EXIT_SUCCESS);7 }

Bitna napomena

Potrebno je da se prvo pokuša čitanje, pa tek onda da se proverava da li se stiglo do kraja fajla.Pretpostavimo da je sadržaj ulazne datoteke ulaz.txt sledeći:

ulaz.txt:-------------------0 1 2 3 4-------------------

Naš zadatak je da čitamo fajl broj po broj, pročitano pišemo na standarni izlaz, i to radimo svedok ne dođemo do kraja fajla.

Loše rešenje mi moglo biti sledećeg oblika.

1 #include <stdio.h>2 int main() {3 FILE* ulazni_fajl = fopen("ulaz.txt", "r");4 if (ulazni_fajl == NULL)5 exit(EXIT_FAILURE);6

7 int x;8 // Citamo broj po broj, sve dok ne dodjemo do kraja fajla9 while (feof(ulazni_fajl) == 0) {

10 fscanf(ulazni_fajl, "%d", &x);11 printf("Procitano: %d\n", x);12 }13 fclose(ulazni_fajl);14 return 0;15 }

Gde nastaje problem? Kada čitamo 0, 1, 2, 3, sve je u redu. Problem nastaje kada čitamoposlednji broj.

23

Page 25: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

7. Tekstualne datoteke

Pretpostavimo da smo pročitali 3, ispisali ga na ekran i završili iteraciju petlje. U sledećojiteraciji, testiramo funkcijom feof da li smo stigli na kraj fajla? Nismo, čitamo sledeći broj (fscanf),to je 4, pišemo ga na ekran (fprintf), i idemo u sledeću iteraciju. U sledećoj iteraciji testiramoda li smo stigli do kraja fajla (feof), nismo, pokušava se čitanje (fscanf), ne uspeva, x ostajenepromenjen, ponovo se na ekran ispisuje 4 (fprintf). Idemo u sledeću iteraciju, testiramo da lismo stigli do kraja fajla (feof), JESMO, petlja staje.

Tačno rešenje se može realizovati na sledeći način.

1 #include <stdio.h>2 int main() {3 FILE* ulazni_fajl = fopen("ulaz.txt", "r");4 if (ulazni_fajl == NULL)5 exit(EXIT_FAILURE);6

7 int x;8 // Citamo broj po broj, sve dok ne dodjemo do kraja fajla9 while (1)

10 // pokusavamo citanje11 fscanf(ulazni_fajl, "%d", &x);12

13 // ako smo stigli do kraja fajla, stajemo sa petljom14 if (feof(ulazni_fajl))15 break;16

17 // inace, nastavljamo sa petljom18 printf("Procitano: %d\n", x);19 }20 fclose(ulazni_fajl);21 return 0;22 }

Primetimo da prvo pokušavamo čitanje, a tek nakon toga proveravamo da li smo stigli dokraja fajla.

24

Page 26: Uvod u programiranje - alas.matf.bg.ac.rsalas.matf.bg.ac.rs/~mi13283/systempro/op.pdfSadržaj Zdravo svete! Skripta „Uvod u Programiranje" prati nastavu koju sam držao učenicima

Bibliografija

[1] Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman Compilers: Principles, Techniques,and Tools, Second Edition, 2006

[2] Predrag Janičić, Aleksandar Samardžić i Goran Nenadić, LATEX 2εza autore. Kompjuter bib-lioteka, 2003.

[3] Predrag Janičić i Filip Marić, Osnove programiranja kroz programski jezik C. Matematički fakul-tet, 2014.

[4] Predrag Janičić i Filip Marić, Osnove programiranja kroz programski jezik C - Deo II. Matem-atički fakultet, 2014.

[5] Predrag Živković, Algoritmi. Matematički fakultet, 2000.

[6] Thomash H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein Introduction toAlgorithms. The MIT press, III edition.

25