27
UUR 2010/2011 1 Uvod u računarstvo Preddiplomski studij elektrotehnike 2010/2011 prof.dr.sc. Ivo Ipšić UUR 2010/2011 2 Saržaj kolegija Uvod u računarstvo Uvod i razvoj računala Zapis podataka i kodiranje informacija u računalu Graña računala Programska oprema računala Računalne mreže Uvod u programiranje i programski jezik C UUR 2010/2011 3 Sadržaj Algoritam Kompleksnost algoritma Povijest programskih jezika Elementi programa Strukturirano programiranje Prevoñenje i izvršavanje programa UUR 2010/2011 4 Algoritam arapski matematičar Abu Ja'far Mohammed ibn Musa al Khowarizmi (Muhamed, otac Jafarov, sin Muse iz Khwarizma) roñen u mjestu Khwarizm, danas Khiva, Uzbekistan, oko 780. g oko 825 godine napisao knjigu Hidab al-jabr w'al-muqubala (Znanost o prenošenju i poništenju) jabr (JAH-ber) - prenošenje na suprotnu stranu jednadžbe x - 2 = 12 x = 12 + 2 UUR 2010/2011 5 Algoritam prijevod knjige u XII stoljeću na latinski ispred svakog pravila “Dixit Algorizmi” ime al Khowarizmi pretvoreno u Algorizmi a onda u Algorithmus Algoritam je govorio algoritam glasi UUR 2010/2011 6 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

Uvod u ra čunarstvo - riteh.uniri.hr · PDF fileUvod u programiranje i programski jezik C 3 UUR 2010/2011 Sadržaj Algoritam Kompleksnost algoritma Povijest programskih jezika

Embed Size (px)

Citation preview

UUR 2010/20111

Uvod u računarstvoPreddiplomski studij

elektrotehnike 2010/2011

prof.dr.sc. Ivo Ipšić

UUR 2010/20112

Saržaj kolegija Uvod u računarstvo

Uvod i razvoj računala Zapis podataka i kodiranje informacija u

računalu Graña računala Programska oprema računala Računalne mreže

Uvod u programiranje i programski jezik C

UUR 2010/20113

Sadržaj

Algoritam Kompleksnost algoritma Povijest programskih jezika Elementi programa Strukturirano programiranje Prevoñenje i izvršavanje programa

UUR 2010/20114

Algoritam

arapski matematičar Abu Ja'far Mohammed ibn Musa al Khowarizmi

(Muhamed, otac Jafarov, sin Muse iz Khwarizma) roñen u mjestu Khwarizm, danas Khiva, Uzbekistan, oko 780. g oko 825 godine napisao knjigu

Hidab al-jabr w'al-muqubala

(Znanost o prenošenju i poništenju)jabr (JAH-ber) - prenošenje na suprotnu stranu jednadžbe

x - 2 = 12 x = 12 + 2

UUR 2010/20115

Algoritam

prijevod knjige u XII stoljeću na latinski ispred svakog pravila “Dixit Algorizmi” ime al Khowarizmi pretvoreno u Algorizmi a onda u

Algorithmus

Algoritam je govorio algoritam glasi

UUR 2010/20116

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

UUR 2010/20117

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)

UUR 2010/20118

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

UUR 2010/20119

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

UUR 2010/201110

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

UUR 2010/201111

Primjer I

sortiranje (najprije najmanji)2 1 3 1 5 81 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

UUR 2010/201112

Vremenska kompleksnost ovisi od količine ulaznih podataka ali i od njihovih

vrijednosti

ovisi od broja osnovnih računskih operacija (zbrajanje, množenje, usporeñivanje i sl.)

za različite vrijednosti na ulazu različita kompleksnost: T(n) – najgori slučaj Tpr(n) - prosječno gdje je n broj ulaznih podataka

najčešće se koristi T(n) - vrijeme izvoñenja u najgorem slučaju

UUR 2010/201113

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 broju n npr. n2

uvodi se mjera rasta funkcije O(f(n)) O(f(n)) – je gornja procjena rasta funkcije Ω(f(n)) – je donja procjena rasta funkcije

UUR 2010/201114

T(n)

n

3000

2000

1000

5 10 15 20

100 n

2nn3/2

5n2

UUR 2010/201115

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

16

Početak najprije ožičena logika: Analytical Engine,

Jacquard Loom, rad s bušenim karticama ENIAC

jedna ALU i sljedno izvoñenje programa – utjecao na prevoñenje programa (kompajliranje)

Manchester Mark I, EDSAC strojni jezici programi pohranjeni u memoriji poput podataka

17

Početak 1951. Rutishauser definirao proces

kompajliranja (Švicarska) petlju zapisuje: for k = 1 (1) 10.

1952. UNIVAC – (Mauchly, Logan, Schmit, Tonik) interpreter za programski jezik SHORT CODE

programski jezici za UNIVAC 1955. ARITH-MATIC i MATH-MATIC

1957. UNICODE – preteča Fortrana

18

Početak 1953. IBM razvija seriju 701

