subota, 20 aprila, 2024
Kako da...?

Uvod u programski jezik C (2. deo)

Autor: Stefan Nožinić

U prethodnom broju smo dali okvirnu sliku o tome kako izgleda jedan jednostavan C program koji smo nazvali Hello world i koji je imao zadatak da na standardni izlaz ispisuje rečenicu Hello, world. Takođe smo objasnili jednostavan proces prevođenja izvornog C koda u izvršni korišćenjem GNU Compiler-a (gcc). U ovom delu vam objašnjavamo šta su to tipovi podataka, promenljive i kako da im dodelite vrednosti u programu ili da ih učitate sa standardnog ulaza. Takođe vam predstavljamo i neke osnovne, ali i česte greške koje prave ne samo početnici nego i iskusni programeri. Ove greške se nazivaju sintaksne greške i nastaju obično kada se javi greška u kucanju (tzv. typo).

Tipovi podataka

U radnoj memoriji računara čuvaju se razni podaci, kao što su brojevi, tekst, imena i drugo. Na primer, kada otvorite ovaj časopis, vaš PDF čitač (ili ePUB, ako čitate to izdanje) verovatno je učitani fajl smestio u RAM (Random Access Memory), odatle čita potrebne podatke i prikazuje ih na vašem ekranu. Ti podaci se pre prikazivanja obično obrađuju, pa tako dobijate lepu i čitljivu stranicu ovog dokumenta. Kod PDF čitača ovo se zove renderovanje i služi da vektorski format prikaže kao sliku na ekranu.

Kao što smo rekli, postoje razni podaci koji se mogu čuvati u memoriji. Oni su podeljeni po njihovom sadržaju i za svaki tip podataka je određeno tačno koliko memorije zauzima. Zauzeće memorije zavisi od programskog jezika, ali i od arhitekture na kojoj se pokreće program, odnosno za koju je program preveden (kompajliran).

Svaki tip, pored svoje veličine, ima svoj skup mogućih vrednosti (domen), skup operacija koje se mogu izvršiti nad ovim tipom podataka i skup relacija koje važe za ovaj tip podataka. Ovde vam predstavljamo neke osnovne tipove podataka, njihove ključne reči u C programskom jeziku koje će nam biti korisne kod definisanja promenljivih i dajemo vam uvid u neke operacije, odnosno relacije za svaki od navedenih tipova.

Prvi tip koji ćemo da pomenemo, jeste integer. Ovo nije najjednostavniji tip, ali se obično navodi kao prvi jer je najbliži čovekovom shvatanju računara. Ovaj tip opisuje cele brojeve (…, -2, -1, 0, 1, 2, …) i ključna reč u C-u mu je int. Domen ovog tipa su celi brojevi koji ulaze u opseg [-231 , 231 – 1]. Sigurno ste se zapitali zašto baš ovakav opseg i kako smo došli do njega. Odgovor leži u činjenici da na većini arhitektura integer zauzima 4B odnosno 32 bita. Ako ste u dobrim odnosima sa kombinatorikom, onda znate da je to ukupno 232 kombinacija, pa je domen podeljen na negativne vrednosti, pozitivne vrednosti i nulu. Operacije koje važe za ovaj tip podataka, iste su one koje važe i za cele brojeve u matematici. To su operacije dodele (operator = ), sabiranje, oduzimanje, množenje, deljenje i modulo (% operator). Ništa nije drugačije ni sa relacijama, pa tu imamo relacije jednakosti (== operator), veće, manje, veće ili jednako, manje ili jednako i nije jednako. Potrebno je obratiti pažnju da se operator za dodelu vrednosti ( = ) obeležava sa jednim znakom jednakosti, dok se relacija za jednakost obeležava sa dva.

Sledeći tip podataka je char. On predstavlja jedan karakter. Zauzima 1B u memoriji, pa je time moguće opisati 256 vrednosti. Ovo je sasvim dovoljno da opiše engleski alfabet, brojeve i još dosta drugih znakova. Najčešća operacija je operacija dodele, a najčešća relacija je relacija ekvivalencije (= – dodela, == – relacija ekvivalencije). Svako slovo ima svoju brojčanu vrednost koja se može videti u ASCII tabeli.

