Download as pdf or txt
Download as pdf or txt
You are on page 1of 74

VISOKA KOLA ZA TURISTIKI MENADMENT IBENIK

Frane Urem

OSNOVE PROGRAMIRANJA 1 AUDITORNE VJEBE

ibenik, 2004.

OSNOVE PROGRAMIRANJA 1

SADRAJ BINARNI BROJEVNI SUSTAV ..................................................................................................2 NEGATIVNI BINARNI BROJEVI ............................................................................................3 OKTALNI BROJEVNI SUSTAV..................................................................................................4 HEKSADECIMALNI BROJEVNI SUSTAV.....................................................................................4 RAZLOMLJENI BINARNI BROJEVI ............................................................................................5 PRIKAZ REALNIH BROJEVA U RAUNALU .................................................................................6 REALNI BROJEVI STANDARDNE TONOSTI ..............................................................................6 RASPON I TONOST REALNIH BROJEVA ..................................................................................8 NUMERIKE POGREKE ........................................................................................................8 REALNI BROJEVI DVOSTRUKE TONOSTI ................................................................................9 CJELOBROJNI TIP PODATAKA U Cu ..................................................................................... 10 PRIKAZ CIJELIH BROJEVA S PREDZNAKOM I BEZ PREDZNAKA .............................................. 10 DEKLARACIJA CJELOBROJNOG (INT) TIPA:PRETVORBA TIPOVA PODATAKA ................................ 11 CJELOBROJNO DIJELJENJE .................................................................................................. 13 PRIORITETI OPERATORA ..................................................................................................... 14 OPERATORI S BITOVIMA ..................................................................................................... 15 PRIKAZ ZNAKOVA U PROGRAMSKOM JEZIKU C ...................................................................... 17 ZNAKOVNE KONSTANTE...................................................................................................... 18 OPERATOR PRIDRUIVANJA ................................................................................................ 20 OPERATORI POVEANJA I SMANJENJA ZA JEDAN.................................................................... 22 USPOREDNI OPERATORI ..................................................................................................... 23 VELIINA OSNOVNIH TIPOVA PODATAKA .............................................................................. 23 KONTROLNA NAREDBA IF.................................................................................................... 24 UVJETNI OPERATOR ........................................................................................................... 28 PRETPROCESORSKE NAREDBE ............................................................................................. 28 LOGIKI OPERATORI .......................................................................................................... 29 PRIORITET OPERATORA ...................................................................................................... 30 DVOSTRANA SELEKCIJA...................................................................................................... 32 VIESTRANA SELEKCIJA ..................................................................................................... 34 PETLJA S ISPITIVANJEM UVJETA PONAVLJANJA NA POETKU ................................................... 35 PETLJA S POZNATIM BROJEM PONAVLJANJA .......................................................................... 37 PETLJA S ISPITIVANJEM UVJETA PONAVLJANJA NA KRAJU ....................................................... 43 NAREDBE ZA KONTROLU TOKA PETLJE BREAK I CONTINUE...................................................... 46 NAREDBA UVJETNOG GRANJANJA SWITCH CASE ................................................................. 48 POLJA...............................................................................................................................50

AUDITORNE VJEBE

OSNOVE PROGRAMIRANJA 1

BINARNI BROJEVNI SUSTAV Brojevni sustav s bazom brojanja B ima znamenke 0, 1, 2, ... ,B-1 Npr. u dekadskom sustavu B=10, a znamenke su 0, 1, 2, ..., 8 i 9.

Ako je baza B=2 dobiva se binarni brojevni sustav, ije znamenke su 0 i 1. Iz engleskog BInary digiT nastalo je ime za najmanju koliinu informacije BIT. Primjer zapisivanja brojeva: 5710 = 5 * 101 + 7 * 100 = 1*25 + 1*24 + 1*23 + 0*22 + 0*21 + 1*20 = 1 1 1 0 0 1

Za binarno prikazivanje informacija je potreban najvei broj elemenata u usporedbi s ostalim prikazima, a broj bita za prikaz brojeva je iz tehnikih razloga ogranien. Ureaji koji obrauju i pohranjuju binarne informacije fiziki se izvode pomou elektronikih elementa s 2 stabilna stanja (sklopka), koji su veoma brzi i jeftini. Primjer: Binarni broj tvore ostaci dijeljenja s 2, odozdo prema gore 57 : 2 = 28 1 28 : 2 = 14 0 14 : 2 = 7 0 7:2= 3 1 3:2= 1 1 1:2= 0 1 1 1 1 0 0 1

AUDITORNE VJEBE

OSNOVE PROGRAMIRANJA 1

NEGATIVNI BINARNI BROJEVI

Registar je skup memorijskih elemenata koji pamte znamenke binarnog broja to znai da je za odreeno raunalo unaprijed propisana duina registra, a time i brojevno podruje unutar kojeg se kreu brojevi. Primjer: Operacija 7 - 5 u raunalu s registrom od 4 bita obavit e se kao 7 + (-5). Binarni prikaz broja -5 je slijedeci: Pozitivni broj 0101 Komplement do baze (dvojni komplement) + 1010 0001 1011 Operacija oduzimanja 7 - 5 0 1 1 1 ( 7) +1 0 1 1 (-5) 0010 Preliv 1

Komplement do baze-1 1111 (jedinini komplement) - 0 1 0 1 1010 Dokaz da je dobiveni broj - 5 1 0 1 1 (- 5) + 0 1 0 1 (+5) 0000 Preliv 1

U registru s 3 bita, ako je prvi bit predznak mogu se prikazati slijedei brojevi: Dekadski broj 0 1 2 3 -4 -3 -2 -1 Binarni broj 000 001 010 011 100 101 110 111 0 22 - 1

+1

-22

VANO!!!! Za n=3 dobije se interval [-22, 22 - 1], openito [-2n-1, 2n-1 - 1]. Za n=8 taj je interval [-27, 27-1], tj. [-128, 127].

AUDITORNE VJEBE

OSNOVE PROGRAMIRANJA 1

OKTALNI BROJEVNI SUSTAV Baza sustava je B=8 a znamenke su 0,1,2,3,4,5,6,7. Koristi se za skraeno zapisivanje binarnih sadraja kada je to spretno. Primjer: 36-bitni broj oktalni ekviv. 001 110 000 101 111 001 010 011 111 000 100 001 1 6 0 5 7 1 2 3 7 0 4 1

HEKSADECIMALNI BROJEVNI SUSTAV Baza sustava je B = 16, a znamenke su 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Koristi se za skraeno zapisivanje binarnog sadraja. Primjer: 16-bitni broj heksadecimalni ekviv. 0111 1011 0011 1110 7 B 3 E

AUDITORNE VJEBE

OSNOVE PROGRAMIRANJA 1

RAZLOMLJENI BINARNI BROJEVI Razlomljeni binarni brojevi sadre "binarnu toku", analogno decimalnom zarezu, odnosno toki u anglo-amerikoj notaciji. Primjer prikaza razlomljenih brojeva: 5.75
10

= 5 * 100 + 7 * 10-1 + 5 * 10-2 = = 1*22 + 0*21 + 1*20 + 1*2-1 + 1*2-2 = 1 0 1 . 1 1


2

Primjer: Pretvaranje decimalnog broja u binarni: Cjelobrojni dio dekadskog broja pretvara se u binarni uzastopnim dijeljenjem, a decimalni uzastopnim mnoenjem s 2, gdje cjelobrojni dio dobivenih produkata tvori znamenke binarnog razlomka. 1.25 = 1 + .25 1 . 0 1

.25 * 2 0.50 .5 1.0 * 2

Primjer pretvaranja decimalnih brojeva koji se ne mogu prikazati konanim brojem binarnih frakcija: 13.3 = 13 + 0.3 .3 * 2 0.6 .6 * 2 1.2 .2 * 2 0.4 .4 * 2 0.8 .8 * 2 1.6 .6 * 2 1.2 .... Treba uoiti da se konani decimalni razlomak prikazuje kao beskonani periodiki binarni razlomak. Binarni broj se mnoi s potencijama baze 2 tako da se binarna toka pomakne odgovarajui broj mjesta desno ili lijevo, zavisno da li je predznak potencije pozitivan ili negativan. Na primjer, 1 . 1 1 * 22 = 1 1 1 1 1 0 1 . 0 1 0 0 1 1 0 0 1 ...

AUDITORNE VJEBE

OSNOVE PROGRAMIRANJA 1

PRIKAZ REALNIH BROJEVA U RAUNALU Standardna tonost: 32 bita (4 byte) Dvostruka tonost: 64 bita (8 byte)

REALNI BROJEVI STANDARDNE TONOSTI Deklaracija u programskom jeziku C: float IEEE (Institute of Electrical and Electronics Engineers) standard 754 za prikaz realnih brojeva u standarnoj tonosti: 31 P 30 Karakteristika 23 22 Mantisa 0

P Karakteristika Mantisa

predznak ( P=1 negativan, P=0 pozitivan) binarni eksponent + 127 (da se izbjegne prikaz negativnog eksponenta) normalizirana (samo jedan bit ispred binarne toke).

Primjer: Prikazati dekadski broj 5.75 5.7510 = 101.112 * 20 = 1.01112 * 22 Kako se normalizacijom svakog binarnog broja (osim nule) postie oblik 1.xxxxx, vodea jedinica ne pohranjuje se u raunalu i naziva se skrivenim bitom. Time se tedi jedan bit to poveava tonost. Predznak = 0 (pozitivan broj) Binarni eksponent = 2 K = 2 + 127 = 129 = (1000 0001)2 Mantisa (cijela) 1.0111 Mantisa (bez skrivenog bita) 0111 Rezultat: ili 0 10000001 01110000000000000000000 0100 0000 1011 1000 0000 0000 0000 0000 4 0 B 8 0 0 0 0

(heksadecimalno)

Primjer: 2 = 102 * 20 = 12 * 21 = 0100 0000 0000 0000 ... 0000 0000 = 4000 0000 hex P = 0, K = 1 + 127 = 128 (10000000), M = (1.) 000 0000 ... 0000 0000 -2 = -102 * 20 = -12 * 21 = 1100 0000 0000 0000 ... 0000 0000 = C000 0000 hex Jednako kao 2, ali P = 1 6

AUDITORNE VJEBE

OSNOVE PROGRAMIRANJA 1

4 = 1002 * 20 = 12 * 22 = 0100 0000 1000 0000 ... 0000 0000 = 4080 0000 hex Jednaka mantisa, BE = 2, K = 2 + 127 = 129 (10000001) 6 = 1102 * 20 = 1.12 * 22 = 0100 0000 1100 0000 ... 0000 0000 = 40C0 0000 hex 1 = 12 * 20 = 0011 1111 1000 0000 ... 0000 0000 = 3F80 0000 hex K = 0 + 127 (01111111). .75 = 0.112 * 20 = 1.12 * 2-1 = 0011 1111 0100 0000 ... 0000 0000 = 3F40 0000 hex Poseban sluaj - 0: Normalizacijom broja 0 ne moe se dobiti oblik 1.xxxxx 0 = 0 0000000 0000 ... tj. kao 1.02 * 2-127

AUDITORNE VJEBE

OSNOVE PROGRAMIRANJA 1

