PODACI U JEZIKU C
Struktura programa u jeziku C
Pisanje programa(aplikacije) ima za cilj da izvrši neki manji ili veći zadatak postavljen kao zahtev pred programera. To može biti aplikacija za obradu teksta, muzike, igrica, složeni programi za vođenje procesa u industriji, medicini, aplikacije koje se kriste u naučnim istraživanjima itd. Sve te aplikacije u manjoj ili većoj meri u svojoj pozadini imaju neku vrste obrade podataka. Da bi kreirana aplikacija mogla da obrađuje podatke, ona mora na neki način biti povezana sa memorijom. Dakle, za te podatke, posredstvom kompajlera(compiler engl.) potrebno je prvo rezervisati memoriju, a zatim jednom ili više puta pristupati toj memoriji da bi se podaci uneli, bilo od strane programera bilo od korisnika programa. Posle obrade podataka, pomoću izraza i formula, možda će biti potrebno tako obrađene podatke ponovo ubaciti u istu ili različitu memoriju.Da bi se putem naredbi programa upravljalo sa tim obradama, potrebno je na neki način označiti te podatke(dati im naziv). Takođe je za svaki podatak potrebno definisati tip podatka. Npr. kompajler treba da ima informaciju kakav je podatak u pitanju, da li je to ceo ili realan broj, slovo, logički tip, tekst ili možda neki složen tip podatka. To je potrebno da bi se na osnovu tipa znalo koliko memorije treba rezervisati, koji skup operacija je dozvoljen nad takvim podacima. Za predstavljanje tipova podataka obično se koriste službene reči "C" jezika koje su date kasnije u tabeli, npr. int, float, double itd.
Da bi se rezervisala memorija(definisao podatak) za npr. ceo broj treba napisati naredbu:
int a;
tip_podatka ime_podatka;
Na koji se sve način može dati naziv podatku pogledajte u prethodnoj lekciji:
Elementi jezika C
Tipovi podataka
Tip podatka je određen skupom odrećenih vrednosti koje može da uzme podatak i skupom operacija koje mogu da se izvrše nad podatkom.
| Tip podatka | Opis | Memorija[bit] |
|---|---|---|
| char | Mali celobrojni podatak. Koristi se za smeštanje znakova | 8 |
| short | Kratak celobrojni podatak | 16 |
| int | Celobrojni podatak | 16 ili 32 |
| long | Dugački celobrojni podatak | 32 |
| float | Realan broj u jednostrukoj preciznosti | 32 |
| double | Realan broj u dvostrukoj preciznosti | 64 |
Vrste podataka:
- Promenljivi podaci:
- Mogu da menjaju vrednost u toku programa
- Mora se rezervisati memorija
- primer: int a; //rezeviše se memorija za celobrojni podatak
- Konstante
- Ne rezerviše se memorija
- Koriste se u izrayima
- primer: Y=2*X; //2 je konstanta
- Simboličke konstante
- Konstante predstavljene pomoću identifikatora
- primer:
#define PI 3.14
P=r*r*PI;
- Konstantni podaci
- Rezerviše se memorija
- Podaci moraju da se inicijalizuju
- ne menjaju vrednost u toku programa
- primer: const double e=2.71828;
Tip podatka je određen skupom odrećenih vrednosti koje može da uzme podatak i skupom operacija koje mogu da se izvrše nad podatkom. Ovo je značajno prevodiocima(engl. compiler and interpreter) kojima treba informacija o vrsti podatka za koji je rezervisana memorija. Svaki tip zauzima određenu memoriju.
Postoje sledeći tipovi podataka:
- Primitivni tipovi podataka
- Izvedeni tipovi podataka
- Tip void
- Nabrajanja
IZRADA JEDNOSTAVNE APLIKACIJE U PROGRAMSKOM JEZIKU C-VIDEO
Rešavanje zadataka
Da bi ste odgledali video - lekciju za rešavanje jednostavnih primera upotrebom alata "Code Block", kao i primere za samostalan rad, kliknite na sledeći link: Podaci-primeriUputstvo za kreiranje aplikacija u programskom jeziku C pomoću mobilnog telefonaPrimitivni tipovi podataka
U C programskom jeziku se koriste sledeći tipovi podataka:Celobrojni tip podatka:
Za opis celih brojeva koriste se tipovi:
- short 16byta kratak celobrojni podatak
- int 16 ili 32 bita celobrojni podatak
- long 32 bita dugačak celobrojni podatak
- long long 64 bita dugačak celobrojni podatak
dakle to bi bio broj 263+262 +...+20 =18446744073709551615
Primer:
int a;
int b;
Realni tip u pokretnom zarezu: Za opis celih brojeva koriste se tipovi:
- float 32byta kratak celobrojni podatak
- double 64 bita celobrojni podatak
Primer kod-a sa upotrebom karaktera:
char c;
c='A';
printf(“ASCII kod karaktera %c iznosi %d\n”,c,c);
Izvedeni tipovi podataka
U C programskom jeziku se koriste sledeći izvedeni tipovi podataka:
Nizovni tip: Ako treba definisati niz brojeva istog tipa, npr. celih brojeva onda definišemo tip podatka na sledeći način:
int niz[10];
Pokazivački tip: Ako treba definisati pokazivač na podatak tipa double onda se definiše i inicijalizuje pokazivač na sledeći način:
double a;
double *pA;;//Pokazivač na podatak tipa double
pA=&a;
Od izvedenih tipova podataka se koriste još i strukture, unije i funkcijeTip voidU C programskom jeziku se koristi tip void kod funkcija, kada funkcija ne vraća nikakvu vrednost. Onda se za tip povratne vrednosti koristi službena reč c jezika void.
Označeni i neoznačeni podaci(signed i unsigned)
Označeni signed podaci mogu imati i pozitivne i negativne vrednosti dok su neoznačeni podaci pozitivni ili imaju vrednost nula. U C jeziku su podaci podrazumevano označeni signed, a ako se želi definisati podatak kao neoznačen ispred tipa mora se dodati službena reč unsigned. Primeri za definisanje označenih i neoznačenih celobrojnih podataka:int a;
signed int b;
unsigned int c;
Celobrojni označeni podaci, ako int zauzima 32 bita memorije su u opsegu od -231 do 231 tj od -32767 do 32767,
dok
neoznačeni su u rangu od 0-232 tj od 0-65535.
Prva cifra kod označenih celih brojeva se koristi da odredi znak(0-pozitivan,1-negativan) dok se preostale cifre koriste za prikaz vrednosti broja. Zbog toga je najveća vrednost označenih brojeva 231 a ne 232.
Ostali tipovi, float, double,ne mogu biti označeni, dok za razliku od float i double, tip char može biti označen (signed) ili neoznačen (unsigned).
Dakle, u C jeziku:char može biti signed char ili unsigned char. Podrazumevano ponašanje za char (da li je signed ili unsigned) zavisi od implementacije kompajlera. Na nekim sistemima char se tretira kao signed, dok na drugima kao unsigned.
unsigned float x;
signed double y;
unsigned char z;
Promenljivi podaci(engl. variable)
Kako sama reč kaže, mogu da menjaju vrednosti u toku programa, pa se zato zovu promenljive(engl. variable). Za promenljive je obavezno rezervisanje memoriju. Podatak definišemo tako što za njega obezbedimo memoriju. Deklaracija podatka podrazumeva da odredimo kog je tipa i da mu damo naziv. Kod prostih podataka, deklaracija je u isto vreme i definicija podatka i to se radi na sledeći način:tip_podatka ime_podatka;
Npr. ako su u pitanju dva cela broja onda se za tip podatka koristi službena reč int i podatak se definiše na sledeći način:
int a,b;// ili u dva reda
int a;
int b;
a
b
Više o operatorima u jeziku c pogledati na web stranici: Operatori u C/C++ jeziku
Ovo ne znači jednakost i ne važi da je levo od znaka “=” isto što i desno. Ovde levo mora biti memorija koja treba da dobije neku vrednost a sa desne strane je ta vrednost ili neki izraz čiji će rezultat biti smešten u memoriju sa leve strane. Npr. dodelimo neke vrednosti promenljivima a i b:
a=14;
b=22;
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 |
|---|
a
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
|---|
b
| 14 |
|---|
a
| 22 |
|---|
b
int c;
c = a + b;
| 36 |
|---|
c
To je funkcija printf iz zaglavlja stdio.h u jeziku c(vidi podnaslov čitanje i pisanje podataka u nastavku) ili u jeziku c++ može se koristiti funkcija cout iz zaglavlja iostream.
U prethodnom primeru programer je naredbom a=14; i b=22; programski odredio vrednost a i b i korisnik programa na te vrednosti ne bi mogao da utiče. U većini slučajeva je potrebno obezbediti da korisnik unese vrednosti po svojoj želji i za to je potrebno obezbediti komandu koja broj ukucan na tastaturi od strane korisnika privremeno upamti kao niz karaktera a zatim konvertuje odgovarajućom ulaznom konverzijom u binarnom obliku. Vidi u nastavku čitanje podataka.
Konstantni podaci
Ako se podatku ne menja vrednost u toku programa, onda se takav podatak definiše kao konstantan dodavanje službene reči const. Npr. osnova prirodnog logaritma bi se definisala na sledeći način:const double e = 2.718281;
Konstante
To su vrednosti npr 2, 25, 3.14, 7f,9.81f,…..Za njih se ne rezerviše memorija, već se one jednostavno koriste u izrazima. Međutim i konstante imaju svoj tip podatka. Npr 2 je celobrojna konstanta tipa int, 2. ili 2.0 su tipa double, dok bi 2f bila po tipu float.
Simboličke konstante
To su konstante date identifikatorom. Npr. umesto da u izrazima za broj pi pišemo 3.14, možemo pomoću direktive #define definisati simboličku konstantu PI na sledeći način:#define PI 3.14;
P = r * r * PI;
Datoteke zaglavlja
Da bi u određenom fajlu mogli da koristimo funkcije iz drugih datoteka, takva datoteka se mora uključiti pomoću direktive #include<datoteka>.Te datoteke nazivamo datoteke zaglavlja. U C jeziku imaju ekstenziju .h. Npr. da bi mogli koristiti funkcije printf i scanf za pisanje i čitanje podataka na standardni izlaz, tj. ulaz moramo uključiti datoteku stdio.h:
#include <stdio.h>
Ili za upotrebu matematičkih funkcija potrebno je uključiti datoteku math.h u jeziku c, ili, datoteku cmath u jeziku c++.
#include<math.h>
Koristan sajt za pregled datoteka zaglavlja u c i c++ je: http://www.cplusplus.com/reference/
Čitanje i pisanje podataka u C jeziku
Podaci koje neki korisnik unosi preko tastature se unose se kao niz znakova. Pošto se podaci u memoriji smeštaju u binarnom obliku, mora da se izvrši konverzija podataka i to ako je reč o unosu podataka u memoriju od strane korisnika onda je nazivamo ulaznom konverzijom. Suprotno tome,kada se podaci koji se nalaze u memoriji žele prikazati na ekranu, proces je obrnut, tj. podaci iz memorije koji su u binarnom obliku, na ekranu se prikazuju kao niz karaktera i zato je potrebna izlazna konverzija podataka. Za unos podatka sa tastature u memoriju postoji bibliotečka funkcija scanf , dok se za ispisivanje podataka na ekran koristi bibliotečka funkcija printf. Da bi se one mogle upotrabljavati u programu, mora se uključiti datoteka zaglavlja stdio.h, na vrhu fajla, pomoću direktive pretprocesora #include na sledeći način:#include < stdio.h >
Ulazna konverzija(unos podataka sa tastature)
Deklaracija funkcije scanf bi bila:scanf(format, adresa_podatka_1, adresa_podatka_2, adresa_podatka_3);
scanf("%d%d%d", &a, &b, &c);
Format je tekstualni podatak(stavlja se pod navodnike) i to u stvari predstavlja šablon za ulaznu konverziju iz niza karaktera u binaran oblik. U prethodnom primeru %d se odnosi na jedan podatak, a kad imamo 3 onda se ponavlja 3 puta bez razmaka. Forma za unos jednog podatka se može predstaviti na sledeći način:
%[širina polja]oznaka_konverzije
gde je širina polja opcioni( dopunski )parametar konverzije, koji predstavlja širinu polja za prikaz.
Oznake konverzije za unos podatka:
Celobrojne ulazne konverzije: i, d,u, o, x,.
za short: hi,hd....
za long: li, ld,...
Ulazne konverzije realnih brojeva:
za float: f,e,g.
za double: lf, le,lg
Izlazna konverzija
U prethodnom primeru sabiranja brojeva ostalo je da se pokaže kako se podatak iz memorije prikazuje na ekran.Datoteka stdio.h obezbeđuje funkciju printf čija je sintaksa:
printf(format, podatak_1, podatak_2, podatak_3);
printf(Zbir brojeva %d i %d iznosi %d, a, b, c);
Zbir brojeva 14 i 22 iznosi 36;
printf("%d", c);
Zaključak:
Ako bismo želeli da na izlazu kombinujemo prikaz teksta i broja npr. da napišemo “Zbir brojeva 14 i 22 iznosi 36”, onda bi parametar format bio zapravo tekst sa umetnutim formatima za izlaznu konverziju, u ovom slučaju za cele brojeve “%d” ili “%i”. Parametri u funkciji printf, navedeni posle formata su zapravo promenljive čija se konverzija vrši i to napisanih po redosledu s leva na desno:
printf(“Zbir brojeva %d i %d iznosi %d”, a, b, c);
Pregled formata u ulaznoj i izlaznoj konverziji
Sledeća tabela prikazuje formate ulazne konverzije, kao izlazne, za različite tipove podataka.Ulazna konverzija (scanf)
| Tip podatka | Oznake formata |
|---|---|
| Ceo broj (int) | %d, %i |
| Neoznačeni ceo broj (unsigned int) | %u |
| Oktalni broj (unsigned int) | %o |
| Heksadecimalni broj (unsigned int) | %x, %X |
| Short ceo broj (short) | %hd, %hi |
| Long ceo broj (long) | %ld, %li |
| Realni broj (float) | %f, %e, %g |
| Double | %lf, %le, %lg |
Izlazna konverzija (printf)
| Tip podatka | Oznake formata |
|---|---|
| Ceo broj (int) | %d, %i |
| Neoznačeni ceo broj (unsigned int) | %u |
| Oktalni broj (unsigned int) | %o |
| Heksadecimalni broj (unsigned int) | %x, %X |
| Short ceo broj (short) | %hd, %hi |
| Long ceo broj (long) | %ld, %li |
| Realni broj (float) | %f, %e, %g |
| Double | %f, %e, %g |
Za oznaku formata kada se podaci prikazuju na ekran se koristi:
Celobrojne izlazne konverzije: i, d,u, o, x,.
za short: hi,hd....
za long: li, ld,...
izlazne konverzije realnih brojeva:
za float: f,e,g.
za double: f, e,g
Da bi omogućili korisniku da unese željene vrednosti za a i b, koristićemo funkciju scanf iz zaglavlja stdio.h.
Redove za dodelu vrednosti promenljivima a i b
a=14;
b=22;
treba zameniti sa :
scanf(“%d%d”, &a, &b);
Operator “&” daje memorijsku adresu podatka i koristi se kod ulazne, a ne i kod izlazne konverzije.
Pre naredbe scanf, treba dodati printf naredbu kojom se ispisuje poruka, koja obaveštava korisnika koje podatke treba da unese.
Kompletan kod zadatka bi bio:
Deklaracija i inicijalizacija različitih tipova podataka
U programskom jeziku C , promenljive moraju biti deklarisane pre nego što ih koristimo. Deklaracija uključuje definisanje tipa podatka i imena promenljive, dok inicijalizacija podrazumeva dodelu početne vrednosti promenljivoj.Primer deklaracije i inicijalizacije osnovnih tipova podataka
Sledeći primer ilustruje deklaraciju i inicijalizaciju različitih tipova podataka u C:#include <stdio.h>int main() {
// Celobrojni tipovi
int a = 10; // Deklaracija i inicijalizacija celog broja
short b = 5; // Kratki tip
long c = 1000000; // Dugi tip
// Realni brojevi
float pi = 3.14f; // Float tip (kraća decimalna preciznost)
double e = 2.71828; // Double tip (duža decimalna preciznost)
// Karakteri
char ch = 'A'; // Jedan karakter
// Logički tip (samo u C++)
bool isValid = true; // Logička vrednost
printf("Celobrojni: %d, %hd, %ld\n", a, b, c);
printf("Realni brojevi: %.2f, %.5lf\n", pi, e);
printf("Karakter: %c\n", ch);
printf("Logička vrednost: %d\n", isValid);
return 0;
}
Razlika između float i double
- float koristi 4 bajta memorije i omogućava manju preciznost (približno 6 do 7 decimalnih cifara).
- double koristi 8 bajtova memorije i omogućava veću preciznost (približno 15 do 16 decimalnih cifara).
Primer
#include <stdio.h>int main() {
float x = 0.123456789f; // Float tip
double y = 0.123456789; // Double tip
printf("Float vrednost: %.9f\n", x); // Prikazuje 6-7 značajnih cifara
printf("Double vrednost: %.9lf\n", y); // Prikazuje 15-16 značajnih cifara
return 0;
}
Rezultat:
Float vrednost: 0.123456791
Double vrednost: 0.123456789000000
Praktična upotreba različitih tipova
- Koristite float kada vam je potrebna manja preciznost i želite da štedite memoriju (npr. u grafičkim aplikacijama ili igrama).
- Koristite double kada vam je potrebna velika preciznost (npr. u naučnim ili finansijskim aplikacijama).
Ova tabela prikazuje osnovne tipove podataka, veličinu memorije koju zauzimaju i njihove opsege vrednosti.
| Tip podatka | Memorija [bajtovi] | Opseg vrednosti |
|---|---|---|
| char | 1 | -128 do 127 (ili 0 do 255 za unsigned) |
| int | 4 | -2,147,483,648 do 2,147,483,647 |
| float | 4 | ±3.4e−38 do ±3.4e+38 |
| double | 8 | ±2.2e−308 do ±1.7e+308 |
| short | 2 | -32,768 do 32,767 |
| long | 8 | -9,223,372,036,854,775,808 do 9,223,372,036,854,775,807 |
Prostor imena u C jeziku
U C jeziku ne postoji direktan koncept prostora imena kao u C++. Međutim, slična organizacija se može postići:- Dodavanjem prefiksa imenima funkcija i promenljivih. Na primer:
void mojmodul_funkcija2();
Ovaj pristup se koristi da bi se izbegli konflikti imena između modula.
2. Korišćenjem datoteka i static ključne reči. U C jeziku, static funkcije i promenljive unutar datoteke su lokalne za tu datoteku, čime se izbegavaju konflikti sa istim imenima u drugim datotekama.
Primeri za vežbu
- Uneti poluprecnik kruga i izracunati površinu
- Učitati stranice trapeza i izračunati površinu.
- Učitati vreme u sekundama i ispisati u obliku hh:mm:ss
Rešenja:
Resenje primera 1:
Zadatak rešavamo u 4 koraka:
Prvo moramo da definišemo podatke koji su nam potrebni: U program je potrebno da korisnik unese poluprečnik, a program treba da izračuna površinu kruga. Da bi definisali te podatke daćemo im nazive i staviti tip podatka za realne brojeve(double). Dakle prva naredba:
double r,P;
Ovim smo rezervisali memoriju za dva podatka tipa double koje smo oznacili sa r i sa P
Drugi korak je da omogucimo da korisnik unese poluprecnik. Za unos koristimo metodu scanf koja se nalazi u datoteci stdio.h
Ovu datoteku cemo ukljuciti pomocu direktive #include za uklucivanje datoteka i ovo pisemo pri vrhu dokumenta
#include < stdio.h >U ovoj datoteci se još nalazi i metoda printf za ispisivanje podataka i teksta na konzolu.
Pre unosa ispisujemo poruku na konzolu da bi korisnik znao šta treba da unese. Za ispisivanje koristimo metodu printf što zapravo predstavlja izlaznu konverziju. Ulazna konverzija ostvaruje se metodom scanf. Ovaj drugi korak je:

