29
Elementi izrade programa Elementi izrade programa

Elementi izrade programa

  • Upload
    dolph

  • View
    27

  • Download
    0

Embed Size (px)

DESCRIPTION

Elementi izrade programa. Normalan slijed; Bezuvjetni skok. Normalan programski slijed naredba_1 naredba_2 naredba_3 ... Bezuvjetni skok Pseudokod:C: idi na oznaka_naredbe goto oznaka_naredbe ;. Grananje. S: Oznaka za jednu ili više naredbi, odnosno programski odsječak - PowerPoint PPT Presentation

Citation preview

Page 1: Elementi izrade programa

Elementi izrade programaElementi izrade programa

Page 2: Elementi izrade programa

22

Normalan slijed; Bezuvjetni skokNormalan slijed; Bezuvjetni skok Normalan programski slijedNormalan programski slijed

naredba_1naredba_1

naredba_2naredba_2

naredba_3naredba_3

......

Bezuvjetni skokBezuvjetni skok

Pseudokod:Pseudokod: C:C:

idi naidi na oznaka_naredbeoznaka_naredbe gotogoto oznaka_naredbeoznaka_naredbe;;

Page 3: Elementi izrade programa

33

GrananjeGrananje S: Oznaka za jednu ili više naredbi, odnosno programski odsječakS: Oznaka za jednu ili više naredbi, odnosno programski odsječak

Uvjetno obavljanje naredbi (jednostrana selekcija)Uvjetno obavljanje naredbi (jednostrana selekcija)

Pseudokod:Pseudokod: C:C:

ako je ako je ((logički_izrazlogički_izraz) ) ondaonda if (if (logički_izrazlogički_izraz){){

| | SS S;S;

}} Grananje (dvostrana selekcija)Grananje (dvostrana selekcija)

Pseudokod:Pseudokod: C:C:

ako jeako je ( (logički_izrazlogički_izraz) ) ondaonda if (if (logički_izrazlogički_izraz){){

| | S_1S_1 S_1S_1;;

inačeinače } else {} else {

| | S_2S_2 S_2S_2;;

}}

Page 4: Elementi izrade programa

44

GrananjeGrananje Višestruko grananje (viVišestruko grananje (višestrana selekcija)šestrana selekcija)

Pseudokod:Pseudokod: C:C:

ako jeako je (logički_izraz_1) (logički_izraz_1) ondaonda if (if (logički_izraz_1logički_izraz_1) {) {| | S_1S_1 S_1S_1;;

inače ako jeinače ako je (logički_izraz_2) (logički_izraz_2) onda onda} else if (} else if (logički_izraz_2logički_izraz_2) {) {

| | S_2 S_2 S_2S_2;;

inače ako jeinače ako je (logički_izraz_3) (logički_izraz_3) ondaonda} else if (} else if (logički_izraz_3logički_izraz_3) {) {

| | S_3S_3 S_3S_3;;

...... ... ...

inačeinače } else {} else {

| | S_0S_0 S_0 S_0;;

}}

Page 5: Elementi izrade programa

55

GrananjeGrananje SkretnicaSkretnica

Pseudokod:Pseudokod: C:C:

skretnicaskretnica (vrijednost) (vrijednost) switch(switch(cjelobrojna vrijednostcjelobrojna vrijednost){){

slučajslučaj C1 C1 case case C1C1::

| | S_1S_1 S_1S_1;;

break;break;

slučajslučaj C2 C2 case case C2C2::

| | S_2S_2 S_2S_2;;

break;break;

...... ......

slučajslučaj Cn Cn case case CnCn::

| | S_nS_n S_nS_n;;

break;break;

inačeinače default:default:

| | S_n+1S_n+1 S_nplus1S_nplus1;;

}}

Page 6: Elementi izrade programa

66

GrananjeGrananje Primjer za vježbu: Ostvariti skretnicu naredbom Primjer za vježbu: Ostvariti skretnicu naredbom if - else.if - else.

if (vr == C1) {if (vr == C1) {

S1;S1;

} else if (vr == C2) {} else if (vr == C2) {

S2;S2;

}}

......

} else if (vr == Cn) {} else if (vr == Cn) {

Sn;Sn;

} else {} else {

S_nplus1;S_nplus1;

}} Ako se iz skretnice izbace naredbe Ako se iz skretnice izbace naredbe breakbreak, obavljaju se slijedno sve , obavljaju se slijedno sve

naredbe iza one gdje je prvi put zadovoljeno: naredbe iza one gdje je prvi put zadovoljeno: vr == Civr == Ci

Page 7: Elementi izrade programa

77

GrananjeGrananje Skretnica bez Skretnica bez breakbreak korištenjem naredbe korištenjem naredbe ifif..

nadjen = 0;nadjen = 0;

if (vr == C1) {if (vr == C1) {

S1;S1;

nadjen = 1;nadjen = 1;

}}

