Osnove Račuvarstva

46
Još jedan algoritam za sabiranje prvih n prirodnih brojeva Suma= 1 + 2 + 3 + 4+ …………+ n-3+ n-2 + n-1+n Svaki par brojeva ima sumu n+1; Ima n/2 takvih parova Suma = n / 2 · (n+1) Ima n/2 takvih parova. ulaz (n) Suma=n/2·(n+1); drugi algoritam za sabiranje prvih n brojeva vrati (Suma) Koji od dva algoritma je efikasniji, a time i bolji? Vremenska kompleksnost(1/2) Pored ispravnosti algoritma važno svojstvo algoritma je i trajanje algoritamskog procesa. procesa. • Trajanje algoritamskog procesa izražavamo kao broj osnovnih operacija koje algoritam treba izvesti. algoritam treba izvesti. • Za izvođenje svake operacije potrebno je neko vrijeme. Pt i li ih l it kt t j j l it k Potpuno precizna analiza svih algoritama sa aspekta trajanja algoritamskog procesa je nemoguća. Zd lj t t k d j t j j l it k Zadovoljavamo se pretpostavkom da je trajanje algoritamskog procesa proporcionalno ukupnom broju operacija. S jt l it kj ki ti i ž t j j l it k Svojstvo algoritma koje aproksimativno izražava trajanje algoritamskog procesa naziva se vremenska kompleksnost. Vremenska kompleksnost(2/2) Prvi algoritam ima vremensku kompleksnost koja je proporcionalna sa n. Tada kažemo da algoritam ima vremensku kompleksnost O(n) Vremenska kompleksnost drugog algoritma ne ovisi o n, odnosno, trajanje algoritamskog procesa je približno konstantno bez obzira na vrijednost n. Tada kažemo da algoritam ima vremensku kompleksnost O(1) Općenito ako je trajanje nekog algoritamskog procesa proporcionalno s n 2 njegovu Općenito, ako je trajanje nekog algoritamskog procesa proporcionalno s n 2 njegovu vremensku kompleksnost zapisujemo kao O(n 2 ). Slično zapisujemo vremensku kompleksnost i u drugim situacijama kada je trajanje U većini slučajeva analiza vreemnske kompleksnosti algoritama je vrlo složena algoritamskog procesa, na primjer, proporcionalno s n 3 , n·log (n) itd. U većini slučajeva analiza vreemnske kompleksnosti algoritama je vrlo složena. • Ako neki problem možemo rješiti s više različitih algoritama, u većini slučajeva se izabire onaj koji ima manju vremensku kompleksnost. Zašto viši programski jezici? Mašinski jezik je vrlo nepraktičan jer od programera zahtijeva detaljno poznavanje arhitekture mikroprocesora i ostalih komponenti u arhitekturi računara. • Zbog toga su dizajnirani umjetni jezici koji su prikladniji za programere jer u načelu ne zahtijevaju detalnjo poznavanje arhitekture računara. •Ti jezici se nazivaju viši programski jezici. • Viši programski jezici moraju biti tako dizajnirani da se programi napisani u njima mogu prevoditi u mašinski jezik računara da bi se mogli izvoditi. • Viši programski jezici su značajno povećavli produktivnost kreiranja softvera.

description

or

Transcript of Osnove Račuvarstva

Page 1: Osnove Račuvarstva

Još jedan algoritam za sabiranje prvih n prirodnih brojeva

Suma= 1 + 2 + 3 + 4+ …………+ n-3+ n-2 + n-1+n• Svaki par brojeva ima sumu n+1;

Ima n/2 takvih parovaSuma = n / 2 · (n+1)

• Ima n/2 takvih parova.

ulaz (n)Suma=n/2·(n+1);

drugi algoritam za sabiranje prvih n brojeva

vrati (Suma)

Koji od dva algoritma je efikasniji, a time i bolji?

Vremenska kompleksnost(1/2)

• Pored ispravnosti algoritma važno svojstvo algoritma je i trajanje algoritamskog procesa.procesa.

• Trajanje algoritamskog procesa izražavamo kao broj osnovnih operacija koje algoritam treba izvesti.algoritam treba izvesti.

• Za izvođenje svake operacije potrebno je neko vrijeme.

P t i li ih l it kt t j j l it k• Potpuno precizna analiza svih algoritama sa aspekta trajanja algoritamskog procesa je nemoguća.

Z d lj t t k d j t j j l it k• Zadovoljavamo se pretpostavkom da je trajanje algoritamskog procesa proporcionalno ukupnom broju operacija.

S j t l it k j k i ti i ž t j j l it k• Svojstvo algoritma koje aproksimativno izražava trajanje algoritamskog procesa naziva se vremenska kompleksnost.

Vremenska kompleksnost(2/2)

• Prvi algoritam ima vremensku kompleksnost koja je proporcionalna sa n.

Tada kažemo da algoritam ima vremensku kompleksnost O(n)

• Vremenska kompleksnost drugog algoritma ne ovisi o n, odnosno, trajanje

algoritamskog procesa je približno konstantno bez obzira na vrijednost n.

Tada kažemo da algoritam ima vremensku kompleksnost O(1)

Općenito ako je trajanje nekog algoritamskog procesa proporcionalno s n2 njegovuOpćenito, ako je trajanje nekog algoritamskog procesa proporcionalno s n2 njegovu vremensku kompleksnost zapisujemo kao O(n2).Slično zapisujemo vremensku kompleksnost i u drugim situacijama kada je trajanje

• U većini slučajeva analiza vreemnske kompleksnosti algoritama je vrlo složena

p j p g j j j jalgoritamskog procesa, na primjer, proporcionalno s n3, n·log (n) itd.

• U većini slučajeva analiza vreemnske kompleksnosti algoritama je vrlo složena. • Ako neki problem možemo rješiti s više različitih algoritama, u većini slučajeva se izabire onaj koji ima manju vremensku kompleksnost.

Zašto viši programski jezici?

• Mašinski jezik je vrlo nepraktičan jer od programera zahtijeva detaljno j j p j p g j jpoznavanje arhitekture mikroprocesora i ostalih komponenti u arhitekturi računara.

• Zbog toga su dizajnirani umjetni jezici koji su prikladniji za programere jer u načelu ne zahtijevaju detalnjo poznavanje arhitekture računara.

•Ti jezici se nazivaju viši programski jezici.

• Viši programski jezici moraju biti tako dizajnirani da se programi napisani u p g j j j p g pnjima mogu prevoditi u mašinski jezik računara da bi se mogli izvoditi.

• Viši programski jezici su značajno povećavli produktivnost kreiranja softvera.p g j j p p j

Page 2: Osnove Račuvarstva

Da li je jedino važno detaljno znati neki programski jezik?

• Pisanje programa u nekom višem programskom jeziku zahtijeva da se

d t lj j il k j i j t j j ikdetaljno poznaju pravila koja opisuju taj jezik.

• Učenje nekog jezika i strogo pridržavanje prilikom programiranja u tom j g j g p j p p g j

jeziku mogu na neki umanjiti važnost osnovnih svojstava nekog

algoritma.

š č žZa uspješno oblikovanje novog programa nije isključivo važno da

je program sa aspekta formalnih pravila nekog jezika ispravan,

nego je važno i to da je algoritam koji se opisuje tim jezikom

ispravan i dovoljno efikasan.

Programiranje i izbor programskog jezika

• Programiranje je proces kojim neki algoritam pretvaramo pomoću nekog od

programskih jezika u programski kod te na taj način oblikujemo opis algoritmaprogramskih jezika u programski kod, te na taj način oblikujemo opis algoritma

pomoću dotičnog programskog jezika.

• Neki od viših programskih jezika:• Neki od viših programskih jezika:

FortranPascal

• C• C++• Pascal

• Ada• Cobol

• C++• Java• C#

Visula Basic itd• Visula Basic, itd.

• Svaki od navedenih programskih jezika ima svoje specifičnosti koje ga čine p g j j p j gprikladnijim u odnosu na neki drugi jezik za neku domenu njegove primjene.

• Programski jezik C karakterizira visok stupanj općenitosti u smislu primjene u g j p j p p jrazličitim problemskim domenama, odnosno sferama ljudskog djelovanja za koje se oblikuju programi koji rješavaju probleme iz tih oblasti.

Programiranje, kompajliranje, povezivanje, greške(1/3)

Unos programskogkoda (ASCII datoteka)

programski kod)

kompajliranjesintaksne greške kompajliranjesintaksne greške(eng. syntax errors) biblioteka

potprograma

objektni kod

greške

greške u toku izvođenja(eng. run-time errors)

povezivanje izvršni kod

greške povezivanja(eng. linker

errors))

logičke

testni podaci

izvođenje programa rezultati logičke greške

Programiranje, kompajliranje, povezivanje, greške(2/3)

• Unos izvornog koda programa (eng. source code) pomoću nekog ASCII g p g ( g ) p g

editora teksta.

• Editori teksta su danas u pravilu ugrađeni u razvojna okruženja kojaEditori teksta su danas u pravilu ugrađeni u razvojna okruženja koja

programer koristi

• Kompajliranje izvornog koda programa u objektni kod pomoću kompajlera• Kompajliranje izvornog koda programa u objektni kod pomoću kompajlera.

• Kompajler nam daje sintaksne greške u programu (pravopisne i formalne)

• Programer ispravlja sintaksne greške u izvornom kodu i opet pokreće

kompajler.

Page 3: Osnove Račuvarstva

Programiranje, kompajliranje, povezivanje, greške(3/3)

• Povezivanje kompajliranog programa u izvršni program (eng linking)