svo programiranje u Asembleru

Problem: cijena SW viša od cijene HW, koji je ionako jako skup!

John Backus razvija ideju brzog kodiranja:(Speedcoding) - interpreter, radi 10-20 puta sporije od asemblerskog programa

1955. programski jezik BACAIC (Boeing Airplane

Company Algebraic Interpretive Coding System) za 701 operatori pridruživanja i množenja

19

FORTRAN I Mathematical FORmula TRANslating System 1954. IBM razvija seriju 704 John Backus – voditelj projekta prog. jezika

ideja: pretvaranje visoko nivojske kode u strojni jezik mnogi misle da je to nemoguće!

1954-7. projekt FORTRAN I

od 1958, >50% svog SW u FORTRANU primjena velikih razmjera

rapidno smanjenje razvojnog vremena 2 tjedna na 2 sata

20

FORTRAN I - II prvi kompajler

generiran kod je gotovo isto tako dobar kao i ručno pisan strojni kod

veliki utjecaj na razvoj računarstva

otvorio prostor za razne teorijske radove i razvoj računarstva (computer science)

principi postavljeni u FORTRANu su ugrañeni i u modernije programske jezike

utjecao na razvoj: ALGOL 58, BASIC, PL/I, C

21

Nakon FORTRANa Algol 58 Algol 60

razmjena podataka i programa izmeñu različitih računala

razvija se u Europi kao odgovor na FORTRAN moderna sintaksa, blokovna struktura, eksplicitno

deklariranje varijabli 1. put različiti proizvoñači HW i SW Backus ALGOL opisuje BNF sustavom oznaka donosi: begin end za blokove naredbi, gnježñenje,

rekurzivni spust, dinamička alokacija memorije, strukturirano programiranje, prijenos parametra po vrijednosti i po imenu u potprograme

važan utjecaj na razvoj programskih jezika 22

Eksplozija 60tih APL (polja-arrays), SNOBOL (stringovi-strings), FORMAC (formule), ... .

1967-68. Simula 67

prvi jezik s “objektno-orijentiranim” idejama

23

Eksplozija 60tih- LISP 1959. LISP (MIT)

dinamičke i simboličke strukture podataka rad s listama, rekurzije, operacije sa znakovima zasniva se na Church-evom λ- računu program i podaci u memoriji pohranjeni isto značajan za razvoj umjetne inteligencije Wikipedia: second-oldest high-level programming

language in widespread use today; only Fortran is older.

24

LISP II

primjer S-izraza (list 1 2 (list 3 4))

(+ 1 2 3 4) /1+2+3+4

utjecao na: ML, Perl, Python, Smalltalk, Ruby, Dylan, Mathematica, Rebol, Qi, Lua, JavaScript, Forth, Nu, OPS5, CLU, Falcon, Io, Ioke

25

Eksplozija 60tih – ALGOL 68

Algol 68:

kombinira FORTRANski pristup numeričkim podacima, COBOLski pristup zapisima, uvodi pointere, uvodi rigorozni formalizam

ideje se prenose u C, Algol68 je prekompleksan

26

Eksplozija 60tih: BASIC i COBOL

1965. BASIC (Beginer’s All Purpose Symbolic Instruction Code) jednostavan – ZX Spectrum

COBOL (Common Busines Oriented Language) poslovna namjena, zapisi - Records poseban zapis podataka i akcija, strojno nezavisan opis

podataka odreñuju se parametri okoline i računala parametri za prijenos podataka izmeñu vanjske memorije i

programa

ujedinio: IBM, Honeywell, RAND, Burroghs za razvoj

27

Eksplozija 60tih: PL/I

ujedinjuje FORTRAN i COBOL iznimno kompleksan

memorija: ALLOCATE i FREE prekid: SIGNAL programski zadaci: TASK, WAIT, EVENT,

PRIORITY, STOP, EXIT makronaredbe % - definiranje vlastitih naredbi i danas na IBM platformi PL/I - SQL

28

Kriza SW 1968: najavljena kriza softwera

Software Crisis

nakon toga počinje trend uvoñenja jednostavnijih programskih jezika Algol, Pascal, C

29

Razvoj 70tih Pascal

Wirth, 1971. za računalo CDC6000

Prolog

1970-72. Francuska- Marseilles- A. Colmerauer izvorno za DEC 10 Declarative logic programming.

1981. Japan odabrao Prolog za jezik 5. generacije računala

utjecaj na umjetnu inteligenciju30

Razvoj 70tih početak 70-tih. naglasak na metodologiji

Modula modularno programiranje SmallTalk (XEROX)- objektno orijentirana

paradigma

Razvoj 70tih -II

sredina 70tih : ML (Metalanguage) zaključivanje (inference), programiranje na osnvi uzorka (pattern-driven

programming)

kraj 70tih: AdA početak razvoja s ciljem konsolidacije > 500 programskih jezika

31 32

I danas C pa kompleksnost raste s C++. zatim Java smanjuje kompleksnost

pa C# opet povećava kompleksnost