if (vr == C2 if (vr == C2 |||| nadjen nadjen) {) {

S2;S2;

nadjen = 1;nadjen = 1;

}}

......

if (vr == Cn if (vr == Cn |||| nadjen nadjen) {) {

Sn;Sn;

}}

S_nplus1;S_nplus1;

Page 8: Elementi izrade programa

88

Programska petljaProgramska petlja

Petlja s ispitivanjem uvjeta ponavljanja na početkuPetlja s ispitivanjem uvjeta ponavljanja na početku

Pseudokod:Pseudokod: C:C:

dok jedok je (logički_izraz) (logički_izraz) činitičiniti while (while (logički_izrazlogički_izraz) {) {

| | SS SS;;

}} Petlja s ispitivanjem uvjeta ponavljanja na krajuPetlja s ispitivanjem uvjeta ponavljanja na kraju

U nekim programskim jezicima postoji oblik:U nekim programskim jezicima postoji oblik: REPEAT...UNTIL REPEAT...UNTIL

Pseudokod:Pseudokod: C:C:

ponavljatiponavljati do {do {

| | SS SS;;

dodo ( (logički_izraz)logički_izraz) } while(!} while(!logički_izrazlogički_izraz)) Standardna petlja u C-u:Standardna petlja u C-u:

Pseudokod:Pseudokod: C:C:

ponavljatiponavljati do {do {

| | SS SS;;

dok dok jeje (logički_izraz) (logički_izraz) }} while (while (logički_izrazlogički_izraz););

Page 9: Elementi izrade programa

99

Programska petljaProgramska petlja

Petlja s poznatim brojem ponavljanjaPetlja s poznatim brojem ponavljanja

Pseudokod:Pseudokod: C:C:

zaza ii := := pocpoc dodo krajkraj ( (korakkorak kk) ) činitičiniti for(i=poc;i<=kraj;i=i+k){for(i=poc;i<=kraj;i=i+k){

| | SS S S;;}}

Primjer: Realizacija istog odsječka petljom Primjer: Realizacija istog odsječka petljom whilewhile::

i = poc;i = poc;

while (i <= kraj) {while (i <= kraj) {

SS;; // niz naredbi koje ne mijenjaju vrijednost za i// niz naredbi koje ne mijenjaju vrijednost za i

i += k;i += k;

}}

ili općenitije:ili općenitije:

i = poc;i = poc;

while ((i - kraj) * k <= 0) {while ((i - kraj) * k <= 0) {

SS;; // niz naredbi koje ne mijenjaju vrijednost za i// niz naredbi koje ne mijenjaju vrijednost za i

i += k;i += k;

} } // // U čemu je razlika? Pokus: poc = 5; kraj = -20; k = -7;U čemu je razlika? Pokus: poc = 5; kraj = -20; k = -7;

Page 10: Elementi izrade programa

1010

Programska petljaProgramska petlja

Skok iz petljeSkok iz petlje

Pseudokod:Pseudokod: C:C:

izađi iz petljeizađi iz petlje break;break;

skoči na kraj petljeskoči na kraj petlje continue;continue; Beskonačna petljaBeskonačna petlja

Pseudokod:Pseudokod: C:C:

ponavljajponavljaj while(1) {while(1) {

SS S; S;

zauvijekzauvijek }}

U algoritmima ovakva petlja nije dopuštena jer je u suprotnosti sa zahtjevom U algoritmima ovakva petlja nije dopuštena jer je u suprotnosti sa zahtjevom da postupak bude konačan. da postupak bude konačan.

Page 11: Elementi izrade programa

1111

Programska petljaProgramska petlja

U tijelu petlje mora postojati barem jednom ispitivanje uvjeta za izlazak iz U tijelu petlje mora postojati barem jednom ispitivanje uvjeta za izlazak iz petlje:petlje:

while(1) {while(1) {

S1S1;;

if (if (logički_izrazlogički_izraz) break;) break;

S2S2;;

......

} } iliili

while(1) {while(1) {

S1S1;;

if (if (logički_izrazlogički_izraz) goto ) goto oznaka_naredbeoznaka_naredbe;;

S2S2;;

......

}} Naredbu Naredbu gotogoto treba izbjegavati ako je ikako moguće. Smanjuje se mogućnost treba izbjegavati ako je ikako moguće. Smanjuje se mogućnost

pogreške i olakšava testiranje programa ako svaka programska cjelina (npr. pogreške i olakšava testiranje programa ako svaka programska cjelina (npr. petlja) ima samo jedan ulaz i jedan mogući izlaz.petlja) ima samo jedan ulaz i jedan mogući izlaz.

Page 12: Elementi izrade programa

1212

ProcedureProcedure