(Povezuju se potprogramske binlioteke (stdio h math h string h )(Povezuju se potprogramske binlioteke (stdio.h, math.h, string.h,…).

• Linker otkriva pogreške, a programer ispravlja greške i opet pokreće kompajler.

• Izvođenje izvršnog programa.

• Odredimo neke testne podatke i očekivane rezulate.

• Greške koje otkrivamo u toku izvođenja programa (eng. run-time errors).

• Logičke greške

(Program ne javlja nikakvu grešku ali daje pogrešne rezultate).(Program ne javlja nikakvu grešku ali daje pogrešne rezultate).

• Ispravlja se izvorni programski kod i ponovno pokreće kompajliranje programa.

Struktura C programa i uvodni opis (1/3)

• U C programima je obavezna jedna i samo jedna funkcija main ().

Funkcija main () označava mjesto na kojem počinje izvršavanje programa• Funkcija main () označava mjesto na kojem počinje izvršavanje programa.

• Nakon svake naredbe stoji znak ; (terminator) koji označava kraj jedne i početak druge naredbepočetak druge naredbe.

• Niz naredbi grupiranih u jednu logičku cjelinu predstavlja blok naredbi.

• Početak bloka naredbi označava se znakom { .

• Završetak bloka naredbi označava se znakom } , pri čemu iza tog znaka ne stavljamo znak ; (terminator) .

Struktura C programa i uvodni opis (2/3)

• Ako se blok sastoji od samo jedne naredbe tada se znakovi { i }ne moraju koristiti.

• Sve varijable koje koristi neki C program moraju se deklarirati.

• Komentari se stavljaju između znakova /* i */.

• Komentare koristimo za dokumentiranje programa.

P ki j ik C ij i ij ki t či d ki k d ž č ti bil• Programski jezik C nije pozicijski a to znači da programski kod može početi u bilo kojoj liniji.

• Komentari naredbe i izrazi se mogu nalaziti u više linija• Komentari, naredbe i izrazi se mogu nalaziti u više linija.

Struktura C programa i uvodni opis (3/3)

• Programskom jezik C razlikuje velika i mala slova. Na primjer,

- Rez

- rezREZ- REZ

- rEznije isto

• Možemo izabrati proizvoljno mjesto za početak pisanja naredbe.

• Dozvoljeno je pisanje više naredbi u istom retku.

(Ali, da li je to preporučljivo raditi, to je pitanje?)

Page 4: Osnove Račuvarstva

Ključne riječi (ANSI standard)(ANSI ⇔ American National Standatds Institutre)

• Ključne riječi predstavljaju identifikatore koji za kompajler imaju tačno određeno značenje.

auto extern sizeof

• Sve ključne riječi u C-u se pišu malim slovima.

auto extern sizeofbreak float staticcase for structchar goto switchconst if typedefcontinue int uniondefault long unsigned

32 riječi

do register voiddouble return volatilel h t hilelse short while

enum signed

Varijable

• Varijable su promjenljivi podaci koji će tijekom izvođenja programa moći poprimiti različite vrijednostipoprimiti različite vrijednosti.• Svakoj varijabli se pridružuje neko ime.• Varijable zauzimaju određeni prostor u memoriji, što ovisi o tipu varijable.Varijable zauzimaju određeni prostor u memoriji, što ovisi o tipu varijable.• Imena varijabli se sastoje od slova i brojeva, pri čemu prvi znak mora biti slovo ili znak ‘_’._• Nije dozvoljeno koristiti ključne riječi kao imena varijabli.• Varijable se obavezno moraju deklarirati prije korištenja u programu.•Opći oblik za deklaraciju:

tip_podataka lista_varijabli;

•Nazivi varijabli u listi se odvajaju zarezom.

• Broj znakova u imenu može biti proizvoljan, ali je značajan prvi 31 znak.

Osnovno o tipovima podataka

• Programski jezik C ima sljedeće osnovne tipove podataka:

znakovni tip char

cjelobrojni tip intcjelobrojni tip int

realni tip float

l i ti d t k d blrealni tip sa dvostrukom double

preciznošću

• Svaki tip podataka zauzima određeni prostor u memoriji.

• Pravilnim izborom tipova podataka povećeva se efikasnost programa.

•Tipove podataka definiramo ovisno o rasponu vrijednosti koji će neka varijabla poprimiti tijekom izvođenja programa.

Osnovno o deklaraciji varijabli

char a;int b,c;float x1 x2;

• Primjer deklaracije varijabli:

float x1,x2;• Razlika između pojedinih tipova podataka je u broju bitova koje zauzimaju prilikom pohranjivanja u memoriji.p j j j

• Općenito:količina memorije koju zauzima neka varijabla ovisi o konkretnom kompajleru.

• Grafički, varijable možemo prikazati na slijedeći način:

8 bi 16 bi 32 bi

Ovakav prikaz će nam u nekim budućim primjerima omogućiti lakše razumijevanje tih

a b X1

8 bitova 16 bitova 32 bita primjera.

c X2c X2

Page 5: Osnove Račuvarstva

Nepotpuni opis ulaza i izlaza (funkcije scanf() i printf()) (1/2)

• Programski jezik C nema ugrađene ulazno-izlazne naredbe, pa se ulaz i izlaz podataka ostvaruje upotebom funkcija.

• Funkcije se nalaze u standardnoj U/I datoteci i definirane su ANSI standardom.

• Formatirani ulaz:Formatirani ulaz:

• Opći oblik funkcije:

f(“k t l i i “ li t t )scanf(“kontrolni niz “, lista argumenata);

• Kontrolni niz sadrži između ostalog oznake formata. Oznaka formata se sastoji d k % i ti f tod znaka % i tipa formata.

• Neki od formata za unos su:

%c učitava jedan znak;%d učitava cijeli broj;%f učitava broj s pokretnim zarezom.

• Podaci koji se unesu pridružuju se argumentima iz liste argumenata.

Nepotpuni opis ulaza i izlaza (funkcije scanf() i printf()) (2/2)

• Kontrolni niz može sadržavati i ostale znakove koji služe za povezivanje unesenih podataka s argumentima u listi argumenata.

• Formatirani izlaz

• Opći oblik funkcije koja služi za formatirani ispis na standardni izlaz je:

printf(“kontrolni niz”, lista argumenata);

• Kontrolni niz se sastoji od dva tipa znakova.Kontrolni niz se sastoji od dva tipa znakova.

• Prvi tip je oznaka formata ispisa koja se sastoji od obaveznog znaka % i oznake tipa formata koji se nalazi odmah iza %.tipa formata koji se nalazi odmah iza %.

• Neki od formata za ispis su:

% i i j j d k%c ispisuje jedan znak;%d ispisuje zadani argument u decimalnom zapisu;%f ispisuje zadani argument kao broj s pokretnim zarezom.% sp suje ada a gu e t ao b oj s po et a e o

• Drugi tip znakova kontrolnog niza predstavlja poruku.

Jedan jednostavan primjer(1/2)

#include <stdio.h>pretprocesorska naredba

int main(){int b1,b2,b3,rez;/*ucitavanje cijelih brojeva*/

deklaracija varijablipočetak funkcije main

/ ucitavanje cijelih brojeva /scanf("%d %d %d",&b1,&b2,&b3);rez=b1+b2+b3;

/*ispis unesenih cijelih brojeva i rezultata sabiranja*/printf("%d+%d+%d=%d",b1,b2,b3,rez);return 0; Kontrolni niz;

}kraj funkcije main. Lista argumenata

komentari

Jedan jednostavan primjer(2/2)

• Varijable b1, b2, b3 i rez su deklarirane kao cjelobrojne (integer).

• Deklaracijom varijabli se određuje ime i tip varijableDeklaracijom varijabli se određuje ime i tip varijable.

• Funkcija main() označava mjesto početka izvršavanja programa.

• Kao i ostale funkcije, funkcija main() ima mogunost prijenosa podataka u funkciju preko argumenata.

• scanf () predstavlja poziv funkcije za formatirano učitavanje podataka.

• printf () predstavlja poziv funkcije za ispis podataka.

Više o ovim funkcijama ćemo govoriti kasnije

• U naredbi za dodjeljivanje vrijednosti rez=b1+b2+b3;lijeva i desna strana su povezane operatorom pridruživanja = .

• Operator pridruživanja (=) je potrebno razlikovati od usporedbenog operatora za ispitivanje jednakosti koji je predstavljen dvostrukim znakom (= =).

Page 6: Osnove Račuvarstva

Pretprocesorske naredbe

•naredba #include <stdio.h> predstavlja tzv. pretprocesorsku naredbu kojom se uključuje datoteka stdio.h u program.

• Prije procesa prevođenja izvornog C programskog koda u mašinski jezik, pokreće se tzv. pretprocesor.

• Ovisno o pretprocesorskim naredbama, pretprocesor mijenja programski kod a zatim se tako promijenjeni programski kod prevodi.

• Promjene se zapisuju u privremenu datoteku, te na taj način datoteka sPromjene se zapisuju u privremenu datoteku, te na taj način datoteka s izvornim programskim kodom ostaje nepromijenjena.

Upotreba simboličkih konstanti i komentara (1/2)

• Korištenje simboličkih konstanti doprinosi većoj općenitosti i preglednosti programa.

• Simboličke konstante se moraju definirati izvan svih funkcija, pa se najčešće definiraju na početku programa.

• Opći oblik naredbe za definiranje simboličkih konstanti je:

#define simboličko_ime vrijednost• Treba primijetiti da između simboličkog imena i vrijednosti ne postoji znak pridruživanja =, kao i to da na kraju naredbe nema oznake ; (terminatora).

• Pri prevođenju (kompajliranju) programa sve simboličke konstante se fzamjenjuju definiranim vrijednostima.

Upotreba simboličkih konstanti i komentara (2/2)

• Upotreba simboličkih konstanti je jako korisna u programima gdje se određene konstante koriste na više mjesta, a postoji mogućnost njihove promjene. Na primjer, ako u nekom programu koristimo vrijednost porezne stope od 0.15 (15%) a došlo je do promjene na 0.2 (20%), tada nije potrebno obavljati izmjene na svim mjestima u programu gdje je godnije potrebno obavljati izmjene na svim mjestima u programu gdje je god korištena porezna stopa, nego je dovoljno promijeniti vrijednost konstante koja predstavlja poreznu stopu.

⇒ Komentari

• Komentari počinju znakom /* i završavaju znakom */.

• Sve što se nalazi unutar znakova /* */ ne utječe na tok izvođenja

programa.

• Povećavaju razumljivost programa.

Mogu se nalaziti u više linija• Mogu se nalaziti u više linija.

• Nije dozvoljeno koristiti komentar unutar komentara.

Primjer(upotreba simboličkih konstanti)

#include <stdio.h>#define PI 3.14 Ako bi bilo potrebno promijeniti vrijednost PI, na

primjer zbog veće preciznosti, dovoljno je to učiniti

int main(){fl t R P V

p j g p , j ju ovoj liniji.

float R, P, V;

/* Unos poluprecnika sa tastature i izracunavanje */

printf (“\ Unesite poluprecnik:”);scanf (“%f”, &R);P=(R*R)*PI;P=(R R) PI;V=(4/3)*R*R*R*PI;

/* Ispis na monitoru*// Ispis na monitoru /

printf(“\n Povrsina kruga sa poluprecnikom %2f je %.2f”,R,P);printf(“\n Zapremina kugle sa poluprecnikom %2f je %.2f”,R,V);p ( p g p p j , , );return 0;

}

Page 7: Osnove Račuvarstva

Važnost stila pisanja programa i upotrebe komentara

#include <stdio.h>int main(){int b1 b2int b1,b2,b3,rez; scanf("%d %d %d",&b1,&b2,&b3); rez=b1+b2+b3; printf("%d+%d+%d=%d",b1,b2,b3,rez); return 0; }

isti programi • donji program je pregledniji i jasniji zbog stila pisanja,zbog

#include <stdio.h>

int main(){

j j g p j , gupotrebe komantara, te zbog umetanja praznih redova.

int b1,b2,b3,rez;/*ucitavanje cijelih brojeva*/

scanf("%d %d %d",&b1,&b2,&b3);rez=b1+b2+b3;

/*ispis unesenih cijelih brojeva i rezultata sabiranja*/printf("%d+%d+%d=%d",b1,b2,b3,rez);return 0;return 0;

}

Page 8: Osnove Račuvarstva

Sadržaj predavanja 02

• Cjelobrojni tip podatakaCjelobrojni tip podataka• Realni tip podataka• Aritmetički operatori

I iObavezno čitanje literature:

• Izrazi• Operatori inkrement i dekrement• Kontrola toka programa

Skripta : strane: 16 - 26 + 96 - 106

• Naredba za jednostruki izbor• Naredba za dvostruki izbor• Naredba za višestruki izbor

Napomena: dio gore navedenih stranica iz skripte sadrži i koncepte

• Ponavljanje naredbi/petlja forstranica iz skripte sadrži i koncepte koji neće biti obrađeni na ovom predavanju. Studentima se savjetuje

+da ipak pročitaju i taj dio.

• Primjeri koji ilustriraju sve uvedene koncepte

Cjelobrojni tip podataka(1/3)

• Cjelobrojni tip podataka može imati slijedeće prefikse:

i d ć j id ži j i iti ih i ti ih ij d ti- signed omogućuje pridruživanje i pozitivnih i negativnih vrijednosti;

- unsigned omogućuje pridruživanje samo pozitivnih vrijednosti;

- long omogućuje da se proširi raspon cjelobrojnih vrijednosti koje

varijabla može poprimiti;

- short sužava raspon cjelobrojnih vrijednosti koje varijabla može

poprimitipoprimiti.

• Cjelobrojni tip deklariran sa prefiksom long omogućuje veću preciznost u odnosu na deklaraciju ka je korišten prefiks shortdeklaraciju ka je korišten prefiks short.

• Pretpostavljeni prefiks cjelobrojnog tipa je signed.

Cjelobrojni tip podataka(2/3)

• Pretpostavim da int zauzima dva bajta.

• To znači da ta varijabla može poprimiti vrijednosti između:• To znači da ta varijabla može poprimiti vrijednosti između:

-32768 i 32767

• Na primjer, neka je stanje u 16-bitnom registru:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

• Uz pretpostavku da je korišten zapis dvojnog komplementa vrijedi:

ako je varijabla deklarirana kao signed int vrijednost varijable je 1- ako je varijabla deklarirana kao signed int vrijednost varijable je -1.

- ako je varijabla deklarirana kao unsigned int vrijednost varijable

je 65535=216-1.

Cjelobrojni tip podataka(3/3)

• ANSI C ne postavlja ograničenja na preciznost prikaza varijabli koristeći prefikse short i long, pri čemu ipak vrijedi:

prec(short) ≤ prec(int) ≤ prec(long)

gdje prec označava preciznost, odnosno broj cifri.int

signed short precizan prikaz

unsigned long

short

p pdeklaracijecjelobrojnih varijablishort

long

signed int a;int a;

signed long int a;long int a;

unsigned short int a;unsigned short a;

• Primjeri nekih ekvivalentnih deklaracija su grupirani zajedno:

long int a;signed long a;long a;

g

Page 9: Osnove Račuvarstva

Primjer uticaja prefiksa na cjelobrojnu varijablu

#include <stdio.h>

i i ()int main(){

int a;unsigned int b;a=-1;b=a;printf(“\n a=%d b=%u”,a,b);return 0;

}}• Izvođenje ovog programa daje rezultat:

a = -1 b = 65535 (uz pretpostavku da tip int u konkretnoj implementaciji C-aa = -1 b = 65535 (uz pretpostavku da tip int u konkretnoj implementaciji C-a zauzima 16 bitova)

a = 1 b = 4294967295 (uz pretpostavku da tip int u konkretnoj implementaciji Ca = -1 b = 4294967295 (uz pretpostavku da tip int u konkretnoj implementaciji C-a zauzima 32 bita)

Realni tip podataka(1/3)

• U programiranju često imamo potrebu deklarirati varijablu koja modelira neku fizikalnu veličinu ili neku drugu vrstu podatka realnim brojem.

• Ti brojevi su često “vrlo mali” i “vrlo veliki”.

• Obično za prikaz velikih i malih brojeva koristimo slijedeću notaciju:

eksponentjedno decimalno mjesto isperd tačke

• Slično se mogu prikazati i binarni brojevi

34542000=3.4542·107

• Slično se mogu prikazati i binarni brojevi.

• Na primjer:

0.000000101=1.01·2-7

1010 11=1 01011 ·231010.11 1.01011 2• Ovakav zapis brojeva nazivamo normalizirani zapis.

Realni tip podataka(2/3)

0 . 0 0 0 0 0 0 1 0 1 = 1 . 0 1 · 2 -7Na prvom mjestu je uvijek jedinica.

1 0 1 0 . 1 1 = 1 . 0 1 0 1 1 · 2 3j j j

• Kod gore prikazanog načina zapisa binarnih brojeva, na prvom mjestu je uvijek jedinica.

•To znači, da se ta jedinica ne mora niti zapisivati jer je možemo podrazumijevati. Na taj način se štedi jedan bit, što doprinosi većoj preciznosti.

•Taj bit se naziva skriveni bit (eng. hidden bit)Taj bit se naziva skriveni bit (eng. hidden bit)

Realni tip podataka(3/3)

float

double

precizan prikaz deklaracije varijabli double

long

j jrealnog tipa

• Primjeri mogućih deklaracija:

- float a;- double b;- long double c;

Page 10: Osnove Račuvarstva

IEEE standard zapisa realnih brojeva(IEEE-Institute of Electrical and Electronics Engineers)(IEEE Institute of Electrical and Electronics Engineers)

K MP022233031

• P označava predznak (1 bit)

- 1 negativan brojg j

- 0 pozitivan broj

• K označava karakteristiku (8 bitova)

- binarni eksponent+127bi k t j 126 127- raspon binarnog eksponenta je -126 - 127

- raspon karakteristike je 0 - 255

• M označava mantisu, pri čemu se vodeća jedinica ne zapisuje (23 bita).

Primjer prikaza realnog broja tipa float

• Potrebno je odrediti prikaz broja 6.625 koji je pridru\en varijabli deklariranoj kao float.

6.625(10) = 110.101(2)

•Binarni broj dalje možemo zapisati na slijedeći način:

110.101=1.10101•22

• Izračunajmo karakteristiku:

K= 2 + 127=129K= 2 + 127=129

129(10) =10000001(2)

• Nakon izbacivanja vodeće jedinice i tačke za mantisu dobivamo:10101

• Prema tome, broj 6.625 kao tip float će biti zapisan na slijedeći način:

0 10000001 10101000000000000000000

Šta je sa zapisom broja 0?

• Pošto je u normaliziranom zapisu vodeća uvijek jedinica, postavlja se pitanje kako prikazati broj 0.kako prikazati broj 0.• Vrjedi slijedeći dogovor:

Kada su svi bitovi karakteristike i svi bitovi mantise jednaki nuli, onda se radi o prikazu realnog broja 0.

• Gornji dogovor ima za posljedicu da postoje “pozitivna nula” i “negativna nula”, pri čemu su oba prikaza ravnopravna. Dogovor je da se pri usporedbi ta dva prikaza smatraju jednakim.

“pozitivna nula” 00000000000000000000000000000000“negativna nula” 10000000000000000000000000000000

predznakpredznakkarakteristika mantisa

Zapis +∞, -∞ i “not a number”

Prikaz “broja” +∞ je:

0 11111111 00000000000000000000000

Prikaz “broja” -∞ je:• Svi bitovi mantise su 0, karakteristika ima vrijednost 255, a bit predznaka je 0.

Prikaz broja ∞ je:

1 11111111 00000000000000000000000

• Gore prikazani brojevi se najčešće dobiju zbog dijeljenja s nulom.

• Svi bitovi mantise su 0, karakteristika ima vrijednost 255, a bit predznaka je 1.

Page 11: Osnove Račuvarstva

Neki specijalni slučajevi

• Ako karakteristika ima vrijednost 255, te postoje bitovi mantise koji nisu 0, onda se zapis klasificira kao

t b ( ij b j)not a number (nije broj)• Ovakav zapis se može dobiti zbog toga što je prilikom izvođenja neke operacije došlo do greške.došlo do greške.

• Primjer zapisa klasificiranog kao not a number:

0 11111111 10000000000000000000001

• Postoje i specijalni slučajevi kada je vrijednost karakteristike 0 a postoje bitovi• Postoje i specijalni slučajevi kada je vrijednost karakteristike 0, a postoje bitovi mantise koji nisu nula.

• Takav zapis nazivamo “denormalizirani zapis”Takav zapis nazivamo denormalizirani zapis

• Ne podrazumijeva da je skriveni bit jednak 1 i smatra se da je vodeći bit mantise 0.

• Vrijednost eksponenta je -126 (ne koristi se formula K=binarni eksponent +127)j p j ( p )

• Primjer: 0 00000000 01010000000000000000000 (=0.0101•2-126)

Aritmetički operatori

• Binarni operatori:

bi j+ sabiranje- oduzimanje* množenje/ dijeljenje% modulo

• Operator modulo (%) daje ostatak cjelobrojnog dijeljenja.• Može se primijeniti samo na cjelobrojne tipove podataka.Može se primijeniti samo na cjelobrojne tipove podataka.

Izrazi

• Izrazi se sastoje od operatora, operanada i zagrada.• Svaki izraz daje neki rezultat• Svaki izraz daje neki rezultat.• Primjeri izraza:

2*x+52 x+5(a+b)/2

• Brojevi 2 i 5 u gornjim izrazima su konstante• Brojevi 2 i 5 u gornjim izrazima su konstante.• Znakovi {*, +, /} predstavljaju operatore• Varijable x, a i b predstavlaju varijable,odnosno, operande.

Za pridruživanje vrijednosti varijablama koristi se znak =.

Na primjer, slijedeća naredba:

i=10;varijabli i pridružuje vrijednost 10.

Šta radi naredba i=i+1; ?

• Naredba i=i+1; je jedna od najčešče korištenih naredbi u programiranju.a edba ; je jed a od ajčešče o š e a edb u p og a a ju

• Pošto kod početnika uperator pridruživanja unosi određene dileme jer ih podsjeća na značenje znaka = u matematici, na ovom mjestu bi ta zabuna trebala da se ukloni.j , j

• Značenje naredbe i=i+1;i=i+1;

je:

“Pridružiti novu vrijednost varijabli i a ta nova vrijednost se dobije tako da se trenutna“Pridružiti novu vrijednost varijabli i a ta nova vrijednost se dobije tako da se trenutna vrijednost te varijable uveća za 1”.

8…….

9…….

i….. …..

Page 12: Osnove Račuvarstva

Primjer (operator modulo)

#include <stdio.h>

i i ()int main(){

int a,b,o;a=7;b=3;o=a%b;printf(“\n Ostatak dijeljenja %d i %d je %d.“,a,b,o);return 0;

}}Izvođenjem programa dobit će se:

Ostatak dijeljenja 7 i 3 je 1.

Prioritet operatora

• Prioritet operatora *, / i % je viši od operatora + i -.• Na primjer u izrazu:• Na primjer, u izrazu:

x=a/b+c*d

prvo će se izvesti operacije dijeljenja i množenja, a nakon toga i operacija sabiranja.

• Kod operatora s istim prioritetom, izvršavanje operacija ide od lijeve strane prema desnoj.

• Prioritet izvođenja operacija se može mijenjati upotrebom zagrada.

• Na primjer, u izrazu:

s=(x*(a-b)+1)/2( ( ) )/

operacija dijeljenja će biti izvedena posljedna.

Operatori inkrement i dekrement

• Unarni opertori.

++ operator inkrement uvećaj za jedan;++ operator inkrement - uvećaj za jedan;-- operator dekrement- umanji za jedan.

• Mogu se pisati iza ili ispred varijable• Mogu se pisati iza ili ispred varijable.

x=x+1; x++;

x=x-1; x--;

• Na primjer, iza odsječka programa:….

x=15;x++;…

vrijednost varijable x je 16.

•Isto vrijedi i u slučaju da je umjesto x++ napisano ++x.

Operatori inkrement i dekrement u izrazima

U izrazima nije svejedno da li operatori ++ i -- stoje ispred ili iza varijable.

• O položaju operatora u odnosu na varijablu ovisi kada će se vrijednost varijable povećati(++) ili smanjiti(- -).

• Ako operator stoji ispred varijable, onda se vrijednost varijable prvo promijeni a zatim se promijenjena vrijednost koristi u izrazu.

• Ako operator stoji iza varijable, onda se u izrazu uzima trenutna vrijednost varijable, a tek nakon izračunavanja izraya se promijeni vrijednost varijable.

• Na primjer, neka je x=100. Izračunavanjem izraza:

y=++x;y ++x;

vrijednost varijable x će se prvo povećati za 1, a zatim će se ta vrijednost pridružiti varijabli ypridružiti varijabli y.

• Dakle, varijabla y će poprimiti vrijednost 101.

Page 13: Osnove Račuvarstva

Operatori inkrement i dekrement u izrazima(2/2)

• Suprotno, izračunavanjem izraza:

y=x++;varijabli y će se pridružiti vrijednost varijable x (a to je 100), a zatim će se povećati za 1 vrijednost varijable x.

• Vrijednost varijable y nakon izračunavanja gornjeg izraza je 100, dok je vrijednost varijable x tada 101.

• Prikladnim odabirom operatora inkrement i dekrement može se povećati razumljivost programskog kodarazumljivost programskog koda.• Operatori ++ i -- se ne mogu primijeniti na konstante i na aritmetičke izraze.

• To znači da su slijedeći izrazi pogrešni:• To znači da su slijedeći izrazi pogrešni:

(2*x+y)++

5.672++

Kontrola toka programa

• Kod proceduralnih programskih jezika naredbe se ………….Kod proceduralnih programskih jezika naredbe se izvršavaju sekvencijalno, a to znači redoslijedom kojim su napisane. Naredba n

• Naredbe za kontrolu toka programa omogućuju:- ponavljanje jedne ili više naredbi; Naredba n+1- preusmjeravanje toka programa.

Naredba +2

…………..

Naredba za jednostruki izbor

• Opći oblik naredbe za jednostruki izbor je: ………….

if (uvjet){ NEblok naredbi;} uvjet

• Uvjet može biti bilo koji aritmetički ili logički izraz.Bl k dbi ž i i j d ili iš dbi

DA

• Blok naredbi može imati jednu ili više naredbi.• Uvjet je istinit ako je rezultat izraza različit od nule.• Ako je uvjet istinit, blok naredbi se izvršava.

blok narebi

Ako je uvjet istinit, blok naredbi se izvršava.• U suprotnom, naredbe koje se nalaze u bloku se preskaču.

………….

Primjer(naredba za jednostruki izbor)

#include <stdio.h>int main()int main(){

int a,b;printf(“\n Unesite prvi cijeli broj”);scanf(“%d”,&a);printf(“\n Unesite drugi cijeli broj”);printf( \n Unesite drugi cijeli broj );scanf(“%d”,&b);if (a==b){{

printf(“\n Unijeli ste iste brojeve”);}

}}

Šta bi bilo kad bi uvjet glasio a=b, a za unos u program je:1. a=10, b=32. a=0, b=0

Page 14: Osnove Račuvarstva

Naredba za dvostruki izbor

• Opći oblik naredbe za jednostruki izbor je:………….

if (uvjet){

DAuvjet

NE

blok naredbi1;}else blok narebi 2blok narebi 1

{blok naredbi2;

}}• Uvjet može biti bilo koji aritmetički ili logički izraz.• Ako je uvjet ispunjen (vrijednost izraza je različita od 0, izvršava se blok naredbi1 i

………….

Ako je uvjet ispunjen (vrijednost izraza je različita od 0, izvršava se blok naredbi1 i preskače blok naredbi2.• U suprotnom(uvjet nije ispunjen, tj. izraz ima vrijednost 0), izvršava se blok narebi2, a preskače se blok naredbi1.

Primjer (naredba za dvostruki izbor)

#include <stdio.h>int main(){

int br;i tf(“\ U it ij li b j”)printf(“\n Unesite cijeli broj”);

scanf(“%d”,&br);if (br%2){

printf(“\n Unijeli ste neparan broj”);}else{

printf(“\n Unijeli ste paran broj”);printf( \n Unijeli ste paran broj );}return 0;

}}