RASPON I TONOST REALNIH BROJEVA Za sluaj realnog broja standardne tonosti karakteristika (8 bita) se moe nalaziti u intervalu [0,255]. K = 0 rezervirana je za prikaz nule K = 255 rezervirana je za prikaz beskonano velikog broja Kako je BE = K - 127, BE se moe kretati u intervalu [-126,127]. Najmanji pozitivni broj razliit od nule koji se moe prikazati je: 1.02 * 2 a najvei je: 1.111111111111111111111112 * 2127 = 3.402823669209*1038 Tonost: 24 binarne znamenke 24 log 2 x log 10 x 224 10x tj. priblino 7 prvih vaeih tonih znamenki. 24 log 2 7.224719895936
-126

1.175494350822*10

-38

Prikaz pomou brojevnog pravca:

-3.4*1038

-1.17*10-38

1.17*10-38

3.4*1038

NUMERIKE POGREKE Nemogunost koritenja svih bita kod raunanja Primjer: 0.000110 + 0.990010 0.000110 : 0.990010 :

(1.)101000110110111000101112 * 2-14 (1.)111110101110000101000112 * 2-1

Kod zbrajanje, binarne toke moraju biti poravnate: .000000000000011010001101 * 20 Samo 11 od 24 bita! +.111111010111000010100011 * 20 .111111010111011100110000 * 20 = 0,990099906921410

AUDITORNE VJEBE

OSNOVE PROGRAMIRANJA 1

REALNI BROJEVI DVOSTRUKE TONOSTI Deklaracija u programskom jeziku C: double 63 62 P Karakteristika (11 bita) 52 51 Mantisa 0

P Karakteristika Mantisa

predznak ( P=1 negativan, P=0 pozitivan) binarni eksponent + 1023 normalizirana (52+1 bit). (11 bita)

Raspon: K - [0,2047]. K = 0 rezervirana je za prikaz nule K = 2047 rezervirana je za prikaz beskonano velikog broja BE = K - 1023 BE - [-1022,1023] Najmanji pozitivni broj razliit od nule koji se moe prikazati je: 1.02 * 2 a najvei je: 1.1111.....1111112 * 21023 21024 = 1.797693134862316*10308 Tonost: 53 binarne znamenke 253 10x 53 log 2 x log 10 x 53 log 2 15.95458977019
-1022

2.225073858507*10

-308

tj. priblino 16 prvih vaeih tonih znamenki. Postoji jo i: long double 80 bita

Karakteristika: 15 bita Binarni eksponent: Karakteristika - 16383 Realne konstante 1. 2f 1.L 2.34 9e-8 8.345e+25 2.34F -1.34e5f 2.34L -2.5e-37L double float long double

AUDITORNE VJEBE

OSNOVE PROGRAMIRANJA 1

CJELOBROJNI TIP PODATAKA U CU Cjelobrojni tip podataka (integer) s obzirom na preciznost moe se deklarirati kao short ili long. U programskom jeziku C ne postoji ogranienje na duljinu short-a ili long-a ali postoje pravila: short ne moe biti dulji od int int ne moe biti dulji od long odnosno za duljinu moe se napisati short int long

PRIKAZ CIJELIH BROJEVA S PREDZNAKOM I BEZ PREDZNAKA

Signed kvalifikator oznaava da se u varijabli moe pohraniti i negativna vrijednost. Varijabla deklarirana kao unsigned (bez predznaka) moe pohraniti samo pozitivne vrijednosti to udvostruuje maksimalnu vrijednost koja u njoj moe biti pohranjena. Primjer: Broj 5 prikazan metodom dvojnog komplementa izgleda ovako: 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1

U tom sluaju vodea jedinica moe se smatrati predznakom broja (1 negativan broj). Ako se isti broj pohrani u varijablu cjelobrojnog tipa bez predznaka: 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1

U tom sluaju vodea jedinica je dio podatka (nije predznak) te je na taj nain predstavljen broj 65531.

AUDITORNE VJEBE

10

OSNOVE PROGRAMIRANJA 1

DEKLARACIJA CJELOBROJNOG (INT) TIPA:PRETVORBA TIPOVA PODATAKA

Tip rezultata aritmetikih izraza odreen je tipovima operanada u njemu. Kada se u izrazu nae vie razliitih tipova podataka, tip rezultata ovisi o definiranim pravilima za pretvorbu. Pravila pretvorbe razliitih tipova podataka u C-u orijentirana su prema viem tipu podataka. Dvije su vrste pretvorbi podataka u C-u: automatska (implicitna) zadana (eksplicitna)

Za automatsku pretvorbu vrijedi: short int -> unsigned short int -> long int -> unsigned long int -> float -> double -> long double Zadana pretvorba podataka ima vii prioritet od automatske. Opi oblik deklaracije zadane (eksplicitne) pretvorbe (eng. cast operator) glasi (tip_podatka) operand Operand moe biti varijabla ili izraz. Primjer: (int) c;

AUDITORNE VJEBE

11

OSNOVE PROGRAMIRANJA 1

Primjer: Rijeiti sljedee primjere za prevodilac koji za pohranu varijable tipa short int koristi 16 bita, a za pohranu varijable tipa long int 32 bita. long l; unsigned short int ui1=40000,ui2=40000; signed short int si1=30000,si2=30000; long int li1=30000; Primjer: l=ui1 + ui2; Rezultat 80000 (0x13880) ne moe se pohraniti u 16 bita, te u registru ostaje 0x3880. Rjeenje: l=14464 0001 0011 1000 1000 0000 3 8 8 0 (14464) /* 80000-65536=14464 */ Primjer: l=(long)ui1+(long)ui2; Cijeli brojevi bez predznaka su pomou cast operatora pretvoreni u long i njihov zbroj je long int. Rjeenje: l=80000 Primjer: l=si1 +si2; Rezultat 60000 (0xEA60) predstavlja se kao cijeli broj sa predznakom Rjeenje: l= 5536. E A 6 0 1110 1010 0110 0000 prvi bit=1 -> broj je negativan -> dvojni komplement

0001 0101 1001 1111 + 1 0001 0101 1010 0000 1 5 A 0 (5536) Primjer: l=li1 + si2; Izraz ukljuuje long int i signed int. Rezultat je long. Rjeenje: l=60000

AUDITORNE VJEBE

12

OSNOVE PROGRAMIRANJA 1

CJELOBROJNO DIJELJENJE Potrebno je obratiti pozornost i na neeljene rezultate zbog cjelobrojnog dijeljenja. Ukoliko se na primjer u realnu varijablu a eli pridruiti vrijednost od , sljedea naredba pridruivanja nee dobro raditi: a = 1 / 2; U izrazu s desne strane jednakosti postoje dva operanda cjelobrojnog tipa i operacija dijeljenja. U tom sluaju obavlja se cjelobrojno dijeljenje. Rezultat tog izraza je vrijednost 0 (uz ostatak 1). Za izbjegavanje takvih neeljenih rezultata potrebno je koristiti zadanu pretovrbu 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.;

Napomena: U prvom sluaju koritena je zadana pretvorba tipa (mogla se uporabiti i nad drugim operandom); u drugom odnosno treem sluaju, dodavanjem toke konstanta je predstavljena kao realna te se dijeljenje obavlja u realnoj domeni.

AUDITORNE VJEBE

13

OSNOVE PROGRAMIRANJA 1

PRIORITETI OPERATORA 1. 2. * + / %

Ako i izrazu ima vie operatora jednakog prioriteta, izraunavaju se slijeva nadesno. Izrazi u okruglim zagradama imaju najvei prioritet. Primjer: Koliki je rezultat izraza: 5 + 5 + 5 + 5 + 11 10 / 3 * ( 8 6 ) 10 / 3 * 2 3 * 2 6

Primjer: Koliko iznosi: a) 9 / 4 Rjeenje: 2 (cjelobrojno dijeljenje) b) 9 % 4 Rjeenje:1 (ostatak cjelobrojnog dijeljenja 9:4=2 i ostatak 1) Primjer: 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,c=3.5 Primjer: Prikazati heksadecimalno sadraj varijable tipa short u koju je pohranjena vrijednost -7. 0000000000000111 710 = 1112 (komplement) 1111111111111000 +1 1 1111111111111001 F F F 9

AUDITORNE VJEBE

14

OSNOVE PROGRAMIRANJA 1

OPERATORI S BITOVIMA & | ^ << >> ~ AND OR XOR SHIFT LEFT SHIFT RIGHT NOT

Operatori & , |, ^ su binarni (definirani nad dva bita), a operator ~ unarni (definiran nad jednim bitom). Primjer: Izraunati izraze 3 & 5, 3 | 5, 3 ^5, ~3 0000 0011 (3) & 0000 0101 (5) --------0000 0001 (1) 0000 0011 (3) | 0000 0101 (5) --------0000 0111 (7) 0000 0011 (3) ^ 0000 0101 (5) --------0000 0110 (6) ~ 0000 0011 (3) --------1111 1100 (252 ili 4) Operatori << i >> slue za pomak svih bitova vrijednosti varijable u lijevo ili u desno. Pomak bitova u varijabli za jedno mjesto u lijevo odgovara mnoenju vrijednosti varijable sa 2, dok pomak za jedno mjesto u desno rezultira dijeljenjem vrijednosti varijable sa 2. Elektronika raunala u skupu svojih strojnih naredbi u pravilu imaju naredbe za pomak vrijednosti u registru, i tako izvreno mnoenje ili dijeljenje sa viekratnikom broja 2 je bitno bre u odnosu na klasino mnoenje i dijeljenje. Broj pomaka je odreen parametrom.

AUDITORNE VJEBE

15

OSNOVE PROGRAMIRANJA 1

Primjer: Izraunati izraze 2<<1, 37>>2 0000 0010 (2), nakon pomaka u lijevo za jedno mjesto, 0000 0100 (4) (rezultat je umnoak vrijednosti sa 2) 0010 0101 (37), nakon pomaka u desno za dva mjesta, 0000 1001 (9) (cjelobrojno dijeljenje vrijednosti sa 4) Primjer: U sluaju da je podatak spremljen u jedan oktet bez bita za predznak, izraunati 128<<1 1000 0000 (128), nakon pomaka za jedno mjesto, 0000 0000 (0) Primjer: U sluaju da je podatak spremljen u jedan oktet sa bitom za predznak, izraunati 64<<1 0100 0000 (64), nakon pomaka za jedno mjesto, 1000 0000 (-128)

AUDITORNE VJEBE

16

OSNOVE PROGRAMIRANJA 1

PRIKAZ ZNAKOVA U PROGRAMSKOM JEZIKU C a) Pohrana malih cijelih brojeva b) Pohrana slova, interpunkcija, posebnih znakova Varijabla znakovnog tipa (char) moe poprimiti vrijednosti takozvanih alfanumerikih podataka, a za pohranu zauzima 1 oktet (byte). Alfanumeriki znakovi su slova, brojevi te posebni znakovi koji se mogu unijeti putem tipkovnice. Varijable znakovnog tipa mogu biti s predznakom (signed char) ili bez predznaka (unsigned char). Ponekad se radi utede memorije koriste za pohranu manjih cijelih brojeva. Raspon je sljedei: signed char [-128,127] unsigned char [0,255] Zauzima 1 byte. Deklaracije u programskom jeziku C: char unsigned char [-128, 127] [0,255]