Slika 4: Rešenje zadatka "Površina kruga"
U 4. koraku se na ekranispisuje poruka sa vrednošću površine, koja se isčitava iz memorije označene u ovom programu sa P. Za izlaznu konverziju se koristi format %f za podatke tipa double.
Resenje primera 3:
Zadatak rešavamo u 4 koraka:Ovde korisnik unosi vreme u sekundama koje treba biti ceo broj
int vrSek;
scanf(“%d”, &vrSek);
vremena u sekundama i 3600, vrSek/3600, a da bi dobili koliko je sekundi preostalo koristimo „%“, dakle vrSek % 3600.
Kod koji ovo radi:
int hh, ostSek;
hh = vrSek / 3600;
ostSek= vrSek % 3600;
Na sličan način bi od preostalog broja sekundi (ostSek) dobili minute, ali u ovom slučaju bi za delilac uzeli 60 jer 1min=60sek;
int mm;
mm = ostSek/ 60;
ostSek= ostSek% 60;
printf(“%02d : %02d : %02d”, hh, mm, ostSek);
Razvoj tipova podataka u C jeziku
Rani razvoj (1972–1978)- Jezik C je razvijen od strane Denisa Ričija na Bell Labs kao evolucija B jezika.
- Prvi standardizovani tipovi podataka uključivali su: int, float, double, char, i void.
- Strukture (struct) i unije (union) su uvedene za rad sa složenijim podacima.
- Standardizacija jezika od strane ANSI donela je jasno definisan set osnovnih tipova podataka.
- Uvedena podrška za signed i unsigned modifikatore za celobrojne tipove.
- Dodata su ključna pravila za veličine podataka:
- short ≤ int ≤ long
- float ≤ double ≤ long double
- Značajna proširenja za tipove podataka:
- Logički tip (_Bool):
- Uveden kao prvi tip za rad sa logičkim vrednostima (true, false), kroz <stdbool.h>.
- Celo brojni tipovi fiksne širine:
- Tipovi poput int8_t, uint16_t, i int64_t definisani u <stdint.h>.
- Pružaju preciznu kontrolu nad veličinama podataka.
- Kompleksni brojevi:
- Uvedeni kroz ključnu reč _Complex, sa podrškom u <complex.h>.
- Deklaracije promenljivih bilo gde:
- Omogućeno deklarisanje promenljivih unutar bloka koda.
- Logički tip (_Bool):
- Dalja poboljšanja u radu sa podacima:
- Atomarni tipovi:
- Uvedeni za podršku u višedretvenom programiranju kroz <stdatomic.h>.
- Anonymous Structures and Unions:
- Strukture i unije bez imena za jednostavniji rad sa ugneždenim podacima.
- Podrška za Unicode karaktere:
- Dodati char16_t i char32_t za rad sa Unicode standardom.
- Atomarni tipovi:
- Nije doneo nove tipove podataka, već je fokus bio na stabilnosti i ispravljanju grešaka iz C11.
- Zadržani svi tipovi i funkcionalnosti iz C99 i C11.
- Fokusiran na dalje modernizovanje jezika:
- Poboljšanja u rukovanju Unicode karakterima.
- Veći naglasak na sigurnosti koda i kompatibilnosti sa savremenim alatima.
Zaključak
Razvoj jezika C kroz verzije odražava potrebu za proširenjem funkcionalnosti i prilagođavanjem modernim tehnologijama, dok zadržava jednostavnost i efikasnost jezika. Uvođenje tipova poput _Bool u C99 i atomarnih tipova u C11 značajno je povećalo njegovu upotrebljivost u širim oblastima programiranja.| Prethodno |<Elementi jezika C |
Sledeće Operatori u C jeziku>| |
Srodni članci
Primeri zadataka sa podacimaRad sa stringovima
Rešeni zadaci iz oblasti podaci
Algoritmi-prosti brojevi
Algoritmi - Fibonačijev niz