Višestruki izbor(if-else if-else)

Opći oblik pisanja naredbi za višestruki izbor je:

if (uvjet 1)( j ){

blok naredbi 1;}

• Ovakav oblik naredbi if-else if-elseomogućava uzastopno ispitivanje niza

else if (uvjet 2){

blok naredbi 2;

uvjeta.

• Ako je bilo koji uvjet istinit (različit od nule) }……………..else if (uvjet n-1)

izvršava se blok naredbi pridružen tom uvjetu, dok se svi ostali blokovi naredbi

k č{blok naredbi n-1;

}l

preskaču

• Broj uvjeta nije ograničenelse{

blok naredbi n;}

• Uvjet može biti logički ili aritmetički izraz

}

Primjer (program za rješavanje kvadratne jednadžbe)

#include <stdio.h>#include <math.h>

Uključuje se datoteka math.h u kojoj je definicija funkcije pow() koja je #include <math.h>

int main(){

korištena u programu.

{float a, b, c, x1, x2, x1Re, x2Re, x1Im, x2Im, t, D;

i f(”\ i k fi ij k d j d d b b ")printf(”\n Unesite koeficijente kvadratne jednadzbe a,b,c:");scanf("%f %f %f", &a,&b,&c);D=b*b -4.0*a*c; /* diskriminanta */if (D > 0)

{t = sqrt(D); Blok naredbi koji ćeqx1 = (-b + t)/(2*a);x2 = (-b - t)/(2*a);printf (”\n Rjesenja su: x1=%f x2=%f\n", x1, x2);

Blok naredbi koji će se izvršiti ako je diskriminanta D pozitivnaprintf ( \n Rjesenja su: x1 %f x2 %f\n , x1, x2);

}p

Page 15: Osnove Račuvarstva

Nastavak primjera programa za rješavanje kvadratne jednadžbe

else if (D == 0){{

x1 = -b/(2*a);printf (”\n Rjesenja su: x1=x2=%f\n", x1);

}else{

Blok naredbi koji će se izvršiti ako je di k i i t Dt = sqrt(-D);

x1Re = -b/(2*a);x2Re = x1Re;

diskriminanta D jednaka nuli

x2Re x1Re;x1Im = t/(2*a);x2Im = -x1Im;printf (”\n Rjesenja su: x1 = (%f %f)\n" x1Re x1Im);printf ( \n Rjesenja su: x1 = (%f,%f)\n , x1Re, x1Im);printf (” x2 = (%f,%f)\n", x2Re, x2Im);

}0

Blok naredbi koji će se izvršiti ako je return 0;

}j

diskriminanta D negativna

Programska petlja for

Opći oblik programske petlje for:

for (izraz1;izraz2;izraz3)for (izraz1;izraz2;izraz3){

blok naredbi;blok naredbi;}

• Ispitivanje uvjeta izlaza iz petlje se ispituje na početku• Ispitivanje uvjeta izlaza iz petlje se ispituje na početku.

•To znači da postoji mogućnost da se blok naredbi ne izvede niti jednom.

• izraz1 pridružuje kontrolnoj varijabli petlje početnu vrijednost. Ovaj izraz se izvršava samo jednom. Ako trebamo všše naredbi u izrazu, onda ih odvajamo zarezom

• izraz2 predstavlja izraz kojim se provjerava da li kontrolna varijabla petlje ispunjava uvjet izlazka iz petlje. Provjera se vrši prije svake iteracije.

• izraz3 definira na koji način se mijenja kontrolna varijabla. Izraz se izvršava nakon svakog prolaska kroz petlju. Ako trebamo više naredbi u izrazu, odvajamo ih zarezom.

Primjer

#include <stdio.h>• Ispis na monitoru niza brojeva od 1 do 10

int main(){

int broj;for(broj=1; broj<=10; broj++)

printf(“%d”, broj);p , jreturn 0;

}

• Iza naredbe for nema oznake početka bloka naredbi, jer se blok naredbi u ovom primjeru sastoji od samo jedne naredbe, pa tada oznake početka i kraja bloka naredbi nisu potrebnebloka naredbi nisu potrebne.

Page 16: Osnove Račuvarstva

Sadržaj predavanja 03

• Znakovni tip• Znakovne konstante

• Stringovi

Obavezno čitanje literature:

Skripta : strane: 46 55• Tip double i long double

• Implicitno pretvaranje tipova podataka

• Eksplicitno pretvaranje tipova podataka

Skripta : strane: 46 – 55

+• Relacijski operatori

• Logički tip podataka i upotreba Boole-ove

algebre u računarstvu

strane: 16 - 26 + 96 – 106 (prošlo predavanje)

• Neki korisni aksiomi (zakoni) u Boole-ovoj

algebri

• Programska petlja while + jednostavni primjerig p j j p j

Znakovni tip

• Deklaracija:Deklaracija:

• char• unsigned char

• Prikaz se temelji na ASCII kodu

• (ASCI- American Standard Code for Information Interchange)( g )

• Varijabla tipa char zauzima 1 bajt.

• Omogućuje da se memoriraju znakovi koji prikazuju slova znakovi• Omogućuje da se memoriraju znakovi koji prikazuju slova, znakovi

interpunkcije, te neki specijalni znakovi.

Znakovne konstante

• Zadaju se unutar jednostrukih navoda ‘ ‘.

• Vrijednost konstante odgovara numeričkoj vrijednosti znaka;

• Na primjer, numerička vrijednost konstante ‘B’ u ASCII nizu znakova je 66.Na primjer, numerička vrijednost konstante B u ASCII nizu znakova je 66.

• U aritmetičkim izrazima koristi se isključivo numerička vrijednost znakovne

konstantekonstante.

• Postoje znakovne konstante koje se sastoje od dva znaka koje počinju

znakom \ (backslash)znakom \ (backslash).

Kod i značenje specijalnih znakovnih konstanti

Postoje konstante koje se sastoje od dva znaka. Takve konstante počinjuznakom \ (backslash) i imaju specijalno značenje. Ovi znakovi se koriste prilikom( ) j p j j pkontrole ispisa.

KOD ZNAČENJE

• \b pomak za jedno mjesto nazad• \f nova stranica

i d• \n novi red• \r povratak na početak linije• \t horizontalni tabulator\” d t ki d ik• \” dvostruki navodnik

• \’ jednostruki navodnik• \\ kosa crta (backslash)• \0 null znak• \0 null znak• \v vertikani tabulator• \o oktalna konstanta• \x heksadecimalna konstanta• \x heksadecimalna konstanta

Page 17: Osnove Račuvarstva

Različite mogućnosti pridrživanja vrijednosti znakovnoj varijabli

• Različite mogućnosti da se znakovnoj varijabli a pridruži vrijednost znaka B:

a=‘B’;;a=66;a=0x42;a=0102;a=‘\x42’;a=‘\102’;

Još neki primjeri pridruživanja

pridruživanje jednostrukog navodnika

a=‘\’’;

• pridruživanje kose crtepridruživanje kose crte

•a=‘\\’;

Pridružena cjelobrojna vrijednost znakovnoj konstanti

• Prilikom pridruživanja varijabli znakovnog tipa memorira se ASCII vrijednost.• Na primjer,

char a;a=‘5’ a=53;

• Znakovnoj varijabli a je pridružena vrijednost 53 što je u skladu sa ASCII tablicom.(Znak 5 je u ASCII tablici na 53. mjestu)

48 0

ASCII vrijednost znakZnaku 0-9 dodamo 48 i dobivamo ASCII vrijednost dotičnog znaka.

49 150 251 352 452 453 554 655 755 756 857 9

Kratki primjeri s ASCII vrijednostima znakova

• Neka je deklarirana znakovna varijabla a:

char a=‘D’;

• Šta će se ispisati na standardnom izlazu:Šta će se ispisati na standardnom izlazu:

printf(“%d”,a); 68printf(“%c”,a);printf(“%c”,a+32);

D

dprintf(“%c”,a+33);printf(“%c”,a+34);

i f(“%d” ’ ’)

e

fprintf(“%d”,a-’A’); 3

Primjer (znakovne konstante)

#include <stdio.h> P ć i i ti lij d ć#include <stdio.h>

int main(){

Program će ispisati slijedeće:

B 665 53{

char a, b, c, d;a=‘B’;b=‘5’;

5 53L 766 54

c=a+10;d=b+1;printf(“%c %d”, a, a);

• ASCII vrijednost od znaka B je 66.

• ASCII vrijednost od znaka 5 je 53printf(“%c %d”, b, b);printf(“%c %d”, c, c);printf(“%c %d”, d, d);

• ASCII vrijednost od znaka 5 je 53.

• ASCII vrijednost od znaka L je 76.

• ASCII vrijednost od znaka 6 je 54.return 0;}

j j

Page 18: Osnove Račuvarstva

Stringovi (nizovi znakova)

• Pod stringom podrazumijevamo niz znakova.• Stringove stavljamo unutar dvostrukih navoda;

• Stringovi završavaju NULL znakom (‘\0’)

U C t i t lj j d di i l lj i č j d i• U C-u stringove stavljamo u jednodimenzionalna polja, pri čemu je zadni član null znak:

Napomena: o pojmu polja ćemo govoriti detaljnije na jednom odNapomena: o pojmu polja ćemo govoriti detaljnije na jednom od slijedećih predavanja.

• Deklaracija K N J I G A \0• Deklaracija

char st[d+1]; st[0] st[1] st[3] st[4] st[5] st[6]st[2]

• d je duljina niza.• d treba povećati za jedan jer trebamo

rezervirati jedno mjesto i za NULL znak. Primjer grafičkog prikaza stringa u memorijij j memoriji.

Tip double (realni tip dvostruke preciznosti) i tip long double

• Za prikaz koristi 8 bajtova;• Grafički prikaz zapisa realnih brojeva tipa double.

K MP051526263

• Raspon binarnog eksponenta je od -1022 do 1023.• P prikazuje predznak: 0 (pozitivan broj) 1 (negativan broj)• P prikazuje predznak: 0 (pozitivan broj), 1 (negativan broj)• Karakteristika se izračunava kao: binarni eksponent + 1023, te je raspon karakteristike od 0 do 2047.

• Najmani pozitivni broj koji se može prikazati je 4.9406·10-324.• Najveći pozitivni broj koji se može prikazati je 1.797693134862316·10308.j p j j p j

• Programski jezik C definira još i tip long double.

• Veličina ovog tipa ovisi o konkretnoj implementaciji (64 80 96 128 bitova)Veličina ovog tipa ovisi o konkretnoj implementaciji (64, 80, 96, 128 bitova)

• ANSI standard definira da ovaj tip nije manji od double tipa.

Pretvaranje tipova podataka

•Tip rezultata aritmetičkih izraza odgovara tipu operanada ako su operandi istog tipa.

• Na primjer, ako su operandi a,b i c cjelobrojnog tipa, onda je rezultat izraza a*b+c a p je , a o su ope a d a,b c cje ob oj og t pa, o da je e u tat a a a b c

također cjelobrojnog tipa.

• Ipak u izrazima pojavljuju različiti tipovi operanada• Ipak, u izrazima pojavljuju različiti tipovi operanada.

• Prilikom izračunavanja takvih izraza različiti tipovi podataka se svode na isti tip

prema pravilima za konverziju tipova podataka koja su ugrađena u programski jezik Cprema pravilima za konverziju tipova podataka koja su ugrađena u programski jezik C.

Primjer:

N k ij bl i b d kl i k i fl b• Neka su varijable a i b deklarirane kao: int a; float b;• Nadalje, neka su tim varijablama pridružene vrijednosti:

a=5 b=10 66a=5, b=10.66

• Neka se treba izvesti izraz: a+b.

• Prije nego se obavi operacija sabiranja vrijednost varijable a se pretvori u 5 0 pri• Prije nego se obavi operacija sabiranja, vrijednost varijable a se pretvori u 5.0, pri

čemu sadržaj varijable a ostaje nepromijenjen.

Osnovna pravila za implicitno pretvaranja tipova podataka

• Pretvaranje tipova podataka obavlja se prema dolje navedenim pravilima,

primjenjujući prvo pravilo koje se može primijeniti.

•Ta pravila su orijentirana prema višem tipu podataka.

1 Ak j j d d d ti l d bl t li di t j ti1. Ako je jedan od operanada tipa long double, ostali operandi se pretvaraju u tip

long double.

2 Ako je jedan od operanada tipa double ostali operandi se pretvaraju u tip double2. Ako je jedan od operanada tipa double, ostali operandi se pretvaraju u tip double.

3. Ako je jedan od operanada tipa float, ostali operandi se pretvaraju u tip float.

4. Ako je jedan od operanada tipa long, ostali operandi se pretvaraju u tip long.j j g j g

5. Operande koji su tipa short i char treba pretvoriti u tip int.

Page 19: Osnove Račuvarstva

Primjeri implicitnog pretvaranja

char c;int i;float f;double d;l d bl ldlong double ld;

ij O i t joperacija Opis pretvaranja

c%i vrijednost od c se pretvara u intc%i vrijednost od c se pretvara u inti*f vrijednost id i se pretvara u floatd-c vrijednostj od c se pretvara u doubleld+f vrijednost od f se pretvara u long double

Pretvaranja prilikom pridruživanja i eksplicitno pretvaranje

• Vrijednost izraza s desne strane se pretvara u tip s lijeve strane operatora za pridruživanje.

N i j• Na primjer:

int a;

a=5.66;

• Vrijednost 5.66 će se pretvoriti u int, tj. pri ispisu varijable a dobili bi vrijednost 5.j p , j p p j j

• Opći oblik izraza za eksplicitno pretvaranje je:

(ti ) d(tip) operand;

• zagrade () su oznake cast operatora;

• tip je jedan od tipova podataka definiranih u C-u

• operand je varijabla ili aritmetički izraz.

Neki primjeri eksplicitnog pretvaranja

• Neki primjeri upotrebe cast operatora su:

(i )(d 4 234)a=(int)(d+4.234)b=(float)((int) a +4);c=(double)(b+100);c (double)(b+100);

• Vrijednost varijable ili izraza na desnoj strani će se prije pridruživanja varijabli s

lijeve strane pretvoriti u zadani tip.

• Prilikom cjelobrojnog dijeljena mogu se pojaviti situacije koje neće dati željeni

rezultat Na primjer neka imamo realnu varijablu a i neka je naredbarezultat. Na primjer, neka imamo realnu varijablu a i neka je naredba

pridruživanja:

a=1/3;

• Pošto su u izrazu s desne strane operatora pridruživanja oba operandaPošto su u izrazu s desne strane operatora pridruživanja oba operanda

cjelobrojna, obavit će se cjelobrojno dijeljenje, pa će rezultat biti 0.

Šta je sa logičkim tipom podataka? + logički operatori

• Za razliku od većine drugih programskih jezika, u programskom jeziku C ne postoji

ključna riječ pomoću koje bi se deklarirao logički tip podataka.

• U C-u svaki tip podataka može poslužiti kao logičkipodatak, pričemu vrijedi:

TRUE ako je vrijednost različita od nuleFALSE ako je vrijednost jenaka nuli

Logički operatori:Logički operatori:

• && logički I operatorg p

• || logički ILI opertor

• ! logički NE operator

Page 20: Osnove Račuvarstva

Relacijski operatori

• Relacijski operatori određuju u kakvom su odnosu dvije vrijednosti.

• Na primjer, koja vijednost je veća, manja i sl.

• Relacijski operatori imaju niži prioritet od aritmetičkih operatora.

• Na primjer, redoslijed izvršavanja izraza

a>a+5 je a>(a+5)

• Dakle prvo se obavi peracija sabiranja a nakon toga se poredi rezultatDakle, prvo se obavi peracija sabiranja, a nakon toga se poredi rezultat

sabiranja sa vrijednošću varijable a.

operator značenje_______________________

== jednako! ij j d k!= nije jednako> veće>= veće ili jednako< j< manje<= manje ili jednako

Primjeri redoslijeda izvršavanja relacijskih izraza

izraz redoslijed izvršavanja rezultat

10 > 5 (10>5) TRUE

2*100<50 (2*100)<50 FALSE

5!=4==0 (5!=4)==0 FALSE

• Prvo se izvršavaju izrazi u zagradama.• Ako se u izrazu nađe više logičkih i relacijskih operatora a nema zagrada prioritetAko se u izrazu nađe više logičkih i relacijskih operatora a nema zagrada prioritet je sljedeći:

!> > < <>, >=, <, <===, !=&&||||

Upotreba matematičke logike u računarstvu (Boole-ova algebra)O t i j j i k i lj j d đ ih bl k dbi• Ostvarivanje grananja u programima, kao i ponavljanje određenih blokova naredbi

zasniva se na ispitivanjima određenih uvjeta.o koristili pojam uvjeta.

• Pri kreiranju algoritama i pisanju programa često se koriste logički sudovi• Pri kreiranju algoritama i pisanju programa često se koriste logički sudovi.

• Logički sud je osnovni pojam u matematičkoj logici.

• Osnove matematičke logike sadržane su u algebri sudova koja se najčešće naziva• Osnove matematičke logike sadržane su u algebri sudova koja se najčešće naziva

Boole-ova algebra ili logička algebra.

• Pod pojmom logičkog suda podrazumijevamo tvrdnju koja se može vrednovati kaoPod pojmom logičkog suda podrazumijevamo tvrdnju koja se može vrednovati kao

istinita ili kao lažna.

• Za označavanje sudova koriste se simboli.a o ača a je sudo a o ste se s bo

• Simboli predstavljaju logičke varijable.

• Logička varijabla može imati samo dvije vrijednosti: LAŽ i ISTINA.g j j j

•Za označavanje tih dviju vrijednosti koriste se različite oznake:

LAŽ ISTINALAŽ ISTINA0 1T ⊥

Upotreba matematičke logike u računarstvu

• Na ovom mjestu mi ćemo koristiti simbole: 1 (istina) i 0 (laž).

• Primjeri sudova:

4>3 istina4>7 laž4>7 laž6=3 laž

• Za gornje sudove uvedimo sljedeće simbole:g j j

A= “4>3”B= “4>7”C= “6=3”• Tada, gornje logičke varijable imaju slijedeće vrijednosti:A=1, B=0, C=0A 1, B 0, C 0

• Gore prikazani primjeri nazivaju se osnovni ili atomni sudovi.

• Istinitost atomnih sudova utvrđuje se neposrednim zaključivanjem o sudu

Page 21: Osnove Račuvarstva

Upotreba matematičke logike u računarstvu

• Istinitost složenih sudova utvrđuje se upotrebom formula.

• Formule se sastoje od:j

- atoma (osnovnih sudova)

l ičkih t- logičkih operatora

- zagrada

• Obično se koriste slijedeći logički operatori:

simbol operatora značenje¬ negacija

∧ konjunkcija

∨ disjunkcija

→ implikacija

d t i lik ij↔ dvostrana implikacija

Negacija

• Operator negacije djeluje na jedan atom.

• Tablica definicije negacije je:j g j j

¬AA

01

10

Primjer

Pogledajmo slijedeće sudove:

“4≤3”01“4>3”

sud BVrijednost¬A

VrijednostA

sud A

“6≠3”10“6=3”

“4≤7”10“4>7”

4 3014 3

suprotni opertori

Konjunkcija i disjunkcija

• Tablice definicija konjunkcije i disjunkcije su:

k j k ij

A ∧ BBA A ∨ BBA

konjunkcija: disjunkcija:

010

000

110

000

111

001

111

101

• Formula (A ∧ B) ima vrijednost 1 onda i samo onda kada i jedan i drugi atom imaju vrijednost 1.• Formula (A ∨ B) ima vrijednost 1 ako je jedan atom istinit ili ako su oba atoma istinitaistinita.

Neki korisni aksiomi (zakoni) (1/2)

Aksiom 1: Zakon neutralnog elementa

Postoje neutralne vrijednosti 0 i 1 s obzirom na operacije ∧ i ∨ tako da vrijedi:

A∨ 0 = AA∨ 0 AA ∧ 1= A

Aksiom 2: Zakon komutacijeAksiom 2: Zakon komutacije

A ∨ B = B ∨ AA ∧ B = B ∧ A

Aksiom 3: zakon distribucije

A ∧ (B ∨ C) = (A ∧ B) ∨ (A ∧ C)A ∨ (B ∧ C) = (A ∨ B) ∧ (A ∨ C)

Page 22: Osnove Račuvarstva

Neki korisni aksiomi (zakoni) (2/2)

• Zakon idempotencije:

A ∨ A = AA ∨ A = AA ∧ A = A

• Zakon asocijacije:Zakon asocijacije:

(A ∨ B) ∨ C=A ∨ (B ∨ C)(A ∧ B) ∧ C=A ∧ (B ∧ C)( ) C ( C)

• De Morganov zakon:

¬(A ∧ B) = ¬A ∨ ¬B

¬(A ∨ B) = ¬A ∧ ¬B

• Zakon apsorpcije:

A ∨ (A ∧ B) = AA ∨ (A ∧ B) = AA ∧ (A ∨ B) = A

Programska petlja while

• Opći oblik petlje while je:

while (uvjet)uvjet NE

blok naredbi;

blok naredbiDA

• Uvjet može biti varijabla, aritmetički izraz ili logički izraz.• Uvjet ponavljanja petlje se isptuje na početku. To znači da postoji mogućnost da se blok naredbi ne izvrši niti jednomse blok naredbi ne izvrši niti jednom.• Blok naredbi u petlji se ponavlja sve dok je uvjet istinit (različit od nule).• Kada uvjet postane neistinit, program se nastavlja prvom naredbom iza petlje

Odnos programskih petlji while i for

• Pošto petlje for i while imaju ispitivanje uvjeta na početku, vrijedi da se svaka programska petlja for može zamijeniti petljom while i obrnutoprogramska petlja for može zamijeniti petljom while i obrnuto.

for (i ra 1 i ra 2 i ra 3) izraz1;for (izraz1; izraz2; izraz3){

blok naredbi;}

while (izraz2){

blok naredbi;} izraz3,}

• Kad će se koristiti koja petlja ovisi o pristupu programera i njegovim navikama.

Jednostavan primjer

• Program učitava cijeli broj N, a na standardnom izlazu ispisuje parne brojeve koji

su manji ili jednaki od N

#include <stdio.h>

su manji ili jednaki od N.

int main(){

int b, N;t b, ;printf("\n Unesite cijeli broj manji od 100:");scanf("%d",&N);b=2; Ispisuje se vrijednost varijable b iwhile(b<=N)

{printf("\n %d", b);

Ispisuje se vrijednost varijable b i njena vrijednost se povaćava za 2 sve dok je ispunjeno da je njena vrijednost manja od broja N koji je

b=b+2;}return 0;

j j j j junesen sa standardnog ulaza.

}

Page 23: Osnove Račuvarstva

Jednostavan primjer (while petlja)

• Program učitava pozitivne cijele brojeve sve dok njihova suma ne prekorači 100.

#include <stdio.h> Kada vrijednost varijable suma bude veća od 100, odnosno kada uvjet

int main(){int b, suma=0;

, jponavljanja petlje ne bude ispunjen, izlazi se iz petlje i izvršava prva naredba iza petlje.

while(suma<=100){

printf(“Unesite broj: ”);scanf(“%d”, &b);suma=suma+b;

}\printf(“\n Suma je: “, suma);

return 0;}

Page 24: Osnove Račuvarstva

Sadržaj predavanja 04

Obavezno čitanje literature:

• Dekadski brojni sistem• Binarni brojni sistem

Obavezno čitanje literature:

isto kao prošli put:

• Oktalni brojni sistem

• Heksadecimalni brojni sistem

• Pretvaranje brojeva iz jednog sistema u

Skripta : strane: 46 – 55

+j j j g

drugi

• Zapis negativnih brojeva

+strane: 16 - 26 + 96 – 106 (prošlo predavanje)

• ASCII kod

Digitalni računari i binarni brojevi

• Svi podaci u digitalnim računarima se zapisuju u obliku binarnih brojevabinarnih brojeva

• Binarni brojevi se upotrebljavaju zato jer je za njihov prikaz j p j j j j j pdovoljno imati elektroničke elemente sa samo dva stabilna stanja.

• Pomoću binarnih brojeva zapisuju se instrukcije, podaci kao i ostale informacije koje računar obrađuje.

Brojni sistemi

⇒ pozicijski brojni sistemi

• U pozicijskim brojnim sistemima vrijednost znaka ovisi o položaju

u zapisanom broju.

• Broj znakova određuje bazu sistema.

⇒ nepozicijski brojni sistemi

• Značenje pojedinog znaka ne ovisi o njegovom položaju u

zapisanom broju.

• Primjer nepozicijskog brojnog sistema je sistem rimskih brojevaPrimjer nepozicijskog brojnog sistema je sistem rimskih brojeva.

Dekadski brojni sistem

• Najčešće korišteni brojni sistem.

• Osnova dekadskog brojnog sistema je 10.

• Težinska vrijednost prvog broja lijevo od zareza je 10,drugog broja je 101, trećeg broja 102 ,…,.n-tog broja 10 n-1, n ∈ N.

• Težinska vrijednost prvog broja desno od zareza je 10-1Težinska vrijednost prvog broja desno od zareza je 10 ,drugog broja je 10-2, trećeg broja 10-3 ,…,.n-tog broja 10 -n, n ∈ N

Page 25: Osnove Račuvarstva

Zapis broja u dekadskom brojnom sistemu

• Dekadski broj zapisujemo u formatu:

dn-1dn-2….d2d1d0,d-1,d-2,…dm

gdje je di ∈ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

• Vrijednost gore zapisanog broja je:

dn-1 × 10n-1 + dn-2 × 10n-2 +…+ d1 × 101 + d0 × 100 + d-1 × 10-1 + d-2 ×10-2 +…d-m ×10-m

Primjer zapisa dekadskog broja

Težinska vrijednost 10-1

Težinska vrijednost 10-2

3 4 5, 2 7 = 3 × 100 + 4 × 10 + 5 × 1+ 2 × 10 -1 + 7 × 10 -2

T ži k ij d t 100Težinska vrijednost 100

Težinska vrijednost 101

Težinska vrijednost 102

3 4 5, 2 7 = 3 × 10 2 + 4 × 10 1 + 5 × 100 + 2 × 10-1+7 × 10-1

Zapis broja u bilo kojem sistemu

• Općenito, po uzoru na dekadski brojni sistem, broj N u bilo kojem brojnom sistemu možemo prikazati kao:

N = d × Bn + d 1 × Bn-1+ + d2 × B2+ d1 × B1+ d0 × B0 +N dn × B + dn-1 × B +…+ d2 × B + d1 × B + d0 × B ++ d-1 × B-1 + d-2 × B-2+ …. d-m × B-m

• n, m ∈ N• B je baza brojnog sistema.• d je bilo koji broj brojnog sistema, d ≤ B-1.

Binarni brojni sistem

• Baza B=2;

• Znakovi di, koji se koriste za zapis binarnog broja su di∈ {0, 1}

Primjer

• Binarni broj 101001 ima vrijednost:

1 × 25 + 0 × 24 + 1 × 23 + 0 × 22 + 0 × 21 +1×20 = 32 + 8 + 1= 41

• Radi jasnoće zapisa brojeva pišemo:

101001(2) = 41(10)101001(2) 41(10)

• indeks 2 označava da je broj zapisan s lijeve strane znaka jednakosti zapisan u binarnom brojnom sistemu;zapisan u binarnom brojnom sistemu;• indeks 10 označava da je broj zapisan u dekadskom brojnom sistemu;

Page 26: Osnove Račuvarstva

Oktalni brojni sistem

• Baza B=8;• Znakovi di, koji se koriste za zapis binarnog broja, j p g jdi∈{0, 1,2,3,4,5,6,7}

PrimjerPrimjer

• Oktalni broj 324 ima vrijednost:

3 × 82 + 2 × 81 + 4 × 80 = 192 + 16 + 4= 212

D kl ij di• Dakle, vrijedi:

324(8) = 212(10)

Heksadecimalni brojni sistem

• Baza B=16;• Znakovi d koji se koriste za zapis heksadecimalnog broja su• Znakovi di, koji se koriste za zapis heksadecimalnog broja sudi∈{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}

P i jPrimjer

• Heksadecimalni broj AB4 ima vrijednost:

10 × 162 + 11 × 161 + 4 × 160 = 2560 + 176 + 4= 2740

Dakle vrijedi:• Dakle, vrijedi:

AB4(16) = 2740(10)

Pretvaranje brojeva iz dekadskog u binarni brojni sistem

Primjer

41:2 =20 ⇒ ostatak 120:2 =10 ⇒ ostatak 010:2 = 5 ⇒ ostatak 05:2 = 2 ⇒ ostatak 12:2 = 1 ⇒ ostatak 02:2 = 1 ⇒ ostatak 01:2= 0 ⇒ ostatak 1

DakleDakle,41(10) = 101001(2)

Pretvaranje brojeva manjih od 1

• Postupak je slijedeći:

- Dekadski broj se pomnoži sa 2Dekadski broj se pomnoži sa 2- Ako je rezultat veći od 1, onda se na prvo mjesto desno od zareza stavi 1, inače se stavlja 0.- Preostali dio rezultata koji je manji od 1 se ponovno pomnoži sa 2, te se na drugo mjesto desno od zareza stavi 1 ako je rezultat veći od 1 inače se stavi 01, inače se stavi 0.- Postupak se ponavlja dok rezultat množenja ne bude 1.

Page 27: Osnove Račuvarstva

Primjer pretvaranja dekadskog broja u binarni zapis

• Pretvoriti broj 35,625 iz dekadskog u binarni zapis

Pretvaranje cijelog broja Pretvaranje decimalnog dijela broja

35:2 = 17 ⇒ ostatak 117:2 = 8 ⇒ ostatak 1

0,625×2=1,250 ⇒ 10,250×2=0,500 ⇒ 0

Pretvaranje cijelog broja Pretvaranje decimalnog dijela broja

8 ⇒ ostata8:2 = 4 ⇒ ostatak 04:2 = 2 ⇒ ostatak 0

0, 50 0,500 ⇒ 00,500×2=1 ⇒ 1

2:2 = 1 ⇒ ostatak 01:2 = 0 ⇒ ostatak 1

• Dakle, vrijedi:35 625 100011 10135,625(10) = 100011,101(2)

Veza između binarnog i oktalnog zapisa brojeva

• Neka N prikazuje zapis binarnog brojaN=dndn-1……..d7d6d5d4d3d2d1d0,

• Pretpostavimo da je n djeljivo sa tri. Ako nije ispred broja dodamo jednu ilnule da bi taj uvjet bio ispunjen

N=d0×20+ d1×21+ d2×22+ d3×23+ d4×24+ d5×25+... dn-1×2n-1+ dn-2×2n

20 (d 20 d 21 d 22) 23 (d 20 d 21 d 22)= 20 × (d0×20+ d1×21+ d2×22) + 23 × (d3×20+ d4×21+ d5×22)+…++ 23p × (dn-2×20+ dn-1×21+ dn×22), p = n / 3

Primjer

• 1|010|011(2)=123(8)

Veza između binarnog i heksadecimalnog zapisa brojeva

• Neka N prikazuje zapis binarnog brojaN=dmdm-1……..d7d6d5d4d3d2d1d0,

N = d0×20+ d1×21+ d2×22+ d3×23+ d4×24+ d5×25+ d6×26 + d7×27... dn-1×2n-1+ dn-2×2n-2=

= 20 × (d0×20+ d1×21+ d2×22 + d3×23) + 24 × (d4×20+ d5×21+ d6×22 + d7×23)+…+( 0 1 2 3 ) ( 4 5 6 7 )

+ 24 q × (dm-2×20+ dm-1×21+ dm×22), q = m / 4

Primjer

• 11|0101|1011(2) = 35B(16)

Zbrajanje binarnih brojeva

O il • Ispravnost zbrajanja možemo•Osnovna pravila:0 + 0 = 00 + 1 = 1

Ispravnost zbrajanja možemo provjeriti pretvaranjem u dekadski sistem.

1 + 1 = 101 + 1 + 1 = 11 • 100100(2) =36(10)

• 110110 =54Primjer

100100

• 110110(2) =54(10)

• 1011010(2) =90(10)

100100+ 1101101011010

36+54=90

Page 28: Osnove Račuvarstva

Prikaz negativnih brojeva u binarnom sistemu(1/4)

• Pri raznim operacijama u računaru pored pozitivnih trebaju i ti i b j inegativni brojevi.

• Sa n bitova se može napraviti ukupno 2n kombinacija• Pola postojećih mogućnosti se koristi za prikaz pozitivnih brojeva, p j g p p jdok se druga polovica mogućih kombinacija koristi za prikaz negativnih brojeva.

K j ji lij i bit i k d k• Krajnji lijevi bit uzima se kao predznak• 0 označava pozitivan broj• 1 označava negativan brojg j• Zaključujemo da se sa n bitova može prikazati 2n-1 pozitivnih i isto toliko negativnih brojeva.

Prikaz negativnih brojeva u binarnom sistemu(2/4)

Na prvi pogled, bilo bi logično koristiti slijedeći kod pri zapisivanju cijelih brojeva:

dn-1 dn-2 dn-3 d3 d2 d1

predznak apsolutna vrijednost

• U jednu riječ se duljine n bitova se mogu zapisati brojevi u rasponu:

(2n-1 1) do +(2n-1 1)- (2n 1 – 1) do +(2n 1-1)

• Na primjer, u jedan bajt se mogu zapisati brojevi u granicama od7 7-(27-1) do +(27-1)

odnosno u granicama: -127 do +127

• Međutim, tada bi operacije zbrajanja i oduzimanja bile složenije nego ako se upotrijebi prikaz sa dvojnim komplementom.

Prikaz negativnih brojeva u binarnom sistemu(3/4)

⇒ Komplement i dvojni komplement

• komplement od 0 je 1• komplement od 1 je 0

⇒ Postupak za dobivanje dvojnog komplementa je:

• Zapisati apsolutnu vrijednost u binarnom brojnom sistemu• Napraviti komplement tog zapisa• Komplementu dodati 1.

Prikaz negativnih brojeva u binarnom sistemu(4/4)

Primjer:

• Kako ce biti prikazan broj 5?• Kako ce biti prikazan broj -5?

apsolutna vrijednost (=5) 00000101komplement 11111010+ 1 + 1

1111101111111011

Primjer zbrajanja: 0000100011111011

100000011

8+(-5)

Zanemarujemo bit prijenosa

Page 29: Osnove Račuvarstva

Primjer 4-bitnog prikaza negativnih brojeva

Binarni prikaz Decimalni prikaz0000 +00001 +1

Krajnji lijevi bit je predznak

0001 +10010 +20011 +30100 +4

• 0 ⇒ broj je pozitivan• 1 ⇒ broj je negativan

0100 +40101 +50110 +60111 +7

Pozitivni brojevi0111 +71000 - 81001 - 71010 61010 - 61011 - 51100 - 4Negativni brojevi1101 - 31110 - 21111 - 1

ASCII kod za zapis znakova

• Računar za prikaz različitih simbola mora koristiti binarne brojeve.

• ASCII (7 bitni prikaz)

( A i St d d(eng. American Standard Code for Information Interchange).

• Postoji i različita proširenja ASCII koda koja koriste 8 bitni prikakoriste 8 bitni prikaz.

• Najčešći motiv za uvođenje proširenja je j p j jprikaz specifičnih znakova iz različitih jezika.

Page 30: Osnove Račuvarstva

Sadržaj predavanja 05

Obavezno čitanje literature:

• Operator pridruživanja u izrazima i u

kombinaciji s aritmetičkim operatorima• Višestruko pridruživanje Obavezno čitanje literature:

Skripta : strane: 31 – 36

• Višestruko pridruživanje• Operatori za rad s bitovima + primjeri• Naredba switch-case• Programska petlja do-while

31 – 3655 - 57107-116

• Naredba break • Naredba continue• Naredba goto• Nizovi (polja)

Napomena:

Čitanje preporučene literature je

Nizovi (polja)+• Primjer 7.1 (naredba switch-case)• Primjer 7.2 (petlja do-while) j p p j

obavezno• Primjer 7.3 (zadatak sa zbrajanjem elemenata zadatog niza pomoću for petlje)• Primjer 7.4 (zadatak sa zbrajanjem elemenata zadatog niza pomoću while petlje)elemenata zadatog niza pomoću while petlje)• 11 primjera zadataka za analizu načina rada programskih struktura

Sadržaj predavanja 05

• Operator pridruživanja u izrazima i u kombinaciji s aritmetičkim operatorima• Višestruko pridruživanje• Operatori za rad s bitovima + primjeri• Naredba switch-case• Programska petlja do-while• Naredba break • Naredba continue• Naredba gotoNaredba goto

+• Primjer 7 1 (naredba switch-case)Primjer 7.1 (naredba switch case)• Primjer 7.2 (petlja do-while)• Primjer 7.3 (zadatak sa zbrajanjem elemenata zadatog niza pomoću for petlje)

Primjer 7 4 ( adatak sa brajanjem elemenata adatog ni a pomoć hile petlje)• Primjer 7.4 (zadatak sa zbrajanjem elemenata zadatog niza pomoću while petlje)• 11 primjera zadataka za analizu načina rada programskih struktura

Operator pridruživanja u izrazima

• Programski jezik C dozvoljava da se operator pridruživanja nađe u izrazima koji sadrže druge operatore.• Na primjer,p j

if ((a=b*c)<=100)Opertor pridruživanja se nalazi unutar logičkog izraza.• Tok izvršavanja je sljedeći:Tok izvršavanja je sljedeći:- Varijabli a se prvo pridruži proizvod varijabli b i c.- Cijeli izraz (a=b*c) dobiva vrijednost tog proizvoda.

V ij d t ij bl đ j ij d šć k t t 100- Vrijednost varijable a se uspoređuje s vrijednošću konstante 100.Primjer:

y=(a=10) – (b=5);y (a 10) (b 5);

Varijabli a se pridruži vrijednost 10, dok se varijabli b pridruži vrijednost 5.• Izvrši se oduzimanje 10-5.• Varijabli y se pridruži vrijednost 5.

Višestruko pridruživanje

• Višestruko pridruživanje ćemo objasniti kroz primjer.

Primjer:

m=n=p=0;

• Vrijednsti svih gore navedenih varijabli se postavljaju na 0, pri čemu se pridruživanje obavlja s desna na lijevo. Drugim riječima, prioritet pridruživanja je sljedeći:

m=(n=(p=0));

• Prvo će se varijabli p pridružiti 0, pri čemu i vrijednost izraza (p=0) dobiva vrijednost 0. j

• Zatim se varijabli n pridružuje vrijednost tog izraza (0), te cijeli izraz (n=(p=0)) dobiva vrijednost 0.

• Na kraju se 0 pridružuje varijabli mNa kraju se 0 pridružuje varijabli m.

Page 31: Osnove Račuvarstva

Operator pridruživanja u kombinaciji s aritmetičkim operatorima

• Operator pridruživanja se može nalaziti i u kombinaciji s aritmetičkim operatorima.

• Na primjer:

a=a+100; ⇔ a+=100;

a=a-100; ⇔ a-=100;

a=a/4; ⇔ a/=4;

a=a%5; ⇔ a%=5;; ;

a=a*(5+3) ⇔ a*=5+3;

a=a-b+100; ⇔ a-=b+100;a a b+100; ⇔ a b+100;

a=a*50+b+20 ⇔ a*=50+b+20;

Operatori za rad s bitovima

• Programski jezik C ima slijedeće operatore za rad s bitovima:

& logička I operacija između bitova& logička I operacija između bitova| logička ILI operacija između bitova^ ekskluzivna ILI operacija~ komplementkomplement<< pomak ulijevo>> pomak udesno

• Mogu se primijeniti samo na varijable tipa char, short, int i long.

• Pomak ulijevo i udesno

• Opći oblik je:ime_var << broj;ime_var >> broj;

• ime_var je ime varijable;• broj označava broj bitova za koliko se treba pomaknuti.

Primjeri s operatorima za pomak ulijevo i udesno

• Neka je deklarirana znakovna varijabla c:

char c=0xD;• Varijabla c je u memoriji prikazana kao:

0 0 0 0 1 1 0 1

Primjer učinka operatora za pomak ulijevo i udesno

Naredbe: zapis varijable c u memoriji nakon naredbe

c=c>>2; ⇒ 0 0 0 0 0 0 1 1

c=c>>3; ⇒ 0 0 0 0 0 0 0 1c=c>>3; ⇒ 0 0 0 0 0 0 0 1

c=c<<2; ⇒ 0 0 1 1 0 1 0 0

c=c<<3; ⇒ 0 1 1 0 1 0 0 0

Primjeri s logičkim operacijama između bitova

• Neka je deklarirana znakovna varijabla cchar a=7,b=9;

a 0 0 0 0 0 1 1 1a 0 0 0 0 0 1 1 1

b 0 0 0 0 1 0 0 1

Izvršavanjem izraza: Izvršavanjem izrazaIzvršavanjem izraza: Izvršavanjem izraza

c=a&b; c ⇒ 0 0 0 0 0 0 0 1 c=~a; c ⇒ 1 1 1 1 1 0 0 0

Izvršavanjem izraza: Izvršavanjem izraza:

c=a|b; c ⇒ 0 0 0 0 1 1 1 1 c=a^b; c ⇒ 0 0 0 0 1 1 1 0

• Tablica istinitosti za logičku operaciju ekskluzivno ILI (XOR):

a b a^b0 0 00 0 00 1 11 0 11 1 0

Page 32: Osnove Račuvarstva

Naredba switch-case (1/2)

Opći oblik naredbe je:

switch (izraz){

• Izraz mora biti cjelobrojan.

• Koristi se za višestruko granjanje {case konstanta 1:

blok naredbi 1;break;

k t t 2

programa, odnosno, omogućuje izbor između više mogućih puteva izvođenja programa.case konstanta 2:

blok naredbi 2;break;.

p g

• Korištenje switch-case naredbe doprinosi boljoj razumljivosti i

.

.case konstanta n-1:

blok naredbi n 1;

preglednosti programa.

• Prvo se izračuna izraz a zatim se uporedi s konstantama konstanta1blok naredbi n-1;

break;default:

blok naredbi n;

uporedi s konstantama konstanta1 ...konstanta n-1.

• Ako je izračunati izraz jednak nekoj break;}

j j jkonstanti onda se izvodi blok naredbi pridružen dotičnoj konstanti.

Naredba switch-case (2/2)

• Ako rezultat izraza nije jednak nijednoj od konstanti, onda se izvodi blok naredbi pridružen oznaci default.

• Isti tok programa bi se mogao realizirati i upotrebom if-else if-else strukture.

• Izvođenje nekog bloka naredbi prekida se naredbom brake ili oznakom kraja switch-case naredbe , a to je }.

• Opcija default se može izostaviti zajedno s pripadajućim blokom naredbi.

• Dvije konstante u case-switch strukturi ne mogu imati iste vrijednosti, osim kada se naredba switc-case nalazi u sklopu druge strukture switch-case.

Ako iza bloka naredbi ne stoji break onda se nastavlja sa izvođenjem bloka• Ako iza bloka naredbi ne stoji break, onda se nastavlja sa izvođenjem bloka naredbi slijedećeg case dijela.

Primjer 7.1 (naredba switch-case) (1/2)

#include <stdio.h>

int main(){int ocjena;printf(“\n Unesite ocjenu (5-10):”;printf( \n Unesite ocjenu (5 10): ;scanf(“%d”, &ocjena);switch (ocjena){

case 5:printf(“\n Niste polozili”); break;

case 6:printf(“\n Polozili ste, ali …”);break;p ( \ , ); ;

case 7:printf(“\n Nije lose”);break;

case 8:i tf(“\ D b d b ”) b kprintf(“\n Dobar, dobar”);break;

Primjer 7.1 (naredba switch-case) (2/2)

/* nastavak sa prethodne stranice*/case 9:

printf(“\n Svaka cast”);break;printf( \n Svaka cast );break;case 10:

printf(“\n Odlicno”);break;defaut:

printf(“\n Niste unijeli ispravnu ocjenu”);break;}

Diskusija:a) Šta bi bio rezultat izvođenja programa da nema naredbe break a unijeli smo ocjea) Šta bi bio rezultat izvođenja programa da nema naredbe break, a unijeli smo ocjeb) Šta bi bio rezultat da smo unijeli za ocjenu 7?

R l i a) b)Rezultati: a)Niste poloziliPolozili ste, ali …Nije loseD b d b

b)Nije loseDobar, dobarSvaka castOdliDobar, dobar