Programi se sastoje od procedura. Prva pozvana procedura je glavni Programi se sastoje od procedura. Prva pozvana procedura je glavni program. Kad glavni program završi, slijedi povratak u operacijski sustav. program. Kad glavni program završi, slijedi povratak u operacijski sustav. Inače, povratak iz procedure je uvijek na onu proceduru koja ju je Inače, povratak iz procedure je uvijek na onu proceduru koja ju je pozvala. Uobičajena je podjela na funkcije (pozvala. Uobičajena je podjela na funkcije (functionfunction) koje imaju od nula ) koje imaju od nula do više ulaznih argumenata i vraćaju jedan rezultat, te na općenite do više ulaznih argumenata i vraćaju jedan rezultat, te na općenite potprograme (potprograme (subroutinesubroutine) koje rezultat predaju argumentima.) koje rezultat predaju argumentima.

U jeziku C sve procedure su funkcije koje daju rezultat nekog od tipova U jeziku C sve procedure su funkcije koje daju rezultat nekog od tipova podataka, ali mogu mijenjati i vrijednost argumenata.podataka, ali mogu mijenjati i vrijednost argumenata.

Posebni slučajevi:Posebni slučajevi: Glavni program:Glavni program: mainmain Potprogram koji u imenu ne vraća vrijednost:Potprogram koji u imenu ne vraća vrijednost: voidvoid

Page 13: Elementi izrade programa

1313

Razmjena podataka između funkcijaRazmjena podataka između funkcija

globalne varijableglobalne varijable argumenti navedeni u zagradi, prenose se vrijednosti (argumenti navedeni u zagradi, prenose se vrijednosti (call by valuecall by value)) za prijenos vrijednosti u pozivajuza prijenos vrijednosti u pozivajuću funkcijuću funkciju koriste se kod poziva koriste se kod poziva

funkcije kao argumenti adrese, a u definiciji funkcije argumenti su funkcije kao argumenti adrese, a u definiciji funkcije argumenti su pokazivači (pokazivači (call by referencecall by reference).).

Ako funkcija mora predati rezultat preko argumenata, nužno se koristi Ako funkcija mora predati rezultat preko argumenata, nužno se koristi call by referencecall by reference..

Ulazno-izlazne operacijeUlazno-izlazne operacije:: Za slijedno čitanje/pisanje preko standardnih ulazno-izlaznih jedinica Za slijedno čitanje/pisanje preko standardnih ulazno-izlaznih jedinica

koristit će se odgovarajuće C funkcije ili naredbe pseudokoda:koristit će se odgovarajuće C funkcije ili naredbe pseudokoda: ulazulaz (lista adresa argumenata) (lista adresa argumenata) izlazizlaz (lista argumenata) (lista argumenata)

Kod čitanja je dakle nužan Kod čitanja je dakle nužan call by referencecall by reference, dok kod ispisa može , dok kod ispisa može poslužiti i poslužiti i call by value.call by value.

Page 14: Elementi izrade programa

1414

Dvodimenzionalna i višedimenzionalna polja Dvodimenzionalna i višedimenzionalna polja kao argumenti funkcijekao argumenti funkcije

Polje u funkciji treba Polje u funkciji treba prihvatitiprihvatiti kao jednodimenzionalno polje ili pokazivač. kao jednodimenzionalno polje ili pokazivač.

Primjer:Primjer:

int polje[3][4] = { { 1, 2, 3, 4},int polje[3][4] = { { 1, 2, 3, 4},

{ 5, 6, 7, 8},{ 5, 6, 7, 8},

{ 9, 10, 11, 12} };{ 9, 10, 11, 12} };

u memoriji računala spremljeno je kaou memoriji računala spremljeno je kao

tj. jednako kao jednodimenzionalno polje od 12 elemenata.tj. jednako kao jednodimenzionalno polje od 12 elemenata. Razlikuju se fizičke dimenzije polja od logičkih, koje mogu biti i manje. Za Razlikuju se fizičke dimenzije polja od logičkih, koje mogu biti i manje. Za

pozicioniranje je potrebno znati fizički broj stupaca pozicioniranje je potrebno znati fizički broj stupaca (MAX_broj_stupaca).(MAX_broj_stupaca). Za dohvat elementa izZa dohvat elementa iz ii-tog retka treba preskočiti-tog retka treba preskočiti ii-1 -1 punih redaka.punih redaka. Kako prvi redak ima indeks 0, drugi 1, treći 2 itd., za dohvat elemenata retka Kako prvi redak ima indeks 0, drugi 1, treći 2 itd., za dohvat elemenata retka

s indeksoms indeksom ii treba preskočititreba preskočiti i*i*MAX_broj_stupacaMAX_broj_stupaca članova poljačlanova polja.. Općenito: Općenito:

dvodim_polje[i][j] dvodim_polje[i][j] jednodim_polje[i * MAX_broj_stupaca + j] jednodim_polje[i * MAX_broj_stupaca + j]