Meunarodni standard: 7-bitni ASCII kod (American Standard Code for Information Interchange) U programskom jeziku C znakovi su pohranjeni kao brojevi koji predstavljaju ASCII vrijednost (kod) navedenog znaka. Najvanije ASCII vrijednosti: 0 znak NULL (\0) 32 praznina ( ) 48 57 znamenke 0-9 65 90 velika slova A do Z 97 122 mala slova a do z (97-65=32 razlika izmeu malog i velikog slova!) Podebljano su brojevi koje bi trebalo znati napamet.

AUDITORNE VJEBE

17

OSNOVE PROGRAMIRANJA 1

ZNAKOVNE KONSTANTE Znakovne konstante zadaju se unutar jednostrukih navodnika: char a; a = X; Primjer: Varijabli c tipa char pridruiti vrijednost slova A na razliite naine: c=A; c=65; // ASCII kod znaka A je 6510 = 4116 = 1018 c=\x41; // hexadecimalne konstante poinju sa \x c=\0101; //oktalne konstante poinju sa \0 Primjer: Varijabli c tipa char pridruiti vrijednost jednostrukog navodnika ('), te znaka \ c='\''; c='\\'; // specijalni znakovi unutar navodnika moraju imati ispred sebe znak \

Ukoliko se znakovni tip koristi za pohranjivanje jednoznamenkastih brojeva treba obratiti pozornost na to da se u varijabli znakovnog tipa ne pohranjuje brojana vrijednost tog broja. U varijabli je pohranjena ASCII vrijednost tog znaka, odnosno:

char a; a = 1;

ekvivalentno izrazu a = 49;

u varijabli a nalazi se brojana vrijednost 49, odnosno vrijednost za znak 1 u ASCII tablici. Zbog toga, ukoliko se eli dobiti stvarna brojana vrijednost varijable, potrebno je od te vrijednosti oduzeti 48. Vrijednost 48 ustvari predstavlja ASCII vrijednost znaka 0. Treba uoiti da pojedine znamenke prikazane kao znak ne odgovaraju po binarnom prikazu tim istim znamenkama prikazanim kao cijeli broj.

AUDITORNE VJEBE

18

OSNOVE PROGRAMIRANJA 1

Primjer: varijabla a tipa char sadri znamenku 7. Pretvoriti tu vrijednost u broj. Binarni sadraj varijable a iznosi 0011 0111 (ASCII vrijednost 5510). char a=7; short int broj; broj = a 48; ili broj = a '0'; ili broj= a & 0x0f; 0011 0111 (5510) 0000 1111 (0x0f) --------0000 0111 (710) Koji je binarni prikaz sadraja varijable broj? Rjeenje: 0000 0000 0000 0111

AUDITORNE VJEBE

19

OSNOVE PROGRAMIRANJA 1

OPERATOR PRIDRUIVANJA Operator pridruivanja u C-u je znak jednakosti (=). Potrebno ga je razlikovati od dvostrukog znaka (==) jednakosti koji je usporedni operator. Operator pridruivanja obavlja pridruivanje vrijednosti operanda s desne strane (r-value) operandu s lijeve strane (l-value). Razlika izmeu l-value i r-value je u tome to l-value operand mora imati dobro definiranu adresu i nakon izvravanja izraza. Moe se napisati: a = b + 3; ali ne moe b + 3 = a; U C-u postoji i viestruko pridruivanje. Primjer: a = b = c = 0; Sve tri varijable inicijaliziraju se na vrijednost 0. Prioritet pridruivanja je s desna na lijevo. Prvo se varijabi c pridruuje 0, zatim varijabli b, pa varijabli c. a = b = c + 3; Da li moe sljedee? a = b + 3 = c = d * 3; // NE MOE !!! b+3 nije l-value

U programiranju se esto nova vrijednost varijable izraunava na temelju stare vrijednosti. Zbog toga u C-u postoje skraeni izrazi pridruivanja. Operatori za skraeno pridruivanje su: Primjer: i = i + 5; moe se pisati kao: i += 5; i = i * a; moe se pisati kao: i *= a; + =, - = , * = , / = , % =

AUDITORNE VJEBE

20

OSNOVE PROGRAMIRANJA 1

Primjer: c=A; to e se ispisati naredbama: printf printf printf printf (%c,c); (%d,c); (%c,c+32); (%d,B-A)); A 65 a 1

Primjer: Zadane su dvije varijable a i b tipa char koje sadre znamenke (0-9). Napisati izraz koji e dati broj koji odgovara zbroju tih znamenki (npr. za '5' i '6' rezultat treba biti 11.) char a,b; int i; i=a-'0'+b-'0'; ili i=a+b 2*'0' ili i=a+b-96; //2*48

AUDITORNE VJEBE

21

OSNOVE PROGRAMIRANJA 1

OPERATORI POVEANJA I SMANJENJA ZA JEDAN U C-u postoje dva operatora za poveanje i smanjenje cjelobrojnih varijabli za jedan. Razlog njihovog postojanja je efikasnije izvravanje (postoje poseben procesorske instrukcije koje vrlo brzo obavljaju te operacije) !!! prefiksni (operator ispred varijable) ++a; --a; postfiksni (operator iza varijable) a++; a--;

Preporua se koritenje prefiksnih operatora zato jer su efikasniji (kod postfiksnih operatora se mora kreirati privremena varijable u koju se pohranjuje stara vrijednost operanda koja se koristi u cijelom izrazu) Primjer: a = 5; b = ++a * 2; c = b++; Nakon izvoenja ovih naredbi a ima vrijednost 6, b ima vrijednost 13 a c ima vrijednost 12 VANO !!! Primjer: ... i = 2; j = ++i; Primjer: ... i = 2; j = --i; Primjer: ... i = 2; j = i++; Primjer: ... i = 2; j = i--; i 2 1 j ? 2 i 2 3 j ? 2 i 2 1 j ? 1 i 2 3 j ? 3

AUDITORNE VJEBE

22

OSNOVE PROGRAMIRANJA 1

USPOREDNI OPERATORI Usporedni operatori usporeuju podatke. Ti podaci mogu biti konstante, varijable ili neki izrazi. U programskom jeziku C postoje slijedei usporedni operatori : Operator == > < >= <= != Opis jednako vee manje vee ili jednako manje ili jednako razliito

Usporedni operator kao rezultat daje istinu (vrijednost razliita od 0) ili la (nula). U programskom jeziku C ne postoji logiki tip podatka, ve se logike vrijednosti prikazuju pomou numerikih vrijednosti.

VELIINA OSNOVNIH TIPOVA PODATAKA Veliina osnovnih tipova podataka, odnosno koliko jedna varijabla osnovnog tipa zauzima prostora u memoriji, nije fiksna i ovisi o konkretnoj implementaciji prevodioca. Primjer razmimoilaenja u interpretaciji veliine osnovnih tipova podataka je injenica da su prevodioci firme Borland koristili 16 bita za pohranu varijable tipa int, dok se moe vidjeti iz tabele koja slijedi da Microsoft u svojem prevodiocu varijablu tipa int pohranjuje u 32 bita. Sizes of Fundamental Types (Izvod iz MSDN Library za MS Visual C++ 6.0) Type char, unsigned char, signed char short, unsigned short int, unsigned int long, unsigned long float double long double1 Size 1 byte 2 bytes 4 bytes 4 bytes 4 bytes 8 bytes 10 bytes

Poto nisu strogo propisane dimenzije tipova u C prevodiocima, programeru je na raspolaganju operator sizeof(), koji vraa veliinu u oktetima navedenog parametra. Primjer: int var; printf("%d",sizeof(char)); printf("%d",sizeof(var)); // // ispisuje 1 ispisuje 4 u MSVisualC++ 6.0

// obratite panju da sizeof u prvom ispisu ima kao argument // naziv tipa, dok je u drugom ispisu argument naziv varijable

AUDITORNE VJEBE

23

OSNOVE PROGRAMIRANJA 1

KONTROLNA NAREDBA IF Usporedni operatori obino se ukljuuju u kontrolne naredbe. Ovisno o rezultatu usporedbe naredba se izvodi ili se ne izvodi. U C-u postoje tri oblika kontrolne naredbe if. 1) jednostrana selekcija 2) dvostrana selekcija 3) viestrana selekcija Primjer: to e se ispisati sljedeim blokom naredbi za zadane vrijednosti varijabli: 1.) a = 25 i b = 4. 2.) a = 0, b = 0 if (a = b) printf (\n Vrijednost varijabli je jednaka); else printf (\n Vrijednost varijabli nije jednaka); Rjeenje: ad 1) Za a = 25 , b = 4 , nakon pridruivanja a = b, a postaje 4. Poto se blok naredbi iza if-a obavlja ako je uvjet ispunjen tj. istinit tj <> 0 ( 4 > 0 ) ispisat e se: Vrijednost varijabli je jednaka. ad 2) Nakon pridruivanja a postaje 0, pa e se ispisati: Vrijednost varijabli nije jednaka. Pitanje: to bi se ispisalo u prvom i drugom sluaju kada bi uvjet glasio (a == b)? Odgovor: Poto se radi o logikom operatoru usporedbe (a ne o pridruivanju) ispisuje se: ad 1) Vrijednost varijabli nije jednaka ad 2) Vrijednost varijabli je jednaka Vano je napomenuti: if (a = b) je ekvivalentno if ( b ).

AUDITORNE VJEBE

24

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati programski odsjeak koji e zbrojiti int varijable a i b ako je sadraj char varijable c +, oduzeti ako je sadraj varijable c - a ispisati poruku o greki ako varijabla c sadri neki trei znak. Rezultat pohraniti u varijablu r. int char a,b,r; c;

if( c == + ) r = a + b; else if( c == -) r = a - b; else printf(Pogrena operacija); } Primjer: Napisati program koji rauna koordinate sjecita pravaca. #include <stdio.h> void main () { float a1, a2, b1, b2, x, y, anaz; /* unesimo parametre pravaca*/ printf("Unesite koeficijente smjera pravaca - a1,b1,a2,b2 : "); scanf ("%f %f %f %f", &a1, &b1, &a2, &b2); printf("a1=%f b1=%f a2=%f b2=%f\n", a1,b1,a2,b2); /* izracunaj nazivnik izraza */ anaz = a1 - a2; if(anaz == 0.) { /* ako su pravci paralelni onda */ printf ("Pravci su paralelni\n"); } else { /* inace */ printf ("Nazivnik izraza: %f\n", anaz); x = (b2 - b1) / anaz; y = a1 * x + b1; printf("Koordinate sjecista su(%f,%f)\n",x, y); }

AUDITORNE VJEBE

25

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji rauna koordinate sjecita pravca i parabole. #include <stdio.h> #include <math.h> main() { float a, b, c, e, f, x1, x2, q, d, x1r, x2r, x1i, x2i; printf("Zadajte koeficijente kv.jed. a,b,c i koeficijente pravca e i f !"); scanf("%f%f%f%f%f", &a,&b,&c,&e,&f); b-=e; c-=f; d=b*b -4.0*a*c; if (d >= 0) { /* Rjesenja su realna */ q = pow (d, 1./2); x1 = (-b + q)/(2*a); x2 = (-b - q)/(2*a); printf ("X1=%f X2=%f\n", x1, x2); } else {

