Primjena računala Preddiplomski studij računarstva 2010/2011 prof.dr.sc. Ivo Ipšić 1
Saržaj kolegija Primjena računala Uvod i razvoj računala Programska oprema računala Uvod u programiranje i programski jezik C 2
Sadržaj Algoritam Kompleksnost algoritma Elementi programa Strukturirano programiranje Prevođenje i izvršavanje programa 3
Algoritam Slijed pravila koja daju rješenja nekog problema Definiraju se objekti nad kojima se obavljaju operacije Rezultat obrade su završni objekti Broj koraka koje izvodi algoritam mora biti konačan Izvršavanje algoritma mora biti u konačnom vremenu Svaki korak algoritma je opisan instrukcijom 4
Algoritam mora biti: razumljiv jednostavna implementacija jednostavno otklanjanje pogreški efikasna iskorištenost računalnih resursa brzina vs. prostor... jednokratna upotreba (troškovi razvoja) učestala upotreba (troškovi korištenja) 5
Algoritam Program - Opis algoritma koji u nekom programskom jeziku jednoznačno određuje što računalo treba napraviti. Algoritmi + strukture podataka = PROGRAMI algoritamski proces programski jezici = umjetni jezici objekti = podaci klase objekata = tipovi podataka 6
Cijena ukoliko algoritam radi često i s velikom količinom podataka isplati se potrošiti resurse (vrijeme i rad) na njegovo optimiranje isplati se implementirati kompleksniji algoritam koji će raditi efikasnije (vremenski i prostorno) potrebno uvesti mjeru kompleksnosti algoritma, koja će ocijeniti njegove vremenske i prostorne potrebe 7
Vrijeme izvođenja programa ovisi od: količine i vrste ulaznih podataka u program kvalitete kode koju generira compiler brzini i performansama računala (sklopovlja) vremenskoj zahtjevnosti (kompleksnosti) algoritma 8
Primjer I sortiranje (najprije najmanji) 9 2 1 3 1 5 8 1 1 2 3 5 8 mjera kompleksnosti: broj elemenata koje sortiramo odnosno dužina liste T(n) vrijeme potrebno za izvođenje programa, koji na ulazu ima n podataka T(n) = broj potrebnih instrukcija za izvršenje zadataka na idealnom računalu
Vremenska kompleksnost ovisi od količine ulaznih podataka ali i od njihove vrijednosti za različite vrijednosti na ulazu različita kompleksnost: T(n) najgori slučaj T pr (n) - prosječno gdje je n broj ulaznih podataka najčešće se koristi T(n) - vrijeme izvođenja u najgorem slučaju 10
Vremenska kompleksnost II dužina izvođenja ovisi i o radu compilera i brzini sklopovlja, zato je vrijeme teško izraziti u standardnim vremenskim jedinicama zato se kaže da je vrijeme izvođenja algoritma proporcionalno npr. n 2 uvodi se mjera rasta funkcije O(f(n)) O(f(n)) je gornja procjena rasta funkcije Ω(f(n)) je donja procjena rasta funkcije 11
Primjer II T(0) = 1 T(1) = 4 T(n) = (n+1) 2 O(n 2 ) T(n) = 3n 3 + 2n 2 O(n 3 ) T(n)= n log(n)+n O(n log(n)) 12
T(n) 2 n n 3/2 5n 2 3000 100 n 2000 1000 13 5 10 15 20 n
Razvoj programske opreme 1. ukoliko će se program koristiti samo nekoliko puta: udio troškova pisanja i testiranja je značajan u ukupnom trošku 2. ukoliko različite osobe razvijaju i održavaju: algoritam efikasan ali kompleksan, raste trošak održavanja 3. poneki algoritmi rade brzo ali zahtijevaju puno prostora i zato koriste spore vanjske memorije i time postaju spori 4. kod numeričkih algoritama je točnost i stabilnost barem isto toliko važna kao i brzina 14
Pregled programskih jezika 15 Copyright 2006 Addison-Wesley. 1-15
16 16
Koje osobine mora imati programski jezik? razvoj interpreterski, izvođenje u prevedenoj verziji dobro otklanjanje pogreški (debug) jasna i jednostavna sintaksa široka grupa korisnika namjenjeni za vrstu problema koju rješavamo brzo kodiranje, portabilnost,...... svaki programer ima svoju listu želja! 17 17
Programski jezik C Razvijen za potrebe razvoja UNIX operacijskog sustava (Dennis Ritchie, Bell Telephone Laboratories, 1970) prenosivost UNIX operacijskog sustava na razna računala jezgra operacijskog sustava napisana u višem programskom jeziku C 18
Programski jezik C C je programski jezik blizak arhitekturi računala aritmetičke, logičke, relacijske operacije operacije na bitovima (posmak, logički operatori) C omogućava i lakši rad s podacima izvedene strukture podataka: polja, strukture, datoteke,... organizacija programa u funkcije, koje mogu biti u različitim datotekama 19
Programski jezik C programska biblioteka, sadrži strojno ovisne funkcije funkcije za unos i ispis podataka funkcije za formatirani unos i ispis matematičke funkcije funkcije za rad s datotekama,... header datoteke koje sadrže deklaracije funkcija i tipova podataka 20
Programski jezik C ANSI-C opisan u knjizi Kernighan B. W., Ritchie D. M., The C Programming Language, Prentice Hall, Inc., 1988. ANSI/ISO standard 1990. godine C90 1999. novi ISO standard manje dopune C90 standard C99 21
Prevođenje programa programe napisane u nekom programskom jeziku je potrebno prevesti u strojni kod interpreter prevodioc (compiler) 22
Prevođenje programa Z :=A + B; MVT 1024 ADD 1025 MVF 1026 1110011001100000 1100011000001100 0111100001111001 23
Prevođenje programa 24
Programski kod tekst C program (p1.c) prevodioc - compiler (gcc -S) tekst asemblerski program (p1.s) asembler (gcc, as) binarni kod objektni program (p1.o) binarni kod 25 Izvršni program (p)
Programski kod int zbroji(int x, int y) { int zbroj; } return zbroj=x+y; 26
Programski kod prevođenje izvornog programa u asemblerski kod gcc O2 S zbroji.c gcc - GNU compiler prikaz asembleskog programa objdump -d zbroji.s 27
Programski kod zbroji.o: file format pe-i386 Disassembly of section.text: 00000000 <_zbroji>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 8b 45 0c mov 0xc(%ebp),%eax 6: 8b 55 08 mov 0x8(%ebp),%edx 9: 5d pop %ebp a: 01 d0 add %edx,%eax c: c3 ret d: 90 nop e: 90 nop f: 90 nop 28 objektni kod asemblerski kod
Programski kod instrukcija zbroji zbroj=x+y registri mikroprocesora 01 d0 add %edx,%eax 0000000111010000 16-bitna instrukcija 29
Prevođenje programa 30
Prevodioc (Compiler) 31
Razvojna okolina 32
KDevelop 33
PRIMJER Programski zadatak pronaći veći od dva zadana broja Pseudokod koji koristi isključivo termine govornog jezika pročitaj dva realna broja ispiši pročitane brojeve odredi veći broj ispiši nađeni broj 34
Pseudokod pročitaj (x,y) ispiši (x,y) {odredi veći broj} ako je x > y tada rez := x inače rez := y ispiši (rez) kraj 35
Dijagram toka početak učitaj x i y ispiši x i y DA x>y NE rez = x rez = y ispiši rez 36 kraj
Varijable svi podaci moraju imati imena i tip tip podataka je oznaka prevodiocu koliko memorijskog prostora je potrebno za zapis vrijednosti neke varijable npr. deklaracija varijable a kao cijeli broj int a znači da je prevodioc rezervirao 4 bajta memorije za zapis varijable 37
Varijable Općenito: promjenljiv podatak (lat.variabilis-promjenljiv) U programiranju: podatak smješten u memoriji računala, poznate veličine, koji se može mijenjati i kojemu je dodijeljeno ime Simbolički se prikazuje pravokutnikom uz koji stoji ime x y Smještaj u memoriji računala...... x y 38
Instrukcije programa instrukcije za aritmetičke i logičke operacije instrukcije za određivanje toka programa instrukcije za ponavljanje dijelova programa instrukcije za ulaz i izlaz podataka 39
Instrukcije za aritmetičke i logičke operacije operator pridruživanja = operator jednakost == nejednakost!= aritmetički operatori: * / % + - 40
Instrukcije za određivanje toka programa Normalan programski slijed (sekvencija instrukcija): instrukcija_1 instrukcija_1 instrukcija_2 instrukcija_2 instrukcija_3 instrukcija_3... 41
Selekcija - kontrolna instrukcija if - jednostrana selekcija Pseudokôd ako je logički_izraz istinit tada naredbe U C-u if (logički_izraz) naredba logički_izraz D niz naredbi N 42 ili if (logički_izraz){ niz naredbi }
Pseudokôd ako je logički_izraz istinit tada niz_naredbi_1 inače niz_naredbi_2 43 U C-u Kontrolna instrukcija if - dvostrana selekcija if (logički_izraz){ niz_naredbi_1 } else { niz_naredbi_2 } D niz naredbi_1 logički_izraz N niz naredbi_2
Instrukcije za ponavljanje dijelova programa iteracije instrukcija - petlje kontrolne varijable za izvođenje iteracija (unaprijed zadan) logički izrazi (ispitivanje uvjeta), koji određuju broj iteracija 44
Instrukcije za ulaz i izlaz podataka čitanje ulaznih podataka (standardni ulaz, datoteka) ispis podataka ( zaslon, datoteka, štampač,...) funkcije u C-u 45
Funkcija za ispis printf(const char *format [, argument]... ) printf( Dobar dan \n "); printf("%f \n", rez); formatirani ispis konstantni znakovni niz sadrži informaciju o formatu ispisa printf("%5.1f\n",ime_varijable);
Funkcija printf %format predstavlja oblik podatka koje unosimo odnosno ispisujemo Format: d cijeli broj(integer) ld dugi cijeli broj(long) f realni broj (float) c znak s niz znakova 47
Funkcija za unos podataka scanf(const char *format [,argument]... ); scanf("%f", &a); varijabla a tipa float operator & - adresni operator &a = adresa varijable a
Struktura programa u C-u naredbe pretprocesora deklaracija tipova podataka deklaracija varijabli prototipovi funkcija deklaracija tipova funkcija i varijabli koje se unose u funkciju definicija funkcija 49
Struktura programa u C-u programi su organizirani u funkcije oblik funkcije: tip_funkcije ime_funkcije(varijable) { lokalne varijable naredbe } 50
Primjer funkcije 1: /* Funkcija zbroji_dva_broja zbraja dva cijela broja i vrača zbroj*/ 2: int zbroji_dva_broja( int x, int y ) 3: { 4: int result; 5: result = x + y; 6: return result; 7: } 51
Struktura programa u C-u svaki program mora sadržavati barem jednu funkciju main (glavna) main glavni program unutar kojega se mogu pozivati ostale funkcije int main () {...... return 0; } 52
PRIMJER #include <stdio.h> int main() { float x, y, rez; scanf("%f %f", &x, &y); printf("%f %f \n", x, y); 53 /* odredi veći broj */ if ( x > y ) { rez = x; } else { rez = y; } printf("%f \n", rez); return 0; }
Elementi C-programa definicija 3 varijable x, y i rez funkcija za čitanje sa ulaza funkcija za ispis #include <stdio.h> int main() { float x, y, rez; scanf("%f %f ", &x, &y); printf("%f %f \n", x, y); /* odredi veci broj */ if ( x > y ) { rez = x; } else { rez = y; } poziv knjiznice stdio.h glavna funkcija 54 } printf("%f \n", rez); return 0;
Elementi jezika C ključne riječi programskog jezika C sadrže definicje tipova podataka i naredbe programskog jezika: auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while 55
Prvi program #include <stdio.h> naredba predprocesoru int main() { početak funkcije printf( Dobar dan \n "); return 0; glavna funkcija funkcija za ispis } kraj funkcije 56
Osnovni tipovi podataka u C-u char - znakovni tip ili mali cijeli broj int - cjelobrojni tip float - realni tip double - realni tip u dvostrukoj preciznosti 57
Operatori * / % + - < <= >= > ==!= & &&?: (right->left) = += -= (right->left) 58
Primjer rješenja kvadratne jednadžbe ax 2 +bx+c=0 diskriminanta D=b 2-4ac rješenja ovise od D D>0 D=0 x 1 = x 2 = 59 D<0 -b- D 2a -b+ D 2a
Struktogram unesi vrijednosti a,b,c izračunaj D = b 2 4ac da D>0? ne f ima realne različite korijene da f ima dvostruki realni korijen D=0? ne f nema realne korijene kraj programa 60
#include <stdio.h> #include <math.h> int main() { float a, b, c; /* parametri jednadzbe */ float dis; /* diskriminanta */ /* inicijalizacija i citanje parametara */ printf("a="); scanf("%f", &a); printf("b="); scanf("%f", &b); printf("c="); scanf("%f", &c); 61
/* izracun diskriminante */ dis= b*b-4*a*c; 62
/* izracun korijena */ if (dis == 0) /* dvostruki korijen */ printf(" rjesenje - dvostruki korijen = %f\n", -b/(2.0*a)); else if (dis>0){ /* realni razliciti korijeni */ printf("1. korijen = %f\n", (sqrt(dis)-b)/(2.0*a)); } else printf("2. korijen = %f\n", (-sqrt(dis)-b)/(2.0*a)); /* nema realnih korijena */ 63 } printf("f nema realnih korijena\n"); return 0;
#include <stdio.h> #include <math.h> int main() { float a, b, c; /* parametri jednadzbe */ float dis; /* diskriminanta */ /* inicijalizacija i citanje parametara */ printf("a="); scanf("%f", &a); printf("b="); scanf("%f", &b); printf("c="); scanf("%f", &c); /* izracun diskriminante */ dis= b*b-4*a*c; /* izracun korijena */ if (dis == 0) else if (dis>0){ /* dvostruki korijen */ printf(" rjesenje - dvostruki korijen = %f\n", -b/(2.0*a)); /* realni razliciti korijeni */ printf("1. korijen = %f\n", (sqrt(dis)-b)/(2.0*a)); } else printf("2. korijen = %f\n", (-sqrt(dis)-b)/(2.0*a)); 64 } return 0; /* nema realnih korijena */ printf("f nema realnih korijena\n");
Primjer program ispisuje tablicu za pretvaranje stupnjeva u fahrenheitima u celsijuse prema formuli ºC = (5/9)( ºF-32) ispis programa: 0.0-17.8 20.0-6.7 40.0 4.4 60.0 15.6 80.0 26.7 100.0 37.8 120.0 48.9 140.0 60.0 160.0 71.1 180.0 82.2 200.0 93.3 220.0 104.4 240.0 115.6 260.0 126.7 280.0 137.8 300.0 148.9 65
Primjer #include <stdio.h> main () { float cel, faren; int donji, gornji, korak; donji = 0; gornji = 300; korak = 20; faren = donji; while (faren <= gornji) { cel = (5.0/9.0)*(faren-32.0); printf("%5.1f%8.1f\n",faren,cel); faren = faren+20; } } 66
for petlja Naredbe za ponavljanja for(izraz_1;izraz_2;izraz_3) izraz_1 inicijalizacija brojača { izraz_2 uvjet brojača naredba_1; izraz_3 inkrement/dekrement brojača naredba_2:.. } while petlja while (uvjet) { naredba_1; naredba_2:.. } 67 naredba switch
Naredbe za ponavljanja while petlja while (faren <= gornji) { cel = (5.0/9.0)*(faren-32.0); printf("%5.1f%8.1f\n",faren,cel); faren = faren+20; } for petlja for (faren=0; faren<= 300; faren=faren+20) printf("%5.1f%8.1f\n",faren,(5.0/9.0)*(faren-32.0)); 68
Literatura Kernighan B. W., Ritchie D. M., The C Programming Language, Prentice Hall, Inc., 1988. Rajko Vulin: Od sada programiramo u C-u, Turbo C, Školska knjiga, Zagreb 1991. Rajko Vulin: "Zbirka riješenih zadataka iz C- a", Školska knjiga, Zagreb 1995. 69