uvod u ra čunarstvo - riteh.uniri.hr · pdf fileuvod u programiranje i programski jezik c 3...
TRANSCRIPT
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.