/* Rjesenja su konjugirano kompleksni broj q = pow(-d, 1./2); x1r = -b/(2*a) ; x2r = x1r; x1i = q/(2*a); x2i = -x1i; printf ("X1 = (%f,%f)\n", x1r, x1i); printf ("X2 = (%f,%f)\n", x2r, x2i);

*/

AUDITORNE VJEBE

26

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji od 3 unesena broja pronalazi najvei. #include <stdio.h> void main() { float x, y, z, rez; /*unos varijabli*/ printf("\n Unesite x,y,z :"); scanf("%f %f %f", &x, &y, &z); printf("%f %f %f \n", x, y, z); /* odredi najveci broj */ rez = z; /*pretpostavljamo da je on najveci*/ if ( x > y ) { if ( x > z) rez = x; } else { if ( y > z) rez = y; } printf("Najveci broj je %f \n", rez);

Primjer: Napisati program koji pronalazi srednju znamenku troznamenkastog broja. #include <stdio.h> void main ( ) { int x, rez; printf("Unesite troznamenkasti cijeli broj > "); scanf("%d",&x); if( (x<100) || (x>999) ) { else } { printf("Broj %d nije troznamenkast\n", x);

rez = x % 100; rez = rez /10; printf("Srednja znamenka broja %d je %d\n", x, rez);

AUDITORNE VJEBE

27

OSNOVE PROGRAMIRANJA 1

UVJETNI OPERATOR Uvjetni operator (?:) je ternarni operator (zahtjeva tri operanda), a koristi se u pojedinim situacijama umjesto if-else naredbi. Oblik uvjetnog operatora je : uvjetni_izraz ? izraz1 : izraz2; Ako je uvjetni_izraz istinit, izvodi se izraz1, ako je laan izvodi se izraz2. Primjer: int a, b, c; ... c = a > b ? a : b;

PRETPROCESORSKE NAREDBE ukljuuje neku drugu datoteku u program definira simboliku konstantu <stdio.h> MojeFunkcije.h PI IME_PROGRAMA 3.14159 Program

#include #define #include #include #define #define Primjer:

Koju vrijednost e poprimiti varijable? #include <stdio.h> void main() { int a, b; #define MAX(x,y) ( (x) > (y) ) ? (x) : (y) a = 3; b = MAX (3, a ++); /* a = 5, b = 4*/ a = 3; b = MAX (a++, 3); printf("A iznosi: %d, B iznosi : %d",a,b); /* a = 4, b = 3 */ }

AUDITORNE VJEBE

28

OSNOVE PROGRAMIRANJA 1

LOGIKI OPERATORI Jednostavni relacijski izrazi mogu se kombinirati u sloene pomou logikih operatora. C ukljuuje 3 logika operatora: Operator && || ! Primjer: #include <stdio.h> void main() { int x; /*unesimo x*/ printf("\n Unesite x: "); scanf("%d", &x); /*testirajmo x*/ if((x>20) && (x<100)) printf("x se nalazi u intervalu 20-100"); if((x<5) || (x>20)) printf("x se ne nalazi u intervalu 5-20"); } Primjer: to e se ispisati sljedeim programskim odsjekom? int a, b, c; a = 0; b = 4; c = (a++)+b; /*(a++) +b printf (a = %d, b = %d,c = %d , a, b, c); d = c&&b+3*a; printf (d = %d, d); if(!(x>20)) printf("x je manji ili jednak 20"); Znaenje logiko I logiko ILI logiko NE

/*

0+4 4*/ 1, 4, 4 */

Budui da je prioritet aritmetikih vei od prioriteta logikih operatora: d d d d d = = = = = c&&b + 3*a c&& (b + (3*a)) 4 && (4+(3*1)) 4 && 7 1

AUDITORNE VJEBE

29

OSNOVE PROGRAMIRANJA 1

PRIORITET OPERATORA OPERATORI () ! ~ ++ -- (tip) */% +< <= > >= == != & ^ | && || ?: = *= /= %= += -= &= ^= |= Primjer: Koji je sadraj varijable d, na kraju programa ? #include <stdio.h> void main() { short int a=4, b=2, c=8, d; d = a < 10 && 2 * b < c; /*ispisi d*/ } Primjer: Koji je sadraj varijabli a,b,i c na kraju programa ? #include <stdio.h> void main() { int a = 5, b = -1, c = 0; c = (a = c && b) ? a = b : ++c; } printf("a = %d, b = %d, c = %d: \n", a, b, c); printf("Varijabla d iznosi: %d",d);

AUDITORNE VJEBE

30

OSNOVE PROGRAMIRANJA 1

Primjer: Cjelobrojno dijeljenje brojeva u razliitoj notaciji #include <stdio.h> /* primjer zadavanja cjelobrojnih konstanti*/ void main ( ) { int x, y, rez; /*oktalno zadan cijeli broj*/ x = 010; /*heksadecimalno zadan cijeli broj*/ y = 0xF; rez = 10 + y / x; printf("Rezultat = %d\n", rez); } Primjer: to e se ispisivati kao rezultat u slijedeem zadatku. #include <stdio.h> void main () { float r, f, g; int i, j, k; short s; f = 32000.5; g = 1; i = 1; j = 2147483647; s = 32767; r = f + i; printf("%f\n", r); k = f + g; printf("%d\n", k); k = f + i; printf("%d\n", k); r = i + j; printf("%f\n", r); r = g + j; printf("%f\n", r); r = (float) i + j; printf("%f\n", r); r = (float) (i + j); printf("%f\n", r); r = s + s; printf("%f\n", r);

AUDITORNE VJEBE

31

OSNOVE PROGRAMIRANJA 1

DVOSTRANA SELEKCIJA if (logiki_izraz){ niz_naredbi_1 } else { }

niz_naredbi_2

Primjer: Napiite program koji rauna apsolutnu vrijednost zadanog broja. #include<stdio.h> void main(){ int broj,abs; printf("Unesite broj: "); scanf("%d",&broj); /*moze se napisati i kao */ if (broj < 0) { /*if (broj < 0) */ abs = -broj; /* abs = -broj; */ } else /*else */ { abs = broj; /* abs = broj; */ } printf("Apsolutna vrijednost broja %d je %d\n", broj, abs);

} Primjer:

Napiite program koji rauna povrinu kruga i ispituje vrijednost uneenog radijusa. #include<stdio.h> #define PI 3.141592 void main(){ float radijus,povrsina; printf("Unesite radijus kruga: "); scanf("%f",&radijus); if (radijus <= 0) { printf("Unijeli ste neispravan radijus!\n"); } else { povrsina=radijus*radijus*PI; } printf("Povrsina kruga je: %f\n",povrsina);

AUDITORNE VJEBE

32

OSNOVE PROGRAMIRANJA 1

Primjer: Napiite program koji ispituje djeljivost dva cijela broja. #include<stdio.h> void main(){ int a,b; printf("Unesite a i b:"); scanf("%d %d", &a, &b); if (b != 0) { if (a % b == 0) { printf("%d jest djeljiv s %d\n", a, b); } else { printf("%d nije djeljiv s %d\n", a, b); } }

AUDITORNE VJEBE

33

OSNOVE PROGRAMIRANJA 1

VIESTRANA SELEKCIJA if (logiki_izraz_1) { niz_naredbi_1 } else if (logiki_izraz_2) { niz_naredbi_2 } else if (logiki_izraz_3) { niz_naredbi_3 ... } else { niz_naredbi_0 } Primjer: Napiite program koji uitava temperaturu kotla i ispisuje odgovarajue poruke . #include <stdio.h> #define donja 50.0 #define gornja 80.0 void main(){ float temp; printf("\n Unesite temperaturu kotla: "); scanf("%f",&temp); if (temp < donja) { printf("Temperatura je pala ispod dozvoljene!\n"); } else if (temp > gornja) { printf("Temperatura je porasla iznad dozvoljene!\n"); } else { printf("Temperatura kotla OK\n"); }

AUDITORNE VJEBE

34

OSNOVE PROGRAMIRANJA 1

PETLJA S ISPITIVANJEM UVJETA PONAVLJANJA NA POETKU while(logiki_izraz) naredba ili while(logiki_izraz) { niz_naredbi } Primjer: Napiite program koji pronalazi najmanji od uitanih brojeva . #include <stdio.h> void main() { int min, x; printf("Unesite broj : "); scanf("%d", &x); /* pretpostavljamo da je prvi uneseni najmanji */ min = x; while (x != 0) { /*pocetak petlje*/ printf("Unesite broj : "); scanf("%d", &x); if(x > 0 && x < min) { min = x; } } /*kraj petlje*/ printf("Najmanji uneseni broj je %d\n", min); } Primjer: Treba ispisati povrinu kruga, ako se r mijenja od 1 do zadanog g s korakom 1. Ispis prekinuti i ako r premai vrijednost 20. #include <stdio.h> void main ( ) { float g, r=1.0f, pi=3.14159f; printf ("Unesite gornju granicu za r > "); scanf ("%f", &g); while ( (r <= g) && (r <= 20.0f)) { printf("%2.0f %10.7f\n", r, r*r*pi); r = r + 1; } }

AUDITORNE VJEBE

35

OSNOVE PROGRAMIRANJA 1

Primjer: Ispisati prvih 100 prirodnih brojeva djeljivih sa 7. #include <stdio.h> void main() { int i=0, n=0; while (n < 100) { if (i % 7 == 0) { printf ("%d\n", i); n++; } i++; }

Primjer: Uitaj pozitivan cijeli broj i izraunaj slijed brojeva na sljedei nain: ako je broj paran podijeli ga s 2, a ako je neparan pomnoi s 3 i dodaj 1. Ponavljati postupak dok broj ne postane jednak 1. U svakom koraku ispisati trenutnu vrijednost broja. Ispisati ukupan broj operacija nad uitanim brojem. #include <stdio.h> void main() { int broj, brKoraka = 0; printf("Upisi pozitivan broj:"); scanf("%d:\n", &broj); while (broj > 1) { ++brKoraka; if (broj%2){ broj = broj*3+1; } else { broj /= 2; } printf ("U %d. koraku broj = %d \n",brKoraka, broj); } printf ("Ukupno %d koraka. \n",brKoraka);

AUDITORNE VJEBE

36

OSNOVE PROGRAMIRANJA 1

PETLJA S POZNATIM BROJEM PONAVLJANJA for(i = poc; ili for (i = poc; i <= kraj; i = i + k) niz_naredbi } Uobiajeno koritenje: for (i = poc; i <= kraj; i = i + k) . . . } Primjer for petlje sa dva brojaa: for (hi = 100, lo = 0; hi >= lo; hi--, lo++) { . . . } Primjer: Napisati program koji e izraunati aritmetiku sredinu za n uitanih brojeva. #include <stdio.h> void main() { int float i, n, suma, x; arit_sred; { { i <= kraj; i = i + k) naredba;

printf("\nZa koliko brojeva elite izraunati aritmetiku sredinu : "); scanf("%d", &n ); suma = 0; for(i=0; i<n; i++) { printf("\nUnesite %d-ti broj : ", i); scanf("%d", &x); suma += x; } arit_sred = (float) suma / n; printf("\nAritmetika sredina uitanih brojeva je %f", arit_sred); }

AUDITORNE VJEBE

37

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji e ispisati realne brojeve od 0 do n s korakom od 0.1 #include <stdio.h> void main() { int n; float i; printf("\nDo kojeg broja zelite ispis :"); scanf("%d", &n ); for( i=0; i<n; i=i+0.1 ) { printf("%f\n",i); }

} Primjer:

Napisati program koji e ispisati brojeve djeljive sa 7, 13 i 19, a manje od ucitanog broja n. Brojeve treba ispisati od najveeg prema najmanjem. #include <stdio.h> void main() { int i, n; printf("Upisite broj n : "); scanf("%d", &n ); for( i=n; i > 0; i-- ) { if (( i % 7 == 0 ) || ( i % 13 == 0 ) || { printf(" %d \n", i); } }

(i % 19 == 0))

Primjer: Napisati program koji e ispisati tablicu potencija 2n i 2-n za brojeve od n od 1 do 32. #include <stdio.h> void main ( ) { short int i, x = 1; double y = 1.0; printf ( "%2d %12d %.16lf\n", 0, x, y); for( i = 1; i <= 16; i = i+1) { x = x*2; y = y/2; printf ( "%2d %12d %.16lf\n", i, x, y); }

AUDITORNE VJEBE

38

OSNOVE PROGRAMIRANJA 1

Primjer: Napiite program za raunanje faktorijela zadanog broja. #include <stdio.h> void main () { int n, i; double fakt; printf("Unesite faktorijel kojega racunate :"); scanf ("%d", &n); fakt = 1.; for (i = 1; i <= n; i = i + 1) { fakt = fakt * i; } printf ("%d! = %g\n", n, fakt);

} Primjer:

Napisati program koji e izraunati sumu reda


#include <stdio.h>

i
i =1

void main() { int i, n; double sum = 0.0; printf("\nDo kojeg n zelite izracunati sumu :"); scanf("%d", &n ); for( i=1; i<=n; i++ ) { sum += 1. / i; } } printf("\nSuma reda je : %f", sum);

AUDITORNE VJEBE

39

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji e za uitani broj ispisati da li je broj prost ili nije. #include <stdio.h> void main() { int i, n; printf("\nUcitajte prirodan broj :"); scanf("%d", &n); for( i=2; i<=n-1; i++) { if( n % i == 0 ) { printf("\n %d nije prost broj !", n); printf("\n Djeljiv je sa %d !", i); break; } if( i == n ) { /* znai da ni sa jednim nije bio djeljiv*/ printf("\n %d jest prost broj !", n); }

} } Primjer:

Napisati program koji e uitati n brojeva i ispisati koliko je od uitanih brojeva parnih a koliko neparnih. #include <stdio.h> void main() { int i, n, x, br_par=0, br_nep=0; printf("\nKoliko brojeva zelite ucitati : "); scanf("%d", &n ); for( i=0; i<n; i++ ) { printf("\nUitajte %d-ti broj : ", i ); scanf("%d", &x ); if( x % 2 == 0 ) br_par++; else br_nep++; // postaviti pitanje to sa nulom

} printf("\nParnih je bilo %d, a neparnih %d", br_par, br_nep );

AUDITORNE VJEBE

40

OSNOVE PROGRAMIRANJA 1

Primjer: Napiite program koji ispisuje ASCII tablicu na ekran. #include <stdio.h> void main() { unsigned char i; for (i=32; i<255; i++) { printf("\nASCII KOD : %3d ASCII ZNAK : %c if(((i-31))%10==0) { printf("\n"); } } ", i,i);

Primjer: Fibonaccijev niz Napisati program koji e ispisivati prvih N Fibonacci-jevih brojeva. N uitavati pomou tipkovnice. Algoritam za raunanje Fibonacci-jevih brojeva: Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2) Fibonacci(0) = Fibonacci(1) = 1

1, 1, 2, 3, 5, 8, 13, 21,...
#include <stdio.h> void main() { int N, i, f0=1, f1=1,f=1; printf ("\n Upisite broj Fibonacci-jevih brojeva : \n"); scanf ("%d",&N); for (i = 0; i <= N; i++) { if (i > 1) { f = f1 + f0; f0 = f1; f1 = f; } printf ("Fibonnaci (%d) = %d \n", i , f); } }

AUDITORNE VJEBE

41

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji e ispisati tablicu mnoenja do 100. #include <stdio.h> void main() { int i,j; for (i = 1; i <= 10; ++i) { for (j = 1; j <= 10; ++j) { printf("%3d",i*j); printf("\n"); } } } Primjer: Modificirajte prethodni primjer tako da se tablica ispisuje samo za parne brojeve. Rjeenje: Postie se dodavanjem samo jedne linije koda: #include <stdio.h> void main() { int i,j; for (i = 1; i <= 10; ++i) { for (j = 1; j <= 10; ++j) { /*ako je ovo istina, tada preskacemo ispis sa*/ /*continue i idemo dalje sa na novi korak petlje*/ if ( (i%2!=0) && (j%2!=0) ) { continue; } printf("%3d",i*j); printf("\n"); } } }

AUDITORNE VJEBE

42

OSNOVE PROGRAMIRANJA 1

PETLJA S ISPITIVANJEM UVJETA PONAVLJANJA NA KRAJU do {

. . . } while (izraz);

petlja se izvrava sve dok je zadovoljen uvjet, za razliku od npr. Pascala gdje se petlja izvrava dok se uvjet ne zadovolji (znai dok je false). petlja e se izvriti minimalno jedan put (prva provjera uvjeta ide tek nakon prvog prolaska kroz petlju)

Primjer: Napisati program koji rauna faktorijel zadanog broja. Program treba realizirati pomou do while petlje. #include <stdio.h> void main(){ int n; double fact=1; printf("Unesite faktorijel kojeg racunate : "); scanf("%d", &n); do {

fact *= n--; } while ( n > 0 );

printf("Faktorijel je %g\n", fact); }

AUDITORNE VJEBE

43

OSNOVE PROGRAMIRANJA 1

Primjer: Izraunaj aritmetiku sredinu brojeva koji se redom itaju s tipkovnice sve dok njihova suma ne premai neku zadanu gornju granicu. #include <stdio.h> void main ( ) { /* deklaracija varijabli */ int n=0, s=0, i, gg; float as; /* citanje gornje granice za sumu */ printf("\nUnesite gornju granicu sumiranja: "); scanf("%d", &gg); do {

printf("\n %d element :",n+1); scanf("%d", &i); %d ",s);

s = s + i; printf("\nTrenutna suma: n = n + 1; } while (s <= gg);

as = (float) s / n; printf("\nUkupna suma :%d Ukupno elemenata :%d Aritmet. sred.: %10.3f\n", s, n, as); }

Primjer: Kako bi izgledao program koji bi raunao sumu reda


#include <stdio.h> void main() { int i, n; float sum, prec,nova_suma,razlika; printf("\nS kojom relativnom preciznoscu zelite izraunati sumu :"); scanf("%f", &prec ); sum = 0.0; i = 1; do { nova_suma = sum + 1. / i; razlika = (nova_suma - sum) / nova_suma; sum = nova_suma; i++; } while ( razlika > prec ); printf("\nSuma reda je : %f", sum); }

i s nekom zadanom relativnom preciznou


i =1

AUDITORNE VJEBE

44

OSNOVE PROGRAMIRANJA 1

Primjer: Kako bi izgledao program koji bi raunao sumu reda preciznou #include <stdio.h> void main() { int i; float sum, prec,nova_suma,razlika; printf("\nS kojom apsolutnom preciznoscu zelite izracunati sumu :"); scanf("%f", &prec ); sum = 0.0; i = 1; do { nova_suma = sum + 1. / i; razlika = nova_suma - sum; sum = nova_suma; i++; } while ( razlika > prec ); } printf("\nSuma reda je : %f", sum);

i
i =1

s nekom zadanom apsolutnom

AUDITORNE VJEBE

45

OSNOVE PROGRAMIRANJA 1

NAREDBE ZA KONTROLU TOKA PETLJE BREAK I CONTINUE U C-u postoje dvije naredbe za kontrolu toka petlje break izlazi iz petlje continue preskae jednu iteraciju petlje i nastavlja s njenim izvoenjem Primjer: Napisati program koji e uitavati cijele brojeve s tipkovnice i postupati prema sljedeem pravilu: ako je uitani broj manji od nule treba ispisati poruku o greci i prestati sa uitavanjem brojeva. Ako je uitani broj vei od 100 treba ga zanemariti i prijei na sljedei broj, a inae treba ispisati taj broj. Prestati sa uitavanjem brojeva kada se uita 0. #include <stdio.h> void main() { int x; do { printf ("\n Upisite broj : "); scanf("%d", &x ); if (x < 0) {

printf("\n Nedozvoljena vrijednost\n"); break; /* Izlazak iz petlje */

if (x > 100) { printf("\n Zanemarujem vrijednost\n"); continue; /* Skok na novu iteraciju */ } printf ("\n Ucitani broj je : %d", x); } while (x != 0);

AUDITORNE VJEBE

46

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji e za zadani broj provjeriti da li je taj broj prost. #include <stdio.h> #include <math.h> void main() { int i, n; printf("\nUcitajte prirodan broj :"); scanf("%d", &n); for( i=2; i<= n-1; i++) { if( n % i == 0 ) { printf("\n %d nije prost broj !", n); break; } } if( i == n ) { // znai da ni sa jednim nije bio djeljiv printf("\n %d jest prost broj !", n); } }

AUDITORNE VJEBE

47

OSNOVE PROGRAMIRANJA 1

NAREDBA UVJETNOG GRANJANJA SWITCH CASE switch( izraz ){ case const_izraz1: [case const_izraz2: . . . [default : naredbeN;] }

naredbe1; naredbe2;]

moe se upotrijebiti umjesto viestrane if selekcije obratiti panju da ako se unutar case bloka ne navede kljuna rije break; nastavak programa je sljedei case blok u listi.

Primjer: Napisati program koji provjerava uneenu ocjenu i za danu vrijednost ispisuju opis ocjene na ekran, npr. za unos 1, na ekranu se ispisuje nedovoljan.

#include <stdio.h> void main() { int ocjena; printf ("Upisite ocijenu :"); scanf("%d", &ocjena); switch (ocjena) { case 1: printf("Nedovoljan\n");break; case 2: printf("Dovoljan\n");break; case 3: printf("Dobar\n");break; case 4: printf("Vrlo dobar\n");break; case 5: printf("Odlican\n");break; default: printf("Unijeli ste nepostojecu ocjenu\n"); break; }

AUDITORNE VJEBE

48

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji uitava dva broja i simbol raunske operacije, i ispisuje rezultat te raunske operacije primjenjen nad uneenim brojevima. #include <stdio.h> void main() { char operacija; int a,b,rezultat; printf ("Upisite prvi broj :"); scanf("%d", &a); printf ("Upisite drugi broj :"); scanf("%d", &b); printf ("Upisite operaciju :"); scanf("%s", &operacija); switch (operacija) { case '+': rezultat=a+b;break; case '-': rezultat=a-b;break; case '*': rezultat=a*b;break; case '/': rezultat=a*b;break; default: printf("\nUnijeli ste nepostojecu operaciju\n"); break; } printf("Rezultat je %d \n",rezultat);

Primjer: to e se ispisati sljedeim programskim odsjekom? #include <stdio.h> void main(){ int i; i = 1; while (i < 5) { if (i==3) { printf (\n Hello world %d.x!, i); continue; } else if (i==4) { printf (\n Goodbye %d.x!, i); continue; } i++; } } Rjeenje: Hello world 3.x! Hello world 3.x!