Svaka castOdlicno

Odlicno

Page 33: Osnove Račuvarstva

Programska petlja do-while

Opći oblik petlje je:

doblok naredbi{

blok naredbi;} while (uvjet); DA

• Uvjet ponavljanja petlje se ispituje na kraju na kraju blokanaredbi.• Prema tome blok naredbi se mora izvesti barem jednom

uvjet

NEPrema tome, blok naredbi se mora izvesti barem jednom.

• Način izvršavanja petlje do-while je:

1. Izvesti blok naredbi2 I it ti i ti it t j t2. Ispitati istinitost uvjeta: -ako je uvjet istinit (različit od nule) prelazi se ponovno na blok naredbi.-ako uvjet nije istinit (jednak nuli) prelazi se na prvu naredbu iza while.

Uvjet može biti varijabla logički ili aritmetički izraz• Uvjet može biti varijabla, logički ili aritmetički izraz.• Zbog činjenice da se blok naredbi mora izvršiti barem jednom, petlje for i while se koriste češće u odnosu na petlju do-while.

Primjer 7.2 (petlja do-while)

#include <stdio.h>int main()int main(){int a=0;do {

printf("\n a=%d,dvostruko:%d,trostruko:%d",a,2*a,3*a);a++;

} while (a<7);return 0;} Isti bi ispis bio da izbacimo naredbu a++}

