Programski jezik C
O programskom jeziku C
C programski jezik spada u proceduralne programske jezike koji je razvijen
u ranim 70-im godinama 20. stoljeća. Autor ovog programskog jezika je
Dennis Ritchie, no značajan doprinos nastanku C-a dali su Ken Thompson
kao autor programskog jezika B i Martin Richards, autor programskog jezika
BCPL. Dennis Ritchie je stvorio ovaj programski jezik za rješavanje praktičnih
problema kodiranja sistemskih programa i jezgre operativnog sistema UNIX,
koji je praktički u cijelosti napisan u C-u.
Programski jezik C dosta se mijenjao tokom godina te je u više navrata
neformalno i formalno standardiziran. Prva važnija verzija poznata je
pod nazivom "K&R C", što je engl. kratica prezimena dvaju
autora najpoznatijeg C priručnika "The C Programming Language",
a to su Brian Kernighan i Dennis Ritchie. Prvo izdanje te vrlo sažeto
i precizno pisane knjige koje datira iz 1978. godine ujedno je de facto
standardiziralo jezik u 70-ima. Drugo izdanje iz 1988. godine opisuje
"ANSI C", standard kojeg je 1983. godine definirao američki
nacionalni institut za standardizaciju, a koji je i danas najbolje podržan.
Aktualni ISO/IEC standard skraćeno poznat kao "C99" podržava
u cijelosti samo jedan manji dio komercijalnih proizvođača softvera.
Kao jedan od najvažnijih jezika u povijesti komercijalne računarske industrije,
C je do danas ostao jedini programski jezik prilagođen za sve računarske
platforme, od malih sistema pa do mrežnih super-računara. Programi napisani
u njemu vrlo su bliski načinu rada hardvera te u načelu zahtijevaju od
programera dobro razumijevanje rada procesora, memorije, ulazno-izlaznih
sklopova itd. No, rad s registrima procesora i adresiranje memorije apstrahirani
su pomoću koncepta varijabli i pokazivača što uz eksplicitne kontrolne
strukture i funkcije znatno olakšava programiranje u odnosu na izravno
programiranje u strojnim jezicima.
Prvobitni razvoj C programskog jezika započinje između 1969 i 1973 u AT&T
Bell Labs, i po Dennis Ritchie-ju najkreativniji period je bio u toku
1972-ge godine. Nazvan je C jer su mnoge od njegovih karakteristika potekle
od ranijeg programskog jezika zvanog B. Postoje mnoge verzije C jezika
za programiranje. Jedna od njih je Turbo C koji je namijenjen za rad na
osobnim računalima. Turbo C posjeduje brzinu u radu, zauzima malo memorije,
pruža mogućnost uređivanja i pisanja programa i ima program za ispravljanje
grešaka "debuger".
Tokom 1980-ih, Bjarne Stroustrup zajedno s drugim istraživačima u Bell
Labs proširuje C dodajući sposobnosti objektno orijentiranog programiranja,
a naziv ovog novog programskog jezika je C++. Nažalost, ta je 100%-na
kompatibilnost ujedno i razlog što su problemi koje programiranje u C-u
nosi sa sobom naslijeđeni u C++-u. Efikasno i sigurno programiranje u
C-u vrlo je zahtjevna vještina koja traži višegodišnje iskustvo pa je
stoga C jezik koji se ne preporučuje početnicima, posebice ako im programiranje
nije primarni posao.
Mnogobrojni problemi vezani prije svega za upravljanje memorijom koje
programer mora sam eksplicitno kodirati razlog su da je danas većina novih
korisničkih aplikacija napisana u nekom modernijem jeziku koji ima ugrađeno
automatsko upravljanje memorijom (engl. garbage collection), ne dopušta
izravan rad s memorijom pomoću pokazivača te ima podršku za upravljanje
kodom odnosno njegovom okolinom za vrijeme njegova izvođenja. Danas se
relativno rijetko ukazuje potreba za pisanjem novih korisničkih aplikacija
izravno u C-u, pa čak i u vrlo malim sistemima kao što su primjerice mobilni
telefoni. Glavno područje njegove upotrebe su sistemski programi na strani
poslužitelja (engl. servers), programi prevoditelji (engl. compilers)
i jezgre operativnih sistema (engl. operating system kernels), gdje je
potreba za najvećom mogućom brzinom izvođenja, efikasnom kontrolom resursa
i izravnom kontrolom hardvera od primarne važnosti.
Programiranje u programskom jeziku (ovdje za programski jezik C) sastoji
se od nekoliko koraka: pisanja programa u nekom tekstualnom editoru, prevođenja
u strojni jezik, startanja programa.
Program napisan u editoru mora imati ekstenziju ".c" (točka,
potom malo slovo c), npr. program.c
Tekst editor koji će se koristiti u ovom predmetu je kate.
Mikroprocesor i drugi logički sklopovi računala imaju svoj vlastiti programski
jezik koji se naziva strojni jezik, a sastoji se od nizova binarnih rijeci
koje predstavljaju instrukcije logičkim sklopovima i podatke koje treba
obraditi. Program napisan u strojnom jeziku nazivamo izvrsni program ili
izvrsni kod budući da ga računalo može neposredno izvršiti. Strojni jezik
je određen arhitekturom računala, a definira ga proizvođač hardwarea.
Izvrsni program je strojno zavisan, sto znaci da se kod napisan na jednom
računalu može izvršavati jedino na računalima istog tipa. Pisanje instrukcija
u binarnom kodu posve je nepraktično pa su razvijeni simbolički jezici
u kojima su binarne instrukcije zamijenjene mnemoničkim oznakama. Programer
unosi program napisan u mnemoničkim oznakama u tekstualnu datoteku pomoću
editora teksta i zatim poziva program koji mnemoničke oznake prevodi u
binarne instrukcije strojnog jezika. Program koji vrši konverziju naziva
se asembler (eng. assembler) a sam se programski jezik naziva asemblerski
jezik ili jednostavno asembler. Program napisan u asemblerskom jeziku
nazivamo izvorni program (eng. source code). Pisanje programa time postaje
dvostepeni proces koji cine pisanje izvornog programa i prevođenje izvornog
programa u izvrsni program. Programer se tako oslobađa mukotrpnog pisanja
binarnih instrukcija te se dobiva do određene mjere strojna neovisnost
izvornog programa.
Osnove programskog jezika C
Osnovne karakteristike programskog jezika C:
VELIČINA – Programski jezik C karakterizira vrlo mali
broj ključnih riječi (32). Ključne riječi su dijelovi programskog koda.
BRZINA – Programi napisani u programskom jeziku C
su brže izvode od programa koji su pisani u drugim programskim jezicima.
Programski jezici su umjetni jezici koji nam omogućavaju manipuliranje
računalom i izvršavanje zadaća pomoću računala (npr. C, VB, ASP.NET).
NAREDBE ZA KONTROLU TOKA - Programski jezik C raspolaže
naredbama koje kontroliraju tok izvršavanja programa, a to su: petlja
for, petlja while, switch (case) funkcija te naredba if-else.
BITWISE KONTROLA - Za direktno pristupanje bitovima
i bajtovima.
POKAZIVAČI (POINTERI) - Pokazivači su varijable koje
sadrže memorijsku lokaciju neke druge varijable, tj. oni su 'pokazivači'
na adrese drugih varijabli. Programski jezik C omogućava manipuliranje
adresama varijabli.
OPĆA NAMJENA - U programskom jeziku C se rješavaju
problemi iz svih područja.
PRIMJERAK PROGRAMA U PROGRAMSKOM JEZIKU C NA MONITORU
VAŠEG RAČUNALA
Jedan jednostavan ali potpun C program izgleda ovako:
#include <stdio.h>
int main(void)
{
printf("Dobar dan.\n");
return 0;
}
Program treba spremiti u datoteku s ekstenzijom .c kako bi se znalo da
se radi o C-programu. Nazovimo stoga datoteku prvi.c. Program zatim kompiliramo
naredbom
cc prvi.c
nakon čega prevodilac kreira izvršni program i daje mu ime a.out. Da bismo
izvršili program dovoljno je otipkati
./a.out
Rezultat izvršavanja programa je ispis poruke
Svi C-programi sastoje se od funkcija i varijabli. Funkcije sadrže instrukcije
koje određuju koje će operacije biti izvršene, a varijable služe memoriranju
podataka.
Izvršavanje programa počinje izvršavanjem funkcije main koja mora biti
prisutna u svakom programu. Funkcija main svoju zadaću obavlja općenito
pozivanjem drugih funkcija. Tako se u našem programu poziva funkcija printf
iz standardne biblioteke, koja je zadužena za ispis podataka na ekranu.
Da bismo mogli koristiti funkcije iz standardne biblioteke zadužene za
ulaz i izlaz podataka program započinjemo naredbom
#include <stdio.h>
Njom se od prevodioca traži da uključi (include) u program datoteku stdio.h
koja sadrži informacije nužne za korištenje funkcije printf i mnogih drugih.
Datoteke s ekstenzijom .h nazivaju se datoteke zaglavlja (eng. header
_les) i njihovo stavljanje u oštre zagrade < > informira prevodilac
da se radi o standardnim datotekama zaglavlja, koje se nalaze na unaprijed
određenim mjestima u datotečnom sustavu.
Sljedeća linija predstavlja deklaraciju funkcije main:
int main(void)
Funkcija može uzimati jedan ili više argumenata i obično vraća neku vrijednost.
Deklaracijom se uvodi ime funkcije, broj i tip argumenata koje uzima i
tip povratne vrijednosti. U našem primjeru ime funkcije je main i ona
ne uzima niti jedan argument. To je deklarirano tako što je u oble zagrade
stavljena ključna riječ void (eng. void=prazan). Povratna vrijednost je
tipa int, što je oznaka za cijeli broj.1
Iza oblih zagrada dolaze vitičaste zagrade koje omeđuju tijelo funkcije.
Tijelo funkcije je sastavljeno od deklaracija varijabli i izvršnih naredbi.
Sve deklaracije varijabli dolaze prije prve izvršne naredbe. U našem primjeru
nemamo deklaracija varijabli. Tijelo sadrži samo dvije naredbe: poziv
funkcije printf i return naredbu:
{
printf("Dobar dan.\n");
return 0;
}
Svaka naredba završava znakom točka-zarez (;). To omogućava da se više
naredbi stavi na istu liniju.
Funkcija se poziva tako da se navede njezino ime iza koga idu oble zagrade
s listom argumenata koji se funkciji predaju. Funkcija printf dobiva samo
jedan argument: to je niz znakova "Dobar dan.nn". Navodnici
služe za ograničavanje konstantnih znakovnih nizova. Sve što se nalazi
između " i " predstavlja niz znakova koji čini jednu cjelinu.
Pored običnih znakova između navodnika mogu se naći i specijalni znakovi
koji počinju znakom n (eng. backslash). Tako nn označava prijelaz u novi
red. Funkcija printf nakon završenog ispisa ne prelazi automatski u novi
red nego je potrebno ubaciti znak nn tamo gdje takav prijelaz želimo.
Program smo stoga mogli napisati u obliku
#include <stdio.h>
int main(void)
{
printf("Dobar ");
printf("dan.");
printf("\n");
return 0;
}
i dobili bismo posve isti ispis.
Izvršavanje funkcije završava naredbom return. Kad funkcija vraća neku
vrijednost u pozivni program ta se vrijednost navodi u return naredbi.
Funkcija main vraća nulu pa je stoga zadnja naredba return 0; Funkcija
main mora biti prisutna u svakom programu. Kada na komandnoj liniji otipkamo
./a.out
operacijski sustav poziva funkciju main. Zatim se redom izvršavaju naredbe
unutar funkcije main sve dok se ne dođe do return naredbe. Ona operacijskom
sustavu vraća cjelobrojnu vrijednost koja ima značenje izlaznog statusa.
Nula se interpretira kao uspješni završetak programa, a svaka druga vrijednost
signalizira završetak uslijed greške.
U C-u je potrebno deklarirati sve varijable koje se u programu koriste.
Preciznije, unutar svake funkcije (ovdje unutar funkcije main) sve varijable
koje funkcija koristi treba deklarirati prije prve izvršne naredbe.
Deklaracija se sastoji od tipa varijable koji slijede imena varijabli
odvojena zarezima. Deklaracija kao i svaka druga naredba u programu završava
znakom točka-zarez. U deklaraciji int n,fakt;
imena varijabli koje se deklariraju su n i fakt, a njihov tip je int.
Tip int predstavlja cjelobrojnu varijablu koja može biti pozitivna i negativna.
Granice u kojima se može kretati varijabla tipa int ovise o računalu i
danas je to najčešće od -214748347 do 214748348. Pored varijabli tipa
int postoje još dvije vrste cjelobrojnih varijabli. To su varijable tipa
short i varijable
tipa long. Razlika je u tome da short pokriva manji raspon cijelih brojeva
i zauzima manje memorijskog prostora, dok long pokriva veći raspon i treba
više memorijskog prostora. Varijable realnog tipa (tzv. brojevi s pokretnim
zarezom) pojavljuju se u dvije forme: brojevi jednostruke preciznosti
float i brojevi dvostruke preciznosti double. Konačno, postoje i varijable
tipa chart u kojima se pamte znakovi.
Tipovi varijabli:
chart jedan znak,
short \kratki" cijeli broj,
int cijeli broj,
long \dugi" cijeli broj,
float realan broj jednostruke preciznosti,
double realan broj dvostruke preciznosti.
Pored ovih tipova podataka koje nazivamo osnovnim, postoje još i složeni
tipovi podataka kao što su strukture, polja, unije te pokazavatelji kao
posebni osnovni tip podatka.
Prva izvršna naredba u programu je naredba pridruživanja
n=1;
Znak jednakosti je operator pridruživanja. On vrijednost konstante ili
varijable na desnoj strani pridružuje varijabli na lijevoj strani. Nakon
te naredbe vrijednost varijable n postaje jednaka 1.
While i for petlja
Govorimo o jednima od najkorisnijih i najzahvalnijih petlji.
Naredba
while(n<=10)
{
....
}
je while petlja. Ona se sastoji od ključne riječi while, testa n<=10
i tijela
petlje; tijelo petlje je skup naredbi koje se nalaze unutar vitičastih
zagrada.
while-petlja funkcionira na sljedeći način: prvo se izračunava izraz u
zagradama:
n<=10. Ukoliko je on istinit (n je manji ili jednak 10) onda se
izvršava tijelo petlje (sve naredbe unutar vitičastih zagrada). Zatim
se ponovo
testira izraz n<=10 i izvršava tijelo petlje ako je izraz istinit.
Izvršavanje
petlje prekida se kada izraz n<=10 postane neistinit. Program se tada
nastavlja
prvom naredbom koja slijedi iza tijela while petlje.
Tijelo petlje može se sastojati od jedne ili više naredbi. Ako se sastoji
od samo jedne naredbe nije potrebno koristiti vitičaste zarade, iako njihova
upotreba nije pogrešna. Kada se tijelo sastoji od više naredbi one moraju
biti omeđene vitičastim zagradama.
Manje ili jednako (<=) je jedan od relacijskih operatora. Ostali su:
Operator |
Primjer |
Značenje |
<= |
a <= b |
manje ili jednako, |
>= |
a >= b |
veće ili jednako, |
< |
a < b |
strogo manje, |
> |
a > b |
strogo veće, |
== |
a == b |
jednako, |
!= |
a != b |
nejednako. |
Važno je razlikovati operator pridruživanja (=) i relacijski operator
jednakosti (==).
U tijelu while petlje imamo tri naredbe:
fakt=fakt*n;
printf(" %d %d\n",n,fakt);
n=n+1;
U prvoj i trećoj naredbi pojavljuju se operacije množenja i zbrajanja.
Osnovne
aritmetičke operacije dane su sljedećoj tabeli:
|
Operator |
Primjer |
zbrajanje |
+ |
a+b |
oduzimanje |
- |
a-b |
množenje |
* |
a*b |
dijeljenje |
/ |
a/b |
Naredba:
for(i=1;i<=n;i=i+1)
{
....
}
je for petlja. Ona djeluje na sljedeći način. Prvo se
varijabla i inicijalizira tako što joj se pridruži vrijednost 1
(i=1). Inicijalizacija se izvrši samo jednom. Zatim se testira
izraz
i<=n;
Ako je rezultat testa istinit izvršavaju se naredbe iz tijela petlje (naredbe
u vitičastim zagradama). Nakon toga se izvršava naredba
i=i+1;
i kontrola programa se vraća na testiranje istinitosti izraza i<=n.
Petlja završava kad izraz koji se testira postane lažan. Program se tada
nastavlja prvom naredbom iza tijela petlje. for-petlja iz našeg primjera
može se zapisati pomoću while-petlje na ovaj način:
i=1;
while(i<=n)
{
suma=suma+1.0/(i*(i+1));
i=i+1;
}
Naredbe oblika i=i+1 i i=i-1 kojima se brojač povećava, odnosno smanjuje
za jedan sreću se vrlo često pa za njih postoji kraća notacija:
n=n+1 je ekvivalentno s n++,
n=n-1 je ekvivalentno s n--.
Operator ++ naziva se operator inkrementiranja i on povećava vrijednost
varijable za 1; Operator -- koji smanjuje vrijednost varijable za 1 naziva
se operator dekrementiranja. Ti se operatori redovito koriste u for petljama
pa bismo gornju petlju pisali u obliku:
for(i=1;i<=n;i++)
suma=suma+1.0/(i*(i+1));
Operatore inkrementiranja i dekrementiranja možemo primijeniti na cjelobrojne
i realne varijable. Uočimo još da smo vitičaste zagrade oko tijela for-petlje
mogli ispustiti jer se tijelo sastoji samo od jedne naredbe. To vrijedi
za sve vrste petlji.
Svaka petlja sadrži u sebi jedan ili više brojača kojim se kontrolira
odvijanje petlje. Brojač je potrebno na početku inicijalizirati i zatim
ga u svakom prolazu petlje povećavati (ili smanjivati). Pelja se zaustavlja
testiranjem brojača. U while petlji jedino testiranje brojača ulazi u
zagrade nakon ključne riječi while. Inicijalizaciju moramo staviti izvan
petlje, a promjenu brojača negdje unutar petlje. U for petlji sva tri
elementa dolaze u zagradama iza ključne riječi for, u obliku for(inicijalizacija
brojača; test; promjena brojača)
{
.........
}
Inicijalizacija, test i promjena brojača odvajaju se znakom točka-zarez
(;).
Naredba if-else
Naredbe if-else nam u programskom jeziku omogućavaju korake u programiranju
koji bi bez tih naredbi bilo nemoguće učiniti.
Naredba if - else koristi se za donošenje određenih odluka. Formalna
sintaksa jest
if(izraz)
naredba1
else
naredba2
pri čemu je else neobavezan. Izraz se provjerava. Ako je istinit (ima
vrijednost koja nije nula),
izvršava se naredba1. Ako nije istinit (ima vrijednost nula) i ako postoji
else dio, izvršava se naredba2.
Kako if testira brojevnu vrijednost nekog izraza, moguća su određena skraćenja
koda. Primjerice
dovoljno je napisati
if(izraz)
umjesto:
if(izraz!=0)
Katkad je ovaj način pisanja ipak zgodniji i čitljiviji.
Na prvi pogled, malo je nejasno što se događa u slučaju kad if - else
konstrukcija nema else dijela
(jer je neobavezan). Postoji pravilo, potpuno intuitivno, koje pridružuje
else najbližem prethodnom if-u koji
nema else. Npr. u
if(n>0)
if(a>b)
z=a;
else
z=b;
else se pridružuje unutrašnjem if-u, što zorno pokazuje i uvučenost redova.
Ako to nije željeni
raspored, morate iskoristiti vitičaste zagrade kako bi pojasnili prevoditelju
što zapravo želite
if(n>0){
if(a>b)
z=a;
}
else
z=b;
Česta je greška:
if(n>0)
for(i=0;i<n;i++)
if(s[i]>0){
printf("...");
return i;
}
else /* pogrešno */
printf("greska
- n je negativno\n");
Uvučenost redova pokazuje što programer želi, ali prevoditelj else pridružuje
unutrašnjem if-u.
Ovakve greške nije lako naći. Zato je topla preporuka korištenje vitičastih
zagrada kad je to moguće, a ne
kad se može.
Osim toga primijetite da postoje točka-zarez nakon z=a u
if(a>b)
z=a;
else
z=b;
Gramatički gledano, naredba ide kao posljedica if, a naredbu moramo okončati
s točka-zarezom.
Konstrukcija
if(izraz)
naredba
else
if(izraz)
naredba
else
if(izraz)
naredba
else
if(izraz)
naredba
else
naredba
je toliko česta da o tomu ne treba trošiti riječi. Ovaj niz if naredbi
predstavlja najopćenitiji način pisanja višesmjernog grananja. Izrazi
se računaju po redu. Ako je bilo koji izraz istinit pridružena naredba
se izvršava, čime se završava čitava konstrukcija. Kao i uvijek, naredbom
se podrazumijeva ili jedna naredba ili više njih omeđenih vitičastim zagradama.
Zadnja else naredba ne obavlja nijedan od gornjih slučajeva, ali izvodi
slučajeve koji se izvršavaju
kad nijedan od uvjeta nije zadovoljen. Ponekad takvi, podrazumijevani
slučajevi, ne rade ništa, pa tada zadnji else nije ni potreban. Međutim,
ipak je dobro ostaviti else, te pomoću njega tražiti nemoguće greške.
LITERATURA:
- WIKIPEDIA, slobodna enciklopedija
http://bswikipedia.org/wiki/ProgramskijezikC
- „PROGRAMSKI JEZIK C“ : Brian W. Kernighan, Dennis M. Ritchie
Prvo izdanje, Zagreb
- www.zts-zagreb.hr/sdeljac/index_files/progc/
PROCITAJ
/ PREUZMI I DRUGE SEMINARSKE RADOVE IZ OBLASTI:
|
|
preuzmi seminarski
rad u wordu » » »
Besplatni Seminarski
Radovi
SEMINARSKI RAD
|