...

AUDITORNE VJEBE

49

OSNOVE PROGRAMIRANJA 1

POLJA Polje je podatkovna struktura gdje isto ime dijeli vie podataka. Pri tom svi podaci u polju moraju biti istog tipa. Elementima polja se pristupa koristei indeks, koji mora biti nenegativni cijeli broj (konstanta, varijabla, cjelobrojni izraz). Indeks elemenata je broj izmeu 0 i broja elemenata minus jedan, ukljuivo, tj. indeks [0, BrojElemenata 1]. Definicija polja u C-u: int x[20] polje od 20 cijelih brojeva char znakovi[2] polje od 2 znaka float niz[MAX] MAX je konstanta Definicija s pridjeljivanjem vrijednosti elemenata: int polje[] = {1, 2, 3}; polje[0] = 1 polje[1] = 2 polje[2] = 3 int polje[4] = {1, 2}; polje[0] = 1 polje[1] = 2 polje[2] = 0 polje[3] = 0 Pristupanje elementima polja: x[0] prvi element polja niz[i] i-ti element polja, 0 <= i <= BrojElemenata 1 niz[MAX 1] posljednji element polja Neispravno pristupanje elementima polja: int polje[10] = {0}; int x = polje[10]; float a = 1.; int x = polje[a]; int a = 1, b = 0, c = 1; int x = polje[(a && b) - c];

AUDITORNE VJEBE

50

OSNOVE PROGRAMIRANJA 1

Primjer: Na primjeru je vidljiva inicijalizacija poetnih vrijednosti niza realnih brojeva u standardnoj tonosti. #include <stdio.h> #define MAX 5 void main() { int i; /*inicijalizacija niza na konkretne vrijednosti*/ float niz[5]={12.15,54.87,12.23,78.98,90.21}; for (i=0;i<MAX;i++) { printf(" \n %d. element niza : ", i+1); printf("%4.2f",niz[i]); } } Primjer: Na primjeru je vidljiva inicijalizacija poetnih vrijednosti elemenata niza realnih brojeva na 0. #include <stdio.h> void main() { int i,broj_elemenata; /*inicijalizacija niza na nule*/ float niz[5]={0.}; for (i=0;i<5;i++) { printf(" \n %d. element niza : ", i+1); printf("%4.2f",niz[i]); } }

AUDITORNE VJEBE

51

OSNOVE PROGRAMIRANJA 1

Primjer: Pokazati unos proizvoljnog broja elemenata niza realnih brojeva. #include <stdio.h> #define MAX 5 void main() { int i,broj_elemenata; float niz[MAX]={0.}; printf(" \n Unesite broj elemenata niza : "); scanf("%d",&broj_elemenata); for (i=0;i<broj_elemenata;i++) { printf(" \n Unesite %d. element niza : ", i+1); scanf("%f",&niz[i]); } } Primjer: Kopiranje vrijednosti elemenata jednog niza u drugi. #include <stdio.h> #define MAX 10 void main() { int i,broj_elemenata; float niz1[MAX]={0.},niz2[MAX]={0.}; printf(" \n Unesite broj elemenata 1.niza : "); scanf("%d",&broj_elemenata); /*unos elementa 1. niza*/ for (i=0;i<broj_elemenata;i++) { printf(" \n Unesite %d. element niza : ", i+1); scanf("%f",&niz1[i]); } /*kopiranje elemenata 1.niza u 2.niz*/ for (i=0;i<broj_elemenata;i++) { niz2[i]=niz1[i]; } for (i=0;i<broj_elemenata;i++) { printf(" \n %d. element 1. niza : %4.2f i+1,niz1[i],i+1,niz2[i]); } } %d. element 2. niza : %4.2f ",

AUDITORNE VJEBE

52

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji vri unos brojeva u cjelobrojno polje a[] i nakon unosa rauna aritmetiku sredinu uneenih lanova niza. #include <stdio.h> /*ovdje definiramo velicinu niza*/ #define DIMENZIJA 10 void main() { int i; float suma = 0., arit_sred = 0., niz[DIMENZIJA]={0}; for (i = 0; i < DIMENZIJA; i++) { printf("\n Unesi broj: "); scanf("%f",&niz[i]); suma += niz[i]; } arit_sred = suma / DIMENZIJA; printf("Aritmeticka sredina niza je %6.2f.\n", arit_sred);

Primjer: Napisati program koji vri unos brojeva u polje cijelih brojeva a[] i nakon unosa rauna sumu neparnih lanova niza. #include <stdio.h> #define DIMENZIJA 10 void main() { int i, suma = 0, niz[DIMENZIJA]={0}; for (i = 0; i < DIMENZIJA; i++) { printf("Unesi broj: "); scanf("%d",&niz[i]); if (niz[i]%2!=0){ suma += niz[i]; } } } printf("Suma neparnih elemenata niza je %d\n", suma);

AUDITORNE VJEBE

53

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji vri unos brojeva u polje realnih brojeva a[] i nakon unosa pronalazi najmanji i najvei element niza. #include <stdio.h> #define DIMENZIJA 10 void main() { int i; float najveci,najmanji,niz[DIMENZIJA]={0}; for (i = 0; i < DIMENZIJA; i++) { printf("Unesi broj: "); scanf("%f",&niz[i]); if (niz[i]<najmanji){ najmanji= niz[i]; } if (niz[i]>najveci){ najveci= niz[i]; } } printf("\n Najmanji element niza je %f :", najmanji); printf("\n Najveci element niza je %f :", najveci); } Primjer: Napisati program koji e traiti unos niza brojeva, nakon ega e izraunati aritmetiku sredinu tog niza, te najprije ispisati brojeve manje od aritmetike sredine, a zatim one koji su vei od aritmetike sredine. #include <stdio.h> #define DIMENZIJA 10 void main() { int i; float suma = 0., arit_sred = 0., niz[DIMENZIJA]={0}; for (i = 0; i < DIMENZIJA; i++) { printf("Unesi broj: "); scanf("%f",&niz[i]); suma += niz[i]; } arit_sred = suma / DIMENZIJA; printf("Aritmeticka sredina niza je %6.2f.\n", arit_sred); for (i = 0; i < DIMENZIJA; i++) { if (niz[i] < arit_sred) { printf("%6.2f je manji od arit. sredine.\n", niz[i]); } } for (i = 0; i < DIMENZIJA; i++) { if (niz[i] > arit_sred) { printf("%6.2f je veci od arit. sredine.\n", niz[i]); } } }

AUDITORNE VJEBE

54

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji e traiti unos niza brojeva, nakon ega e zamijeniti redoslijed elemenata niza, npr. ako je uitan niz {1,5,4,6,7} novodobiveni niz treba biti {7,6,4,5,1}. #include <stdio.h> #define MAX 5 void main() { int i,n; float niz[MAX]={0.},pomocna; printf(" \n Unesite broj elemenata niza : "); scanf("%d",&n); /*unos elemenata niza*/ for (i=0;i<n;i++) { printf(" \n Unesite %d. element niza : ", i+1); scanf("%f",&niz[i]); } /*zamjena pozicija*/ for (i=0;i<n/2;i++) { pomocna=niz[i]; niz[i]=niz[n-i-1]; niz[n-i-1]=pomocna; } /*ispis novodobivenog niza*/ for (i=0;i<n;i++) { printf(" \n %d. element niza naopako : ", i+1); printf("%f",niz[i]); } }

AUDITORNE VJEBE

55

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji e uitavati prirodne brojeve u intervalu [10, 99] i brojati koliko puta je uitan koji broj. Uitavanje prekinuti kad se unese broj izvan zadanog intervala. Nakon uitavanja program treba ispisati koliko je puta uitan svaki broj iz zadanog intervala koji je uitan barem jednom. #include <stdio.h> #define DG 10 #define GG 99 void main() { int broj, i; /*deklaracija niza brojaca*/ int brojac[GG - DG + 1] = { 0 }; do { printf("\nUnesite broj u intervalu [%d, %d]: ", DG, GG); scanf("%d", &broj); if (broj >= DG && broj <= GG) { brojac[broj - DG]++; } } /*unos prestaje kada se unese vrijednost van intervala*/ while (broj >= DG && broj <= GG); /*ispis broja pojavljivanja*/ for (i = DG; i <= GG; i++) { if (brojac[i - DG] > 0) { printf("\nBroj %d se pojavio %d puta",i ,brojac[i - DG]); } } /* donja granica intervala */ /* gornja granica intervala */

AUDITORNE VJEBE

56

OSNOVE PROGRAMIRANJA 1

Primjer: Uitati prirodan broj n (0<n30). Provjeriti da li je proitana vrijednost unutar dozvoljenog intervala. Uitati niz od n cijelih brojeva. Ispisati na zaslon uitani niz. Pronai i ispisati na zaslon najvei i najmanji broj u nizu. #define MAXNIZ 30 #include <stdio.h> void main(){ int n,i; float niz[MAXNIZ],min,max; /*provjera da li je dimenzija niza OK*/ do{ printf("\nUnesite velicinu niza:"); scanf("%d",&n); } while((n<=0)||(n>30)); /*unos elemenata niza*/ for(i=0;i<n;i++){ printf("\nUnesite %d.element niza:",i+1); scanf("%f",&niz[i]); } /*maksimalni i minimalni element niza*/ min=niz[0]; max=niz[0]; for(i=0;i<n;i++){ if(niz[i]<min) {min=niz[i];} if(niz[i]>max) {max=niz[i];} } /*ispis elemenata niza*/ for(i=0;i<n;i++){ printf("\n %d.element niza je: %f",i+1,niz[i]); } /*ispis najmanjeg i najveceg elemenata niza*/ printf("\n Minimalni element niza: %f",min); printf("\n Maksimalni element niza: %f",max); }

AUDITORNE VJEBE

57

OSNOVE PROGRAMIRANJA 1

Primjer: Uitati prirodan broj n (0<n30). Provjeriti da li je proitana vrijednost unutar dozvoljenog intervala. Uitati dva niza od n realnih brojeva. Izraunati i ispisati na zaslon novi niz definiran na slijedei nain: ci=ai+bi. #define MAXNIZ 30 #include <stdio.h> void main(){ int n,i; float a[MAXNIZ],b[MAXNIZ],c[MAXNIZ]; /*provjera da li je dimenzija niza OK*/ do{ printf("\nUnesite velicinu niza:"); scanf("%d",&n); } while((n<=0)||(n>MAXNIZ)); /*unos elemenata 1. niza*/ for(i=0;i<n;i++){ printf("\nUnesite %d.element 1.niza:",i+1); scanf("%f",&a[i]); } /*unos elemenata 2. niza*/ for(i=0;i<n;i++){ printf("\nUnesite %d.element 2.niza:",i+1); scanf("%f",&b[i]); } /*suma elemenata nizova*/ for(i=0;i<n;i++){ c[i]=a[i]+b[i]; } /*ispis sume nizova*/ for(i=0;i<n;i++){ printf("\n %d.element suma je: %f",i+1,c[i]); } }

AUDITORNE VJEBE

58

OSNOVE PROGRAMIRANJA 1