11 22 33 44 55 66 77 88 99 1010 1111 1212

Page 15: Elementi izrade programa

1515

Pisanje strukturiranih programaPisanje strukturiranih programa Osnovni naputciOsnovni naputci

specifikacija ulaznih i izlaznih varijabli ( u C obvezatno!)specifikacija ulaznih i izlaznih varijabli ( u C obvezatno!) definicija lokalnih varijablidefinicija lokalnih varijabli tok programa prema dolje, osim petlji i neizbježne goto naredbetok programa prema dolje, osim petlji i neizbježne goto naredbe poravnati naredbe iste razine za povećanje čitkosti (poravnati naredbe iste razine za povećanje čitkosti (indentationindentation)) dokumentacija kratka ali smislenadokumentacija kratka ali smislena koristiti potprograme gdje je to primjerenokoristiti potprograme gdje je to primjereno

Izbor vrste petljeIzbor vrste petlje

Primjer: Čitati članove nekog skupa nenegativnih brojeva sve dok njihova suma ne Primjer: Čitati članove nekog skupa nenegativnih brojeva sve dok njihova suma ne premaši neki predviđeni iznos premaši neki predviđeni iznos nn..

y = 0;y = 0;

do {do {

ulaz(&x);ulaz(&x);

y += x;y += x;

} while (y <= n);} while (y <= n);

Programi nisu funkcionalno identični jer u prvom slučaju se uvijek obavlja barem Programi nisu funkcionalno identični jer u prvom slučaju se uvijek obavlja barem jedno čitanje, pa program ispravno radi samo zajedno čitanje, pa program ispravno radi samo za n n00. U drugom slučaju, ako je . U drugom slučaju, ako je n<0n<0, smatra se da je bez čitanja ijednog podatka postupak završen., smatra se da je bez čitanja ijednog podatka postupak završen.

y = 0;y = 0;

while (y <= n){while (y <= n){

ulaz(&x);ulaz(&x);

y += x;y += x;

}}

Page 16: Elementi izrade programa

1616

Pisanje strukturiranih programaPisanje strukturiranih programa Primjer: PročitatiPrimjer: Pročitati n n vrijednosti i obraditi ih procedurom vrijednosti i obraditi ih procedurom PROCES. PROCES. Korištenjem Korištenjem

petljepetlje while: while:

i = 0;i = 0;

while (i < n) {while (i < n) {

ulaz(&x);ulaz(&x);

PROCES(x);PROCES(x);

i++;i++;

}}

S obzirom da je unaprijed poznat broj ponavljanja, primjerenije je koristiti S obzirom da je unaprijed poznat broj ponavljanja, primjerenije je koristiti petlju s poznatim brojem ponavljanja:petlju s poznatim brojem ponavljanja:

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

ulaz(&x);ulaz(&x);

PROCES(x);PROCES(x);

}}

Ne radi se samo o manjem broju naredbi, nego se smanjuje i mogućnost Ne radi se samo o manjem broju naredbi, nego se smanjuje i mogućnost pogreške u pisanju programa.pogreške u pisanju programa.

Page 17: Elementi izrade programa

1717

Pisanje strukturiranih programaPisanje strukturiranih programa Ako ima dva kriterija za završetak petlje: kraj podataka ili da rezultat Ako ima dva kriterija za završetak petlje: kraj podataka ili da rezultat

procedureprocedure PROCESPROCES, pohranjen u varijabli, pohranjen u varijabli y y bude nula:bude nula:

do {do {

ulaz(&x);ulaz(&x);

if (x == EOF) break;if (x == EOF) break;

PROCES(x, &y);PROCES(x, &y);

} while (y != 0);} while (y != 0);

if (x != EOF) {if (x != EOF) {

......

} else {} else {

......

}}

Na izlasku iz programskog segmenta ne zna se zbog čega je petlja završila pa Na izlasku iz programskog segmenta ne zna se zbog čega je petlja završila pa se to mora ispitivati.se to mora ispitivati.

Korištenje naredbeKorištenje naredbe casecase

Uvijek se može uprabiti elementarnija naredbaUvijek se može uprabiti elementarnija naredba if-elseif-else. Naredba . Naredba casecase je u je u prednosti kad ima mnogo ravnopravnih grananja.prednosti kad ima mnogo ravnopravnih grananja.

Page 18: Elementi izrade programa

1818

VišeobličjeVišeobličje; Logi; Logičke operaciječke operacije Razlika između opisa algoritma i realizacije Razlika između opisa algoritma i realizacije - vi- višeobličješeobličje

Deklarirat će se tip varijable tamo gdje je to jednoznačno za algoritam. C Deklarirat će se tip varijable tamo gdje je to jednoznačno za algoritam. C ne podržava višeobličje (polimorfizam). Umjesto nekog od elementarnih ne podržava višeobličje (polimorfizam). Umjesto nekog od elementarnih tipova može se (zahvaljujući naredbi tipova može se (zahvaljujući naredbi typedeftypedef), koristiti općeniti), koristiti općeniti tiptip..