Tip podataka koji služi za opis nekih realnih brojeva je double. Za njega važe sve relacije i operacije kao i za integer, izuzev modulo operacije (ona nema ovde svrhe, zar ne? – prim.aut.).

Poslednji tip podataka koji ćemo pomenuti u ovom tekstu, jeste bool (boolean u nekim drugim jezicima). Za njegov opis je takođe potreban 1B i može imati samo dve vrednosti, a to su true ili false, odnosno tačno i netačno. Operacije koje se mogu izvršiti na ovim tipovima, jesu operacija dodele, logičko „i” (&&), logičko „ili” (||) i logičko „ne” (!). Ovaj tip podataka vraća sve relacije na drugim tipovima podataka, pa se ovaj tip, iako ne na prvi pogled, dosta koristi u uslovnom grananju, o kojem će biti više reči u narednom tekstu.

Promenljive

Sada kada znamo okvirno čemu služe neki osnovni tipovi podataka, možemo da ih iskoristimo i sačuvamo nešto u memoriju.

Svaka promenljiva mora da ima svoj tip podataka. Promenljive bi obično trebalo da imaju vrednost, ali će se vaš program uspešno prevesti čak i kad neka promenljiva ne bude imala dodeljenu vrednost. Naravno, treba napomenuti da ovo isključivo zavisi od podešavanja vašeg prevodioca. Svaka promenljiva se definiše na sledeća dva načina:

tip_podataka ime_promenljive = vrednost; tip_podataka ime_promenljive;

U prvom slučaju je promenljivoj dodeljena odmah vrednost, dok u drugom slučaju ona nema vrednost (ima neku nasumičnu vrednost koja nam nije od neke koristi). Što se tiče drugog slučaja, promenljivoj možemo dodeliti kasnije vrednost, korišćenjem operatora dodele:

ime_promenljive = vrednost;

Slede primeri definisanja nekih promenljivih:

int a = 1; int b = 1000; int c = -5645;
char d = 'a';
bool e = true;
double f = 0.0015;

Učitavanje promenljivih sa standardnog ulaza

Svi oni koji redovno koriste konzolne programe, znaju da oni mogu da pitaju korisnika za neki podatak tokom svog izvršavanja i da čekaju da korisnik taj podatak unese. Ovaj podatak se potom smešta u memoriju i kasnije se koristi i obrađuje. Posle obrade rezultat se ispisuje na standardni izlaz, korišćenjem nama svima dobro poznate funkcije printf koju smo koristili u našem prvom programu da bismo ispisali frazu Hello, world! na standardni izlaz.

Neko je rekao da se uz primer najbolje uči, a mi kažemo da se uz primer najbolje objašnjava.

Program koji učitava dva broja i potom ispisuje njihov zbir:

#include  int main() { int a; int b; printf("Unesite dva broja: "); scanf(" %d %d", &a, &b); int zbir = a+b; printf("Zbir je: %d", zbir); return 0; }

