Professional Documents
Culture Documents
Algoritam
Pravilo (ili skup pravila) kojim se opisuje kako rijeiti neki problem i koje posjeduje sljedea svojstva: algoritam je precizan algoritam je jednoznaan algoritam obuhvaa konani broj koraka; svaki korak je opisan instrukcijom za algoritam su definirani poetni objekti (koji pripadaju nekoj klasi objekata) nad kojima se obavljaju operacije ishod obavljanja algoritma je skup zavrnih objekata (rezultat), tj. algoritam je djelotvoran (effective) Postupak obavljanja algoritma je algoritamski proces
2
Krastavce i kopar oprati i posloiti u iste staklenke U 2 l vode dodati ocat, eer, sol i papar Zakuhati uz mijeanje Vruu otopinu uliti u staklenke Staklenke zatvoriti celofanom i gumicom Sloiti staklenke u iroki lonac napunjen vodom do grla staklenki Zagrijati vodu do 80 stupnjeva. Ako toplomjer nije raspoloiv, zagrijavati dok se s dna ne ponu dizati mjehurii zraka Ostaviti stajati barem 24 sata prije uporabe. Zavrni objekti:
kiseli krastavci la FER
3
Algoritmi i programi
Program - opis algoritma koji u nekom programskom jeziku jednoznano odreuje to raunalo treba napraviti. Programiranje proces opisivanja algoritma nekim od programskih jezika Postupci izrade algoritama nisu jednoznani te zahtijevaju i kreativnost. Koristit e se programski jezik C. Za saeti opis sloenijih algoritama koristit e se pseudokod ili dijagram toka.
Primjer
Programski zadatak: s tipkovnice proitati dva cijela broja, na zaslon ispisati proitane brojeve i vei od proitana dva broja
Primjer - nastavak
Pseudokod koji koristi iskljuivo termine govornog jezika
proitaj dva cijela broja ispii proitane brojeve odredi vei broj ispii rezultat
Primjer - nastavak
Pseudokod koji koristi uobiajene simbole proitaj (m, n) ispii (m, n) {odredi vei broj} ako je m > n tada rez := m inae rez := n ispii (rez) kraj
7
Primjer - nastavak
Dijagram toka Poetak cijeli broj m, n, rez proitaj m, n
Da
m>n
Ne
rez = m
rez = n
rez Kraj
8
Primjer - nastavak
Kd u programskom jeziku C
#include <stdio.h> int main() { int m, n, rez; /* ucitaj i ispisi dva cijela broja */ scanf("%d %d", &m, &n); printf("Ucitani su %d i %d\n", m, n); /* odredi veci broj */ if ( m > n ) { rez = m; } else { rez = n; } /* ispisi rezultat */ printf("Veci broj je %d\n", rez); return 0; }
Objanjenje
#include #include <stdio.h> <stdio.h>
uputa pretprocesoru: ukljuuje u program prije prevoenja standardno zaglavlje <stdio.h> koje sadri definicije struktura, vrijednosti, makroinstrukcija i funkcija za standardne ulazno-izlazne jedinice ugraditi na poetak svakog programa koji koristi funkcije scanf ili printf
10
Objanjenje
int int main() main() { { ... ... ... ... return return 0; 0; } }
glavna funkcija koja predstavlja mjesto gdje poinje izvravanje programa. Svaki C program mora sadravati tono jednu main funkciju. int ispred main znai da funkcija u pozivajui program vraa cijeli broj funkcija zavrava naredbom return koja u pozivajui program vraa rezultat. Za sada, uvijek napisati return 0;
11
Objanjenje
int int m, m, n, n, rez; rez;
definicija varijabli. Varijabla je prostor u memoriji raunala, poznate veliine, kojemu je dodijeljeno ime i iji se sadraj moe mijenjati. Naredbom su definirane 3 cjelobrojne varijable u koje se mogu pohranjivati cijeli brojevi
12
Objanjenje
/* /* ucitaj ucitaj dva dva cijela cijela broja broja */ */
13
Objanjenje
scanf("%d scanf("%d %d", %d", &m, &m, &n); &n);
funkcija za uitavanje vrijednosti s tipkovnice. Kao argumenti se navode format (ovisi o tipovima varijabli u koje se uitavaju vrijednosti) koritenjem specifikacije %d uitavaju se cjelobrojne vrijednosti adrese varijabli u koje se uitavaju vrijednosti. Adrese varijabli se oznaavaju s &imeVarijable npr, preko tipkovnice je uneseno
3 5
nakon obavljanja naredbe scanf varijabla m ima vrijednost 3, varijabla n ima vrijednost 5 koritenjem specifikacije %f uitavaju se realne vrijednosti
float float x, x, y, y, z; z; scanf("%f scanf("%f %f %f %f", %f", &x, &x, &y, &y, &z); &z);
1.15 2 3.5
z 3.5
14
x 1.15
y 2.0
Objanjenje
printf("%d printf("%d %d\n", %d\n", m, m, n); n);
\n u formatu predstavlja uputu za skok u novi red uz pretpostavku da su vrijednosti varijabli m=156, n=20, na zaslon e se ispisati
156 20
15
Objanjenje
specifikacijom se moe utjecati na irinu ispisa, npr.
printf("%d,%5d,%2d", printf("%d,%5d,%2d", 10, 10, 20, 20, 30); 30);
10,
20,30
printf("%d,%d\novo printf("%d,%d\novo je je novi novi red%4d", red%4d", 10, 10, 20, 20, 30); 30);
30
16
Objanjenje
kad se ispisuju realne vrijednosti, koristi se specifikacija %f
printf("%f printf("%f %f", %f", 15.2, 15.2, -3.45); -3.45);
15.200000 -3.450000
15.20,
%6.2f: %10.4f:
-3.4500
ispisuje ukupno 6 znakova, od toga dva iza decimalne toke ispisuje ukupno 10 znakova, od toga etiri iza decimalne toke
17
Objanjenje
rez rez = = m; m; naredba za pridruivanje vrijednosti u varijablu u varijablu rez pridrui vrijednost koja se nalazi u varijabli m
= = = = = = = =
5; 5; 5 5 * * 3; 3; 12 12 / / 3; 3; m m + + 5 5 - 3; 3;
rez rez = = 3 3 / / 4; 4;
u rez pridrui u rez pridrui u rez pridrui u rez pridrui uveane za 2 u rez pridrui
float float x; x; x x = = 3. 3. / / 4; 4;
u x pridrui 0.75
18
Objanjenje
if if ( ( m m rez rez } } else else rez rez } } > > = = { { = = n n ) ) { { m; m; n; n;
if ( m if ( m if ( m >=, <,
> n ) != n ) == n ) <=
ako je sadraj m vei od sadraja n ako je sadraj m razliit od sadraja n ako je sadraj m jednak sadraju n
19
Zadatak za vjebu
S tipkovnice uitati dva cijela broja. Na zaslon ispisati, ovisno o vrijednostima koje su uitane, jednu od sljedeih poruka:
brojevi su jednaki prvi broj je veci od drugog prvi broj je manji od drugog
20
Rjeenje (varijanta 1)
#include <stdio.h> int main() { int i, j; scanf("%d %d", &i, &j); if ( i > j ) { printf("prvi broj je veci od drugog"); } if ( i < j ) { printf("prvi broj je manji od drugog"); } if ( i == j ) { printf("brojevi su jednaki"); } return 0; }
21
Rjeenje (varijanta 2)
#include <stdio.h> int main() { int i, j; scanf("%d %d", &i, &j); if ( i > j ) { printf("prvi broj je veci od drugog"); } else { if ( i < j ) { printf("prvi broj je manji od drugog"); } else { printf("brojevi su jednaki"); } } return 0; } Koja je varijanta bolja? Zato?
22
Zadatak za vjebu
S tipkovnice uitati polumjer krunice (realni broj). Ukoliko je uitani broj vei od nule, izraunati opseg i povrinu krunice, te na zaslon ispisati: zadani polumjer je: xxxxxx.xx opseg kruznice je: xxxxxx.xx povrsina kruznice je: xxxxxx.xx inae ispisati polumjer kruznice je neispravno zadan: xxxxxx.xx
23
1. Domaa zadaa
Svaki student treba u CIP-u otvoriti korisniki raun za FERWeb (ukoliko ga ve nema otvorenog) S FERweba preuzeti i prouiti upute vezane za koritenje sustava Ahyco Provjeriti moete li se prijaviti na sustav Ahyco. U tu svrhu student se treba Internet explorerom prijaviti na sustav FER-a, pokrenuti Ahyco koristei istu pristupnu zaporku te se upoznati sa sustavom Kako bi se kasnije mogli bez problema sluiti istim u svrhu rjeavanja zadaa i automatskih testova. Ukoliko se prijava naini nekim dugim preglednikom, npr. Mozilla Firefoxom tada neke od funkcija sustava Ahyco nee raditi dobro ukoliko se prethodno ne poduzmu odreene prilagodbe preglednika (o tome ima dosta informacija u diskusijskim grupama prethodnih generacija)
24
2. Domaa zadaa
Preuzeti instalaciju MS Visual Studio .NET 2003, .NET 2005 ili najnoviju inaicu .NET 2008 sa stranica http://msdnaa.fer.hr/ i instalirati to razvojno okruenje na vlastito raunalo Eventualno, na raunalo se moe instalirati slian alat s kojim je mogue prevoditi C programe i pratiti njihovo izvravanje (debugging) uz napomenu da automatsko ocjenjivanje domaih zadaa uvaava specifinosti .NET okruenja i moe (vrlo rijetko) doi do situacije da inae ispravno rjeenje na testnom raunalu sustav automatskog ocjenjivanja ocijeni kao djelomino ispravno ili ak neispravno. Prikladan besplatni kompajler se moe preuzeti sa stranica http://www.cs.virginia.edu/~lcc-win32/ U laboratoriju ili na vlastitom raunalu testirati rad MS Visual Studio .NET 2003 ili .NET 2005 prema uputama za uporabu objavljenim na slubenoj stranici predmeta.
25
27
izvorni kd
objektni kd
(run-time errors)
pogreke
(linker errors)
pogreke
Izvravanje
Kolektor
rezultati
28
Kolekcija (povezivanje) prevedenog programa u izvrni (apsolutni) program Poziv kolektora (linker)
Povezuju se potrebne potprogramske biblioteke (stdio.h, math.h, ...) Kolektor otkriva pogreke programer ispravlja izvorni kd i ponovno pokree prevoenje
29
30
Primjer
Programski zadatak
proitaj tri realna broja ispii proitane brojeve odredi najvei broj ispii naeni broj
31
Primjer - nastavak
Pseudokod koji koristi uobiajene simbole
proitaj (x,y,z) ispii (x,y,z) {odredi najvei broj} ako je x > y tada ako je x > z tada rez := x inae rez := z inae ako je y > z tada rez := y inae rez := z ispii (rez) kraj
32
Primjer - nastavak
Unapreenje prethodnog rjeenja proitaj (x,y,z) ispii (x,y,z) {odredi najvei broj} rez := z ako je x > y tada ako je x > z rez := inae ako je y > z rez := ispii (rez) kraj
tada x tada y
33
Primjer - nastavak
Kd u programskom jeziku C
#include <stdio.h> int main() { float x, y, z, rez; scanf("%f %f %f", &x, &y, &z); printf("%f %f %f \n", x, y, z); /* odredi najveci broj */ rez = z; if ( x > y ) { if ( x > z) rez = x; } else { if ( y > z) rez = y; } printf("%f \n", rez); return 0; }
34
logika pogreka
35
Zadatak za vjebu
Napisati pseudokod, nacrtati dijagram toka, te napisati C program za sljedei problem: Uitati koeficijente dvaju pravaca y = a1 x + b1 i y = a2 x + b2 Ovisno o vrijednostima koeficijenata, ispisati poruku da su pravci paralelni ili ispisati koordinate toke u kojoj se sijeku. Upisati, prevesti i testirati program pomou Visual Studio .NET
36
3. Domaa zadaa
Isprobati prevoenje programa i ispravljanje pogreaka u instaliranom razvojnom okruenju MS Visual Studio .NET Najprije je potrebno isprobati rjeavanje elementarnih programskih zadataka kako bi se podesili svi parametri razvojnog okruenja. Upute i prijedloge nekoliko jednostavnijih zadatka za 3. Domau zadau preuzeti sa slubenih stranica predmeta
37
Uvod u C-programiranje
38
Kljune rijei
predefinirani identifikatori koji za prevodioca imaju posebno znaenje kljune rijei se piu malim slovima Prema ANSI standardu C ima sljedee 32 kljune rijei: auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void volatile default goto sizeof do if static while http://refcards.com/refcard/ansi-c-silvermanj
42
Struktura C programa
C program se sastoji od imenovanih blokova, deklaracija/definicija varijabli, direktiva pretprocesoru
imenovani blokovi se nazivaju funkcije. Za nazive funkcija se ne smiju koristiti kljune rijei. deklaracija opisuje naziv i tip varijable. definicija je deklaracija kojom se osim opisa varijable, rezervira prostor u memoriji
blok zapoinje znakom { i zavrava znakom } blok obuhvaa deklaracije/definicije, naredbe (statement) i neimenovane blokove svaka naredba i deklaracija/definicija mora zavravati znakom ; blok NE zavrava znakom ; tj. iza znaka } ne stavlja se ;
43
Struktura C programa
int suma(int int k; { int m; { m = k = } } return k; } i, int j) {
i + j; m;
imenovani blok (funkcija) definicija varijable neimenovani blok definicija varijable neimenovani blok naredba naredba
44
Struktura C programa
u C programu mora postojati glavna (main) funkcija koja predstavlja mjesto gdje poinje izvrenje programa:
int main() { programski blok return 0; } ISPRAVNO main() { programski blok return 0; }
ISPRAVNO ALI SE NE PREPORUA
ili
void main() { programski blok }
POGRENO!!!
45
Struktura C programa
#include <stdio.h> #define PI 3.14159 int main() { float r; float opseg; printf("Unesi polumjer"); scanf("%f", &r); opseg = 2 * r * PI; printf("%9.2f\n", opseg); return 0; }
46
Komentari
mogu se protezati kroz vie linija izbjegavati komentar oblika: printf("Unesi n: ");/* Ispis na zaslonu */ zato to program postaje neitkiji nije doputeno koristiti komentar unutar komentara: /* definicija /* funkcije */ sume */
47
Pretprocesorske naredbe
#include <stdio.h> ukljuuje u program prije prevoenja standardno zaglavlje <stdio.h> koje sadri definicije struktura, vrijednosti, makroinstrukcija i funkcija za standardne ulazno-izlazne jedinice (na primjer printf, scanf i druge).
/*** *stdio.h - definitions/declarations for standard I/O routines * * Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: * This file defines the structures, values, macros, and functions * used by the level 2 I/O ("standard I/O") routines. * [ANSI/System V] * * [Public] * ****/
#define PI 3.14159 definira simboliku konstantu PI i pridjeljuje joj vrijednost. Simbolike konstante su naroito korisne za parametrizaciju programa.
48
Varijable
Openito: promjenljiv podatak (lat.variabilis-promjenljiv) U programiranju: varijabla je prostor u memoriji raunala, poznate veliine, kojemu je dodijeljeno ime i iji se sadraj moe mijenjati Simboliki se prikazuje pravokutnikom uz kojeg stoji ime
...
...
49
Varijable
imena varijabli i funkcija su sastavljena od slova i brojki, a prvi znak mora biti slovo ili znak potcrtavanja _
suma god_rod 94god x1 pripremni_dio_studija x1.1 maticni broj float novi+datum
Uvod u C-programiranje
osnovni tipovi podataka
51
52
Pouzdano i neosjetljivo na manje promjene napona. Znamenke su 0 i 1, dakle baza brojanja B=2 to odreuje binarni brojevni sustav Iz engleskog BInary digiT nastalo je ime za najmanju koliinu informacije, znamenku binarnog brojevnog sustava BIT. Broj od n znamenki u brojevnom sustavu s bazom 2:
zn-1 2n-1 + zn-2 2n-2 + ... + z1 21 + z0 20, zi { 0, 1 }
53
54
N = 13 = 2 q1 + z0 20 = 2 6 + 1 20 q1 = 6 = 2 q2 + z1 20 = 2 3 + 0 20 q2 = 3 = 2 q3 + z2 20 = 2 1 + 1 20 q3 = 1 = 2 q4 + z3 20 = 2 0 + 1 20
1310 = 1 1 0 12
z0 = 1, q1 = 6 z1 = 0, q2 = 3 z2 = 1, q3 = 1 z3 = 1, q4 = 0
56
Oito, broj znamenaka iz prethodnog izraza treba zaokruiti na vii cijeli broj tj:
b d 3,33
58
0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 + 1 -37 1 1 0 1 1 0 1 1 + 37 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
59
37
60
Zadatak
Dekadski broj -11 prikazati u obliku binarnog broja, u tehnici dvojnog komplementa
61
Zadatak
Prethodni zadatak nije ispravno zadan jer nije navedeno pomou koliko bitova treba prikazati zadani broj Ispravno zadani zadatak glasi: Dekadski broj -11 prikazati u obliku binarnog broja, u tehnici dvojnog komplementa, u registru od 5 bitova
?
62
Primjer: 36-bitni broj 001 110 000 101 111 001 010 011 111 000 100 0012 oktalni ekvivalent 1 6 0 5 7 1 2 3 7 0 4 1 8
63
64
unsigned - doputa pridruivanje samo pozitivnih vrijednosti signed - doputa pridruivanje pozitivnih i negativnih vrijednosti (zato doputa manji raspon brojeva od unsigned)
65
signed short int i; signed short i; short int i; short i; signed int i; int i; signed long int i; signed long i; long int i; long i; unsigned short int i; unsigned short i; unsigned int i; unsigned long int i; unsigned long i;
66
U cjelobrojni tip podatka takoer pripada: char (kada se koristi kao brojevna, a ne znakovna vrijednost).
67
69
to se i zato dogodilo?
71
72
Upamtite
Kod rjeavanja zadataka, ukoliko u zadatku nije drugaije navedeno, podrazumijevat e se: za za za za tip tip tip tip podatka podatka podatka podatka char koristi se jedan oktet short int koristi se dva okteta int koristi se etiri okteta long koristi se etiri okteta
73
74
7U 20u 64u
u oktalnoj notaciji:
07u
024U
0100u
u heksadekadskoj notaciji
0x7u
0x14u
0xFFFFFFFFu
76
1.0 1
Broj s konanim brojem decimala u dekadskom sustavu u binarnom sustavu moe imati beskonani periodiki niz binarnih znamenaka. Mnoenje se nastavlja sve dok se ne dobije cijeli broj 1 ili bude dosegnuta zadovoljavajua preciznost.
79
80
0.333333333333333333333333333333333333333333
3.141592653589793238462643383279502884197169
ne postoji nain na koji bi se u raunalu mogao pohraniti svaki realni broj. Pohranjuju se pribline vrijednosti realnih brojeva.
81
mantisa
eksponent
82
Normalizacija omoguava prikaz vrlo velikih i vrlo malih brojeva, bez koritenja velikog broja nula.
83
84
Primjer C programa:
int main () { float x; x = 2.f * 5.0f * 3.14159F; printf("Krug radijusa 5 ima opseg %f", x); return 0; }
23 22
1 bit za pohranu predznaka 8 bitova za pohranu karakteristike 23 bita za pohranu mantise bez skrivenog bita
86
23 22
P je oznaka za predznak
P = 1: negativan broj P = 0: pozitivan broj
karakteristika K
K = BE + 127 raspon karakteristike: K [0, 255] K = 0 i K = 255 se koriste za posebne sluajeve (objanjeno kasnije)
mantisa M
u registar se ne pohranjuje cijela mantisa M, ve mantisa iz koje je uklonjen skriveni bit
87
5.7510 = 101.112
101.11220 = 1.0111222
0
P
10000001
01110000000000000000000
16
16
.75 = 0.112 * 20 = 1.12 * 2-1 = 0011 1111 0100 0000...0000 0000 = 3F40 0000
16
90
Kalkulator za uvjebavanje
Internet stranica na kojoj se nalazi dobar kalkulator za uvjebavanje zadataka s prikazivanjem realnih brojeva http://babbage.cs.qc.edu/courses/cs341/IEEE-754.html
91
92
0000 0000 0110 0000 0000 0000 0000 0000 0.11 2-126 0000 0000 0000 0000 0000 0000 0000 1101 0.000 0000 0000 0000 0000 1101 2-126
93
0111 1111 1000 0000 0000 0000 0000 0000 + 1111 1111 1000 0000 0000 0000 0000 0000
94
-3.4 1038
-1.4 10-45
+1.4 10-45
+3.4 1038
-1.17 10-38
+1.17 10-38
97
98
99
100
Koliko se razliitih realnih brojeva moe prikazati (za format IEEE 754 - jednostruka preciznost)
za svaki K[0, 254]
mogue su 223 razliite mantise mogua su dva predznaka ukupno 255 *223 * 2 = 4,278,190,080 razliitih realnih brojeva
101
102
104
Zaista, apsolutna pogreka je -1.1920929 10-8, to je po apsolutnoj vrijednosti manje od 4.2 10-8.
106
Numerike pogreke
Neki dekadski brojevi se ne mogu prikazati pomou konanog broja binarnih znamenaka. Primjer:
float f = 0.3f; printf("%17.16f ", f); 0.3000000119209290
107
Numerike pogreke
Raunanje s brojevima bitno razliitog reda veliine moe dovesti do numerike pogreke
Primjer (uz jednostruku preciznost): 1000000.010 : 0.01562510 : (1.) 11101000010010000000000 * 219 (1.) 00000000000000000000000 * 2-6
Kod zbrajanja, binarne toke moraju biti poravnate: 1.11101000010010000000000 * 219 + 0.00000000000000000000000 * 219 = 1.11101000010010000000000 * 219 = 1000000.010
108
Numerike pogreke
Raunanje s brojevima bitno razliitog reda veliine - primjer u programskom jeziku C:
float f = 6000000.0f; float malif = 0.25f; f = f + malif; f = f + malif; f = f + malif; f = f + malif; printf("%f ", f);
oekuje se ispis
6000001.000000
111
-1.8 10308
-4.9 10-324
+4.9 10-324
+1.8 10308
-2.2 10-308
Prikaz nije mogu Prikaz nije mogu
+2.2 10-308
Prikaz nije mogu
113
114
Zaista, apsolutna pogreka je -4.0 10-17, to je po apsolutnoj vrijednosti manje od 7.7 10-17.
115
Programski jezik C ne propisuje preciznost tipova float, double i long double, ali vrijedi da float ne moe biti precizniji od double, te double ne moe biti precizniji od long double: float double long double
116
117
Realne konstante
Primjer realnih konstanti za razliite tipove realnih brojeva: 2.f 1. 1.L 2.34F -1.34e5f 2.34 9e-8 8.345e+25 float double long double
2.34L -2.5e-37L
118
119
Upamtite
Kod rjeavanja zadataka, ukoliko u zadatku nije drugaije navedeno, podrazumijevat e se:
za tip podatka float koristi se etiri okteta za tip podatka double koristi se osam okteta
120
121
Osobitosti C prevodilaca
Veliina prostora za pohranu podatka odreenog tipa nije propisana standardom. Stoga je programeru na raspolaganju operator sizeof, koji za zadani operand izraunava veliinu prostora za pohranu izraenu u oktetima. Operand moe biti naziv tipa podatka ili naziv varijable Primjer:
int var; printf("%d", sizeof(char)); /* ispisuje 1 */ printf("%d", sizeof(var)); /* ispisuje 4 */
122
unsigned int 32 unsigned short int 16 long long int signed long int unsigned long int 32 32 32 32
123
Operatori i izrazi
124
Izrazi
Izraz jest kombinacija operatora, operanada (konstante, varijable, ) i zagrada, koja po evaluaciji daje rezultat. Moe biti dio veeg izraza. Primjer:
a + 5
varijabla Primjer:
operator
konstanta
(b + c) / ((d + e) * 4)
125
Na primjer:
k := 5 k = 5; 5 aritmetika naredba
to znai naredba ?
k = k + 1;
aritmetiki izraz
126
Primjer pridruivanja: Zadano je X=14.5 i Y= -9.9 . U programu treba ispisati vrijednosti X i Y, a zatim u X staviti vrijednost od Y, a u Y staviti vrijednost od X. Ispisati ponovno X i Y.
ZamjenaVarijabli
int main () { x y p float x, y, p; ??? ??? ??? x= 14.5f; 14.5 ??? ??? y= -9.9f; 14.5 -9.9 ??? printf ("x=%f, y=%f\n", x, y); /* zamijeniti vrijednosti x i y */ 14.5 -9.9 14.5 p=x; -9.9 -9.9 14.5 x=y; -9.9 14.5 14.5 y=p; printf ("Nakon zamjene: x=%f, y=%f\n", x, y); return 0; } x=14.500000, y=-9.900000 Nakon zamjene: x=-9.900000, y=14.500000
127
Operator Znaenje
+ * / %
zbrajanje oduzimanje mnoenje dijeljenje ostatak kod cjelobrojnog dijeljenja (modulo, modulus)
128
Izraz
a a a a a + * / % b b b b b
Rezultat
13 7 30 3 1
129
Izraz
a + b a - b a * b a / b a % b a moe li:
Rezultat
14.5 10.5 25.0 6.25 pogreka 12. % 5
130
4.99
Kada su operandi razliitog tipa, prije obavljanja operacije obavlja se implicitna (automatska) pretvorba tipa rezultata u "vei (vaniji)" od tipova operanada koji sudjeluju u operaciji. U prikazanom primjeru, prije nego se obavi operacija zbrajanja, vrijednost koja se nalazi u varijabli i pretvara se u 2.0 (pri tome sadraj varijable i ostaje nepromijenjen).
131
132
float f; double d;
Prema pravilu
1. 5. 3. 1. 4. 3. 2. 5.
133
Izraz
f1 f1 i1 i1 c1 + + + + + f2 i2 i2 f2 c2
Rezultat
32001.5 32001.5 -2147483648 2147483648.0 128
tip rezultata
float float int float int
134
f = 2147483638;
Potrebno je obratiti pozornost da se pri promjeni tipa podatka moe "izgubiti" manji ili vei dio informacije. U gornjem primjeru:
"izgubljene" su decimale 0.75 kod prvog pridruivanja, tj. ispisom vrijednosti varijable i dobilo bi se 2 f sadri vrijednost za 10 veu od one koja je pridruena, tj. ispisom vrijednosti varijable f dobilo bi se 2147483648.
135
-294967296.000000 4000000000.000000
137
Cjelobrojno dijeljenje
Potrebno je obratiti pozornost na "neeljene" rezultate kod cjelobrojnog dijeljenja. Ukoliko se na primjer u realnu varijablu a eli pridruiti vrijednost , sljedea naredba pridruivanja nee varijabli a pridruiti vrijednost 0.5: a = 1 / 2; U izrazu s desne strane jednakosti oba su operanda cjelobrojnog tipa, pa e se obaviti cjelobrojno dijeljenje. Rezultat tog izraza je 0 (uz ostatak 1). Za izbjegavanje cjelobrojnog dijeljenja potrebno je koristiti zadanu pretvorbu tipa (dovoljno samo na jednom operandu) ili zadati konstante tako da je barem jedna realna: a = (float) 1 / 2; ili a = 1. / 2; ili a = 1 / 2.; U prvom sluaju koritena je zadana pretvorba tipa Napomena: operanda (mogla se uporabiti i nad drugim operandom). U drugom i treem sluaju, dodavanjem toke, konstanta je postala realna te se dijeljenje obavlja u realnoj domeni.
138
Cjelobrojno dijeljenje
b) 9 % 4
139
1. * / % 2. + Ako u izrazu ima vie operatora jednakog prioriteta, izraunavaju se slijeva nadesno. Na primjer: 2 + 3 / 2 * 4 - 5 * 6 % 8 2 + 2 + 6 0 1 * 4 4 30 % 8 6 6
140
Kada treba koristiti okrugle zagrade ? a) ako se eli promijeniti ugraeni redoslijed izvoenja operacija b) u sluaju vlastite nesigurnosti c) radi bolje itljivosti programa 2 + 3 / (2 * 4) - 5 * (6 % 8) -28
141
Primjeri
142
Primjeri
Koju e vrijednost poprimiti varijable i, x, c int i; double x, c, d; nakon naredbi: d = 6.0; i = (int)(d + 1.73); x = i / 2; c = (double)i / 2; Rjeenje: i = 7, x = 3.0, c = 3.5
143
Primjeri
Koje su vrijednosti i tipovi izraza nakon evaluacije:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
3 / 2 * 2 3 / 2 * 2. 3 / 2. * 2 3 / (float)2 * 2 (double)3 / 2 (double)(3 / 2) 2+0.5 * 4 (2 + 0.5) * 4 (int)(0.5 + 2) * 4 (int)1.6 + (int)1.6 (int)(1.6 + 1.6)
144
Primjer: Uitati vrijednosti za cjelobrojne varijable i, j i k te ispisati njihove vrijednosti i aritmetiku sredinu.
#include <stdio.h> int main () { int i, j, k; float sredin; scanf ("%d %d %d", &i, &j, &k); sredin = (i + j + k) / 3.f; printf ("Aritm. sredina je %f", sredin); return 0; }
145
146