Obavljanje logičkih operacijaObavljanje logičkih operacija

U analizi algoritama pretpostavljat će se obavljanje logičkih operacija na U analizi algoritama pretpostavljat će se obavljanje logičkih operacija na najkraći način (reducirano ispitivanje, najkraći način (reducirano ispitivanje, short-circuit evalationshort-circuit evalation). Npr. logički ). Npr. logički izraz izraz (logički_izraz1 (logički_izraz1 logički_izraz2) logički_izraz2) daje odmah rezultat daje odmah rezultat truetrue ako je ako je logički_izraz1 = truelogički_izraz1 = true, bez vrednovanja za , bez vrednovanja za logički_izraz2logički_izraz2. Analogno . Analogno (logički_izraz1 (logički_izraz1 logički_izraz2) logički_izraz2) daje odmah rezultat daje odmah rezultat false false ako je ako je logički_izraz1 = falselogički_izraz1 = false..

Page 19: Elementi izrade programa

1919

Operacije u programskom jeziku COperacije u programskom jeziku C

Operacija izjednačavanja: =Operacija izjednačavanja: = Aritmetičke operacije : +, -, *, /, %Aritmetičke operacije : +, -, *, /, % Operatori za skraćeno pisanje nekih aritmetičkih izjednačavanja:Operatori za skraćeno pisanje nekih aritmetičkih izjednačavanja:

i++; ili ++i ; odgovara i = i + 1;i++; ili ++i ; odgovara i = i + 1;

i--; ili --i; odgovara i = i – 1;i--; ili --i; odgovara i = i – 1;

x = a * b++ odgovara x = a + b ; b = b + 1;x = a * b++ odgovara x = a + b ; b = b + 1;

x = --i * (a * b) odgovara i = i – 1 ; x = i * (a + b);x = --i * (a * b) odgovara i = i – 1 ; x = i * (a + b);

i += 10; odgovara i = i + 10; i -= 10; odgovara i = i – 10;i += 10; odgovara i = i + 10; i -= 10; odgovara i = i – 10;

i*= 10; odgovara i = i * 10; i /= 10; odgovara i = i / 10;i*= 10; odgovara i = i * 10; i /= 10; odgovara i = i / 10;

Operator pretvorbe tipa (cast ) : primjerOperator pretvorbe tipa (cast ) : primjer

type1 i;type1 i;

type2 j;type2 j;

j = sqrt ( (type2) i);j = sqrt ( (type2) i);

Uspoređivanje: ==, >, <, >=, <=, !=Uspoređivanje: ==, >, <, >=, <=, != Logički operatori: &&, ||, ! Logički operatori: &&, ||, !

Page 20: Elementi izrade programa

2020

Definiranje novih tipova podataka u C-u pomoću Definiranje novih tipova podataka u C-u pomoću ključne riječi structključne riječi struct

Već znamo da u C-u možemo definirati varijable koje mogu biti različitih Već znamo da u C-u možemo definirati varijable koje mogu biti različitih tipovatipova. Npr, kada negdje u programu . Npr, kada negdje u programu napišemonapišemo

int i;int i; float f;float f; char c;char c; int p[10];int p[10];

Time smo definirali četiri varijable: varijabla i je tipa int, f je tipa float, c je tipa char, a p je polje tipa int koje Time smo definirali četiri varijable: varijabla i je tipa int, f je tipa float, c je tipa char, a p je polje tipa int koje ima 10 elemenata. Tipove poput int, float i char zovemo osnovni ili ima 10 elemenata. Tipove poput int, float i char zovemo osnovni ili ugrađeni tipoviugrađeni tipovi, jer su oni ugrađeni u svaki , jer su oni ugrađeni u svaki standardni C kompajler.standardni C kompajler.

No, pored definiranja varijabli čiji je tip neki od ugrađenih tipova, jezik C nam omogućuje još nešto: da, No, pored definiranja varijabli čiji je tip neki od ugrađenih tipova, jezik C nam omogućuje još nešto: da, koristeći se osnovnim tipovima kao temeljnim gradivim jedinicama, sami definiramo svoje (složenije) tipove i koristeći se osnovnim tipovima kao temeljnim gradivim jedinicama, sami definiramo svoje (složenije) tipove i onda ih koristimo ravnopravno, baš kao i ugrađene tipove. To se radi pomoću ključne riječi struct.onda ih koristimo ravnopravno, baš kao i ugrađene tipove. To se radi pomoću ključne riječi struct.

Npr., pogledajmo ovu programsku konstrukciju: Npr., pogledajmo ovu programsku konstrukciju: struct complexstruct complex {{ float Re;float Re; float Im;float Im; };};