velik broj malih ili specijaliziranih jezika: Perl, Python, Ruby, … skriptni jezici: HTML, PHP, ....

Podjela programskih jezika

postoji više podjela klasična: viši i niži programski jezici po generacijama: 1,2,3,4,5...

po osobinama

po funkcionalnosti

.....

33

Gruba podjela programskih jezika

imperativni (ukazni?) glavne značajke: varijable, pridruživanja i iteracije obuhvaćaju: objektno-orjentirane jezike, vizualne jezike,

skriptne jezike C, Java, Perl, JavaScript, Visual BASIC .NET, C++,...

funkcijski funkcije odreñuju vrijednost parametara LISP, Scheme

logički temelje se na logičkim pravilima, koja nemaju točno odreñen

redosljed izvoñenja Prolog

markup i hibridni jezici JSTL, XSLT34

Podjela programskih jezika po osobinama

interaktivni, strukturirani, proceduralni, jakih tipova, objektno-orijentirani, funkcijski, paralelni

35

Podjela programskih jezika po osobinama I

Interaktivni: APL, FORTH,LISP, T, Scheme,

Miranda

jednostavni za kodiranje, prevoñenje i izvoñenje kratke naredbe i definicije objekata

Strukturirani: Pascal, C, FORTH, LISP, T, Scheme

nema GOTO naredbe omogućavaju poziv funkcija i procedura po

vrijednosti parametara

36

Podjela programskih jezika po osobinama II

Jakih tipova: FORTRAN77, Pascal, Ada, ANSI C, ML

svaki objekt koji se koristi mora imati točno odreñen tip

• nepodudaranje tipova: type mismatch

Objektno-orjentirani: Simula, Smalltalk, T, C++, Java

objekti svoj tip nose sa sobom – tip-podtip svojstva objekata se nasljeñuju postoje metode za objekte (s različitim parametrima)

37

Podjela programskih jezika po osobinama III

Proceduralni: Pascal, Ada, C, FORTRAN, BASIC,

COBOL

program se sastoji od poziva procedura koje se izvode sekvencijalno

programi se izvode sekvencijalno

slika na sljedećem slajdu prikazuje genezu programskih jezika s pregledom najvažnijih osobina

38

39

Razvoj funkcijskih jezika

40

Podjela programskih jezika po osobinama IV

funkcijski jezici (prva generacija): LISP, Scheme, T

program se sastoji od ugnježñenih izraza i poziva funkcija

nema naredbe pridruživanja isključivo poziv po vrijednosti

većinom interaktivni i podržavaju liste sadrže varijable i mogu biti proceduralni

41

Podjela programskih jezika po osobinama V

funkcijski jezici (nova generacija): ML,

Miranda, Haskell

isključivi prijenos vrijednosti po pozivu funkcije evaluiraju vrijednosti tek kad su potrebne (lazy) call-by-need – poziv po potrebi još uvijek u razvoju, nisu poduprta polja

42

Primjer LISP koda

unija skupova

(DEFUN UNION (SET1 SET2)(COND((NULL SET1) SET2)((MEMBER (CAR SET1) SET2)(UNION (CDR SET1) SET2) )

(T (CONS (CAR SET1)(UNION (CDR SET1) SET2) )) ) )

43

Podjela programskih jezika po osobinama VI

paralelni jezici: Co-Pascal, OCCAM, LINDA,

FORTRAN-90

omogućavaju multitasking u programu• dijeljenje u dva asinhrona procesa koja meñusobno

komuniciraju

važno za paralelne arhitekture računala u umjetnoj inteligenciji: izvedi sve procese

paralelno i javi koji je završio uspješno – našao rješenje

sve više se oslanjaju na funkcijske jezike44

Podjela programskih jezika po namjeni

45

specializirani sistemski za poslovne podatke za baze podataka za liste, za polja, za nizove logički

skriptni

Podjela programskih jezika po namjeni I

za specijalizirane aplikacije

nisu opće namjene, za odreñenu vrstu podataka ili procesa

sistemsko programiranje

visoko portabilni jezici

za poslovnu namjenu: COBOL, Ada

laka manipulacija velikih količina podataka prikaz podataka

46

Podjela programskih jezika po namjeni II

za baze podataka: SQL

rad s internim datotekama i relacijama meñu njima

za liste: LISP, T, Scheme, Miranda

za polja (array): APL, VisiCalc, Lotus

za nizove (string): SNOBOL, Icon

47

Logički programski jezici

Prolog, templog, HASL, FUNLOG

simbolička logika, skupovi program zapisan logičkim pravilima,

predikatima neproceduralni: pravila nemaju unaprijed

zadanoga fiksnog redosljeda izvoñenja logičko programiranje ili deklarativno

programiranje

48

Primjer Prolog kodastart(q0).

final(q2).

% prijelazi(ishodišno_stanje,znak,ciljno_stanje)

transition(q0, a, q1).

transition(q1, b, q1).

transition(q1, c, q2).

% rad automata

prihvati(Znakovi) :-