a=0,dvostruko:0,trostruko:0a=1,dvostruko:2,trostruko:3

Isti bi ispis bio da izbacimo naredbu a++,a da uvjet glasi ++a<7

Šta bi program ispisao kad bi uvjet bioa 1,dvostruko:2,trostruko:3a=2,dvostruko:4,trostruko:6a=3,dvostruko:6,trostruko:9a=4,dvostruko:8,trostruko:12a=5,dvostruko:10,trostruko:15

Šta bi program ispisao kad bi uvjet bio

a++<7

Odgovor: Bio bi dodan još jedan red:a=6,dvostruko:12,trostruko:18

g j ja=7,dvostruko:14,trostruko:21

Naredba break

• Naredbu break koristimo u slijedećim slučajevima:

- završetak switch-case naredbe;- prijevremeni izlazak iz petlje;- prijevremeni izlazak iz petlje;

Primjer:

for (i=0; i<=30;i++)( ){

printf (“Prolaz kroz petlju br. %d”,i);if (i>10) break;

}

• Iako je izrazom i<=30 određeno da se iz petlje izađe kada vrijednost od i bude 31, petlja će se završiti kada vrijednost od i bude 11.• Sve programske petlje, kao i naredba switch-case omogućuju da se unutar petlje nalaze druge petlje, tj. Druge naredbe switch-case. • U slučaju da se naredba break nađe unutar takve programske strukture, ona će j p g ,prouzrokovati izlazak iz unutrašnje petlje, odnosno iz unutrašnje naredbe switch-case.