Gornjom definicijom definirali smo novi, složeni tip podataka, čije je ime struct complex i koji je sastavljen od Gornjom definicijom definirali smo novi, složeni tip podataka, čije je ime struct complex i koji je sastavljen od dva člana: realnog broja Re i realnog broja Im. Kada u programu želimo koristiti naš novodefinirani tip, napisat dva člana: realnog broja Re i realnog broja Im. Kada u programu želimo koristiti naš novodefinirani tip, napisat ćemo nešto poput ovoga:ćemo nešto poput ovoga:

struct complex z1;struct complex z1; struct complex z2;struct complex z2; Time smo definirali dvije varijable, z1 i z2, koje su tipa struct complex. Da ne bismo svaki put pri deklaraciji Time smo definirali dvije varijable, z1 i z2, koje su tipa struct complex. Da ne bismo svaki put pri deklaraciji

varijabli morali pisati dvije riječi (struct complex) možemo se poslužiti ključnom riječi typedef i napisati ovo:varijabli morali pisati dvije riječi (struct complex) možemo se poslužiti ključnom riječi typedef i napisati ovo: typedef struct complex Complex;typedef struct complex Complex;

Page 21: Elementi izrade programa

2121

Ključna riječ typedef, suprotno svom imenu, Ključna riječ typedef, suprotno svom imenu, nene služi za definiranje novih tipova, nego samo za služi za definiranje novih tipova, nego samo za preimenovanje već postojećih tipova. Koristi se u obliku:preimenovanje već postojećih tipova. Koristi se u obliku:

typedef stari_tip novo_ime_za_stari_tip;typedef stari_tip novo_ime_za_stari_tip;

Dakle, pomoću naredbe typedef struct complex Complex; rekli smo ustvari kompajleru da je ime Complex Dakle, pomoću naredbe typedef struct complex Complex; rekli smo ustvari kompajleru da je ime Complex (uočite veliko početno slovo C) od sada pa nadalje novo ime za stari (već prije definirani) tip struct (uočite veliko početno slovo C) od sada pa nadalje novo ime za stari (već prije definirani) tip struct complex. Nakon toga možemo, primjerice, deklarirati neki kompleksni broj z na dva načina:complex. Nakon toga možemo, primjerice, deklarirati neki kompleksni broj z na dva načina:

Ovako: struct complex z;Ovako: struct complex z; Ili ovako: Complex z;Ili ovako: Complex z;

Naravno da je drugi način čitljiviji od prvoga, što je sasvim dobar razlog za korištenje typedef-a.Naravno da je drugi način čitljiviji od prvoga, što je sasvim dobar razlog za korištenje typedef-a. Kako deklarirati pokazivač na kompleksni tip? Znamo da pokazivač pok na varijablu tipa int deklariramo Kako deklarirati pokazivač na kompleksni tip? Znamo da pokazivač pok na varijablu tipa int deklariramo

sasa int * pok;int * pok;

Slično tome, pokazivač cpok na tip Complex deklariramo ovako:Slično tome, pokazivač cpok na tip Complex deklariramo ovako: Complex * cpok;Complex * cpok;

Varijable z1, z2 i z su nakon gornjih deklaracija spremne za korištenje i možemo dalje napisati npr. ovo:Varijable z1, z2 i z su nakon gornjih deklaracija spremne za korištenje i možemo dalje napisati npr. ovo: z1.Re = 1;z1.Re = 1; z1.Re = 3;z1.Re = 3; z2.Re = 2;z2.Re = 2; z2.Im = 5;z2.Im = 5; cpok = &z1;cpok = &z1; cpok->Re = 7;cpok->Re = 7;

Primjetite upotrebu operatora . (točka) na mjestima na kojima pristupamo članovima Re i Im od kojih su Primjetite upotrebu operatora . (točka) na mjestima na kojima pristupamo članovima Re i Im od kojih su sastavljene varijable z1 i z2 tipa Complex. Primjetimo također upotrebu operatora -> pomoću kojeg sastavljene varijable z1 i z2 tipa Complex. Primjetimo također upotrebu operatora -> pomoću kojeg pristupamo članovima Re i Im preko pokazivača cpok.pristupamo članovima Re i Im preko pokazivača cpok.

Dakle: kada imamo varijablu tipa Complex, njenim članovima pristupamo pomoću operatora točka (.). No, Dakle: kada imamo varijablu tipa Complex, njenim članovima pristupamo pomoću operatora točka (.). No, kada imamo kada imamo pokazivačpokazivač koji je tipa Complex, tada članovima pristupamo pomoću operatora ->. koji je tipa Complex, tada članovima pristupamo pomoću operatora ->.

Page 22: Elementi izrade programa

2222

Pogledajmo sada potpuni primjer upotrebe novog tipa struct complex :Pogledajmo sada potpuni primjer upotrebe novog tipa struct complex : #include <stdio.h>#include <stdio.h> struct complexstruct complex {{