Kao što možemo videti, koristili smo isto main funkciju kao prošli put, učitali smo istu biblioteku, ali nam je kod unutar naše main funkcije malo drugačiji. Prvo smo definisali dve promenljive tipa int koje nam služe da u njih učitamo zadate brojeve. Potom, pomoću nove funkcije scanf učitavamo te brojeve. Ova funkcija zahteva string koji govori kako da parsira ulaz, pa tako funkcija zna da mi očekujemo dva cela broja (%d) razmaknuta jednim razmakom. Potrebno je primetiti da je razmak napravljen i na početku string-a, što funkciji govori da ne obraća pažnju na specijalne znakove, kao prelazak u novi red (enter). Ovo znači da vi možete uneti prvi broj, pritisnuti taster enter, a zatim uneti drugi broj i opet pritisnuti enter. Funkcija traži i imena promenljivih u koje će biti učitane vrednosti. Potrebno je primetiti znak & na početku imena obe promenljive. Ovaj znak govori da se podatak upiše na lokaciju adresa tih promenljivih u memoriji. Ako vam ovo izgleda zbunjujuće, verujte – niste jedini. O adresama u lokacijama u memoriji ćemo pisati u budućim brojevima kada budemo diskutovali o pokazivačima. Kao što ste mogli da primetite, obe funkcije (scanf i printf) koriste specijalne izraze da bi se naveo tip podataka. Tako %d govori da se na ulazu očekuje int tip podataka, ili da se na izlazu ispisuje vrednost promenljive tog tipa. Neki ostali znakovi za formatiranje su:

  • %c – karakter tipa char
  • %lf – realni broj, tip podataka double
  • %d – ceo broj, int tip podataka

Česte sintaksne greške

Ostavićemo za kraj promenljive i tipove malo po strani i vraćamo se ponovo na početak. Hajde da vidimo, koje sve greške mogu da se naprave i kako prevodilac reaguje na njih.

Posmatrajmo sledeći kod:

#include  int main() { printf("Hello, world!\n"); return 0 }

Ako ovo pokušamo da prevedemo sa korišćenjem gcc prevodioca kao u tekstu koji je objavljen u prošlom broju, dobićemo sledeću grešku:

error: expected ‘;’ before ‘}’ token

Kao što vidimo, negde smo izostavili „;”, tj. tamo gde je trebalo da se nalazi. Potrebno je pogledati u red gde stoji return 0 bez potrebnog znaka na kraju.

Pogledajmo sada ovaj kod:

#include  int main() { printf("Hello, world!\n"); return 0; }

Šta kaže prevodilac?

fatal error: studio.h: No such file or directory

Vidite li gde je greška? Omašili smo naziv biblioteke!

A ovo?

#include  int main() { printf("Hello, world!\l"); return 0; }

izlaz:

warning: unknown escape sequence: '\l' [enabled by default]

Kao što vidimo, specijalan karakter „\l” ne postoji. Potrebno je primetiti da će se po početnim podešavanjima ovako nešto prevesti uz upozorenje.

Završetak

U ovom tekstu smo vam dali osnovne informacije o tipovima podataka, promenljivama i standardnom ulazu i izlazu. Isto tako smo pokazali neke standardne greške koje prave početnici, ali i oni iskusni, kako bismo vam ukazali na greške koje vaš prevodilac izbacuje i koje vam mogu pomoći da iste greške uklonite. Ovde treba napomenuti da prevodilac ne upozorava na greške koje nisu striktno vezane za sam jezik, pa vas tako neće upozoriti ako ste napravili deo programa koji može da se zakuca, ili ako ste napravili sigurnosni propust.

Prethodni deo ovog serijala možete pročitati ovde.

Naredni deo ovog serijala možete pročitati ovde.

2 thoughts on “Uvod u programski jezik C (2. deo)

  • Hvala na ukazanim greškama.

    Serijal „Uvod u programski jezik C“ ima 11 delova, i već su objavljeni u LiBRE! časopisu (od 23. do 30. broja i od 32. do 35. broja). Možete da preuzmete posebno brojeve pa da pročitate nastavke serijala, a možete i da sačekate, jer ćemo u narednih desetak dana objaviti na sajtu preostale delove ovog serijala.

    Srdačan pozdrav,
    – LiBRE! time

  • Postoje dve malene greške u tekstu:

    1. ‘;’ fali kod „return“ naredbe u primeru sa sabiranjem brojeva
    2. Programski jezik C ne poznaje logički „bool“ tip kao primitivni, već je „utkan“ pomoću celobrojnog tipa. Od izvesnog standarda postoji proširenje za njegovu podršku putem biblioteke , tako da primer inicijalizacije promenljive tipa „bool“ je svojstven za programski jezik C++.

    Serijal mi se sviđa, voleo bih da što duže traje. 🙂

Comments are closed.