PODACI U JEZIKU C
Struktura programa u jeziku C
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;
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
Primitivni tipovi podataka
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
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 funkcije
Označeni i neoznačeni podaci(signed i unsigned)
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)
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
const double e = 2.718281;
Konstante
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
#define PI 3.14;
P = r * r * PI;
Datoteke zaglavlja
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
#include < stdio.h >
Ulazna konverzija(unos podataka sa tastature)
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
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
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
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
Primer deklaracije i inicijalizacije osnovnih tipova podataka
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
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;
}
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
- Dodavanjem prefiksa imenima funkcija i promenljivih. Na primer:
void mojmodul_funkcija2();
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:
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
- 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.