Naredba continue

• Za razliku od naredbe break koja omogućuje da se program grana na prvu naredbu izvan petlje, naredba continue omogućuje da se nastavi sa izvršavanjem sljedeće iteracije petlje.

Primjer:int main (){

• Kada god vrijednost od a ne bude djeljiva sa 5, tj. rezultat izraza a%5 je različita od 0 (uvjet je

int a;a=0;while (a<100){

i i

istinit), izvršava se naredba continue. Naredba continue prouzrokuje izvršavanje slijedeće iteracije tj preskakanje naredbeif (a%5) continue;

printf(“\n %d “, a);}return 0;}

slijedeće iteracije, tj. preskakanje naredbe printf(), pa će biti ispisani samo brojevi do 100 koji su djeljivi sa 5.

} • U programskim petljama while i do-while, naredbom continue program se grana na ispitivanje uvjetnog izraza.• Kod for petlje program će prvo izvršiti izraz koji mijenja kontrolnu varijablu petlje (izraz3), a zatim će se ispitati uvjetni izraz.

Page 34: Osnove Račuvarstva

Naredba goto

• Općenito je prihvaćen stav da prečesta upotreba goto naredbe smanjuje čitljivost i razumljivost programa.• Općenito, svaki se program može napisati bez goto naredbe, ali isto tako programi koji koriste tu naredbu ne moraju biti manje efikasni.• Naredba goto zahtijeva simboličku oznaku linije koju nazivamo labela. Na tu liniju se program grana nakon goto naredbe.