start(PocetnoStanje), %počinjemo u početnom stanju

prihvati(Znakovi, PocetnoStanje). %za Znakovi rekurzivno provjeri da li DKA prihvaća

prihvati([], Stanje):- %ako je niz Znakovi u Stanju prazan

final(Stanje). %provjeri da li je Stanje prihvatljivo

prihvati([Znak|Znakovi], Stanje):- %Za Znak iz niza Znakovi i Stanje

transition(Stanje, Znak, SljedeceStanje),%napravi prijelaz

prihvati(Znakovi, SljedeceStanje).%provjeri je li SlijedeceStanje prihvatljivo

49

Skriptni programski jezici

Perl, Python, Tcl, JavaScript, shell scripts, REXX

za sistemske skripte, definicija tipova nisu nužne

kratki programi u skriptama većinom interpretirani (u run-time-u) za web programiranje

50

Copyright © 2006 Addison-Wesley. Sebesta 1-51

Skriptni web jezici JavaScript

razvijen zajedničkim snagama Netscape i Sun Microsystems za web programiranje, kreiranje dinamičkih HTML dokumenata sličanJavi po sintaksi

PHP PHP: Hypertext Preprocessor za serversku stranu WEB aplikacija, generira HTML kod

Python OO interpretiran skriptni jezik dinamičko odreñivanje tipova kod izvoñenja (lasy) podržava CGI skripte i forme interpretira se iz razvojne okoline ali se može i prevesti

Copyright © 2006 Addison-Wesley. Sebesta 1-52

Markup ili Hibridni jezici

XML, XSLT eXtensible Markup Language (XML): meta jezik (metamarkup

language)

eXtensible Stylesheet Language Transformation (XSTL) prikazuje XML dokumente

sadrže petlju (e.g., looping)

JSP

Java Server Pages

za dinamičke web dokumente servlet: Java program na sreveru koji svoj rezultat prikazuje u

pregledniku

....

UUR 2010/201153

Razvoj programa

Program – opis algoritma u nekom programskom jeziku

programiranje – kodiranje, prevoñenje pojedinih koraka algoritma u instrukcije nekog programskog jezika

UUR 2010/201154

PRIMJER

Programski zadatakpronaći veći od dva zadana broja

Pseudokod koji koristi isključivo termine govornog jezika

pročitaj dva realna brojaispiši pročitane brojeveodredi veći brojispiši nañeni broj

UUR 2010/201155

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

UUR 2010/201156

Dijagram toka

rez = x rez = y

x>yNEDA

ispiši x i y

učitaj x i y

početak

ispiši rez

kraj

UUR 2010/201157

PRIMJER#include <stdio.h>

void 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;

printf("%f \n", rez);

Prikaz algoritma

Učitati

Računati

Ako je Da

Ne

Dijagram tokaStrukturni dijagram tipova naredbi

-sekvencija

- selekcijauvjet

- iteracijauvjet

58

UUR 2010/201159

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 brojint a znači da je prevodioc rezervirao 4bajta memorije za zapis varijable

UUR 2010/201160

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

Smještaj u memoriji računala

x y

x y... ...

UUR 2010/201161

Varijable

smještaj u memoriji računalaime varijable adresa memorijske lokacije

•jednostavne varijable : numeričke, boolove i znakovne•složene ili strukturirane varijable•adresne varijable (pokazivači) UUR 2010/201162

Osnovni tipovi podataka u C-u

char - znakovni tip ili mali cijeli brojint - cjelobrojni tipfloat - realni tipdouble - realni tip u dvostrukoj preciznosti

Osnovni tipovi podataka u C-u

promjene osnovnih tipova char signed char -128...127

unsigned char 0...255 int short, unsigned 0...65535

signed -2147483648...2147483647long unsigned 0...232

Cijeli brojevi

dekadski broj 5 zapisan u 16 bitnom registru0000000000000101

dekadski broj -5 zapisan u 16 bitnom registru1111111111111011510 = 1012 0000000000000101(jedinični komplement) 1111111111111010

+11111111111111011

Cijeli brojevi

#include<stdio.h>

int main(void)

short broj1, broj2;

broj1 = 5;

printf("(%d)\n",broj1);

broj2 = ~broj1 + 1;

printf("(%d)\n",broj2);return 0;

Cijeli brojevi

bez predznaka 11111111111110112= 6553110

raspon brojeva od 0 do 2n-1 pozitivni i negativni brojevi

-2n-1,...,-1,0,1,..., 2n-1-1

UUR 2010/201167

P EKSPONENT MANTISA

31 30 22 21 0 msb lsb msb lsb

Zapis realnih brojeva

normirani način zapisa brojeva

11

<≤−

aantismB

KARAKTERISTIKA

UUR 2010/201168

Zapis realnih brojeva

IEEE standard jednostruka preciznost 32 bita dvostruka preciznost 64 bita decimalna točka iza prve jedinice

eksponent pomaknut za 2 -1 za k-bitni eksponentk-1

p k m

