- #include <stdio.h>
#include <math.h>double funkcija (double x);
main() {
double x,h, izv1, izv2, rel, aps,f;
printf (“Unijeti x\n”);
scanf (“%f”,&x);
h=0.1;
while (h>0.00000001) {
izv1=(funkcija(x+h)-funkcija(x))/h;
izv2=exp(x)*cos(x)-exp(x)*sin(x);
aps=fabs(izv2-izv1);
rel=fabs(aps/izv2)*100;
printf (“%f %f %f \n”, h, aps, rel);
h=h*0.9;
}
return (0);
}double funkcija (double x) {
double f;
f=exp(x)*cos(x);
return (f);
}2.# include <stdio.h>
# include <math.h>main() {
int i,j,n,a[9][9],b[9][9],c[9][9],d[9][9],sk1,srn,trag,k,s1,s2;
printf (“Unesi dimenzije matrice\n”);
scanf (“%d”,&n);
printf (“Unesi elemente matrice \n”);
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
scanf (“%d”,&a[i][j]);
}
}
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
printf (“%d “,a[i][j]);
}
printf (“\n”);
}
sk1=0;
for (i=0;i<n;i++){
sk1=sk1+a[i][0];
}
printf (“suma elemenata prve kolone je: %d \n”, sk1);
srn=0;
for (i=0;i<n;i++){
srn=srn+a[n-1][i];
}
printf (“suma elemenata n-tog reda je: %d \n”, srn);
trag=0;
for (i=0;i<n;i++){
trag=trag+a[i][i];
}
printf (“trag matrice je: %d \n”, trag);
printf (“transponovana matrica\n”);
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
b[i][j]=a[j][i];
printf (“%d “, b[i][j]);
}
printf (“\n”);
}
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
c[i][j]=a[i][j]+b[i][j];
}
}
printf (“suma matrice A i njene transponovane AT\n”);
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
printf (“%d “,c[i][j]);
}
printf (“\n”);
}
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
d[i][j]=0;
for (k=0; k<n; k++) {
d[i][j]+=a[i][k]*b[k][j];
}
}
}
printf (“proizvod matrica A i AT\n”);
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
printf (“%d “,d[i][j]);
}
printf(“\n”);
}
s1=0;
for (i=0; i<n; i++) {
for (j=i+1; j<n; j++) {
s1+=a[i][j];
}
}
printf (“suma elemenata iznad glavne dijagonale je: %d \n”, s1);
s2=0;
for (i=0; i<n; i++) {
for (j=0; j<i; j++) {
s2+=a[i][j];
}
}
printf (“suma elemenata ispod glavne dijagonale je: %d \n”, s2);
return(0);
}
Category Archives: C
Primjeri programa u C – u
- #include <stdio.h>
#include <math.h>double funkcija (double x);
main() {
double x,h, izv1, izv2, rel, aps,f;
printf (“Unijeti xn”);
scanf (“%f”,&x);
h=0.1;
while (h>0.00000001) {
izv1=(funkcija(x+h)-funkcija(x))/h;
izv2=exp(x)*cos(x)-exp(x)*sin(x);
aps=fabs(izv2-izv1);
rel=fabs(aps/izv2)*100;
printf (“%f %f %f n”, h, aps, rel);
h=h*0.9;
}
return (0);
}double funkcija (double x) {
double f;
f=exp(x)*cos(x);
return (f);
}2.# include <stdio.h>
# include <math.h>main() {
int i,j,n,a[9][9],b[9][9],c[9][9],d[9][9],sk1,srn,trag,k,s1,s2;
printf (“Unesi dimenzije matricen”);
scanf (“%d”,&n);
printf (“Unesi elemente matrice n”);
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
scanf (“%d”,&a[i][j]);
}
}
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
printf (“%d “,a[i][j]);
}
printf (“n”);
}
sk1=0;
for (i=0;i<n;i++){
sk1=sk1+a[i][0];
}
printf (“suma elemenata prve kolone je: %d n”, sk1);
srn=0;
for (i=0;i<n;i++){
srn=srn+a[n-1][i];
}
printf (“suma elemenata n-tog reda je: %d n”, srn);
trag=0;
for (i=0;i<n;i++){
trag=trag+a[i][i];
}
printf (“trag matrice je: %d n”, trag);
printf (“transponovana matrican”);
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
b[i][j]=a[j][i];
printf (“%d “, b[i][j]);
}
printf (“n”);
}
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
c[i][j]=a[i][j]+b[i][j];
}
}
printf (“suma matrice A i njene transponovane ATn”);
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
printf (“%d “,c[i][j]);
}
printf (“n”);
}
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
d[i][j]=0;
for (k=0; k<n; k++) {
d[i][j]+=a[i][k]*b[k][j];
}
}
}
printf (“proizvod matrica A i ATn”);
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
printf (“%d “,d[i][j]);
}
printf(“n”);
}
s1=0;
for (i=0; i<n; i++) {
for (j=i+1; j<n; j++) {
s1+=a[i][j];
}
}
printf (“suma elemenata iznad glavne dijagonale je: %d n”, s1);
s2=0;
for (i=0; i<n; i++) {
for (j=0; j<i; j++) {
s2+=a[i][j];
}
}
printf (“suma elemenata ispod glavne dijagonale je: %d n”, s2);
return(0);
}
Šta je to algoritam?
Algoritam
U matematici, računarstvu, lingvistici i srodnim disciplinama, algoritam ili postupnik je konačan slijed dobro definiranih naredbi za ostvarenje zadatka, koji će za dano početno stanje terminirati u definiranom konačnom stanju.
Koncept algoritma je potekao kao sredstvo zapisivanja postupaka za rješavanje matematičkih problema, poput pronalaženja zajedničkog djelitelja dvaju ili više brojeva ili množenja dvaju brojeva. Koncept je formaliziran 1936. u vidu Turingovog stroja Alana Turinga i lambda računa Alonza Churcha, koji su jedan za drugim postavili temelje računarstva.
Kuhanje čaja kao primjer algoritma
Najčešći primjer algoritma iz svakodnevnog života jest kuhanje čaja. Svaki korak pripremanja čaja mora biti ispravno izvršen kako bi mogli prijeći na idući te u konačnici dobiti topao i ukusan čaj. Ovaj se primjer može naći u većini početničke literature kao lako shvatljiv primjer osnovnih svojstava algoritama.
I to je to! Dobili smo šalicu vrućeg čaja pa ćemo lakše podnijeti prehladu koja nas danima muči. Iz ovog se jednostavnog primjera jasno vidi slijednost i konačnost algoritma. Naime, nema previše koristi od algoritma koji nikad ne završava. Očito je da algoritam definira način kako se neki problem rješava.
Kratka povijest
Riječ “algoritam” dolazi od latinskog prijevoda imena iranskog matematičara Al‑Hvarizmija koji se bavio trigonometrijom, astronomijom, zemljopisom, kartografijom, a smatra se ocem algebre jer je definirao osnovna pravila rješavanja linearnih i kvadratnih jednadžbi. Njegovi radovi su osnova razvoja mnogih matematičkih i prirodnih disciplina, među njima i računarstva..
Prvi zapis algoritma prilagođen računalu pripada Adi Byron iz 1842 (pa se zbog ovoga smatra prvom programerkom), a računao je Bernoullijeve brojeve. Računalo za koje je napisan je bio analitički stroj, koji je zamislio, ali nikad u potpunosti proveo u djelo, Englez Charles Babbage. Analitički stroj je trebalo biti prvo programabilno računalo, sastavljeno u potpunosti od mehaničkih dijelova. Mehanički dijelovi i fizička glomaznost su glavni razlozi zašto nikad nije završen.
Nedostatak čvrste matematičke forme pravio je određene probleme matematičarima i logičarima 19. i 20. stoljeća prilikom analiziranja algoritama. Definicija Turingovog stroja je riješila većinu tih problema, a predstavio ju je engleski matematičar Alan Turing. Turingov stroj omogućava izvođenje većine današnjih algoritama (uz određene prilagodbe), a dodatno olakšava i analizu složenosti zbog svoje jednostavnosti izvedbe (glava, funkcija pomaka glave te beskonačna ili jako duga traka za čitanje/pisanje).
Primjenom Turingovog stroja kao idealnog modela definirani su mnogi moderni problemi vezani uz analizu algoritama, kao npr. Turingov problem zaustavljanja ili klase NP-teških i NP-potpunih problema.
Svojstva
Algoritmi imaju slijedeća svojstva:
- diskretnost — u odvojenim koracima izvode se diskretne operacije algoritma koje vode ka konačnom cilju;
- konačnost — označava sposobnost algoritma da nakon konačnog broja koraka daje izlazne podatke odnosno rezultate;
- determiniranost — za iste ulazne podatke algoritam uvijek daje iste rezultate
- masovnost — algoritam je primjenjiv na veći broj ulaznih vrijednosti.
Algoritmi u računarstvu
Moderno računarstvo je nezamislivo bez primjene algoritama, njihove matematičke analize te postupcima ubrzavanja njihova izvođenja (optimiranje, optimiziranje). Sva su ta područja povezana i međusobno se nadopunjuju.
Analiza složenosti algoritama
Analiza složenosti algoritama vrlo je važna disciplina zboga toga što omogućuje vrlo dobro predviđanje resursa potrebnih da dani algoritam obradi dani set unosa. Uobičajeno je složenost algoritama izražavati kao matematičku funkciju koja veličinu unosa pretvara u količinu vremena potrebnu da se algoritam završi (vremenska složenost) ili količinu prostora potrebnu da se algoritam završi (memorijska složenost). Vrlo često se analiza složenosti algoritama provodi isključivo uz pomoć papira i olovke bez osvrtanja na pojedinačne implementacije u pojedinim programskim jezicima.
Klasifikacija algoritama
Algoritme je moguće klasificirati po raznim kriterijima:
Klasifikacija prema implementaciji Jedan način klasifikacije algoritama je prema načinu implementacije.
- Rekurzivni ili iterativni: Rekurzivni algoritam je algoritam koji poziva samog sebe sve dok se ne postigne određen uvjet. Rekurzivni algoritmi su vrlo često usko vezani uz implementaciju pojedine matematičke funkcije na primjer Fibbonačijeve funkcije. Iterativni algoritmi su algoritmi koji ne pozivaju samog sebe već se oslanjaju na konstrukte poput petlji i dodatne strukture podataka kao što je stog ili red da bi riješili problem. Važno je napomenuti da je svaki rekurzivni algoritam moguće pretvoriti u iterativni, i da je svaki iterativni algoritam moguće pretvoriti u rekurzivni, iako ponekad pretvaranje može biti vrlo kompleksno.
- Serijski ili paralelni: Većina današnjih računala sadrži samo jedan procesor te stoga obavlja naredbe jednu po jednu, to jest serijski. Algoritmi koji su dizajnirani sa namjerom da se izvršavaju u takvom okruženju shodno tome se nazivaju serijski algoritmi. Suprotno njima su paralelni algoritmi koji sa sve većim probojem višeprocesorskih računala dobivaju sve veću važnost. Paralelni algoritmi koriste mogućnost višeprocesorskog sustava na taj način da problem rascijepe na više malih potproblema koje svaki procesor rješava zasebno te se zatim rezultati spajaju. Paralelni algoritmi uz resurse potrebne za obradu podataka također imaju i malu potrošnju resursa na komunkaciju između više procesora. Algoritmi za sortiranje su jedan od primjera algoritama koje je moguće znatno poboljšati upotrebom paralelnih procesora, dok je probleme poput problem tri tijela sasvim nemoguće riješiti paralelnim algoritmom.
- Deterministički ili stohastički: Deterministički algoritam je algoritam koji će pri svakom izvršavanju u bilo kojim uvjetima od istog unosa doći do istog izlaza sljedeći svaki put identičan niz naredbi. Stohashički algoritmi je algoritam koji barem u jednom dijelu izvršavanja donese neku odluku slučajnim odabirom.
- Točan ili približan: Iako algoritmi u principu daju točan rezultat, ponekad algoritam traži približno rješenje koje je dovoljno blizu točnom, ili je točno rješenje nemoguće naći.
Algoritmi s obzirom na metodologiju dizajna
Brute force algoritmi – “čistom silom” računala isprobavaju sve mogućnosti i traže odgovarajuće rješenje. Najneefikasnijji algoritmi.
Podijeli i vladaj algoritmi tzv. Divide and conquer, podijeli i vladaj. Problem se dijeli na više istih, manjih problema. Podjela teče tako dugo dok se ne dođe do malog problema kojeg je jednostavno riješiti (obično rekurzijom).
Dinamički algoritmi – Metodama dinamičkog programiranja rješavaju se višefazni procesi, tj. procesi u kojima se donosi niz međusobno ovisnih odluka za pojedine godine određenog razdoblja ili za pojedine aktivnosti zadanog problema. Dinamičko programiranje poznato je i pod nazivom metoda donošenja višefaznih, odnosno višestupnjevanih odluka.
Pohlepni algoritmi tzv. greedy – Pohlepni algoritam je algoritam koji se koristi metaheuristiku za rješavanje problema, takvu da u svakom koraku bira lokalno najbolje rješenje, u nadi da će tako iznaći globalni optimum. Ovi algoritmi često ne daju najbolje rješenje već brzu aproksimaciju najboljeg rješenja.
Algoritmi za sortiranje i pobrojavanje tzv. search and enumeration – Algoritmi sortiranja služe za brzo sortiranje podataka, npr. niza brojeva. Mnogi se problemi mogu rješavati teorijom grafova.
Šta je C?
C (programski jezik)
Programski jezik C spada u proceduralne programske jezike koji je razvijen u ranim 70-im godinama 20. stoljeća.
Povijest razvoja
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 operacijskog sustava 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 inačica 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. Donedavni je standard bio ISO/IEC standard skraćeno poznat kao “C99”, no krajem 2011. usvojen je ISO/IEC 9899:2011, poznat kao “C11”, za koji su kompajleri još u razvoju.
Kao jedan od najvažnijih jezika u povijesti komercijalne računalne industrije, C je do danas ostao jedini programski jezik prilagođen za sve računalne platforme, od malih sustava pa do mrežnih superračunala. 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.
Proširivanje na objektno orijentirano programiranjae
Tokom 1980-ih, Bjarne Stroustrup zajedno s drugim istraživačima u Bell Labs proširuje C dodavajuć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.
Uporaba
C je jezik opće namjene, što znači da se u njemu može napraviti apsolutno sve: od rješavanja zadataka, do pisanja drivera, operacijskih sustava, tekst procesora ili igara. C, kao jezik, ni u čemu ne ograničava. Omogućuje i uključivanje naredbi pisanih asemblerski, zbog čega je zajedno s mogućnošću direktnog pristupa pojedinim bitovima, bajtovima ili cijelim blokovima memorije, pogodan za pisanje sistemskog softvera. Zbog tih karakteristika C je među popularnijim programskim jezicima i rabe ga mnogi programeri. Rezultat toga je postojanje velikog broja prevoditelja za C i alata te stalno dostupne pomoći na internetu. Programi pisani u C-u su prenosivi (mogu se prevoditi i izvršavati na različitim porodicama računala uz minimalne ili nikakve ispravke) i obično su vrlo brzi. Postoje mnogi prevoditelji za jezik C, a jedan od najšire korištenih je GNU C Compiler.
Problemi
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 sustavima kao što su primjerice mobilni telefoni. Glavno područje njegove uporabe su sistemski programi na strani poslužitelja (engl. servers), programi prevoditelji (engl. compilers) i jezgre operativnih sustava (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.
Skup znakova
Osnovni skup znakova u programskom jeziku C su:
- Malo i veliko slova abecede:
a
–z
A
–Z
- Brojevi :
0
–9
- Posebni znakovi
! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~
- bijeli razmaci: razmak, vodoravni razmak, Okomiti razmak, prekid stranice, nova linija
Prije pojave standarda C11 u programskom jeziku C u standardu nije bilo moguće umetnuti posebne znakove (UTF8), ratifikacijom standard C11 sada je moguće umetnuti posbene znakove u heksadecimalnom obliku \uXXXX
ili \UXXXXXXXX
.
Ključne riječi
Programski jezik C u standardu C89 ima samo 32 ključne riječi, ove riječi nije moguće primijeniti za variable ili za neke druge svrhe kao recimo imena funkcija, konstanti ili slično:
|
|
|
|
Stadardom C99 dodaje se još 5 novih riječi:
|
|
|
Standardom C11 dodaje se još 7 novih riječi:
|
|
|
|
Struktura programa pisanog u C-u
Najjednostavniji program je onaj koji zadani tekst ispisuje na ekran. Da bi se mogao ispravno napisati čak i tako jednostavan program, potrebno je poznavati strukturu programa odabranog programskog jezika.
Struktura programa odnosi se na način pisanja programa i ako se ona ne poštuje, program neće raditi, bez obzira na to što su uporabljene sve potrebne naredbe. Svaki program pisan u programskom jeziku C sastavljen je od niza funkcija. Glavna i jedina obavezna funkcija u programu je funkcija main( ). Program se može sastojati i od većeg broja funkcija.
Bitna razlika između C-a i ostalih programskih jezika je u tome što u C-u ne postoje ugrađene funkcije. One se nalaze u bibliotekama funkcija koje se isporučuju zajedno s prevoditeljem. Biblioteke funkcija nastale su standardizacijom C-a, pa je dovoljno na početku programa najaviti da će se upotrebljavati određena biblioteka i u cijelom programu dostupne su sve funkcije koje se u njoj nalaze. Tako se biblioteka u kojoj se nalaze funkcije za ulaz i izlaz podataka naziva stdio.h, matematičke funkcije nalaze se u biblioteci math.h, a funkcije za rad sa znakovnim varijablama u biblioteci string.h.
Na početku svakog C programa uobičajeno je pisati pretprocesorske naredbe kojima se pozivaju biblioteke funkcija koje se rabe u programu. Opći oblik te naredbe je: #naredba parametri. Najčešće upotrebljavana pretprocesorska naredba je: #include <ime datoteke> i obavezno se piše prije funkcije main( ). Prevođenjem programa na mjesto naredbe #include kopira se sadržaj navedene datoteke.
Isto tako, prije samog pisanja programa treba istaknuti da se programi napisani u C-u sastoje od niza međusobno povezanih funkcija čiji broj nije ograničen. U svakom programu je obavezna samo jedna funkcija – funkcija main( ) koja označava mjesto na kojem počinje izvršavanje programa. Početak i kraj funkcije označava se vitičastim zagradama. Nakon svake naredbe u C-u mora stajati znak ; koji (kao i u Pascalu) označava kraj jedne i početak druge naredbe.
Programski primjer
U sljedećem primjeru učitavaju se 2 broja, a nakon učitavanje na zaslonu se ispisuje njihov zbroj:
#include <stdio.h>
int main(void) {
int a, b;
scanf("Prvi broj %d",&a);
scanf("Drugi broj %d",&b);
printf("Njihov zbroj je = %d\n",a+b);
return 0;
}
U sljedećem primjeru na zaslonu će se ispisati tablica množenja do 10:
#include <stdio.h>
int main(void){
int a, b;
for(a=1; a<=10; a++)
for(b=1; b<=10; b++)
printf("%d*%d=%d\n", a, b, a*b);
return 0;
}
Funkcije za ispis
Ispis teksta
Najčešće upotrebljavana funcija za ispis u C-u je ona za formatirani ispis: printf( ). Njezina sintaksa ima ovaj oblik:
printf ("niz znakova koji se trebaju ispisati na zaslonu");
Zbog već istaknute specifičnosti C-a, koji sve funkcije ima pohranjene u bibliotekama funkcija, potrebno je pretprocesorskom naredbom #include najaviti uporabu biblioteke stdio.h u kojoj je pohranjena većina ulazno – izlaznih funkcija.
Primjer korištenja funkcije printf( ):
#include <stdio.h>
main()
{
printf ("Ispiši ovo na zaslon ekrana");
}
Ispis vrijednosti
Sam ispis teksta rabi se vrlo rijetko. Namjena svakog programa je obrada podataka i prikaz rezultata te obrade (ispis dobivenih vrijednosti). Pri ispisu vrijednosti potrebno je definirati format ispisa. Njime se oblikuje način ispisa vrijednosti. Pojam formata usko je vezan za tipove podataka.
Podaci u C-u mogu biti:
- cjelobrojni (int)
- realni (float)
- realni dvostruke točnosti (double)
- znakovni (char)
- tip podataka koji ne sadržava vrijednost (void)
Svaki od navedenih može biti s predznakom (signed) ili bez njega (unsigned). Opsegvrijednosti se može odrediti parametrima short i long, koji određuju krajnje vrijednosti svakog tipa. Razlika među njima je u broju bitova koje zauzimaju prilikom zapisa u memoriji:
Tip podataka | Vrsta | Predznak | Duljina (broj bitova) | Opseg | |
---|---|---|---|---|---|
1 | int | short | signed | 2 | -32768 do 32767 |
unsigned | 2 | 0 do 65.535 | |||
long | signed | 4 | –2.147.483.648 do 2.147.483.647 | ||
unsigned | 4 | 0 do 4.294.967.295 | |||
long long | signed | 8 | –9.223.372.036.854.775.808 do 9.223.372.036.854.775.807 | ||
unsigned | 8 | 0 do 18.446.744.073.709.551.615 | |||
2 | float | 4 | -3.4·10-38 do 3.4·1038 | ||
3 | double | 8 | -1.7·10-308 do 1.7·10308 | ||
4 | char | long | signed | 8 | -128 do 127 |
unsigned | 8 | 0 do 255 | |||
5 | bool | 1 | true (1) ili false (0) | ||
6 | void | 0 | bez vrijednosti |
Za ispis vrijednosti upotrebljava se se funkcija printf( ) koja je oblika:
printf("lista formata", lista varijabli);
Najčešće korištene oznake formata za ispis:
Format | Značenje | |
---|---|---|
1 | %c | oznaka formata za ispis jednog znaka |
2 | %d | ispis cijelog broja |
3 | %f | ispis realnog broja |
4 | %lf | ispis realnog broja tipa double |
5 | %s | ispis niza znakova |
6 | %e | ispis realnog broja u E-notaciji |
Izgled ispisa na zaslonu uređuje se unutar dvostrukih navodnika, a u listi varijabli dolazi samo popis varijabli. To prilično olakšava rad s kombiniranim ispisom, jer nema mnogo kompliciranja i kombiniranja naovodnika i zareza kao u ostalim programskim jezicima. Unutar navodnika kreira se izgled ispisa na ekran, a izvan njih redom se navode sve varijable čije se vrijednosti trebaju ispisati. Redoslijed oznaka formata mora odgovarati redoslijedu imena varijabli. Pogrešno zadan format u odnosu na deklaraciju varijable rezultirat će porešnim ispisom.
Primjer:
#include <stdio.h>
main( )
{
printf("\n rezultat izraza %d+%d je %d", 3, 2, 3+2);
}
Na zaslonu će se ispisati:
rezultat izraza 3+2 je 5
Aritmetički operatori
U programskom jeziku C za zbrajanje se uoptrebljava aritmetički operator +. Preostali standardni aritmetički operatori u C-u su: -, *, / i %. Oni se rabe za matematičke operacije:
Operacija | Operator | |
---|---|---|
1 | zbrajanje | + |
2 | oduzimanje | – |
3 | množenje | * |
4 | dijeljenje | / |
5 | modulo (ostatak cjelobrojnog dijeljenja) | % |
Viši prioritet imaju operatori %, * i /, a niži + i -. Rezultat dijeljenja dvaju cijelih brojeva u C-u je cijeli broj, pa zbog toga ne postoji potreba za posebnim operatorom cjelobrojnog dijeljenja.
Učitavanje podataka
Podatke u programu dijelimo na:
- varijable – podaci čije se vrijednosti tijekom izvođenja programa mijenjanju
- konstante – podaci čije se vrijednosti ne mogu mijenjati
Identifikatori
Varijablama, konstantama i funkcijama dodjeljujemo imena – identifikatore. Oni se sastoje od niza alfanumeričkih znakova (brojke i slova), od kojih prvi znak mora biti slovo ili donja crta (_). Dva identifikatora su različita ako se razlikuju u prva 32 znaka. Identifikatori ne smiju biti ključne riječi programskog jezika C. Programski jezik C razlikuje velika i mala slova, tako da su varijable a i A dvije različite varijable.
Za identifikatore nije moguće rabiti ključne riječi. One zajedno sa sintaksom programskog jezika određuju što se i na koji način u određenome programskom jeziku može učiniti. Ključnih riječi u C-u ima poprilično malo (32 ključne riječi definirane standardom ANSI C) no kasnije su proširivane tako da sada u modernim inačicama programskog jezika C ima 44, koje čine jezgru jezika i dovoljne su za rješavanje svih problema) i pišu se malim slovima.
Konstante
Konstane su vrijednosti koje se zadaju jedanput i ne mijenjaju se tijekom izvođenja programa. S obzirom na tipove podataka razlikuju se cjelobrojne, realne i znakovne konstante.
Cjelobrojne konstante su cijeli brojevi iz dopuštenog opsega, zapisani u standardnom obliku.
Realne konstante sadržavaju realne brojeve s predznakom ili bez njega, zapisane u standardnom obliku tako da decimalna točka odvaja cjelobrojni dio od decimalnoga. Mogu se zapisati i u eksponencijalom obliku. Pvi dio takvog zapisa je realan broj (s predznakom ili bez njega), zatim slovo e ili E i iza njega cijeli broj (s predznakom ili bez njega), npr. broj 0.02 može biti zapisan kao 2E-2.
Od numeričkih konstanti C dopušta još i oktalne i heksadekadske konstante. Oktalne konstane počinju s 0, a heksadekadske s 0x. (npr. 044 – oktalna, 0xaba – heksadekadska).
Znakovne konstante zadaju se unutar jednostrukih navodnika – literala ‘ ‘ i uglavnom se sastoje od jednog znaka (osim već spomenutih znakovnih konstanti koje se rabe za kontrolu ispisa). Vrijednost znakovne varijable odgovara numeričkoj vrijednosti koja odgovara ASCII kodu znaka koji se nalazi unutar jednostrukih navodnika. Tako je numerička vrijednost znakovne konstante ‘Z’ 90. Znakovne konstante mogu se pojavljivati u aritmetičkim izrazima i tada se upotrebljava isključivo njihova numerička vrijednost.
Osim navedenih tipova konstanti, programski jezik C definira i konstantu niza znakova (string constant), koja se sastoji od niza znakova unutar para navodnika, npr. “konstanta”.
Neke znakovne konstante za kontrolu ispisa:
\f – nova stranica
\n – novi red
\r – povratak na početak linije
Funkcije za učitavanje
Za unošenje podataka s tipkovnice u C-u postoji nekoliko funkcija. Najčešće se rabi funkcija za formatirani unos podataka scanf( ). Njezina je sintaksa:
scanf("lista_formata",lista_varijabli);
Kao i kod funkcije printf( ), u listu formata upisuju se oznake formata za tip varijabli, a u listu varijabli popis imena varijabli istim redoslijedom kao u popisu formata. Varijable navedene u listi međusobno se odvajaju zarezom. Budući da se u C-u njihove vrijednosti prenose s pomoću adrese, ispred imena imena svake varijable treba dodati i adresni operator & (operator za dodjeljivanje adrese).
Oznake formata tipa varijabli jednake su onima koje se upotrebljavaju u ispisu, ali mora se paziti kako se odvajaju u listi formata, jer to određuje način unosa podataka pri izvođenju programa. Ako su oznake formata odvojene zarezom, i vrijednosti varijabli se prilikom unošenja podataka odvajaju zarezom. Ako nema zareza, vrijednosti se odvajaju razmakom.
Deklaracija varijabli u C-u
Podaci čije će se vrijednosti mijenjati tijekom izvođenja programa (varijable) moraju se prije sam uporabe najaviti (deklarirati). Deklaracijom se zadaju tip i ime varijable. Varijable se najčešće deklariraju na samome početku programa, ali to nije uvjet. Varijabla se u C-u može deklarirati izvan svih funkcija, na početku funkcije ili na početku bloka naredbi.
Opći oblik naredbe za deklaraciju jest:
tip_podataka lista varijabli;
Tip_podataka jedan je od osnovnih ili korisnički definiranih tipova podataka, a lista_varijabli niz je imena varijabli (odvojenih zarezom) koje će tijekom izvršavanja programa sadržavati vrijednosti zadanog tipa podataka.
Naredbom za deklaraciju se u memoriji rezervira memorijska lokacija za svaku varijablu navedenu u listi varijabli. Veličina rezerviranog prostora ovisi o navedenom tipu podataka (2 bajta za broj tipa int, 4 za float…).
Tako se naredbama:
int a, b, c;
float x, y;
u memoriji rezervira 5 zasebnih lokacija. Za varijable a, b i c one su veličine 2, dok su za varijable x i y veličine 4 bajta.
Naredba pridruživanja
Naredbom pridruživanja varijablama se zadaju ili mijenjaju vrijednosti.
Operator pridruživanja u programskom jeziku C je =. Njegova je uloga da vrijednost izraza s desne strane pridruži varijabli na lijevoj strani. Operator pridruživanja ima najniži prioritet izvršavanja.
Opći oblik naredbe za pridruživanje vrijednosti je:
varijabla=izraz;
Več je rečeno da se varijable u C-u mogu najaviti izvan svih funkcija, na početku funkcije ili na početku bloka naredbi. Područje djelovanja određene varijable ovisi o mjestu na kojem je deklarirana, pa ovisno o tome, varijable mogu biti:
- globalne – deklariraju se izvan svih funkcija i mogu se rabiti u cijelom programu
- lokalne – varijable koje se deklariraju na početku funkcije ili kao argumenti funkcije i dostupne su samo u toj funkciji (ili bloku naredbi). Izvan funkcije ili bloka lokalne varijable ne postoje. Imena tih varijabli u različitim funkcijama ili blokovima mogu biti ista.
Definicijom globalne varijable automatski joj se dodjeljuje vrijednost 0, dok lokalne varijable ne sadržavaju početnu vrijednost i moraju se inicijalizirati posebnom naredbom tijekom deklaracije ili nakon nje (ali prije njezina prvog korištenja). Početne vrijednosti varijablama se dodjeljuju naredbom pridruživanja.
Primjer: Naredbom int a=5; deklarirana je cjelobrojna varijabla a i pridružena joj je početna vrijednost 5. Isti efekt postiže se ako se varijabla a deklarira (int a;) prije, a naknadno joj se dodijeli početna vrijednost (a=5).
Šta je C?
C (programski jezik)
Programski jezik C spada u proceduralne programske jezike koji je razvijen u ranim 70-im godinama 20. stoljeća.
Povijest razvoja
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 operacijskog sustava 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 inačica 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. Donedavni je standard bio ISO/IEC standard skraćeno poznat kao “C99”, no krajem 2011. usvojen je ISO/IEC 9899:2011, poznat kao “C11”, za koji su kompajleri još u razvoju.
Kao jedan od najvažnijih jezika u povijesti komercijalne računalne industrije, C je do danas ostao jedini programski jezik prilagođen za sve računalne platforme, od malih sustava pa do mrežnih superračunala. 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.
Proširivanje na objektno orijentirano programiranjae
Tokom 1980-ih, Bjarne Stroustrup zajedno s drugim istraživačima u Bell Labs proširuje C dodavajuć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.
Uporaba
C je jezik opće namjene, što znači da se u njemu može napraviti apsolutno sve: od rješavanja zadataka, do pisanja drivera, operacijskih sustava, tekst procesora ili igara. C, kao jezik, ni u čemu ne ograničava. Omogućuje i uključivanje naredbi pisanih asemblerski, zbog čega je zajedno s mogućnošću direktnog pristupa pojedinim bitovima, bajtovima ili cijelim blokovima memorije, pogodan za pisanje sistemskog softvera. Zbog tih karakteristika C je među popularnijim programskim jezicima i rabe ga mnogi programeri. Rezultat toga je postojanje velikog broja prevoditelja za C i alata te stalno dostupne pomoći na internetu. Programi pisani u C-u su prenosivi (mogu se prevoditi i izvršavati na različitim porodicama računala uz minimalne ili nikakve ispravke) i obično su vrlo brzi. Postoje mnogi prevoditelji za jezik C, a jedan od najšire korištenih je GNU C Compiler.
Problemi
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 sustavima kao što su primjerice mobilni telefoni. Glavno područje njegove uporabe su sistemski programi na strani poslužitelja (engl. servers), programi prevoditelji (engl. compilers) i jezgre operativnih sustava (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.
Skup znakova
Osnovni skup znakova u programskom jeziku C su:
- Malo i veliko slova abecede:
a
–z
A
–Z
- Brojevi :
0
–9
- Posebni znakovi
! " # % & ' ( ) * + , - . / : ; < = > ? [ ] ^ _ { | } ~
- bijeli razmaci: razmak, vodoravni razmak, Okomiti razmak, prekid stranice, nova linija
Prije pojave standarda C11 u programskom jeziku C u standardu nije bilo moguće umetnuti posebne znakove (UTF8), ratifikacijom standard C11 sada je moguće umetnuti posbene znakove u heksadecimalnom obliku uXXXX
ili UXXXXXXXX
.
Ključne riječi
Programski jezik C u standardu C89 ima samo 32 ključne riječi, ove riječi nije moguće primijeniti za variable ili za neke druge svrhe kao recimo imena funkcija, konstanti ili slično:
|
|
|
|
Stadardom C99 dodaje se još 5 novih riječi:
|
|
|
Standardom C11 dodaje se još 7 novih riječi:
|
|
|
|
Struktura programa pisanog u C-u
Najjednostavniji program je onaj koji zadani tekst ispisuje na ekran. Da bi se mogao ispravno napisati čak i tako jednostavan program, potrebno je poznavati strukturu programa odabranog programskog jezika.
Struktura programa odnosi se na način pisanja programa i ako se ona ne poštuje, program neće raditi, bez obzira na to što su uporabljene sve potrebne naredbe. Svaki program pisan u programskom jeziku C sastavljen je od niza funkcija. Glavna i jedina obavezna funkcija u programu je funkcija main( ). Program se može sastojati i od većeg broja funkcija.
Bitna razlika između C-a i ostalih programskih jezika je u tome što u C-u ne postoje ugrađene funkcije. One se nalaze u bibliotekama funkcija koje se isporučuju zajedno s prevoditeljem. Biblioteke funkcija nastale su standardizacijom C-a, pa je dovoljno na početku programa najaviti da će se upotrebljavati određena biblioteka i u cijelom programu dostupne su sve funkcije koje se u njoj nalaze. Tako se biblioteka u kojoj se nalaze funkcije za ulaz i izlaz podataka naziva stdio.h, matematičke funkcije nalaze se u biblioteci math.h, a funkcije za rad sa znakovnim varijablama u biblioteci string.h.
Na početku svakog C programa uobičajeno je pisati pretprocesorske naredbe kojima se pozivaju biblioteke funkcija koje se rabe u programu. Opći oblik te naredbe je: #naredba parametri. Najčešće upotrebljavana pretprocesorska naredba je: #include <ime datoteke> i obavezno se piše prije funkcije main( ). Prevođenjem programa na mjesto naredbe #include kopira se sadržaj navedene datoteke.
Isto tako, prije samog pisanja programa treba istaknuti da se programi napisani u C-u sastoje od niza međusobno povezanih funkcija čiji broj nije ograničen. U svakom programu je obavezna samo jedna funkcija – funkcija main( ) koja označava mjesto na kojem počinje izvršavanje programa. Početak i kraj funkcije označava se vitičastim zagradama. Nakon svake naredbe u C-u mora stajati znak ; koji (kao i u Pascalu) označava kraj jedne i početak druge naredbe.
Programski primjer
U sljedećem primjeru učitavaju se 2 broja, a nakon učitavanje na zaslonu se ispisuje njihov zbroj:
#include <stdio.h>
int main(void) {
int a, b;
scanf("Prvi broj %d",&a);
scanf("Drugi broj %d",&b);
printf("Njihov zbroj je = %dn",a+b);
return 0;
}
U sljedećem primjeru na zaslonu će se ispisati tablica množenja do 10:
#include <stdio.h>
int main(void){
int a, b;
for(a=1; a<=10; a++)
for(b=1; b<=10; b++)
printf("%d*%d=%dn", a, b, a*b);
return 0;
}
Funkcije za ispis
Ispis teksta
Najčešće upotrebljavana funcija za ispis u C-u je ona za formatirani ispis: printf( ). Njezina sintaksa ima ovaj oblik:
printf ("niz znakova koji se trebaju ispisati na zaslonu");
Zbog već istaknute specifičnosti C-a, koji sve funkcije ima pohranjene u bibliotekama funkcija, potrebno je pretprocesorskom naredbom #include najaviti uporabu biblioteke stdio.h u kojoj je pohranjena većina ulazno – izlaznih funkcija.
Primjer korištenja funkcije printf( ):
#include <stdio.h>
main()
{
printf ("Ispiši ovo na zaslon ekrana");
}
Ispis vrijednosti
Sam ispis teksta rabi se vrlo rijetko. Namjena svakog programa je obrada podataka i prikaz rezultata te obrade (ispis dobivenih vrijednosti). Pri ispisu vrijednosti potrebno je definirati format ispisa. Njime se oblikuje način ispisa vrijednosti. Pojam formata usko je vezan za tipove podataka.
Podaci u C-u mogu biti:
- cjelobrojni (int)
- realni (float)
- realni dvostruke točnosti (double)
- znakovni (char)
- tip podataka koji ne sadržava vrijednost (void)
Svaki od navedenih može biti s predznakom (signed) ili bez njega (unsigned). Opsegvrijednosti se može odrediti parametrima short i long, koji određuju krajnje vrijednosti svakog tipa. Razlika među njima je u broju bitova koje zauzimaju prilikom zapisa u memoriji:
Tip podataka | Vrsta | Predznak | Duljina (broj bitova) | Opseg | |
---|---|---|---|---|---|
1 | int | short | signed | 2 | -32768 do 32767 |
unsigned | 2 | 0 do 65.535 | |||
long | signed | 4 | –2.147.483.648 do 2.147.483.647 | ||
unsigned | 4 | 0 do 4.294.967.295 | |||
long long | signed | 8 | –9.223.372.036.854.775.808 do 9.223.372.036.854.775.807 | ||
unsigned | 8 | 0 do 18.446.744.073.709.551.615 | |||
2 | float | 4 | -3.4·10-38 do 3.4·1038 | ||
3 | double | 8 | -1.7·10-308 do 1.7·10308 | ||
4 | char | long | signed | 8 | -128 do 127 |
unsigned | 8 | 0 do 255 | |||
5 | bool | 1 | true (1) ili false (0) | ||
6 | void | 0 | bez vrijednosti |
Za ispis vrijednosti upotrebljava se se funkcija printf( ) koja je oblika:
printf("lista formata", lista varijabli);
Najčešće korištene oznake formata za ispis:
Format | Značenje | |
---|---|---|
1 | %c | oznaka formata za ispis jednog znaka |
2 | %d | ispis cijelog broja |
3 | %f | ispis realnog broja |
4 | %lf | ispis realnog broja tipa double |
5 | %s | ispis niza znakova |
6 | %e | ispis realnog broja u E-notaciji |
Izgled ispisa na zaslonu uređuje se unutar dvostrukih navodnika, a u listi varijabli dolazi samo popis varijabli. To prilično olakšava rad s kombiniranim ispisom, jer nema mnogo kompliciranja i kombiniranja naovodnika i zareza kao u ostalim programskim jezicima. Unutar navodnika kreira se izgled ispisa na ekran, a izvan njih redom se navode sve varijable čije se vrijednosti trebaju ispisati. Redoslijed oznaka formata mora odgovarati redoslijedu imena varijabli. Pogrešno zadan format u odnosu na deklaraciju varijable rezultirat će porešnim ispisom.
Primjer:
#include <stdio.h>
main( )
{
printf("n rezultat izraza %d+%d je %d", 3, 2, 3+2);
}
Na zaslonu će se ispisati:
rezultat izraza 3+2 je 5
Aritmetički operatori
U programskom jeziku C za zbrajanje se uoptrebljava aritmetički operator +. Preostali standardni aritmetički operatori u C-u su: -, *, / i %. Oni se rabe za matematičke operacije:
Operacija | Operator | |
---|---|---|
1 | zbrajanje | + |
2 | oduzimanje | – |
3 | množenje | * |
4 | dijeljenje | / |
5 | modulo (ostatak cjelobrojnog dijeljenja) | % |
Viši prioritet imaju operatori %, * i /, a niži + i -. Rezultat dijeljenja dvaju cijelih brojeva u C-u je cijeli broj, pa zbog toga ne postoji potreba za posebnim operatorom cjelobrojnog dijeljenja.
Učitavanje podataka
Podatke u programu dijelimo na:
- varijable – podaci čije se vrijednosti tijekom izvođenja programa mijenjanju
- konstante – podaci čije se vrijednosti ne mogu mijenjati
Identifikatori
Varijablama, konstantama i funkcijama dodjeljujemo imena – identifikatore. Oni se sastoje od niza alfanumeričkih znakova (brojke i slova), od kojih prvi znak mora biti slovo ili donja crta (_). Dva identifikatora su različita ako se razlikuju u prva 32 znaka. Identifikatori ne smiju biti ključne riječi programskog jezika C. Programski jezik C razlikuje velika i mala slova, tako da su varijable a i A dvije različite varijable.
Za identifikatore nije moguće rabiti ključne riječi. One zajedno sa sintaksom programskog jezika određuju što se i na koji način u određenome programskom jeziku može učiniti. Ključnih riječi u C-u ima poprilično malo (32 ključne riječi definirane standardom ANSI C) no kasnije su proširivane tako da sada u modernim inačicama programskog jezika C ima 44, koje čine jezgru jezika i dovoljne su za rješavanje svih problema) i pišu se malim slovima.
Konstante
Konstane su vrijednosti koje se zadaju jedanput i ne mijenjaju se tijekom izvođenja programa. S obzirom na tipove podataka razlikuju se cjelobrojne, realne i znakovne konstante.
Cjelobrojne konstante su cijeli brojevi iz dopuštenog opsega, zapisani u standardnom obliku.
Realne konstante sadržavaju realne brojeve s predznakom ili bez njega, zapisane u standardnom obliku tako da decimalna točka odvaja cjelobrojni dio od decimalnoga. Mogu se zapisati i u eksponencijalom obliku. Pvi dio takvog zapisa je realan broj (s predznakom ili bez njega), zatim slovo e ili E i iza njega cijeli broj (s predznakom ili bez njega), npr. broj 0.02 može biti zapisan kao 2E-2.
Od numeričkih konstanti C dopušta još i oktalne i heksadekadske konstante. Oktalne konstane počinju s 0, a heksadekadske s 0x. (npr. 044 – oktalna, 0xaba – heksadekadska).
Znakovne konstante zadaju se unutar jednostrukih navodnika – literala ‘ ‘ i uglavnom se sastoje od jednog znaka (osim već spomenutih znakovnih konstanti koje se rabe za kontrolu ispisa). Vrijednost znakovne varijable odgovara numeričkoj vrijednosti koja odgovara ASCII kodu znaka koji se nalazi unutar jednostrukih navodnika. Tako je numerička vrijednost znakovne konstante ‘Z’ 90. Znakovne konstante mogu se pojavljivati u aritmetičkim izrazima i tada se upotrebljava isključivo njihova numerička vrijednost.
Osim navedenih tipova konstanti, programski jezik C definira i konstantu niza znakova (string constant), koja se sastoji od niza znakova unutar para navodnika, npr. “konstanta”.
Neke znakovne konstante za kontrolu ispisa:
f – nova stranica
n – novi red
r – povratak na početak linije
Funkcije za učitavanje
Za unošenje podataka s tipkovnice u C-u postoji nekoliko funkcija. Najčešće se rabi funkcija za formatirani unos podataka scanf( ). Njezina je sintaksa:
scanf("lista_formata",lista_varijabli);
Kao i kod funkcije printf( ), u listu formata upisuju se oznake formata za tip varijabli, a u listu varijabli popis imena varijabli istim redoslijedom kao u popisu formata. Varijable navedene u listi međusobno se odvajaju zarezom. Budući da se u C-u njihove vrijednosti prenose s pomoću adrese, ispred imena imena svake varijable treba dodati i adresni operator & (operator za dodjeljivanje adrese).
Oznake formata tipa varijabli jednake su onima koje se upotrebljavaju u ispisu, ali mora se paziti kako se odvajaju u listi formata, jer to određuje način unosa podataka pri izvođenju programa. Ako su oznake formata odvojene zarezom, i vrijednosti varijabli se prilikom unošenja podataka odvajaju zarezom. Ako nema zareza, vrijednosti se odvajaju razmakom.
Deklaracija varijabli u C-u
Podaci čije će se vrijednosti mijenjati tijekom izvođenja programa (varijable) moraju se prije sam uporabe najaviti (deklarirati). Deklaracijom se zadaju tip i ime varijable. Varijable se najčešće deklariraju na samome početku programa, ali to nije uvjet. Varijabla se u C-u može deklarirati izvan svih funkcija, na početku funkcije ili na početku bloka naredbi.
Opći oblik naredbe za deklaraciju jest:
tip_podataka lista varijabli;
Tip_podataka jedan je od osnovnih ili korisnički definiranih tipova podataka, a lista_varijabli niz je imena varijabli (odvojenih zarezom) koje će tijekom izvršavanja programa sadržavati vrijednosti zadanog tipa podataka.
Naredbom za deklaraciju se u memoriji rezervira memorijska lokacija za svaku varijablu navedenu u listi varijabli. Veličina rezerviranog prostora ovisi o navedenom tipu podataka (2 bajta za broj tipa int, 4 za float…).
Tako se naredbama:
int a, b, c;
float x, y;
u memoriji rezervira 5 zasebnih lokacija. Za varijable a, b i c one su veličine 2, dok su za varijable x i y veličine 4 bajta.
Naredba pridruživanja
Naredbom pridruživanja varijablama se zadaju ili mijenjaju vrijednosti.
Operator pridruživanja u programskom jeziku C je =. Njegova je uloga da vrijednost izraza s desne strane pridruži varijabli na lijevoj strani. Operator pridruživanja ima najniži prioritet izvršavanja.
Opći oblik naredbe za pridruživanje vrijednosti je:
varijabla=izraz;
Več je rečeno da se varijable u C-u mogu najaviti izvan svih funkcija, na početku funkcije ili na početku bloka naredbi. Područje djelovanja određene varijable ovisi o mjestu na kojem je deklarirana, pa ovisno o tome, varijable mogu biti:
- globalne – deklariraju se izvan svih funkcija i mogu se rabiti u cijelom programu
- lokalne – varijable koje se deklariraju na početku funkcije ili kao argumenti funkcije i dostupne su samo u toj funkciji (ili bloku naredbi). Izvan funkcije ili bloka lokalne varijable ne postoje. Imena tih varijabli u različitim funkcijama ili blokovima mogu biti ista.
Definicijom globalne varijable automatski joj se dodjeljuje vrijednost 0, dok lokalne varijable ne sadržavaju početnu vrijednost i moraju se inicijalizirati posebnom naredbom tijekom deklaracije ili nakon nje (ali prije njezina prvog korištenja). Početne vrijednosti varijablama se dodjeljuju naredbom pridruživanja.
Primjer: Naredbom int a=5; deklarirana je cjelobrojna varijabla a i pridružena joj je početna vrijednost 5. Isti efekt postiže se ako se varijabla a deklarira (int a;) prije, a naknadno joj se dodijeli početna vrijednost (a=5).
Šta je to algoritam?
Algoritam
U matematici, računarstvu, lingvistici i srodnim disciplinama, algoritam ili postupnik je konačan slijed dobro definiranih naredbi za ostvarenje zadatka, koji će za dano početno stanje terminirati u definiranom konačnom stanju.
Koncept algoritma je potekao kao sredstvo zapisivanja postupaka za rješavanje matematičkih problema, poput pronalaženja zajedničkog djelitelja dvaju ili više brojeva ili množenja dvaju brojeva. Koncept je formaliziran 1936. u vidu Turingovog stroja Alana Turinga i lambda računa Alonza Churcha, koji su jedan za drugim postavili temelje računarstva.
Kuhanje čaja kao primjer algoritma
Najčešći primjer algoritma iz svakodnevnog života jest kuhanje čaja. Svaki korak pripremanja čaja mora biti ispravno izvršen kako bi mogli prijeći na idući te u konačnici dobiti topao i ukusan čaj. Ovaj se primjer može naći u većini početničke literature kao lako shvatljiv primjer osnovnih svojstava algoritama.
I to je to! Dobili smo šalicu vrućeg čaja pa ćemo lakše podnijeti prehladu koja nas danima muči. Iz ovog se jednostavnog primjera jasno vidi slijednost i konačnost algoritma. Naime, nema previše koristi od algoritma koji nikad ne završava. Očito je da algoritam definira način kako se neki problem rješava.
Kratka povijest
Riječ “algoritam” dolazi od latinskog prijevoda imena iranskog matematičara Al‑Hvarizmija koji se bavio trigonometrijom, astronomijom, zemljopisom, kartografijom, a smatra se ocem algebre jer je definirao osnovna pravila rješavanja linearnih i kvadratnih jednadžbi. Njegovi radovi su osnova razvoja mnogih matematičkih i prirodnih disciplina, među njima i računarstva..
Prvi zapis algoritma prilagođen računalu pripada Adi Byron iz 1842 (pa se zbog ovoga smatra prvom programerkom), a računao je Bernoullijeve brojeve. Računalo za koje je napisan je bio analitički stroj, koji je zamislio, ali nikad u potpunosti proveo u djelo, Englez Charles Babbage. Analitički stroj je trebalo biti prvo programabilno računalo, sastavljeno u potpunosti od mehaničkih dijelova. Mehanički dijelovi i fizička glomaznost su glavni razlozi zašto nikad nije završen.
Nedostatak čvrste matematičke forme pravio je određene probleme matematičarima i logičarima 19. i 20. stoljeća prilikom analiziranja algoritama. Definicija Turingovog stroja je riješila većinu tih problema, a predstavio ju je engleski matematičar Alan Turing. Turingov stroj omogućava izvođenje većine današnjih algoritama (uz određene prilagodbe), a dodatno olakšava i analizu složenosti zbog svoje jednostavnosti izvedbe (glava, funkcija pomaka glave te beskonačna ili jako duga traka za čitanje/pisanje).
Primjenom Turingovog stroja kao idealnog modela definirani su mnogi moderni problemi vezani uz analizu algoritama, kao npr. Turingov problem zaustavljanja ili klase NP-teških i NP-potpunih problema.
Svojstva
Algoritmi imaju slijedeća svojstva:
- diskretnost — u odvojenim koracima izvode se diskretne operacije algoritma koje vode ka konačnom cilju;
- konačnost — označava sposobnost algoritma da nakon konačnog broja koraka daje izlazne podatke odnosno rezultate;
- determiniranost — za iste ulazne podatke algoritam uvijek daje iste rezultate
- masovnost — algoritam je primjenjiv na veći broj ulaznih vrijednosti.
Algoritmi u računarstvu
Moderno računarstvo je nezamislivo bez primjene algoritama, njihove matematičke analize te postupcima ubrzavanja njihova izvođenja (optimiranje, optimiziranje). Sva su ta područja povezana i međusobno se nadopunjuju.
Analiza složenosti algoritama
Analiza složenosti algoritama vrlo je važna disciplina zboga toga što omogućuje vrlo dobro predviđanje resursa potrebnih da dani algoritam obradi dani set unosa. Uobičajeno je složenost algoritama izražavati kao matematičku funkciju koja veličinu unosa pretvara u količinu vremena potrebnu da se algoritam završi (vremenska složenost) ili količinu prostora potrebnu da se algoritam završi (memorijska složenost). Vrlo često se analiza složenosti algoritama provodi isključivo uz pomoć papira i olovke bez osvrtanja na pojedinačne implementacije u pojedinim programskim jezicima.
Klasifikacija algoritama
Algoritme je moguće klasificirati po raznim kriterijima:
Klasifikacija prema implementaciji Jedan način klasifikacije algoritama je prema načinu implementacije.
- Rekurzivni ili iterativni: Rekurzivni algoritam je algoritam koji poziva samog sebe sve dok se ne postigne određen uvjet. Rekurzivni algoritmi su vrlo često usko vezani uz implementaciju pojedine matematičke funkcije na primjer Fibbonačijeve funkcije. Iterativni algoritmi su algoritmi koji ne pozivaju samog sebe već se oslanjaju na konstrukte poput petlji i dodatne strukture podataka kao što je stog ili red da bi riješili problem. Važno je napomenuti da je svaki rekurzivni algoritam moguće pretvoriti u iterativni, i da je svaki iterativni algoritam moguće pretvoriti u rekurzivni, iako ponekad pretvaranje može biti vrlo kompleksno.
- Serijski ili paralelni: Većina današnjih računala sadrži samo jedan procesor te stoga obavlja naredbe jednu po jednu, to jest serijski. Algoritmi koji su dizajnirani sa namjerom da se izvršavaju u takvom okruženju shodno tome se nazivaju serijski algoritmi. Suprotno njima su paralelni algoritmi koji sa sve većim probojem višeprocesorskih računala dobivaju sve veću važnost. Paralelni algoritmi koriste mogućnost višeprocesorskog sustava na taj način da problem rascijepe na više malih potproblema koje svaki procesor rješava zasebno te se zatim rezultati spajaju. Paralelni algoritmi uz resurse potrebne za obradu podataka također imaju i malu potrošnju resursa na komunkaciju između više procesora. Algoritmi za sortiranje su jedan od primjera algoritama koje je moguće znatno poboljšati upotrebom paralelnih procesora, dok je probleme poput problem tri tijela sasvim nemoguće riješiti paralelnim algoritmom.
- Deterministički ili stohastički: Deterministički algoritam je algoritam koji će pri svakom izvršavanju u bilo kojim uvjetima od istog unosa doći do istog izlaza sljedeći svaki put identičan niz naredbi. Stohashički algoritmi je algoritam koji barem u jednom dijelu izvršavanja donese neku odluku slučajnim odabirom.
- Točan ili približan: Iako algoritmi u principu daju točan rezultat, ponekad algoritam traži približno rješenje koje je dovoljno blizu točnom, ili je točno rješenje nemoguće naći.
Algoritmi s obzirom na metodologiju dizajna
Brute force algoritmi – “čistom silom” računala isprobavaju sve mogućnosti i traže odgovarajuće rješenje. Najneefikasnijji algoritmi.
Podijeli i vladaj algoritmi tzv. Divide and conquer, podijeli i vladaj. Problem se dijeli na više istih, manjih problema. Podjela teče tako dugo dok se ne dođe do malog problema kojeg je jednostavno riješiti (obično rekurzijom).
Dinamički algoritmi – Metodama dinamičkog programiranja rješavaju se višefazni procesi, tj. procesi u kojima se donosi niz međusobno ovisnih odluka za pojedine godine određenog razdoblja ili za pojedine aktivnosti zadanog problema. Dinamičko programiranje poznato je i pod nazivom metoda donošenja višefaznih, odnosno višestupnjevanih odluka.
Pohlepni algoritmi tzv. greedy – Pohlepni algoritam je algoritam koji se koristi metaheuristiku za rješavanje problema, takvu da u svakom koraku bira lokalno najbolje rješenje, u nadi da će tako iznaći globalni optimum. Ovi algoritmi često ne daju najbolje rješenje već brzu aproksimaciju najboljeg rješenja.
Algoritmi za sortiranje i pobrojavanje tzv. search and enumeration – Algoritmi sortiranja služe za brzo sortiranje podataka, npr. niza brojeva. Mnogi se problemi mogu rješavati teorijom grafova.