Primjerint main(){

labele

int a;a=2;dio1:a=a+2;if (a>20) goto dio2;printf(“\n %d”,a);goto dio1;poruka:

i f(“\ i ih b j k ji ji d 20”)printf(“\n Nema vise parnih brojeva koji su manji od 20”);return 0;}

• Napisati C program koji izračunava izraz sumu:

Primjer 7.3

• Napisati C program koji izračunava izraz sumu:S=1 - 1/2 + 1/3 - 1\4 + 1/5 - ... +-1/n

• Broj n se unosi sa standardnog ulaza.

#include<stdio.h>int main(){

i t iint i,n,p;float S;printf("Unesite broj clanova koji ce se sabirati\n");scanf("%d",&n); S 0;S=0; p=1;for (i=1;i<=n;i++) {

S+=(p*(1./i)); p=-p;

}printf("Suma %d clanova je:%5 2f\n" n S);printf( Suma %d clanova je:%5.2f\n ,n,S); return 0;

}

Primjer 7.4

#include<stdio.h>• Isti zadatak kao 7.3 ali rješavan pomoću while petlje.

int main(){

int i,n,p;float S;printf("Unesite broj clanova koji ce se sabirati\n");scanf("%d",&n); S=0; p=1;i=1;while (i<=n) {

S+=(p*(1./i)); p=-p;i++;

}printf("Suma %d clanova je:%5.2f\n",n,S);

t 0return 0;}

Zadaci za analizu programa

• U nastavku predavanja je dato11 zadataka za analizu programa ili bloka dbi d j di ih dij l k ihnaredbi, odnosno, pojedinih dijelova ukupnih programa.

• Za rješavanje zadatak potrebno je poznavanje do sada pređenog gradiva iz programskog jezika C.

• Pri rješavanju zadataka posebnu pažnju treba usredotočiti na način radapojedinih programskih struktura korištenih u tim zadacima.

• Uspješno rješavanje zadataka je potvrda razumijevanja mehanizamaUspješno rješavanje zadataka je potvrda razumijevanja mehanizama djelovanja pojedinih operatora, programskih struktura, naredbi i slično.

Page 35: Osnove Račuvarstva

Zadaci za analizu br. 1 i br. 2

int a=10, b=3, c;b+=a++;

• Koje vrijednosti imaju varijable a, b i c nakon izvršenog bloka naredbi:

b-=a--;c=a%b+1;

Odgovor:a=10, b=2,c=1Odgovor:a 10, b 2,c 1

#include <stdio.h>• Šta će ispisati slijedeći program:

int main(){

int i=0;do{

printf("MA");i++;

} while (i%2!=0);}}

Odgovor: MAMA

Zadatak za analizu br. 3

• Koja je vrijednost varijable b nakon izvođenja slijedećeg bloka naredbi:

int main(){

char c=65, b=0;switch (c){

case 'A': b++;case 'a': b++;

'B' b b kcase 'B': b++; break;case 'C': b++;default: b++; break;

}t 0return 0;

}

Od b 3Odgovor: b=3

Zadatak za analizu br. 4

• Šta će ispisati slijedeći program:

#include <stdio.h>int main(){

it h (4%5)switch (4%5) {

case 0: printf ("AA");case 1: printf ("BB"); break;

2 i tf ("CC")case 2: printf ("CC");case 3: printf ("DD");default: printf("EE");

}return 0;return 0;}

Odgovor: EEOdgovor: EE

Zadatak za analizu br. 5

• Šta će ispisati slijedeći program:

#include <stdio.h>#include <stdio.h>int main(){switch (8%7) {{

case 0: printf ("AA");case 1: printf ("BB"); case 2: printf ("CC");break;case 3: printf ("DD");pdefault: printf("EE");

}return 0;}

Odgovor:BBCCOdgovor:BBCC

Page 36: Osnove Račuvarstva

Zadatak za analizu br. 6

int main()

• Koje vrijednosti će imati varijable x, y i z nakon izvođenja slijedećeg bloka naredbi:

int main(){

int x,y,z;x=y=z=1;dodo{

do{

y=z++;y z++;} while (y<5);x=y++;

} while (x<6);return 0;return 0;

}

Odgovor: x=6, y=7, z=7

Zadatak za analizu br. 7

#include <stdio.h>

• Koje vrijednosti imaju x i y nakon izvođenja slijedećeg programa:

int main(){

int x=0, y=10;while (x=x<y){

++x;break;

}t 0return 0;

}

Odgovor: x=2, y=10

Zadatak za analizu br. 8

• Šta će ispisati slijedeći program:

#include <stdio.h>int main(){

char a,b;a='C';b=1;b=-b;b=~b+1;

i tf("% " b 2)printf("%c", a+b+2);return 0;

}

Odgovor: F

Zadaci za analizu br. 9 i br. 10

#include <stdio.h>int main(){

• Šta će ispisati slijedeći program:

{int i, j;for (i=0;i<3;++i)

for (j=0;j<2;++j)printf("A");

Odgovor: AAAAAA

printf( A );return 0;

}Š#include <stdio.h>int main(){

• Šta će ispisati slijedeći program:

{int i, j;for (i=0;i<3;++i)

for (j=0;j<i;++j)printf("B");

Odgovor: BBB

p t ( );return 0;

}

Page 37: Osnove Račuvarstva

Zadatak za analizu br. 11

#include <stdio h>

• Koju vrijednost će imati varijabla a nakon izvršenog programa:

#include <stdio.h>int main(){

int i, a=0;for (i=1;i<100;i++)for (i 1;i<100;i++){

if (i%10==0) continue;a++;if (i==20||i==40||i==60)( || || )

break;}return 0;

}

Odgovor: 90Odgovor: 90

POLJA

• Polje je struktura podataka koju karakterizira sljedeće:Svi elementi u polju moraju biti istog tipa;-Svi elementi u polju moraju biti istog tipa;

-Više elemenata polja ima zajedničko ime;- Element polja je jednoznačno određen svojim položajem u polju.

• Položaj elementa u polju se prikazuje indeksom.• Indeks je broj između 0 i N-1, pri čemu N označava broj elemenata.• Indeks može biti cjelobrojna konstanta, cjelobrojna varijabla ili cjelobrojni izraz.• Polje zauzima kontinuirani niz memorijskih lokacija u memoriji.

Jednodimenzionalno polje

• Opći oblik deklaracije jednodimenzionalnog polja je:

tip_polja ime_polja[dimenzija]

- tip_polja predstavlja jedan od tipova podataka u C-u (int, float, double,…)- ime_polja predstavlja identifikator polja.- dimenzija predstavlja dužinu polja (broj elemenata polja).

• Primjeri deklaracije polja:

int niz[20]; polje niz koje sadrži 20 cijelih brojeva

char b[10]; polje b koje sadrži 10 znakova

float x[1000], y[10]; polje x koje sadrži 1000 realnih brojeva i polje ykoje sadrži 10 realnih brojeva

Primjer jednodimenzionalnog polja

int niz[5];int niz[5];

niz[0]=5

niz[1]=7;

niz[0] niz[1] niz[2] niz[3] niz[4]

5 7 3 5 4

niz[1] 7;

niz[2]=3;

niz[3]=5;[3] 5;

niz[4]=4

Page 38: Osnove Račuvarstva

Primjer (1/2)

• Program uučitava u polje s imenom niz 10 cijelih brojeva, a zatim izračunava prosjek elemenata tog polja.

#include <stdio.h>int main(){

int niz[10],suma,i;float sv;for (i=0; i<10;i++){

printf("\n %d. cijeli broj =",i+1);f("%d" i [i])scanf("%d",&niz[i]);

}suma=0;for(i=0;i<10;i++)

+ i [i]suma=suma+niz[i];sv=(float)suma/10;printf("\n Srednja vrijednost unesenih rojeva je %f",sv);

}

Primjer (2/2)

•Ulaz i izlaz iz programa:

Postavljanje početnih vrijednosti elemenata polja

• Primjeri postavljanja početnih vrijednosti elemenata polja (inicijalizacija polja):

int niz[5]={1, 2, 3, 0, 0};

float p[3]={0, 0.5, 1};

{‘ ‘ ‘C ‘ }char slova[4]={‘A’, ‘B’, ‘C’, ‘D’};

i [0] 1 [0] 0 l [0] ‘A’niz[0]=1 p[0]=0 slova[0]=‘A’niz[1]=2 p[1]=0.5 slova[1]=‘B’ niz[2]=3 p[2]=1 slova[2]=‘C’niz[4]=0 slova[3]=‘D’niz[0] 0niz[0]=0

Page 39: Osnove Račuvarstva

Sadržaj predavanja 06

• Inicijalizacija polja

Strane u skripti:•26 – 37

• Dvodimenzionalno polje• Trodimenzionalno polje• Višedimenzionalno polje

Inicijalizacija dvodimenzionalnog polja

•119-129•165-170

• Inicijalizacija dvodimenzionalnog polja• Funkcije• Definicija funkcije• Poziv funkcije

Napomena:

Čitanje preporučene literature je • Naredba return• Prototip funkcije • Funkcija koja ne vraća rezultat• Argumenti funkcije i prenos podataka u funkciju

obavezno

• Argumenti funkcije i prenos podataka u funkciju• Primjeri

• Ako je zadano manje članova pri inicijalizaciji od dimenzije polja nedefinirani

Inicijalizacija polja

• Ako je zadano manje članova pri inicijalizaciji od dimenzije polja, nedefinirani elementi se postavljaju na nulu.

• Ako nije definirana dimenzija polja, broj elemenata polja je određen brojem j j p j , j p j j jnavedenih konstanti pri deklaraciji.

• Primjeri:

int a[10]={10, 9, 8, 7, 6} int b[ ]={2, 4, 6, 8, 10}

a[0]=10 b[0]=2a[0]=10 b[0]=2a[1]=9 b[1]=4a[2]=8 b[2]=6a[3]=7 b[3]=8a[4]=6 b[4]=10a[5]=0a[6]=0a[7]=0a[7] 0a[8]=0a[9]=0

Višedimenzionalno polje

• Višedimenzionalno polje se može shvatiti kao skup jednodimenzionalnih polja.

• Primjer dvodimenzionalnog polja:

float a[P][Q];

a[0][0] a[0][1] …. a[0][Q-1]

a[1][0] a[1][1] …. a[1][Q-1]

…. …. …. …..

a[P-1][0] a[P-1][1] ….. a[P-1][Q-1]

Primjer dvodimenzionalnog polja:

int a[3][3];

P i j t di i l lj

Trodimenzionalno polje

• Primjer trodimenzionalnog polja:

int b[3][P][Q];

b[2][0][0] b[2][0][1] …. b[2][0][Q-1]

• Prvi član polja je b[0][0][0]

a[1,1] …. b[2][1][Q-1]

…. …. …..

b[1][0][0] b[1][0][1] …. b[1][0][Q-1]

[1 0] [1 1] b[1][1][Q 1]….

a[P-1,0] a[P-1,1] ….. b[2][P-1][Q-1]

a[1,0] a[1,1] …. b[1][1][Q-1]

…. …. …. …..

b[0][0][0] b[0][0][1] …. b[0][0][Q-1]

b[0][1][0] b[0][1][1] …. b[0][1][Q-1]

a[P-1,0] a[P-1,1] ….. b[1][P-1][Q-1]…. …. …. …..

b[0][P-1][0] b[0][P-1][1] ….. b[0][P-1][Q-1]

Page 40: Osnove Račuvarstva

Inicijalizacija dvodimenzionalnog polja

int a[3][4]={1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23}

a[0][0]=1 a[0][1]=3 a[0][2]=5 a[0][3]=7

a[1][0]=9 a[1][1]=11 a[1][2]=13 a[1][3]=15[ ][ ] [ ][ ] [ ][ ] [ ][ ]

a[2][0]=17 a[2][1]=19 a[2][2]=21 a[2][3]=23

• Drugi način zapisa:

int a[3][4]= { Ovakav način zapisa omogućuje veću preglednost.

{1, 3, 5, 7},{9, 11, 13, 15},{17, 19, 21, 23}

};};

Primjeri inicijalizacije kada je postavljeno manje članova

• Primjer 1

int a[3][4]={1, 3, 5, 7, 9, 11, 13}a[0][0]=1 a[0][1]=3 a[0][2]=5 a[0][3]=7a[0][0]=1 a[0][1]=3 a[0][2]=5 a[0][3]=7a[1][0]=9 a[1][1]=11 a[1][2]=13 a[1][3]=0

a[2][0]=0 a[2][1]=0 a[2][2]=0 a[2][3]=0

• Primjer 2

int a[3][4]= { {1, 3},{5, 7},{9, 11}};};