63 62 52 51 0

11 bitni eksponent

s pomakom 1023

52 bitna mantisa0=+

1=-

UUR 2010/201169

operator pridruživanja =

y = y+1;

adresa varijable y vrijednost varijable y

int x= 1/2;prvo se izračunava desna strana jednadžbe a nakon toga se vrijednost pridružuje varijabli x

UUR 2010/201170

aritmetički operatori

* / % + -

UUR 2010/201171

Prevoñenje programa

programe napisane u nekom programskom jeziku je potrebno prevesti u strojni kod

interpreter prevodioc (compiler)

UUR 2010/201172

Prevoñenje programa

MVT 1024ADD 1025MVF 1026

Z :=A + B;

11100110011000001100011000001100

0111100001111001

UUR 2010/201173

Prevoñenje programa

UUR 2010/201174

Prevodioc (Compiler)

UUR 2010/201175

IDE programsko okruženje

UUR 2010/201176

Prevoñenje programa

C program (p1.c)

asemblerski program (p1.s)

objektni program (p1.o)

Izvršni program (p)

tekst

tekst

binarni kod

binarni kod

prevodioc - compiler (gcc -S)

asembler (gcc, as)

UUR 2010/201177

Programski kod

int zbroji(int x, int y)int zbroj;

return zbroj=x+y;

UUR 2010/201178

Programski kod

prevoñenje izvornog programa u asemblerski kod gcc –O2 –S zbroji.c gcc - GNU compiler

prikaz asembleskog programa objdump -d zbroji.s

UUR 2010/201179

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

objektni kod asemblerski kodUUR 2010/201180

Programski kod

instrukcija zbroj=x+y

01 d0 add %edx,%eax

0000000111010000 16-bitna instrukcija

registri mikroprocesora

UUR 2010/201181

Prvi program

#include <stdio.h>

int main()

