Generalno o programiranju
●Računar je mašina koja rješava problem izvršavanjem
instrukcija.
● Program = skup instrukcija sastavljenih za izvođenje
određenog zadatka. Elektronska kola kompjutera "znaju"
samo ograničen skup jednostavnih mašinskih uputstava.
● Svi programi moraju biti konvertovani u mašinske
instrukcije poznate računaru pre nego što se mogu izvršiti.
○ Primjer (MIPS 32-bitna arhitektura, naredba kao
uzorak bita):
■ 00000001000010010101000000100000
■ Dodajte binarne vrijednosti u registar 8 i 9 i
pohranite rezultat u registar 10
■ add $10, $8, $9
3.
Programski jezici visokognivoa
● Mašinske instrukcije čine jezik koji računar može obraditi, mašinski
jezik.
○ Različiti računari (CPU) mogu imati različite mašinske jezike!
● Ljudi mogu koristiti samo mašinske jezike za vrlo male programe i
stoga su razvijeni programski jezici visokog nivoa koji znatno
olakšavaju programiranje.
● Pošto mašina ne poznaje komande višeg programskog jezika, one se
onda moraju prevesti u mašinski jezik.
● Prilikom prevođenja, svaka naredba programa napisana na
programskom jeziku visokog nivoa se prevodi u odgovarajući niz
strojnih naredbi i pohranjuje u datoteku prije izvršenja. Zatim se
izvršava mašinski program iz ove datoteke.
● Program odgovoran za prevođenje općenito se naziva kompajler.
● U stvarnosti, proces prevođenja se sastoji od nekoliko faza i potrebni
su dodatni programi.
Šta se dešavakada pokrenemo program?
●Kompajler (engl. compiler, prevodilac) – prevodi izvorni
kod u višem programskom jeziku (npr. C) u mašinski kod
koji je razumljiv računaru.
●Linker (povezivač) – povezuje objektni kod programa koji
proizvede kompajler sa bibliotekama i kreira izvršnu
datoteku (engl. executable, ekstenzija .exe na Windowsu).
●Interpreter (tumač) – izvršava izvorni kod programa
direktno bez kompajliranja (obično sporije).
●WebIDE – sve se dešava na serveru...
Šta je C?
●Odakle dolazi C?
○ AT&T Bell Laboratories
○ Razvijen ranih 1970-ih
● Verzije
○ 1978 – K&R-C (Brian W. Kernighan i Dennis Ritchie) u prvom izdanju
Programskog jezika C.
○ 1989 – C89 Standard (ANSI C, Standard C)
○ 1990 – ANSI C usvojio ISO (C 90)
○ 1999 – C99 standard
■ Kompatibilan unatrag
■ Nije u potpunosti podržan od strane svih kompajlera! Koristi se u ovom
kursu.
○ 2011 – C11 standard
8.
Svojstva C-a
● Imperativniprogramski jezik
● Nekoliko ključnih riječi (rezerviranih riječi)
● Direktan pristup memoriji i vrlo hardverski orijentirano
programiranje
● Slabo razvijen modularni koncept
● Veoma moćan jezik uprkos nekoliko ključnih reči
○ Prednost i mana!
Zdravo svijete
#include <stdio.h>
intmain() {
printf("Dobro dosli na UUP!");
return 0;
}
Preprocesorska direktiva
#include
Služi za dodavanje vanjskih
biblioteka u program.
Jedna takva biblioteka zove se
stdio.h što je skraćeno od:
- standard
- input
- output
Sadrži funkcije za ulaz i izlaz
kao što je funkcija printf.
11.
Zdravo svijete
Funkcija "main"(glavna)
Svaki C program se sastoji od
jedne ili više funkcija.
U programu mora postojati
jedna funkcija koja se zove
"main". To je funkcija koja se
izvršava kada pokrenemo
program.
#include <stdio.h>
int main() {
printf("Dobro dosli na UUP!");
return 0;
}
12.
Zdravo svijete
#include <stdio.h>
intmain() {
printf("Dobro dosli na UUP!");
return 0;
}
Vitičaste (velike) zagrade
Označavaju jedan „blok“ koda.
Koriste se kada je potrebno iz nekog
razloga grupisati više naredbi tako da
se posmatraju kao jedna.
Svaka funkcija je jedan blok, pa tako
i funkcija main.
13.
Zdravo svijete
#include <stdio.h>
intmain() {
printf("Dobro dosli na UUP!");
return 0;
}
Svaka linija koda u C-u završava
se znakom tačka-zarez, sa
nekim izuzecima.
Savjet:
Tačka-zareza nema ako se red završava
vitičastom zagradom (otvorenom ili
zatvorenom), te u pretprocesorskim
direktivama kao što je #include.
14.
Zdravo svijete
#include <stdio.h>
intmain() {
printf("Dobro dosli na UUP!");
return 0;
}
Povratna vrijednost funkcije
main
Funkcije mogu primati i vraćati
vrijednosti.
Funkcija main vraća vrijednost
0 (nula) ako je program ispravno
završio rad, a vrijednost različitu
od nule kako bi se signalizirala
greška.
15.
Zdravo svijete
#include <stdio.h>
intmain() {
printf("Dobro dosli na UUP!");
printf(" To je dobar predmet.");
return 0;
}
●Izvršenje programa je liniju po liniju, odozgo prema dole.
#include <stdio.h>
int main() {
printf("Dobro dosli na UUP!");
return 0;
printf(" To je dobar predmet.");
}
Ovo se neće nikada ispisati jer
se nalazi poslije naredbe
return 0;
koja završava rad programa.
16.
Jednostavno kreiranje programa
(samojedan izvorni fajl)
Korak 1
● Kreirajte program u bilo kojem editoru (npr. kate, gedit, nano)
● Sačuvajte pod bilo kojim imenom:
○ Međutim, ime bi trebalo da ima smisla i da se završava na .c (npr. test.c).
Korak 2 (veoma pojednostavljen!)
● Prevođenje programa na komandnoj liniji.
● Primjer gornjeg programau terminalu:
○ gcc test.c –o test (ili cc test.c –o test) Kreira test izvršnog programa.
17.
Pokretanje programa
● Napredmetu UUP ćemo koristiti razvojno okruženje
Theia IDE (vrlo slično izgleda kao VS.Code)
● Možete koristiti bilo koje razvojno okruženje
(Code::Blocks, DevCPP…)
● Međutim, razvojna okruženja su uglavnom podešena da
tolerišu greške (manje gnjavaže za programera), ali tako
nećete naučiti najbolje prakse (greška koja ne izgleda kao
greška…)
● ETF Theia je podešena za učenje.
● U Theia je integrisan UUP Game i autotester.
Šta se desikada napravimo grešku?
Pošto blabla nije ključna riječ
jezika C, kompajler pretpostavlja
da je u pitanju identifikator
(npr. promjenljiva).
Pošto ništa pod tim imenom nije
deklarisano, imamo grešku
undeclared.
24.
Šta se desikada napravimo grešku?
Pozicija greške je
podvučena crvenom
vijugavom linijom
Detaljno objašnjenje se
nalazi u prozoru za izlaz
25.
Čitajte poruke kompajlera!
/workspace/uup.c:In function ‘main’:
/workspace/uup.c:4:38: error: ‘blabla’ undeclared (first use in this
function)
printf("Dobro dosli na UUP!n"); blabla
^~~~~~
/workspace/uup.c:4:38: note: each undeclared identifier is reported only
once for each function it appears in
/workspace/uup.c:5:5: error: expected ‘;’ before ‘return’
return 0;
^~~~~~
Život će vam biti drastično lakši ako razumijete šta poruke
znače.
26.
Program br. 2
#include<stdio.h>
int main() {
int a,b,c;
printf("Unesite prvi broj: ");
scanf("%d", &a);
printf("Unesite drugi broj: ");
scanf("%d", &b);
c = a + b;
printf("Suma brojeva %d i %d je %dn", a, b, c);
return 0;
}
27.
Program br. 2
#include<stdio.h>
int main() {
int a,b,c;
printf("Unesite prvi broj: ");
scanf("%d", &a);
printf("Unesite drugi broj: ");
scanf("%d", &b);
c = a + b;
printf("Suma brojeva %d i %d je %dn", a, b, c);
return 0;
}
Uobičajeni dijelovi svakog C
programa
28.
Program br. 2
#include<stdio.h>
int main() {
int a,b,c;
printf("Unesite prvi broj: ");
scanf("%d", &a);
printf("Unesite drugi broj: ");
scanf("%d", &b);
c = a + b;
printf("Suma brojeva %d i %d je %dn", a, b, c);
return 0;
}
Deklarisane su tri cjelobrojne
(engl. integer) promjenljive pod
imenima a, b i c.
29.
Promjenljive (varijable)
●Promjenljiva jeimenovana lokacija u memoriji na kojoj
možemo držati neki podatak. U nju možemo pisati i iz nje
čitati.
●Radna memorija (RAM) računara je prostor za zapis
podataka kojem vrlo brzo možemo pristupiti. Organizovana
je u bajte (eng. byte). Jedan bajt = 8 bita = cijeli broj u
opsegu [0,255]. 4 GB = 4*230
B
30.
Promjenljive (2)
●Deklaracija promjenljivihje oblika:
TIP var1[, var2, var3, ... ];
●Kada deklarišemo promjenljivu, zauzeli smo određeni
prostor u memoriji i pridružili smo mu ime.
●Prilikom deklaracije u C-u je potrebno navesti i tip. Od tipa
zavisi količina zauzete memorije.
31.
Tipovi podataka uC-u
●Neki tipovi (detaljnije u skripti i budućim predavanjima):
−int – cijeli brojevi u intervalu [-231
, 231
)
−float – realni brojevi male preciznosti
−char – jedan znak (slovo, cifra, znak interpunkcije)
−double – realni brojevi dvostruke preciznosti
−long – cijeli brojevi teoretski na većem intervalu...
32.
Pravila za imenovanjepromjenljivih
●U imenu promjenljive se smiju nalaziti: velika i mala slova,
cifre i znak "underscore" (donja crta, _)
− Ime ne smije počinjati cifrom.
− Velika i mala slova se razlikuju.
●Određena imena su zabranjena (rezervisane riječi) jer se
koriste za naredbe u programskom jeziku C.
− Primjeri rezervisanih riječi: return, int, for…
− printf nije rezervisana riječ nego je ime funkcije definisane u
biblioteci stdio.h
33.
Kada koristiti cijelea kada realne?
●Broj jabuka, broj stanovnika, broj predmeta - cijeli broj
●Visina, brzina, prosjek - realan broj
− Sve veličine u prirodi su realne (odatle i ime)
●Uvijek koristite tip double za realne brojeve
● float - 4 bajta
● double - 8 bajtova
34.
Program br. 2
#include<stdio.h>
int main() {
int a,b,c;
printf("Unesite prvi broj: ");
scanf("%d", &a);
printf("Unesite drugi broj: ");
scanf("%d", &b);
c = a + b;
printf("Suma brojeva %d i %d je %dn", a, b, c);
return 0;
}
Funkciju printf znamo od ranije...
znamo li sve o njoj?
35.
printf – funkcijaza izlaz na ekran
●print (štampati), f – od formatirano
●Prvi parametar funkcije je tekst koji se ispisuje (pod
dvostrukim navodnicima) sa znakovima za formatiranje.
●Nakon zatvorenih navodnika slijede promjenljive koje se
ispisuju, razdvojene znakom zarez.
●Znakovi formatiranja se po broju i tipu moraju slagati sa
promjenljivim.
printf("Zbir je: %d+%d=%dn", a, b, c);
36.
Format karakteri ufunkciji printf
●%d – int, %f – float i double, %c – char, itd.
●Vrijednosti promjenljivih se ubacuju umjesto znakova za
formatiranje onim redom kojim su navedene.
●Npr. iznad ako je a=2, b=3, c=5 ispisaće se:
Zbir je: 2+3=5
printf("Zbir je: %d+%d=%dn", a, b, c);
37.
Još o printf-ui formatima...
●Ako želimo ispisati znak postotak (%) na ekranu, moramo
navesti %% (da ne bi došlo do zabune).
●Između znaka % i slova možemo dodati neke parametre
(eng. subspecifiers) npr.
−plus (+) - označava da se mora ispisati predznak čak i
kada je broj pozitivan
−minus (-) - poravnava ispis ulijevo
−broj – ispis broja na određenom broju mjesta
−nula (0) – forsira ispis nula
−tačka (.) - broj decimala (kod realnih brojeva)
I još...
●Određeni karakterise ne mogu navesti u printf tekstu, npr:
novi red, tabulator itd. Za njih se koriste escape kodovi.
n – novi red (eng. newline)
t – tabulator, poravnava ispis sa nekom imaginarnom
uspravnom linijom na ekranu (kao kada pritisnete tipku
TAB)
- znak backslash (obrnuta kosa crtica)
40.
Program br. 2
#include<stdio.h>
int main() {
int a,b,c;
printf("Unesite prvi broj: ");
scanf("%d", &a);
printf("Unesite drugi broj: ");
scanf("%d", &b);
c = a + b;
printf("Suma brojeva %d i %d je %dn", a, b, c);
return 0;
}
Funkcija scanf služi za unos
vrijednosti sa tastature u
promjenljivu.
41.
Funkcija scanf
●Kada izvršenjeprograma
naiđe na funkciju scanf,
program se zaustavlja.
Trepčući ili prazan kursor
signalizira da se očekuje
od korisnika da nešto
unese. Unos se završava
tipkom ENTER.
scanf("%d", &a);
42.
Funkcija scanf
●Formati sukao i kod printf-a samo što ne postoje
parametri, a za tip double se mora koristiti %lf.
●Sve što napišete pod navodnicima (osim formata) treba
se unijeti.
●Npr. scanf("%d,%d", &a, &b); traži da se unesu dva
broja razdvojena zarezom. Unos će se ponavljati sve
dok ne unesete zarez!
●Prije imena varijabli OBAVEZNO se navodi znak &
(ampersand), u suprotnom program se krahira.
& upućuje na memorijsku lokaciju varijable
scanf("%d", &a);
43.
Program br. 2
#include<stdio.h>
int main() {
int a,b,c;
printf("Unesite prvi broj: ");
scanf("%d", &a);
printf("Unesite drugi broj: ");
scanf("%d", &b);
c = a + b;
printf("Suma brojeva %d i %d je %dn", a, b, c);
return 0;
}
Varijabli c dodjeljuje se
vrijednost izraza a+b;
44.
Naredba dodjele
●Znak =nije matematička jednakost, to je naredba
dodjele. Ona se izvršava na sljedeći način:
−najprije se izračuna vrijednost sa desne strane (a+b),
−zatim se ta vrijednost upiše u promjenljivu sa lijeve
strane (c).
c = a + b;
45.
Primjer
●Ako ovo napišetedobićete grešku kompajlera koja
glasi:
Invalid lvalue in assignment
●assignment – engl. dodjela, u pitanju je naredba dodjele
●lvalue – left value, vrijednost s lijeve strane
●invalid – nije ispravna (invalidna je) jer se s lijeve strane
ne može naći matematički izraz.
a + b = c;
Primjer 2
●Koliko jex nakon ovih naredbi?
●Najprije se izračunava vrijednost izraza sa desne
strane:
x+1 = 5+1 = 6
●Zatim se izračunata vrijednost dodjeljuje promjenljivoj
sa lijeve strane, x postaje 6.
=> x=x+1 uvećava vrijednost promjenljive x za 1!
x=5; x = x + 1;
48.
Literali
●U bloku naredbiiznad "5" je literal – doslovce (literalno)
navedena vrijednost.
●Literali također imaju tip!
−Literal 5 je tipa int.
−Literal 5.0 je tipa double.
● Svi programski jezici slijede konvenciju engleskog jezika po kojoj
se za odvajanje decimala koristi tačka a ne zarez.
x=5; x = x + 1;
49.
Inicijalizacija
●Šta se dešavakada napišemo?
int broj;
printf ("%d", broj);
●Kada počnemo rad memorija je popunjena nekim
podacima od ranije (brisanje se ne radi jer je sporo). Kada
deklarišemo promjenljivu, ona poprimi vrijednost koja se
„zatekla“ na odgovarajućoj lokaciji u memoriji.
50.
Inicijalizacija (2)
●Dobićemo nekuneočekivanu vrijednost!
●Sve promjenljive je obavezno inicijalizirati:
int broj=0;
printf ("%d", broj);
●Bilo kakav pristup neinicijaliziranoj promjenljivoj je
pogrešan! Npr.
int suma;
suma++;
51.
Neki operatori uC-u
●(potpuniji spisak na kasnijim predavanjima i u skripti)
+ sabiranje
- oduzimanje
* množenje
/ dijeljenje
% ostatak pri cjelobrojnom dijeljenju
→ greška ako je operand realan broj
●U C-u ne postoji operator stepenovanja kao takav, može
se koristiti funkcija pow iz biblioteke math.h
●Unarni operatori, npr. operator negacije: y=-x;
52.
Kombinovani operatori
●Neki operatoriistovremeno vrše matematičku operaciju i
dodjelu, npr:
x++ je isto što i x=x+1
također i: x-- je x=x-1
x+=6 je isto što i x=x+6
također i: -= *= /= %= ...
53.
Rješavanje programskih zadataka
Primjer:
Napisatiprogram koji na osnovu datog poluprečnika
kružnice izračunava površinu kruga kojeg opisuje ta
kružnica i zapreminu lopte nastale rotacijom kruga oko
svoje ose.
54.
Rješavanje programskih zadataka
●Opštipristup rješavanju programskih zadataka:
−odrediti ulaze
−odrediti izlaze
−odrediti transformaciju kojom se iz ulaza dobijaju izlazi
OBRADA
ULAZ IZLAZ
55.
Rješavanje programskih zadataka
Napisatiprogram koji na osnovu datog poluprečnika kružnice izračunava
površinu kruga kojeg opisuje ta kružnica i zapreminu lopte nastale
rotacijom kruga oko svoje osi.
● Ulazi:
● Izlazi:
● Obrada:
poluprečnik
površina, zapremina
P=R2
π
V=4/3 R3
π
56.
Rješenje
#include <stdio.h>
#define PI3.1415926
int main() {
double r, P, V;
/* Ulaz */
printf("Unesite poluprecnik: ");
scanf("%lf", &r);
/* Obrada */
P=r*r*PI;
V=(4./3)*r*r*r*PI;
/* Izlaz */
printf("Povrsina kruga sa poluprecnikom %.2f je %.2fn", r, P);
printf("Zapremina kugle sa poluprecnikom %.2f je %.2fn", r, V);
return 0;
}
57.
Program br. 3
#include<stdio.h>
#define PI 3.1415926
int main() {
float r, P, V;
/* Ulaz */
printf("Unesite poluprecnik: ");
scanf("%f", &r);
/* Obrada */
P=r*r*PI;
V=(4./3)*r*r*r*PI;
/* Izlaz */
printf("Povrsina kruga sa poluprecnikom %.2f je %.2fn", r, P);
printf("Zapremina kugle sa poluprecnikom %.2f je %.2fn", r, V);
return 0;
}
Simboličke konstante se definišu
pretprocesorskom direktivom #define.
Konstanta se ne može mijenjati za
vrijeme rada programa.
58.
Simboličke konstante
●Između ključneriječi #define, imena konstante i
vrijednosti su razmaci, a ne znak jednako. Na kraju
nema znaka tačka-zarez!
●Običaj je da se konstante imenuju velikim slovima
(mada nije obavezno).
●Prilikom kompajliranja se vrši zamjena imena i
vrijednosti konstante. Tako npr. možete pisati:
#define pisi printf
#define plus +
#define PI 3.1415926
59.
Program br. 3
#include<stdio.h>
#define PI 3.1415926
int main() {
float r, P, V;
/* Ulaz */
printf("Unesite poluprecnik: ");
scanf("%f", &r);
/* Obrada */
P=r*r*PI;
V=(4./3)*r*r*r*PI;
/* Izlaz */
printf("Povrsina kruga sa poluprecnikom %.2f je %.2fn", r, P);
printf("Zapremina kugle sa poluprecnikom %.2f je %.2fn", r, V);
return 0;
}
Komentar je informacija za
programera koju kompajler ignoriše.
60.
Komentari
●Komentari u Cstilu počinju znakom kosa crta (slash) i
zvijezda, a završavaju sa zvijezda kosa crta.
●Komentari u C++ stilu počinju sa dvije kose crte a
završavaju se prelaskom u sljedeći red. Primjer:
int a; // a je stranica kvadrata
scanf ("%d", &a); // unos
●Mada je preporučljiv C stil, oba su podržana.
61.
Šta još uočavamou ovom programu?
#include <stdio.h>
#define PI 3.1415926
int main() {
float r, P, V;
/* Ulaz */
printf("Unesite poluprecnik: ");
scanf("%f", &r);
/* Obrada */
P=r*r*PI;
V=(4./3)*r*r*r*PI;
/* Izlaz */
printf("Povrsina kruga sa poluprecnikom %.2f je %.2fn", r, P);
printf("Zapremina kugle sa poluprecnikom %.2f je %.2fn", r, V);
return 0;
}