float Re;float Re;float Im;float Im;

};}; typedef struct complex Complex;typedef struct complex Complex; Complex Add(Complex u, Complex v)Complex Add(Complex u, Complex v) {{

Complex rez;Complex rez;rez.Re = u.Re + v.Re;rez.Re = u.Re + v.Re;rez.Im = u.Im + v.Im;rez.Im = u.Im + v.Im;return rez;return rez;

}} int main()int main() {{

Complex z1 = {1, 3};Complex z1 = {1, 3}; /* z1 = 1 + 3i *//* z1 = 1 + 3i */Complex z2;Complex z2;Complex r;Complex r;Complex * rpok;Complex * rpok;z2.Re = 2;z2.Re = 2;z2.Im = 5;z2.Im = 5; /* z2 = 2 + 5i *//* z2 = 2 + 5i */r = Add(z1, z2);r = Add(z1, z2); /* r = 3 + 8i *//* r = 3 + 8i */rpok = &r;rpok = &r; /* sada rpok pokazuje na r *//* sada rpok pokazuje na r */

printf("Rezultat zbrajanja: %f + %fi\n", r.Re, r.Im);printf("Rezultat zbrajanja: %f + %fi\n", r.Re, r.Im); rpok->Re = rpok->Re + 1;rpok->Re = rpok->Re + 1; /* indirektno mijenjamo r, preko pointera *//* indirektno mijenjamo r, preko pointera */ printf("Nakon uvecavanja Re dijela za 1 : %f + %fi\n", r.Re, r.Im);printf("Nakon uvecavanja Re dijela za 1 : %f + %fi\n", r.Re, r.Im); return 0;return 0; }}

Page 23: Elementi izrade programa

2323

Razvoj algoritma na primjeru množenja kompleksnih Razvoj algoritma na primjeru množenja kompleksnih brojevabrojeva

Za izradu efikasnog i brzog algoritma potrebno je dobro razumijevanje problema Za izradu efikasnog i brzog algoritma potrebno je dobro razumijevanje problema koji se rješava i metoda koje se koriste u rješavanju koji se rješava i metoda koje se koriste u rješavanju

Jednostavan primjer množenja kompleksnih brojeva u kojem je potrebno znanje Jednostavan primjer množenja kompleksnih brojeva u kojem je potrebno znanje matematike:matematike:

1) Algoritam zasnovan na znanju množenja realnih brojeva: množiti svaki element 1) Algoritam zasnovan na znanju množenja realnih brojeva: množiti svaki element sa svakim, zatim sakupiti zajedno brojeve koji nemaju i imaju “i”. Algoritam za to sa svakim, zatim sakupiti zajedno brojeve koji nemaju i imaju “i”. Algoritam za to ima mnogo koraka i ispitivanja, spor i kompliciran, a rezultat je jednostavan izrazima mnogo koraka i ispitivanja, spor i kompliciran, a rezultat je jednostavan izraz

2) Algoritam koji direktno koristi definiciju množenja kompleksnih brojeva iz 2) Algoritam koji direktno koristi definiciju množenja kompleksnih brojeva iz matematike: 4 množenja, 1 zbrajanje, 1 oduzimanjematematike: 4 množenja, 1 zbrajanje, 1 oduzimanje

(a+ib)*(c+id) = (ac –bd) +i(ad +bc)(a+ib)*(c+id) = (ac –bd) +i(ad +bc)

na nekim mašinama množenje je mnogo sporiji proces od zbrajanja, pa će se na nekim mašinama množenje je mnogo sporiji proces od zbrajanja, pa će se krajnji rezultat dobiti brže upotrebom izrazakrajnji rezultat dobiti brže upotrebom izraza

(a+ib)*(c+id) = (ac - bd) + i [(a+b)(c+d) – ac -bd](a+ib)*(c+id) = (ac - bd) + i [(a+b)(c+d) – ac -bd] gdje se obavlja 3 množenja, 2 zbrajanja i 3 oduzimanjagdje se obavlja 3 množenja, 2 zbrajanja i 3 oduzimanja

Page 24: Elementi izrade programa

2424

Maksimalna granična vrijednost: primjer s kompleksnim brojevimaMaksimalna granična vrijednost: primjer s kompleksnim brojevima

Međurezultati množenja u nekim izrazima mogu biti veći od maksimalne granične Međurezultati množenja u nekim izrazima mogu biti veći od maksimalne granične vrijednosti za neki tip podataka pa dolazi do prelijevanja (overflow) znamenki, iako vrijednosti za neki tip podataka pa dolazi do prelijevanja (overflow) znamenki, iako je konačni rezultat unutar granica koje se mogu predstaviti tim tipom podatakaje konačni rezultat unutar granica koje se mogu predstaviti tim tipom podataka