printf(“Dobar dan \n ");return 0;

naredba predprocesoru

glavna funkcija

funkcija za ispis

početak funkcije

kraj funkcije

UUR 2010/201182

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

Struktura C programa

programi u C-u sastoje se od funkcija, pri čemu svaki program mora imati barem jednu funkciju i to “glavnu” funkciju main

funkcija započinje znakom i završava znakom funkcija sadrži deklaracije, definicije i naredbe svaka naredba, deklaracij i definicija završava

znakom ; iza oznake kraja funkcije nema znaka ;

UUR 2010/201183 UUR 2010/201184

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

UUR 2010/201185

Struktura programa u C-u

programi su organizirani u funkcije oblik funkcije:tip_funkcije ime_funkcije(varijable)

lokalne varijable

naredbe

Elementi C programa

Za pisanje C programa koristimo skup znakova, koji se sastoji od velikih i malih slova engleske abecede, brojeva i posebnih znakova

slova: A-Z, a-z brojevi: 0-9 posebni znakovi: + - * / = % & # ! ? ^ “ ’ ~ \ | <

> ( ) [ ] : ; . , _ i praznina(“space”)

UUR 2010/201186

Identifikatori

imena koja pridružujemo varijablama, funkcijama, tipovima podataka i ostalim elementima programa

identifikatori se sastoje od slova i brojeva, gdje prvi znak mora biti slovo

C kao i UNIX razlikuje velika i mala slova

UUR 2010/201187

Komentari

Komentare pišemo da bi lakse čitali programe Prevoditelj prije prevoñenja briše sve

komentare

Komentar počinje parom znakova /*i završava parom */

ili Komentar počinje parom //

i završava krajem linije

UUR 2010/201188

Primjer

Drugi program, učitava dva cijela broja, izračunava novu vrijednost i ispisuje rezultat

čitaj dva cijela broja a i b ispiši učitane brojeve a i b izračunaj c = b2-4a

ispiši vrijednost varijable c

UUR 2010/201189

Drugi program

#include <stdio.h>

int main(void)

int a,b,c;

scanf("%d%d", &a, &b);

printf(“a=%d b=%d", a, b);

c = b*b-4*a;

printf(" Rezultat = %d\n", c);

return 0;

UUR 2010/201190

UUR 2010/201191

operator pridruživanja =

y = y+1;

adresa varijable y vrijednost varijable y

int x= 1/2;prvo se izračunava desna strana jednadžbe a nakon toga se vrijednost pridružuje varijabli x

Drugi program

UUR 2010/201192

Drugi program

pokrenemo program bash-3.2$ ./drugi

3 5a=3 b=5Rezultat = 13

UUR 2010/201193

Drugi program

#include <stdio.h>

int main(void)

int a,b;

scanf("%d%d", &a, &b);

printf((“a=%d b=%d", a, b);

printf(" Rezultat = %d\n", b*b-4*a ); return 0;

UUR 2010/201194

Funkcija printf

standardna funkcija za formatirani ispis deklarirana u datoteci zaglavlja stdio.h

prvi argument je niz znakova unutar dvostrukih navodnika “ Rezultat =”, koji se prenosi na standardni izlaz

znak %d je znak formata odn. konverzije vrijednosti varijable d=decimal (dekadski ispis varijable)

\n kontrolni znak, koji ispis preusmjerava u novi red (newline)

UUR 2010/201195 UUR 2010/201196

Varijable

smještaj u memoriji računalaime varijable adresa memorijske lokacije

•jednostavne varijable : numeričke, boolove i znakovne•složene ili strukturirane varijable•adresne varijable (pokazivači)

UUR 2010/201197

Osnovni tipovi podataka u C-u

char - znakovni tip ili mali cijeli brojint - cjelobrojni tipfloat - realni tipdouble - realni tip u dvostrukoj preciznosti

Osnovni tipovi podataka u C-u

promjene osnovnih tipova char signed char -128...127

unsigned char 0...255 int short, unsigned 0...65535

signed -2147483648...2147483647long unsigned 0...232

Cijeli brojevi

dekadski broj 5 zapisan u 16 bitnom registru0000000000000101

dekadski broj -5 zapisan u 16 bitnom registru1111111111111011510 = 1012 0000000000000101(jedinični komplement) 1111111111111010

+11111111111111011

Cijeli brojevi

#include<stdio.h>

int main(void)

short broj1, broj2;

broj1 = 5;

printf("(%d)\n",broj1);

broj2 = ~broj1 + 1;

printf("(%d)\n",broj2);return 0;

Cijeli brojevi

bez predznaka 11111111111110112= 6553110

raspon brojeva od 0 do 2n-1 pozitivni i negativni brojevi

-2n-1,...,-1,0,1,..., 2n-1-1

UUR 2010/2011102

P EKSPONENT MANTISA

31 30 22 21 0 msb lsb msb lsb

Zapis realnih brojeva

normirani način zapisa brojeva

11

<≤−

aantismB

KARAKTERISTIKA

UUR 2010/2011103

Zapis realnih brojeva

IEEE standard jednostruka preciznost 32 bita dvostruka preciznost 64 bita decimalna točka iza prve jedinice

eksponent pomaknut za 2 -1 za k-bitni eksponentk-1

p k m

63 62 52 51 0

11 bitni eksponent

s pomakom 1023

52 bitna mantisa0=+

1=- UUR 2010/2011104

Imena varijabli

float a, b, c, rez; deklaracija 4 varijable tipa float

imena varijabli sastoje se od slova i brojeva prvi znak mora biti slovo velika i mala slova se razlikuju

UUR 2010/2011105

PRIMJER

Programski zadatakpronaći veći od dva zadana broja

Pseudokod koji koristi isključivo termine govornog jezika

pročitaj dva realna brojaispiši pročitane brojeveodredi veći brojispiši nañeni broj

UUR 2010/2011106

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

UUR 2010/2011107

Dijagram toka

rez = x rez = y

x>yNEDA

ispiši x i y

učitaj x i y

početak

ispiši rez

kraj

Primjer

UUR 2010/2011108

UUR 2010/2011109

Treći program#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;

printf("%f \n", rez);

return 0;

UUR 2010/2011110

Elementi C-programa

#include <stdio.h>void 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;

printf("%f \n", rez);

definicija 3 varijable x, y i rez

poziv knjiznice stdio.h

glavna funkcija

funkcija za čitanjesa ulaza

funkcija za ispis

UUR 2010/2011111

Kontrolna instrukcija if - jednostrana selekcija

Pseudokôdako je logički_izraz istinit tada

naredbe

U C-uif (logički_izraz) naredba

iliif (logički_izraz)

niz naredbi

logički_izraz

niz naredbi

N

D

Logički operatori

!x logička negacijax && y logički ix || y logički ili

Logički operatori

0 0

0 1

1 0

1 1

0

0

0

1

X Y X && Y

0 0

0 1

1 0

1 1

0

1

1

1

X Y X || Y X !X

0

1

1

0

operator &&

logički izrazi mogu se kombinirati u složenije izraze uporabom operatora logički i &&

izraz je istinit ako su oba izraza istina

sintaksa: (logički_izraz_1) && (logički_izraz_2) primjer: if ( (5 < x) && (x < 50) )

istinit izraz samo ako je vrijednost x-a veća od 5 i manja od 50

operator ||

logički izrazi mogu se kombinirati u složenijeizraze uporabom operatora logički ili ||

izraz je istinit ako je jedan od izraza istinit

sintaksa: (logički_izraz_1) || (logički_izraz_2) primjer: if ( (5 < x) || (y < 50) )

istinit izraz ako je vrijednost x-a veća od 5 ili ako je vrijednost y-a manja od 50 ili ako je vrijednost x-a veća od 5 i vrijednost y-a manja od 50

logički operatori

negacija ! logiči I && logički ILI ||

if !(brojac>3) istinit izraz kada je vrijednost varijable brojac manja ili jednaka 3

if !(x==10) istinitio kada je x različit od 10

UUR 2010/2011117

Ključne riječi programskog jezika C

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

UUR 2010/2011118

Primjer

učitati 3 realna broja i ispisati najveći

algoritam: učitaj tri realna broja ispiši brojeve odredi najveći broj ispiši najveći

UUR 2010/2011119

Pseudokod

pročitaj (a, b, c)ispiši (a, b, c)odredi najveći brojako je a > b tada

ako je a > c tadarez = a

inačerez = c

inačeako je b > c tada

rez = binače

rez = cispiši (rez)kraj

UUR 2010/2011120

Pseudokod

pročitaj (a, b, c)ispiši (a, b, c)odredi najveći brojrez = cako je a > b tada

ako je a > c tadarez = a

inačeako je b > c tada

rez = bispiši (rez)kraj

UUR 2010/2011121

Struktogram

neda

rez = c

a>b

ispiši rez

pročitaj a,b,c

da ne

b >ca >c

da ne

rez = a

rez = c

rez = b

UUR 2010/2011122

C - kod#include<stdio.h>int main ()float a,b,c,rez;scanf("%f %f %f",&a, &b, &c);printf("%f %f %f \n", a, b, c);/* odredi najveci broj */rez = c;if (a>b)

if (a>c) rez = a; else

if (b > c) rez = b;

printf("%f \n", rez);return 0;

UUR 2010/2011123

Varijable

smještaj u memoriji računalaime varijable adresa memorijske lokacije

•jednostavne varijable : numeričke, boolove i znakovne•složene ili strukturirane varijable•adresne varijable (pokazivači) UUR 2010/2011124

Imena varijabli

float a, b, c, rez; deklaracija 4 varijable tipa float

imena varijabli sastoje se od slova i brojeva prvi znak mora biti slovo velika i mala slova se razlikuju

UUR 2010/2011125

Osnovni tipovi podataka u C-u

char - znakovni tip ili mali cijeli brojint - cjelobrojni tipfloat - realni tipdouble - realni tip u dvostrukoj preciznosti

UUR 2010/2011126

Operatori

* / % + -

< <= >= > == !=

& |

&& ||

?: (right->left) = += -= (right->left)

UUR 2010/2011127

Ključne riječi programskog jezika C

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

UUR 2010/2011128

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

UUR 2010/2011129

Instrukcije za aritmetičke i logičke operacije

operator pridruživanja = operator jednakost == nejednakost != aritmetički operatori:

* / % + -

UUR 2010/2011130

instrukcija_1

instrukcija_2

instrukcija_3

Instrukcije za odreñivanje toka programa

Normalan programski slijed:

instrukcija_1

instrukcija_2

instrukcija_3...

UUR 2010/2011131

Kontrolna instrukcija if - jednostrana selekcija

Pseudokôdako je logički_izraz istinit tada

naredbe

U C-uif (logički_izraz) naredba

iliif (logički_izraz)

niz naredbi

logički_izraz

niz naredbi

N

D

UUR 2010/2011132

Pseudokôd

ako je logički_izraz istinit tadaniz_naredbi_1

inačeniz_naredbi_2

U C-u

if (logički_izraz)niz_naredbi_1

else niz_naredbi_2

Kontrolna instrukcija if - dvostrana selekcija

D

niz naredbi_1 niz naredbi_2

logički_izrazN

UUR 2010/2011133

Instrukcije za ponavljanje dijelova programa

petlje kontrolne varijable za izvoñenje iteracija

(unaprijed zadan) logički izrazi (ispitivanje uvjeta), koji odreñuju

broj iteracija

UUR 2010/2011134

Instrukcije za ulaz i izlaz podataka

čitanje ulaznih podataka (standardni ulaz, datoteka)

ispis podataka ( zaslon, datoteka, štampač, ...)

funkcije u C-u

Funcija 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\t%8.1f\n",faren,(5.0/9.0)*(faren-32.0));

Funkcija za unos podataka

scanf(const char *format [,argument]... );

scanf("%f", &a); varijabla a tipa float operator & &a = adresa varijable a

UUR 2010/2011137

PRIMJER#include <stdio.h>

void 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;

printf("%f \n", rez);

UUR 2010/2011138

Primjer – rješenja kvadratne jednadžbe

ax2+bx+c=0 diskriminanta D=b2-4ac rješenja ovise od D

D>0 D=0 D<0

x1= x2=

-b+√D

2a-b-√D

2a

UUR 2010/2011139

Struktogram

neda

izračunaj D = b2 – 4ac

D>0 ?

f ima realne različite

korijene

kraj programa

unesi vrijednosti a,b,c

da ne

f ima dvostrukirealni korijen

f nema realnekorijene

D=0 ?

UUR 2010/2011140

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

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);

UUR 2010/2011141

/* izracun diskriminante */

dis= b*b-4*a*c;

UUR 2010/2011142

/* 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));

printf("2. korijen = %f\n", (-sqrt(dis)-b)/(2.0*a));else

/* nema realnih korijena */

printf("f nema realnih korijena\n");

UUR 2010/2011143

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

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)

/* 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));

printf("2. korijen = %f\n", (-sqrt(dis)-b)/(2.0*a));else

/* nema realnih korijena */

printf("f nema realnih korijena\n");

UUR 2010/2011144

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.740.0 4.460.0 15.680.0 26.7

100.0 37.8120.0 48.9140.0 60.0160.0 71.1180.0 82.2200.0 93.3220.0 104.4240.0 115.6260.0 126.7280.0 137.8300.0 148.9

UUR 2010/2011145

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;

UUR 2010/2011146

Primjer programa

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

int frekvencije[128]; definicija polja veličine 128 tipa integer

int main() početak glavne funkcije

int brojac=0; deklaracija lokalnih varijabliint c;

while ((c=getchar()) != EOF) funkcija getchar definirana u knjižnici stdio.h

brojac++;frekvencije[c]++;

printf("%d znakova u datoteci\n",brojac);for (brojac=0; brojac<128;brojac++)

printf("'%3c' (%4d) = %d\n",brojac, brojac,frekvencije[brojac]);

return 0;

UUR 2010/2011147

Naredbe za ponavljanja for petlja

for(izraz_1;izraz_2;izraz_3) izraz_1 – inicijalizacija brojača

izraz_2 – uvjet brojačanaredba_1; izraz_3 – inkrement/dekrement brojača

naredba_2:...

while petljawhile (uvjet)

naredba_1;

naredba_2:...

UUR 2010/2011148

Naredbe za ponavljanja

while petljawhile (faren <= gornji) cel = (5.0/9.0)*(faren-32.0);printf("%5.1f%8.1f\n",faren,cel);faren = faren+20; for petljafor (faren=0; faren<= 300; faren=faren+20)printf("%5.1f%8.1f\n",faren,(5.0/9.0)*(faren-32.0));

UUR 2010/2011149

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

Instrukcije za ponavljanje dijelova programa

petlje kontrolne varijable za izvoñenje iteracija

(unaprijed zadan) logički izrazi (ispitivanje uvjeta), koji odreñuju

broj iteracija

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.740.0 4.460.0 15.680.0 26.7

100.0 37.8120.0 48.9140.0 60.0160.0 71.1180.0 82.2200.0 93.3220.0 104.4240.0 115.6260.0 126.7280.0 137.8300.0 148.9

Primjer

#include <stdio.h>int 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;

return 0;

Deklaracija varijablii njihovih tipova

petlja while

Petlja while

while(logički_izraz)

naredba_1;naredba_2;...

naredbe unutar zagrada će se izvršavati sve dok je

logički_izraz istinit (logički_izraz > 0)

Naredbe za ponavljanja

while petljawhile (faren <= gornji) cel = (5.0/9.0)*(faren-32.0);printf("%5.1f%8.1f\n",faren,cel);faren = faren+20; for petljafor (faren=0; faren<= 300; faren=faren+20)printf("%5.1f%8.1f\n",faren,(5.0/9.0)*(faren-32.0));

Naredbe za ponavljanja for petlja

for(izraz_1;izraz_2;izraz_3) izraz_1 – inicijalizacija brojača

izraz_2 – uvjet brojačanaredba_1; izraz_3 – inkrement/dekrementnaredba_2:

...

while petljawhile (uvjet)

naredba_1;

naredba_2:...

Primjer

#include <stdio.h>

#define DONJI 0#define GORNJI 300#define KORAK 20

main ()

float faren;

printf(" F\t C\n");for (faren=DONJI; faren<= GORNJI; faren=faren+KORAK)

printf("%5.1f\t%8.1f\n",faren,(5.0/9.0)*(faren-32.0));

do – while

petlje while i for ispituju uvjet prije izvršavanja petlje

petlja do – while ispituje uvjet nakon izvršavanja naredbi unutar petlje

petlja se izvršava najmanje jedanput do

niz naredbiwhile (logicki_izraz)

do – while

Primjer: upis broja članova polja, koji ne smije biti manji od 1 ili veći od 10

do printf("upisi broj elemenata polja\n");scanf("%d",&broj_elem);

while(broj_elem<1 || broj_elem>10);

Funcija za ispis

printf(const char *format [, argument]... )

printf(“Dobar dan \n ");

printf("%f \n", rez);

printf("%5.1f\t%8.1f\n",faren,(5.0/9.0)*(faren-32.0));

Ispis programa

F C0.0 -17.820.0 -6.740.0 4.460.0 15.680.0 26.7100.0 37.8120.0 48.9140.0 60.0160.0 71.1180.0 82.2200.0 93.3220.0 104.4240.0 115.6260.0 126.7280.0 137.8300.0 148.9

UUR 2010/2011161

Ključne riječi programskog jezika C

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

UUR 2010/2011162

Literatura

Kernighan B. W., Ritchie D. M., The CProgramming Language, PrenticeHall, Inc., 1988.

Rajko Vulin: Od sada programiramo v C-u, Turbo C, Školska knjiga, Zagreb1991.

Rajko Vulin: "Zbirka riješenih zadataka iz C-a", Školska knjiga, Zagreb 1995.