Uvod u programiranje
Programski jezik C
Doc. dr. Senka Krivić
Univerzitet u Sarajevu
Elektrotehnički fakultet Sarajevo
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
Programski jezici visokog nivoa
● 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.
Primjer C i MIPS mikroprocesor
Šta se dešava kada 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...
Zašto postoje programski jezici?
ZBOG LJUDI!
(kompjuterima je svejedno)
Š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
Svojstva C-a
● Imperativni programski 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>
int main() {
printf("Dobro dosli na UUP!");
return 0;
}
Zdravo svijete
#include <stdio.h>
int main() {
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.
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;
}
Zdravo svijete
#include <stdio.h>
int main() {
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.
Zdravo svijete
#include <stdio.h>
int main() {
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.
Zdravo svijete
#include <stdio.h>
int main() {
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.
Zdravo svijete
#include <stdio.h>
int main() {
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.
Jednostavno kreiranje programa
(samo jedan 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.
Pokretanje programa
● Na predmetu 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.
Pokretanje programa
Run – pokreće
izvršnu datoteku
Još o Theia ETF
Datoteke
Zadaci:
- tutorijali, zadaće (TP)
- ispiti (UUP)
UUP Game
Debugger
Još o Theia ETF
Kada koristite Assignments ili
UUP Game, automatski se
kreiraju odgovarajući folderi - ne
morate ih ručno kreirati!
Programiranje podrazumijeva...
1) pisanje koda
2) čitanje koda
3) testiranje koda
4) dokumentovanje koda
Kada kliknemo na Run...
Izlaz vašeg programa
(naredba printf)
Šta se desi kada 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.
Šta se desi kada napravimo grešku?
Pozicija greške je
podvučena crvenom
vijugavom linijom
Detaljno objašnjenje se
nalazi u prozoru za izlaz
Č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.
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;
}
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
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.
Promjenljive (varijable)
●Promjenljiva je imenovana 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
Promjenljive (2)
●Deklaracija promjenljivih je 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.
Tipovi podataka u C-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...
Pravila za imenovanje promjenljivih
●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
Kada koristiti cijele a 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
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?
printf – funkcija za 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);
Format karakteri u funkciji 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);
Još o printf-u i 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š...
●Primjeri: ako je a=15:
−printf ("%5d“, a);
−printf ("%05d", a);
−printf ("%5.2f", x);
1 5
0 0 0 1 5
2 . 1 0
I još...
●Određeni karakteri se 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)
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.
Funkcija scanf
●Kada izvršenje programa
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);
Funkcija scanf
●Formati su kao 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);
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;
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;
Primjer
●Ako ovo napišete dobić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 je x nakon ovih naredbi?
x=5; x = x + 1;
Primjer 2
●Koliko je x 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;
Literali
●U bloku naredbi iznad "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;
Inicijalizacija
●Šta se dešava kada 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.
Inicijalizacija (2)
●Dobićemo neku neoč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++;
Neki operatori u C-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;
Kombinovani operatori
●Neki operatori istovremeno 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: -= *= /= %= ...
Rješavanje programskih zadataka
Primjer:
Napisati program 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.
Rješavanje programskih zadataka
●Opšti pristup rješavanju programskih zadataka:
−odrediti ulaze
−odrediti izlaze
−odrediti transformaciju kojom se iz ulaza dobijaju izlazi
OBRADA
ULAZ IZLAZ
Rješavanje programskih zadataka
Napisati program 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
π
Rješenje
#include <stdio.h>
#define PI 3.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;
}
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.
Simboličke konstante
●Između ključne riječ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
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.
Komentari
●Komentari u C stilu 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.
Šta još uočavamo u 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;
}
Vaša prva vježba …
SRETNO!

Prezentacija 1: Uvod u C programiski jezik

  • 1.
    Uvod u programiranje Programskijezik C Doc. dr. Senka Krivić Univerzitet u Sarajevu Elektrotehnički fakultet Sarajevo
  • 2.
    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.
  • 4.
    Primjer C iMIPS mikroprocesor
  • 5.
    Š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...
  • 6.
    Zašto postoje programskijezici? ZBOG LJUDI! (kompjuterima je svejedno)
  • 7.
    Š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!
  • 9.
    Zdravo svijete #include <stdio.h> intmain() { printf("Dobro dosli na UUP!"); return 0; }
  • 10.
    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.
  • 18.
    Pokretanje programa Run –pokreće izvršnu datoteku
  • 19.
    Još o TheiaETF Datoteke Zadaci: - tutorijali, zadaće (TP) - ispiti (UUP) UUP Game Debugger
  • 20.
    Još o TheiaETF Kada koristite Assignments ili UUP Game, automatski se kreiraju odgovarajući folderi - ne morate ih ručno kreirati!
  • 21.
    Programiranje podrazumijeva... 1) pisanjekoda 2) čitanje koda 3) testiranje koda 4) dokumentovanje koda
  • 22.
    Kada kliknemo naRun... Izlaz vašeg programa (naredba printf)
  • 23.
    Š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)
  • 38.
    I još... ●Primjeri: akoje a=15: −printf ("%5d“, a); −printf ("%05d", a); −printf ("%5.2f", x); 1 5 0 0 0 1 5 2 . 1 0
  • 39.
    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;
  • 46.
    Primjer 2 ●Koliko jex nakon ovih naredbi? x=5; x = x + 1;
  • 47.
    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; }
  • 62.
    Vaša prva vježba… SRETNO!

Editor's Notes

  • #49 Ovo treba biti u prvom predavanju!