a[0][0]=1 a[0][1]=3 a[0][2]=0 a[0][3]=0

a[1][0]=5 a[1][1]=7 a[1][2]=0 a[1][3]=0

a[2][0]=9 a[2][1]=11 a[2][2]=0 a[2][3]=0

Inicijalizacija polja koje sadrži niz znakova

• char rijec[7]={‘K’, ‘n’, ‘j’, ‘i’, ‘g’, ‘a’, ‘\0’};

• char rijec[]= {‘K’, ‘n’, ‘j’, ‘i’, ‘g’, ‘a’, ‘\0’};

rijec[0]=‘K’ rijec[1]=‘n’ rijec[2]=‘j’ rijec[3]=‘i’

rijec[4]=‘g’ rijec[5]=‘a’ rijec[6]=‘\0’rijec[4] g rijec[5] a rijec[6] \0

• Niz znakova se završava nulom, pa se nula (‘\0’) navodi kao zadnji element polja.a o a se a ša a u o , pa se u a ( \0 ) a od ao ad j e e e t po ja

• Duljina polja mora biti za jedan veća od broja znakova niza.

Primjer 9.1 (1/5)

• Napisati C program koji učitava dimenzije matrice A (broj redova i kolona)• Napisati C program koji učitava dimenzije matrice A (broj redova i kolona), zatim učitava elemente matrice A, ispisuje unesene elemente, kreira transponiranu matricu i na kraju ispisuje elemente transponirane matrice.

• Program na početku treba provjeriti korektnost unosa dimenzija matrice.

(Broj unesenuh redova i kolona ne smije biti manji od 1 i veći od 10)

• Pretpostaviti da je maksimalni broj redova i kolona 10.

Page 41: Osnove Račuvarstva

Primjer ulaznih podataka i izlaza iz programa (2/5) Primjer 9.1 (3/5)

#include <stdio.h>Unos redova i kolona i provjera korektnosti unosa.

int main(){int i j red kol priv max;int i, j, red,kol,priv,max;int A[10][10];

/* Ucitavanje dimezija matrice*/do{

printf("Unesite broj redova < %d:", 10);scanf("%d", &red);printf("Unesite broj kolona < %d:", 10);p t ( U es te b oj o o a %d: , 0);scanf("%d", &kol);

} while (red < 1 || red > 10 || kol < 1 || kol > 10);

Primjer 9.1 (4/5)

printf("\nUnos elemenata matrice :\n\n");for (i = 0; i < red; i++)

Unos i ispis elemenata matrice.

{for (j = 0; j < kol; j++){

printf("Unesite element [%d][%d] : ", i, j);printf( Unesite element [%d][%d] : , i, j);scanf("%d", &A[i][j]);

}}/ i i //*Ispis elemenata matrice*/printf("\n Elementi matrice su:\n\n");for (i = 0; i < red; i++){{

for (j = 0; j < kol; j++){printf("%4d", A[i][j]);

}}printf("\n");

}

Primjer 9.1 (5/5)

if (red>kol) max=red; else max=kol;/* Postupak transponiranja*/for ( i=0; i<max; ++i ) { Transponiranje i ispis transponirane

t ifor ( j=i+1; j<max; ++j ) {

priv = A[i][j];A[i][j] = A[j][i];

matrice.

A[i][j] A[j][i];A[j][i] = priv;

}}/*I i t i t i *//*Ispis transponirane matrice*/printf("\nTransponirana matrica je:\n\n");for (i = 0; i < kol; i++) {

for (j = 0; j < red; j++) {j j jprintf("%4d", A[i][j]);

}printf("\n");

}}return 0;

}

Page 42: Osnove Račuvarstva

Funkcije

• U C-u je nemoguće napisati program bez ijedne funkcije, jer program mora uvijek sadržavati barem funkciju main().

• Pragramske probleme obično možemo raščlaniti na manji logičke cjeline.

• Funkcije omogućuju rješavanje pojedinih logičkih cjelina.

• Objedinjavanjem funkcija u jednu cjelinu dobivamo cjelokupni program koji predstavlja rješenje datog programskog problema.

• Veliki broj funkcija se već nalazi u bibliotekama funkcija, a neke od njih smo već koristili kao na primjer:

scanf() prototip sadržan u <stdio.h>printf() prototip sadržan u <stdio.h>sqrt() prototip sadržan u <math h>sqrt() prototip sadržan u <math.h>fabs() prototip sadržan u <math.h>

Definicija funkcije

• Definicija funkcije je programski izvorni kod koji opisuje način rada funkcije.

• Opći oblik funkcije:p j

tip_funkcije ime_funkcije(deklaracija liste argumenata){

deklaracija lokalnih varijabli;deklaracija lokalnih varijabli;tijelo funkcije;

}

• tip_funkcije određuje tip podataka koji će funkcija vratiti.

Podaci se prenose u funkciju preko argumenata navedenih u listi argumenata• Podaci se prenose u funkciju preko argumenata navedenih u listi argumenata.• Argumenti u definiciji funkcije se nazivaju formalni argumenti.• Argumenti koji se koriste pri pozivu funkcije se nazivaju stvarni argumenti.

Naredba return

• Naredba return se koristi za:

- vraćanje u nadređenu funkciju.vraćanje rezultata izvršavanja funkcije u nadređenu funkciju- vraćanje rezultata izvršavanja funkcije u nadređenu funkciju.

• Opći oblik naredbe return:

return izraz;

(vraća rezultat izvršavanja pozvane funkcije u nadređenu funkciju).

Primjeri:

return 0; return a;

return 5; return (2*a+b);

Ako tip rezultata izraza ne odgovara definiranom tipu funkcije izvršit će se• Ako tip rezultata izraza ne odgovara definiranom tipu funkcije, izvršit će se pretvaranje rezultata u tip određen funkcijom.

Poziv funkcije

• Pri pozivu funkcije dovoljno je navesti ime funkcije i njene argumente (ako postoje).• Kada izvođenje programa dođe do funkcije, kontrolu programa preuzima funkcija.• Nakon završetka izvođenja funkcije, kontrola programa se opet vraća funkciji iz koje je pozvana dotična funkcija.

#include <stdio.h>i t i ()

int osvojeno(int d,int p){int main ()

{…….b1=osvojeno(dg1, pg1);

{int b;if (d>p)

b=3;…….b2=osvojeno(dg2, pg2);…….b3=osvojeno(dg3 pg3);

else if (d==p)b=1;

elseb=0;b3=osvojeno(dg3, pg3);

……..}

b=0;return b;

}

Page 43: Osnove Račuvarstva

Prototip funkcije

• Omogućuje da kompajler napravi kontrolu broja i tipa argumenata.

• Na primjer:

int suma(int c, int d)

• Različitosti tipova podataka u pozivu funkcije i tipova podataka definirane funkcije lti j škrezultiraju greškom.

• Prototipovi funkcija se obično navode na početku datoteke.

f• U programima koji koriste puno funkcija, prototipove je najpraktičnije grupirati u odvojene datoteke (header datoteke)

• Header datoteke se pretprocesorskom naredbom #include uključuju na početkuHeader datoteke se pretprocesorskom naredbom #include uključuju na početku programa.

•Datoteke koje sadrže prototipove funkcija obično imaju ekstenziju .h

Primjer 9.2

# include <stdio.h>int main()(){

int a;int puta3(int);

printf("\n Unesite cijeli broj:");scanf("%d",&a);printf("\n Trostruko %d je %d",a,puta3(a));

}/* funkcija vraca trostruku vrijednost*/int puta3 (int a){{

a=3*a;return a;

}

#

Primjer 9.3

#include <stdio.h>int main(){

int a,b,c;, , ;int suma(int c, int d); printf("\nUnesite dva cijela broja:");scanf("%d %d",&a,&b);

( b)c=suma(a,b);printf("\nSuma je:%d",c);return 0;

}

/* Definicija funkcije suma() */

int suma(int c int d)int suma(int c, int d){

int g;g=c+d;return (g);

}

Primjer 9.4 (1/4)

• Napraviti C program koji učitava rezultate iz dvije nogometne utakmice a zatim izračunava ukupan broj osvojenih bodova domaće ekipe iz te dvije

takmice Re ltat je formatutakmice. Rezultat je u formatu: d p

gdjed označava broj datih golova domaće ekipeg označava broj primljenih golova

Primjer ulazanih i izlaznih vrijednosti je:

Page 44: Osnove Račuvarstva

#include <stdio h>

Primjer 9.4 (2/4)

#include <stdio.h>int main(){

int dg1,pg1,dg2,pg2,b1,b2,b;i tf("\ U it lt t t k i ")printf("\nUnesite rezultat prve utakmice");

scanf("%d %d",&dg1,&pg1);printf("\bUnesite rezultat druge utakmice");scanf("%d %d",&dg2,&pg2);if (d 1> 1)if (dg1>pg1)

b1=3;else if (dg1==pg1)

b1=1;lelse

b1=0;if (dg2>pg2)

b2=3;l if (d 2 2)else if (dg2==pg2)

b2=1;else

b2=0;b b1+b2b=b1+b2;printf("\nUkupan broj bodova iz dvije utakmice je:%d",b);return 0;

}

Primjer 9.4 (3/4)

#include <stdio.h>/* Funkcija za izracunavanje osvojenih bodova*/int osvojeno(int d,int p){

int b;if (d>p)

b=3;b 3;else if (d==p)

b=1;else

b=0;return b;

}

Primjer 9.4 (4/4)

/*Glavni program-Izracunavanje bodova iz 2 utakmice*/i t i ()int main(){

int dg1,pg1,dg2,pg2,b1,b2,b;printf("\nUnesite rezultat prve utakmice:");p pscanf("%d %d",&dg1,&pg1);printf("\bUnesite rezultat druge utakmice:");scanf("%d %d",&dg2,&pg2);b1=osvojeno(dg1 pg1);b1=osvojeno(dg1,pg1);b2=osvojeno(dg2,pg2);b=b1+b2;printf("\nUkupan broj bodova iz dvije utakmice je:%d",b);return 0;

}

Funkcija koja ne vraća rezultat

• Funkcija na standardni izlaz ispisuje d puta znak *

Funkcija ne vraća rezultat.

void crtaj( int d){

i iFunkcije koje ne trebaju vratiti nikakvu vrijednostint i;

for (i=1;i<=d;i++){

printf("*");

vratiti nikakvu vrijednost definiraju se kao void.

p ( );}

}

Primjer poziva funkcije crtaj():• Primjer poziva funkcije crtaj():

crtaj(12);

• Na standardnom izlazu će biti 12 puta ispisan znak *:

************

Page 45: Osnove Račuvarstva

• Napisati C program koji u polje s pet elemenata učitava pet cjelobrojnih vrijednosti

Primjer 9.5 (1/2)Napisati C program koji u polje s pet elemenata učitava pet cjelobrojnih vrijednosti

a zatim te vrijednosti prikazuje u obliku grafikona (vidjeti sliku).• Koristiti prethodno napisanu funkciju crtaj().

Primjer ulaza i izlaza iz programa je:• Primjer ulaza i izlaza iz programa je:

#include <stdio h>

Primjer 9.5 (2/2)#include <stdio.h>void crtaj( int d){

int i;for (i=1;i<=d;i++){

printf("*");}p ( );}}int main(){

int i,niz[5];printf("\n Unesite vrijednosti za grafikon\n");

for (i=1;i<=5;i++){

i tf("\ %d ij d t " i)printf("\n %d. vrijednost:",i);scanf("%d",&niz[i-1]);

}printf("\n %c\n |",94);for (i=1;i<=5;i++)for (i 1;i< 5;i++){

printf("\n |");crtaj(niz[i-1]);printf(" %d",niz[i-1]);printf("\n |");

}printf("--------------------------------------------->");

}

Argumenti funkcije i prenos podataka u funkciju

• Argumenti funkcije moraju se deklarirati tako da odgovaraju tipu podataka koji se prenose u funkciju.

• Podaci se u funkciju prenose na dva načina:

- preko vrijednosti (eng. call by value)( f )

O ovom načinu prenosa podataka detaljno ćemo- preko adrese (eng. call by reference) podataka detaljno ćemo govoriti na slijedećem predavanju.

Prijenos podataka preko vrijednosti (eng. call by value)

• Kod ovog prijenosa podataka vrijednost varijabli koje se prenose ne mogu se mijenjati u pozvanoj funkciji.• Argumenti pozvane funkcije prihvaćaju kopiju vrijednosti tih varijabli.• Promjena vrijednosti argumenata unutar funkcije ne utiče na promjenu vrijednosti prenesenih varijabli.jed ost p e ese a jab

Page 46: Osnove Račuvarstva

N i ti f k ij k j i č d j ij d t č ti i l b j t

Primjer 9.6

• Napisati funkciju srv koja izračunava srednju vrijednost četiri realna broja, te nakon toga napisati glavni program koji učitava četiri broja te uz pomoć funkcije srv izračunava i ispisuje srednju vrijednost unesenih brojeva.

Formalni argumenti#include <stdio.h>float srv( float a, float b, float c, float d ){

Formalni argumenti

float v;v = (a + b + c+d) / 4;return v;

}}int main()

{float b1, b2, b3, b4,sv;

Stvarni argumenti

printf("\nUnesite cetiri realna broja : ");scanf("%f %f %f %f", &b1, &b2, &b3,&b4 );sv = srv(b1,b2,b3,b4);printf("\nSrednja vrijednost unesenih brojeva je : %f", sv);printf( \nSrednja vrijednost unesenih brojeva je : %f , sv);return 0;

}

Pisanje funkcija u istoj datoteci s glavnim programom

#include <stdio.h>

id f1(i t i t b) • U ovakvoj organizaciji programavoid f1(int a, int b){….}

U ovakvoj organizaciji programafunkcije su definirane prije funkcije main().

double f2(int c, float d){……}

int main(){…..}

Pisanje funkcija u istoj datoteci s glavnim programom i navedenim prototipom

#include <stdio.h>

void f1(int a, int b);double f2(int c float d); • U ovakvoj organizaciji programadouble f2(int c, float d);

int main(){

U ovakvoj organizaciji programaprototipovi funkcija su navedeni prije funkcije main(), dok su funkcije definirane iza funkcije main()…..

}

void f1(int a int b)

definirane iza funkcije main().

void f1(int a, int b){….}

double f2(int c, float d){…………}