Primjer: Uitati prirodan broj n (0<n100). Provjeriti da li je proitana vrijednost unutar dozvoljenog intervala. Uitati niz od n cijelih brojeva. Ispisati na zaslon uitani niz. Izraunati i ispisati na zaslon zbroj pozitivnih i negativnih elemenata niza odvojeno. #define MAXNIZ 100 #include <stdio.h> void main(){ int n,i; float niz[MAXNIZ],suma_poz,suma_neg; /*provjera da li je dimenzija niza OK*/ do{ printf("\nUnesite velicinu niza:"); scanf("%d",&n); } while((n<=0)||(n>100)); /*unos elemenata niza*/ for(i=0;i<n;i++){ printf("\nUnesite %d.element niza:",i+1); scanf("%f",&niz[i]); } /*suma pozitivnih i negativnih*/ suma_poz=0; suma_neg=0; for(i=0;i<n;i++){ if(niz[i]<0) {suma_poz=suma_poz+niz[i];} else {suma_neg=suma_neg+niz[i];} } /*ispis elemenata niza*/ for(i=0;i<n;i++){ printf("\n %d.element niza je: %f",i+1,niz[i]); } /*ispis sume pozitivnih i negativnih elemenata niza*/ printf("\n Suma pozitivnih elemenata: %f",suma_poz); printf("\n Suma negativnih elemenata: %f",suma_neg); }

AUDITORNE VJEBE

59

OSNOVE PROGRAMIRANJA 1

Primjer: Dodjeljivanje vrijednosti elementima dvodimenzionalnog niza. #include <stdio.h> #define MAXSTUP 6 #define MAXRED 3 void main() { int a[MAXRED][MAXSTUP]; /*dodjeljivanje vrijednosti*/ a[0][4]=55; a[2][1]=34; /*ispis*/ printf("\n %d",a[0][4]); printf("\n %d",a[2][1]);

} Primjer: Inicijalizacija elemenata dvodimenzionalnog niza. #include <stdio.h> #define MAXSTUP 6 #define MAXRED 3 void main() { /*deklaracija i dodjeljivanje vrijednosti*/ int a[MAXRED][MAXSTUP]={{77,55,11,33,88},{99},{66,44,22}};

/*probni ispis*/ printf("\n %d",a[0][4]); printf("\n %d",a[2][1]); printf("\n %d",a[1][2]); }

AUDITORNE VJEBE

60

OSNOVE PROGRAMIRANJA 1

Primjer: Uitati prirodan broj n (0<n10). Provjeriti da li je proitana vrijednost unutar dozvoljenog intervala. Uitati dvije realne kvadratne matrice ranga n (n redaka i n stupaca). Ispisati uitane matrice i njihov zbroj. #define MAXRED 10 #define MAXSTUP 10 #include <stdio.h> void main(){ int i,j,n; float a[MAXRED][MAXSTUP],b[MAXRED][MAXSTUP],c[MAXRED][MAXSTUP]; /*provjera da li su dimenzije matrice OK*/ do{ printf("\nUnesite dimenziju matrice:"); scanf("%d",&n); } while((n<=0)||(n>10)); /*unos elemenata prve i druge matrice*/ for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("\nMatrica 1, redak:%d stupac:%d scanf("%f",&a[i][j]); printf("\nMatrica 2, redak:%d stupac:%d scanf("%f",&b[i][j]); } } /*suma matrica*/ for(i=0;i<n;i++){ for(j=0;j<n;j++){ c[i][j]=a[i][j]+a[i][j]; } } /*ispis zbroja matrica*/ for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("\nredak:%d, stupac:%d ,suma:%d",i+1,j+1,c[i][j]); } } }

",i+1,j+1); ",i+1,j+1);

AUDITORNE VJEBE

61

OSNOVE PROGRAMIRANJA 1

Primjer: Uitati prirodan broj n (0<n15). Provjeriti da li je proitana vrijednost unutar dozvoljenog intervala. Uitati realnu kvadratnu matricu ranga n. Ispisati uitanu matricu, najvei i najmanji element matrice s pripadajuim indeksima tih elemenata. #define MAXRED 10 #define MAXSTUP 10 #include <stdio.h> void main(){ int i,j,n,min_red,min_stup,max_red,max_stup; float a[MAXRED][MAXSTUP],max,min; /*provjera da li su dimenzije matrice OK*/ do{ printf("\nUnesite dimenziju matrice:"); scanf("%d",&n); } while((n<=0)||(n>10)); /*unos elemenata matrice*/ for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("\nredak:%d stupac:%d ",i+1,j+1); scanf("%f",&a[i][j]); } } /*maksimalni i minimalni element matrice*/ min=a[0][0]; max=a[0][0]; min_red=0; min_stup=0; max_red=0; max_stup=0; for(i=0;i<n;i++){ for(j=0;j<n;j++){ /*minimalni s pozicijom*/ if(a[i][j]<min){ min=a[i][j]; min_red=i; min_stup=j; } /*maksimalni s pozicijom*/ if(a[i][j]>max) { max=a[i][j]; max_red=i; max_stup=j; } } } /*ispis max i min elemnta matrica s pozicijama*/ printf("\nredak : %d",min_red+1); printf("\nstupac: %d",min_stup+1); printf("\nMinimalni element: %f",min); printf("\nredak : %d",max_red+1); printf("\nstupac: %d",max_stup+1); printf("\nMaksimalni element: %f",max); }

AUDITORNE VJEBE

62

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji e uitati realnu matricu dimenzija 10x10 i nai najmanji element na glavnoj i najmanji na sporednoj dijagonali. #include <stdio.h> #define BR_RED 10 #define BR_STUP 10 void main() { int i, j; float mat[BR_RED][BR_STUP], min_gl, min_sp; /*najprije unesemo elemente matrice*/ printf("\nUnos elemenata matrice :\n"); for (i = 0; i < BR_RED; i++) { for (j = 0; j < BR_STUP; j++) { printf("\nUnesite element [%d][%d] : ", i, j); scanf("%f", &mat[i][j]); } } /*prije pregleda proglasimo poetnu minimalnu vrijednost*/ min_gl = mat[0][0]; /*pregledamo glavnu dijagonalu*/ for (i = 1; i < BR_RED; i++) { if (mat[i][i] < min_gl) { min_gl = mat[i][i]; } } /*prije pregleda proglasimo poetnu minimalnu vrijednost*/ min_sp = mat[0][BR_STUP-1]; /*pregledamo sporednu dijagonalu*/ for (i = 1; i < BR_RED; i++) { if (mat[i][BR_STUP-i-1] < min_sp) { min_sp = mat[i][BR_STUP-i-1]; } } /*ispiemo rezultate*/ printf("\nNajmanji element na glavnoj dijagonali je : %f", min_gl); printf("\nNajmanji element na sporednoj dijagonali je : %f", min_sp);

AUDITORNE VJEBE

63

OSNOVE PROGRAMIRANJA 1

Primjer: Skraena varijanta prethodnog primjera, sa samo jednim prolaskom kroz matricu: #include <stdio.h> #define BR_RED 3 #define BR_STUP 3 void main() { int i, j; float mat[BR_RED][BR_STUP], min_gl, min_sp; printf("\nUnos elemenata matrice :\n"); /*zatim unosimo i odmah ispitujemo unesene vrijednosti*/ for (i = 0; i < BR_RED; i++) { for (j = 0; j < BR_STUP; j++) { printf("\nUnesite element [%d][%d] : ", i, j); scanf("%f", &mat[i][j]); /*slijede testovi za inicijalizaciju pocetnih minimalnih vrijednosti*/ if (i == 0 && j == 0) { min_gl = mat[i][j]; } if (i == 0 && j == BR_STUP - 1) { min_sp = mat[i][j]; } /*testiramo da li je uneeni element dio glavne dijagonale*/ if (i == j) { /*ako jest tada ispitujemo da li je manji od prethodnog if (mat[i][j] < min_gl) { min_gl = mat[i][j]; } }

minimuma*/

} } /*ispiemo rezultate*/ printf("\nNajmanji element na glavnoj dijagonali je : %f", min_gl); printf("\nNajmanji element na sporednoj dijagonali je : %f", min_sp); }

/*testiramo da li je uneeni element dio sporedne dijagonale*/ if (i == BR_STUP - 1 - j) { /*ako jest tada ispitujemo da li je manji od prethodnog minimuma*/ if (mat[i][j] < min_sp) { min_sp = mat[i][j]; } }

AUDITORNE VJEBE

64

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji e uitati realnu matricu dimenzija 10x10 te nai sume elemenata svakog stupca i produkte elemenata svakog retka. Ispisati najmanju sumu i pripadni indeks stupca te najvei produkt i pripadni indeks retka. Sume i produkte uvati u jednodimenzionalnim poljima. #include <stdio.h> #define BR_RED 10 #define BR_STUP 10 void main() { int i, j; int min_sum_ind, max_prod_ind; float mat[BR_RED][BR_STUP]; float sum[BR_STUP], prod[BR_RED]; /* 1. varijanta unosa elemenata i racunanja suma i produkata */ for (i = 0; i < BR_RED; i++) { for (j = 0; j < BR_STUP; j++) { printf("\nUnesite element [%d][%d] : ", i, j); scanf("%f", &mat[i][j]); } } /*racunanje sume elemenata za j-ti stupac*/ for (j = 0; j < BR_STUP; j++) { sum[j] = 0; for (i = 0; i < BR_RED; i++) { sum[j] += mat[i][j]; } } /*racunanje produkta elemenata za i-ti redak*/ for (i = 0; i < BR_RED; i++) { prod[i] = 1; for (j = 0; j < BR_STUP; j++) { prod[i] *= mat[i][j]; } } /* kraj unosa elemenata i racunanja suma i produkata */ /* naci indeks stupca za najmanju sumu */ min_sum_ind = 0; for (j = 0; j < BR_STUP; j++) { if (sum[j] < sum[min_sum_ind]) { min_sum_ind = j; } } /* naci indeks retka za najveci produkt */ max_prod_ind = 0; for (i = 0; i < BR_RED; i++) { if (prod[i] > prod[max_prod_ind]) { max_prod_ind = i; } } printf("\nNajmanja suma je %f , a pripadni indeks je %d\n", sum[min_sum_ind], min_sum_ind); printf("\nNajveci produkt je %f , a pripadni indeks je %d\n", prod[max_prod_ind], max_prod_ind); }

AUDITORNE VJEBE

65

OSNOVE PROGRAMIRANJA 1

Primjer: Skraena varijanta prethodnog primjera s drugaijim uitavanjem elemenata matrice i raunanja suma i produkata: #include <stdio.h> #define BR_RED 10 #define BR_STUP 10 void main() { int i, j; int min_sum_ind, max_prod_ind; float mat[BR_RED][BR_STUP]; float sum[BR_STUP], prod[BR_RED]; /* 2. varijanta unosa elemenata i racunanja suma i produkata */ for (i = 0; i < BR_RED; i++) { prod[i] = 1; for (j = 0; j < BR_STUP; j++) { printf("\nUnesite element [%d][%d] : ", i, j); scanf("%f", &mat[i][j]); prod[i] *= mat[i][j]; if (i == 0) { sum[j] = 0; } sum[j] += mat[i][j]; } } /* kraj unosa elemenata i racunanja suma i produkata */ /*dalje isto kao u prethodnom primjeru*/ /* naci indeks stupca za najmanju sumu */ min_sum_ind = 0; for (j = 1; j < BR_STUP; j++) { if (sum[j] < sum[min_sum_ind]) { min_sum_ind = j; } } /* naci indeks retka za najveci produkt */ max_prod_ind = 0; for (i = 1; i < BR_RED; i++) { if (prod[i] > prod[max_prod_ind]) { max_prod_ind = i; } } printf("\nNajmanja suma je %f , a pripadni indeks je %d\n", sum[min_sum_ind], min_sum_ind); printf("\nNajveci produkt je %f , a pripadni indeks je %d\n", prod[max_prod_ind], max_prod_ind); }