Raniji primjer množenja kompleksnih brojeva: do prelijevanja će doći samo kada je Raniji primjer množenja kompleksnih brojeva: do prelijevanja će doći samo kada je i krajnji rezultat blizu maksimalne granične vrijednostii krajnji rezultat blizu maksimalne granične vrijednosti

Dobar primjer je algoritam za određivanje modula kompleksnog broja dan izrazom:Dobar primjer je algoritam za određivanje modula kompleksnog broja dan izrazom:

U rješavanju gornjeg izraza često će međurezultat (kvadrat) biti veći od graničnog.U rješavanju gornjeg izraza često će međurezultat (kvadrat) biti veći od graničnog.

Ispravan način na koji ovaj račun ostaje unutar granica je:Ispravan način na koji ovaj račun ostaje unutar granica je:

Page 25: Elementi izrade programa

2525

Isti problem se javlja i kod dijeljenja kompleksnih brojeva:Isti problem se javlja i kod dijeljenja kompleksnih brojeva:

Ispravan postupak računanja je:Ispravan postupak računanja je:

Page 26: Elementi izrade programa

2626

Primjeri jednostavnih programaPrimjeri jednostavnih programa

Page 27: Elementi izrade programa

2727

Rješenje kvadratne jednadžbeRješenje kvadratne jednadžbe #include <stdio.h>#include <stdio.h> #include <math.h>#include <math.h>

int main()int main() {{

float a, b, c;float a, b, c;float D;float D;float x1, x2;float x1, x2;

printf("Unesi a: ");printf("Unesi a: ");scanf("%f", &a);scanf("%f", &a);printf("Unesi b: ");printf("Unesi b: ");scanf("%f", &b);scanf("%f", &b);printf("Unesi c: ");printf("Unesi c: ");scanf("%f", &c);scanf("%f", &c);

D = b * b - 4 * a * c;D = b * b - 4 * a * c; if(D >= 0)if(D >= 0) {{

x1 = (-b - sqrt(D)) / (2 * a);x1 = (-b - sqrt(D)) / (2 * a);x2 = (-b + sqrt(D)) / (2 * a);x2 = (-b + sqrt(D)) / (2 * a);printf("x1 = %f\n", x1);printf("x1 = %f\n", x1);printf("x2 = %f\n", x2);printf("x2 = %f\n", x2);

}} elseelse

printf("Rjesenja su kompleksni brojevi!");printf("Rjesenja su kompleksni brojevi!");

return 0;return 0; }}

Page 28: Elementi izrade programa

2828

Promjena ulazne varijable u funkcijiPromjena ulazne varijable u funkciji

FunkcijFunkcijaa ne mijenja svoj ne mijenja svojuu ulazn ulaznu u varijablvarijabluu

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

void func(int);void func(int);

int main()int main() {{

int a = 1;int a = 1;printf("Prije poziva funkcije func: a = %d\n", a);printf("Prije poziva funkcije func: a = %d\n", a);func(a);func(a);printf("Nakon poziva funkcije func: a = %d\n", a);printf("Nakon poziva funkcije func: a = %d\n", a);return 0;return 0;

}}

void func(int a)void func(int a) {{

a = a + 100;a = a + 100; }}

FunkcijFunkcijaa mijenja mijenja elemente elemente poljapolja

#include <stdio.h>#include <stdio.h> void func(int[]);void func(int[]);

int main()int main() {{ int i;int i;

int a[3] = {0, 1, 2};int a[3] = {0, 1, 2};printf("Prije poziva funkcije func:\n");printf("Prije poziva funkcije func:\n");for(i = 0; i < 3; i++)for(i = 0; i < 3; i++)

printf("%d ", a[i]);printf("%d ", a[i]);printf("\n\n");printf("\n\n");func(a);func(a);printf("Nakon poziva funkcije func:\n");printf("Nakon poziva funkcije func:\n");for(i = 0; i < 3; i++)for(i = 0; i < 3; i++)

printf("%d ", a[i]);printf("%d ", a[i]);printf("\n");printf("\n");return 0;return 0;

}}

void func(int a[])void func(int a[]) {{ a[0] = a[0] + 100;a[0] = a[0] + 100; }}

Page 29: Elementi izrade programa

2929

Primjer s pokazivačimaPrimjer s pokazivačima

int main()int main()

{{

int a,b,*p;int a,b,*p;

a=10;a=10;

b=5;b=5;

p=&a;p=&a;

printf("a= %d\n",a);printf("a= %d\n",a);

printf("a= %d\n",*p);printf("a= %d\n",*p);

a++;a++;

printf("a= %d\n",a);printf("a= %d\n",a);

printf("a= %d\n",*p);printf("a= %d\n",*p);

*p=*p+b;*p=*p+b;

printf("a= %d\n",a);printf("a= %d\n",a);

printf("a= %d\n",*p);printf("a= %d\n",*p);

return 0;return 0;

}}