AUDITORNE VJEBE

66

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji e uitati dimenzije realne matrice (broj redaka <= 10, broj stupaca <=15) te uitati elemente matrice. Sve elemente matrice treba promijeniti u skladu sa sljedeim pravilom: x[i][j] < 0, x[i][j] = 0, 0 < x[i][j] < 1, x[i][j] >= 1, x[i][j] = -1 / x[i][j] x[i][j] = 0, bez promjene x[i][j] = sin (x[i][j]) x[i][j] = log10 (x[i][j])

Nakon promjene treba ispisati cijelu matricu. #include <stdio.h> #include <math.h> #define MAX_RED 10 #define MAX_STUP 15 void main() { int i, j, br_red, br_stup; float mat[MAX_RED][MAX_STUP] = { 0. }; /* 1. varijanta unosa dimenzija */ /*vrtimo petlju na unosu sve dok se unese broj redaka */ /*u trazenom intervalu*/ do { printf("Upisite vrijednost za broj redaka:"); scanf("%d", &br_red); } while (br_red < 1 || br_red > MAX_RED); /*vrtimo petlju na unosu sve dok se unese broj stupaca */ /*u trazenom intervalu*/ do { printf("Upisite vrijednost za broj stupaca:"); scanf("%d", &br_stup); } while (br_stup < 1 || br_stup > MAX_STUP); /* kraj unosa dimenzija */ printf("\nUnos elemenata matrice :\n"); for (i = 0; i < br_red; i++) { for (j = 0; j < br_stup; j++) { printf("\nUnesite element [%d][%d] : ", i, j); /* Matematicki ispis indeksa matrice */ printf("\nUnesite element [%d][%d] : ", i + 1, j + 1); scanf("%f", &mat[i][j]);

AUDITORNE VJEBE

67

OSNOVE PROGRAMIRANJA 1

/*dodjeljujemo nove vrijednosti elemntu prema zadanom pravilu*/ if (mat[i][j] < 0 ) { mat[i][j] = -1 / mat[i][j]; } else if (mat[i][j] > 0 && mat[i][j] < 1) { mat[i][j] = sin (mat[i][j]); } else { mat[i][j] = log10 (mat[i][j]); }

printf("\nIspis elemenata matrice :\n"); for (i = 0; i < br_red; i++) { for (j = 0; j < br_stup; j++) { printf("\nmat[%d][%d]=%f", i, j, mat[i][j]); /* Matematicki ispis indeksa matrice*/ printf("\nmat[%d][%d]=%f", i + 1, j + 1, mat[i][j]); } printf("\n");

Primjer: Skraena varijanta unosa dimenzija matrice iz pretodnog primjera : ... /* 2. varijanta unosa dimenzija do { printf("Upisite vrijednost za scanf("%d", &br_red); printf("Upisite vrijednost za scanf("%d", &br_stup); } while (br_red < 1 || br_red > || br_stup < 1 || br_stup /* kraj unosa dimenzija */ ...

*/ broj redaka:"); broj stupaca:"); MAX_RED > MAX_STUP);

AUDITORNE VJEBE

68

OSNOVE PROGRAMIRANJA 1

Znakove je najlake unositi pomou gotove funkcije getchar() koja se nalaziu standardnoj biblioteci stdio.h Primjer: #include <stdio.h> void main() { char ch; printf("Unesite znak:"); ch=getchar(); printf("\n Unijeli ste znak '%c'\n", ch); } Za unos znakova esto se koristimo i gotovom funkcijom getche(), koja se nalazi u biblioteci conio.h Primjer: #include <stdio.h> #include <conio.h> void main() { char ch; printf("Unesite znak:"); ch=getche(); printf("\n Unijeli ste znak '%c'\n", ch); return 0;

AUDITORNE VJEBE

69

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program koji e uitati dimenziju kvadratnog dvodimenzionalnog znakovnog polja (dimenzija <= 10) te uitati elemente polja. Sve elemente polja treba promijeniti u skladu sa sljedeim pravilom: elemente iznad glavne dijagonale koji su mala slova ('a' 'z') treba pretvoriti u velika slova, a sve ostale znakove ostaviti nepromijenjene elemente na glavnoj dijagonali koji su znamenke zamijeniti znakom '#', a sve ostale znakove ostaviti nepromijenjene elemente ispod glavne dijagonale koji su velika slova ('A' 'Z') treba pretvoriti u mala slova, a sve ostale znakove ostaviti nepromijenjene Nakon promjene treba ispisati cijelo polje #include <stdio.h> #include <conio.h> #define MAX_DIM 10 void main() { int i, j, dim; char p[MAX_DIM][MAX_DIM]; do { printf("Upisite vrijednost za dimenziju polja:"); scanf("%d", &dim); } while (dim < 1 || dim > MAX_DIM); printf("\nUnos elemenata polja :\n"); for (i = 0; i < dim; i++) { for (j = 0; j < dim; j++) { printf("\nUnesite element [%d][%d] : ", i, j); p[i][j] = getche(); } } for (i = 0; i < dim; i++) { for (j = 0; j < dim; j++) { if (i == j) { /* gl. dijagonala */ if (p[i][j] >= '0' && p[i][j] <= '9') { p[i][j] = '#'; } } else if (i < j) { /* iznad gl. dijagonale */ if (p[i][j] >= 'a' && p[i][j] <= 'z') { p[i][j] -= ' '; } } else { /* ispod gl. dijagonale */ if (p[i][j] >= 'A' && p[i][j] <= 'Z') { p[i][j] += ' '; } } } } printf("\nIspis elemenata matrice :\n"); for (i = 0; i < dim; i++) { for (j = 0; j < dim; j++) { printf("%4c", p[i][j]); } printf("\n"); }

AUDITORNE VJEBE

70

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program za transponiranje matrice. Potrebno je uitati dimenzije matrice i sve elemente matrice. #include <stdio.h> #include <conio.h> #define DIMENZIJA 4 #define MAX_DIM 10 void main() { int i, j, dim, pom; int mat[MAX_DIM][MAX_DIM]; // ucitavanje velicine matrice do { printf("Upisite vrijednost za dimenziju polja:"); scanf("%d", &dim); } while (dim < 1 || dim > MAX_DIM); // ucitavanje elemenata matrice printf("\nUnos elemenata matrice :\n"); for (i = 0; i < dim; i++) { for (j = 0; j < dim; j++) { printf("Unesite element [%d][%d] : ", i, j); scanf("%d", &mat[i][j]); } } // ispis prije transponiranja printf("\n Ispis elemenata matrice prije transponiranja:\n"); for (i = 0; i < dim; i++) { for (j = 0; j < dim; j++) { printf("%3d", mat[i][j]); } printf("\n"); } // transponiranje for ( i=0; i<dim; ++i ) { for ( j=i+1; j<dim; ++j ) { pom = mat[i][j]; mat[i][j] = mat[j][i]; mat[j][i] = pom; } } // ispis nakon transponiranja printf("\n Ispis elemenata matrice nakon transponiranja : \n"); for (i = 0; i < dim; i++) { for (j = 0; j < dim; j++) { printf("%3d", mat[i][j]); } printf("\n"); } }

AUDITORNE VJEBE

71

OSNOVE PROGRAMIRANJA 1

Primjer: Napisati program za mnoenje matrica. Potrebno je uitati dimenzije matrica i sve elemente. Ispisati uitane i dobivenu matricu. #include <stdio.h> #include <conio.h> #define MAX_DIM 10 void main() { int brRed1Mat, brStup1Mat, brStup2Mat, i, j, k; int mat1[MAX_DIM][MAX_DIM], mat2[MAX_DIM][MAX_DIM], rez[MAX_DIM][MAX_DIM] = { 0 }; // ucitavanje velicina matrica do { printf("\nUnesite broj redaka prve matrice: "); scanf("%d", &brRed1Mat); printf("Unesite broj stupaca prve matrice: "); scanf("%d", &brStup1Mat); printf("Unesite broj stupaca druge matrice: "); scanf("%d", & brStup2Mat); } while ( !( brRed1Mat >0 && brRed1Mat <MAX_DIM && brStup1Mat >0 && brStup1Mat <MAX_DIM && brStup2Mat >0 && brStup2Mat <MAX_DIM ) ); // ucitavanje podataka u matrice printf("\nUnos elemenata prve matrice :\n"); for (i = 0; i < brRed1Mat; i++) { for (j = 0; j < brStup1Mat; j++) { printf("Unesite element [%d][%d] : ", i, j); scanf("%d", &mat1[i][j]); } } printf("\nUnos elemenata druge matrice :\n"); for (i = 0; i < brStup1Mat; i++) { for (j = 0; j < brStup2Mat; j++) { printf("Unesite element [%d][%d] : ", i, j); scanf("%d", &mat2[i][j]); } } // ispis ucitanih podataka printf("\nIspis elemenata prve matrice :\n"); for (i = 0; i < brRed1Mat; i++) { for (j = 0; j < brStup1Mat; j++) { printf("%3d", mat1[i][j]); } printf("\n"); } printf("\nIspis elemenata druge matrice :\n"); for (i = 0; i < brStup1Mat; i++) { for (j = 0; j < brStup2Mat; j++) { printf("%3d", mat2[i][j]); } printf("\n"); }

AUDITORNE VJEBE

72

OSNOVE PROGRAMIRANJA 1

// mnozenje matrica for (i=0; i< brRed1Mat; ++i) { for (j=0; j< brStup2Mat; ++j) { for (k=0; k< brStup1Mat; ++k) { rez[i][j] += mat1[i][k]*mat2[k][j]; } } } printf("\nIspis rezultirajuce matrice :\n"); for (i = 0; i < brRed1Mat; i++) { for (j = 0; j < brStup2Mat; j++) { printf("%4d", rez[i][j]); } printf("\n"); } } Primjer: Napisati program koji e provjeriti je li uitana rije palindrom. Rije uitavati dok korisnik ne unese Enter. Ne praviti razliku izmedju velikih i malih slova. #include <stdio.h> #include <conio.h> #define MAX_DULJINA 100 void main() { char c, c1, c2, rijec[MAX_DULJINA]; int d=-1, i, palindrom=1; // ucitavanje rijeci printf("Unesite rijec:\n"); do { ++d; c = getche(); rijec[d] = c; } while ( c != 13 && d <= MAX_DULJINA - 1 ); // da li je rijec palindrom for ( i=0; i<d/2; ++i ) { c1 = rijec[i]; c2 = rijec[d-1-i]; if ( c1 != c2 ) { palindrom = 0; break; }

// ispis rezultata if (palindrom) { printf("\nUpisana rijec je palindrom.\n"); } else { printf("\nUpisana rijec nije palindrom.\n"); }

AUDITORNE VJEBE

73

You might also like