You are on page 1of 118

Uvod u programiranje

Algoritam
Precizno opisan nain rjeenja nekog problema Jednoznano odreuje to treba napraviti Moraju biti definirani poetni objekti koji pripadaju nekoj klasi objekata na kojima se obavljaju operacije Kao ishod algoritma pojavi se zavrni objekt(i) ili rezultat(i). Konani broj koraka; svaki korak opisan instrukcijom Obavljanje je algoritamski proces

Primjer algoritma kiseljenje krastavaca


Poetni objekti:
5 kg krastavaca, 1 l alkoholnog octa (9%), 30 dag eera, 10 dag soli, kopar, papar

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 Staklenke izvaditi, obrisati i sloiti na police u smonicu Prije kuanja priekati bar 24 sata Zavrni objekti:
kiseli krastavci

Primjer algoritma runo zbrajanje dvaju vieznamenkastih dekadskih brojeva


Poetni objekti:
2 pribrojnika

Napisati dekadske brojeva tako da znamenke jedinica budu potpisane jedna ispod druge, znamenke desetica i sve ostale znamenke takoer. Ako u manjem broju ne postoji znamenka koje u veem ima, zamisliti da na tom mjestu pie 0. Zamisliti broj koji emo nazvati prijenos, i postaviti ga na vrijednost 0 Za svako teinsko mjesto, krenuvi s desna na lijevo, uiniti
Zbrojiti dvije odgovarajue znamenke i prijenos Na odgovarajue teinsko mjesto rezultata upisati znamenku jedinica tako dobivene sume Broju prijenos dodijeliti vrijednost znamenke desetica tako dobivene sume

Ako je prijenos > 0, upisati ga ispred rezultata Zavrni objekt:


zbroj

Algoritam
Instrukcije moraju biti izvedive i jednoznane Primjeri za nedoputene instrukcije:
izraunaj 5/0 uveaj x za 6 ili 7

Uinkovitost:
U konanom vremenu moe se dobiti rezultat koristei olovku i papir.

Primjeri:
Zbrajanje cijelih brojeva je uinkovito Dijeljenje realnih brojeva nije jer se moe pojaviti broj s beskonano mnogo znamenki, npr. 10/3 = 3.3333333... Algoritam postaje uinkovit tek ako se broj znamenki unaprijed ogranii

Algoritam
Algoritam je uporabljiv ako se dobije rezultat u konanom vremenu Vrijeme izvoenja mora biti "razumno"

Primjer: Algoritam koji bi izabirao potez

igraa aha tako da ispita sve mogue posljedice poteza, zahtijevao bi milijarde godina na najbrem zamislivom raunalu. Zato? 20 moguih prvih poteza bijelog 20 moguih prvih poteza crnog > 20 moguih drugih poteza bijelog > 20 moguih drugih poteza crnog itd... Za 10 poteza svakog igraa, barem 2020 kombinacija ~ 1026 Kad bi se 1 kombinacija analizirala 1 s, to je 3170979198376 godina!

Procedura

Procedura Algoritam

Postupak koji ima sva svojstva kao i algoritam, ali ne mora zavriti u konanom broju koraka jest raunalna procedura. Primjeri za proceduru:
Operacijski sustav raunala Ureiva teksta

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 Algoritmi + strukture podataka = PROGRAMI (Wirth) kako osmisliti algoritme kako strukturirati podatke kako formulirati algoritme kako verificirati korektnost algoritama kako analizirati algoritme kako provjeriti (testirati) program Postupci izrade algoritama nisu jednoznani te zahtijevaju i kreativnost. Inae bi ve postojali generatori algoritama. Znai da se (za sada?) gradivo ovog predmeta ne moe u potpunosti algoritmizirati. Koristit e se programski jezik C. Za saeti opis sloenijih algoritama moe se koristiti pseudokod.

Vrste programske podrke


Sistemska programska podrka Operacijski sustavi MS-DOS, UNIX, Linux, Windows 95, Windows 98, Windows NT, Windows 2000 Mreni programi (NFS, TCP/IP) Antivirus programi (McAffie, Sophos)

Aplikativna (namjenska, primijenjena)


Rjeava probleme specifine za neku struku Tablini kalkulatori (npr. Excel), ureivai teksta (npr. Word), mreno planiranje (npr. Project)...

Redoslijed rjeavanja manjih programa


1. Uoavanje (identifikacija) problema i postavljanje programskog zadatka 2. Oblikovanje programa (razvoj algoritma) 3. Konverzija algoritma u logiku razumljivu raunalu 4. Kodiranje (programiranje u uem smislu) 5. Upis programskog koda u raunalo 6. Prevoenje (kompilacija) programa 7. Ispravljanje formalnih pogreaka 8. Kolekcija programa (stvaranje izvrnog programa) 9. Izvoenje programa s test podacima 10. Popravljanje uoenih logikih pogreaka 11. Koritenje programa s aktuelnim podacima

Oblikovanje veih programa


Organizacija posla (tima) Primjena prikladne metodologije

Pristup odozgo na dolje (top-down) Pristup odozdo prema gore (bottom-up)


Prikazi tokova informacija Tablice odluivanja Dijagrami toka Struktogrami Pseudokodiranje

Izbor programerskih pomagala

Oblikovanje veih programa


Prikupljanje i prikaz ulaznih specifikacija i potrebnih izlaznih izvjetaja

Izrada programske dokumentacije


Dokumentacija o svakoj fazi razvoja Programska dokumentacija Komentari u kodu

Verifikacija svake faze oblikovanja

Programiranje u uem smislu


Izbor programskog jezika
FORTRAN PASCAL C C++ Visual Basic Java 4GL (4th Generation Language)

Kodiranje
Kodne liste Translatori pseudokoda u kod Pretprocesori Generatori kda

Programiranje u uem smislu


Unos izvornog programa (source code)
ASCII ureiva teksta (EDIT, vi) Ureiva teksta ugraen u radnu okolinu programera

Prevoenje izvornog programa u relokatibilni program


Poziv prevodioca (compiler) Otkrivanje pravopisnih pogreaka (sintax errors) Ispravci izvornog koda i ponovno prevoenje

Programiranje u uem smislu


Kolekcija prevedenog programa u izvrni (apsolutni) program
Poziv kolektora (LINK) Potprogramske biblioteke (stdio.h, math.h, stdlib.h, string.h) Pogreke koje otkriva kolektor

Izvoenje izvrnog programa


Zadavanje potrebnih ulaznih podataka Provjera programa na osnovi test podataka Pogreke koje se otkrivaju prilikom izvrenja (run time errors) Logike pogreke

PRIMJER

Programski zadatak pronai najvei od tri zadana broja


Pseudokod koji koristi iskljuivo termine govornog jezika

proitaj tri realna broja ispii proitane brojeve odredi najvei broj ispii naeni broj

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

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

Tablica traga

x 1 4

y -2 1

z 4 -2

rez 4 -2 4

-2

-2 4

PRIMJER - nastavak
Struktogram
po etak pro itaj x,y,z ispii x, y, z rez := z ne y > z da rez := y ne da rez := x x > y x > z ne da

ispii rez

kraj

PRIMJER - nastavak
Kd u programskom jeziku C
#include <stdio.h> void main() { float x, y, z, rez; scanf("%f %f %f", &x, &y, &z); printf("%f %f %f \n", x, y, z); /* odredi najvei broj */ rez = z; if ( x > y ) { if ( x > z) rez = x; } else { if ( y > z) rez = y; } printf("%f \n", rez); }

Opa pravila pisanja C programa

C je jezik slobodnog formata (nema pravila koja propisuju stil pisanja) mjesto poetka naredbe u retku je proizvoljno mogue i poeljno umetanje praznina i praznih redova svaka izvrna naredba mora zavravati znakom ; doputeno je stavljanje vie naredbi u istom retku. Npr: int i,n; printf("Unesite n: "); scanf("%d", &n);

Kljune rijei
kljune rijei se piu malim slovima. Npr: do for while C razlikuje velika i mala slova. Npr: sum Sum SUM

Glavna funkcija - main


u C programu mora postojati glavna (main) funkcija koja predstavlja mjesto gdje poinje izvrenje programa:
void main() { programski blok }

ili
int main() { programski blok return 0; }

Struktura C programa
/* Racunanje sume el. polja */ #include <stdio.h> #define MAX 5 float suma (int n); float dat[MAX]={2.5,2.3,0.,1.,5.}; void main() { int n; float sum; printf("Unesi broj elemenata"); scanf("%d", &n); sum = suma(n); printf("%9.2f\n", sum); }

komentar direktive pretprocesoru deklaracija glob.varijabli poetak glavne funkcije po. bloka main funkcije deklar. lokalnih varijabli

tijelo programa

kraj bloka main funkcije

Struktura C potprograma
float suma(int n) { int i; float s = 0; for(i=0; i<n; i++) s += dat[i]; return s; }

poetak bloka funkcije suma poetak bloka suma dekl. lokalnih varijabli

tijelo funkcije suma kraj bloka suma

Komentari

mogu se protezati preko 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 */

Kljune rijei

Prema ANSI standardu C ima slijedee 32 kljune rijei:


auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

Pretprocesorske naredbe
#include <stdio.h> ukljuuje u program prije prevoenja standardno zaglavlje <stdio.h> koje sadri definicije tipova i funkcijskih prototipova (na primjer printf, scanf i druge).

#define MAX 5 definira simboliku konstantu MAX i pridjeljuje joj vrijednost (npr. 5) to je veoma pogodno kod parametrizacije programa

Varijable
Openito: promjenljiv podatak (lat.variabilis-promjenljiv) U programiranju: podatak smjeten u memoriji raunala, poznate veliine, koji se moe mijenjati i kojemu je dodijeljeno ime Simboliki se prikazuje pravokutnikom uz koji stoji ime

Smjetaj u memoriji raunala

...

...

Varijable

svaka varijabla se obavezno mora deklarirati prije koritenja

int i, n; float sum;


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

novi+datum

velika i mala slova se razlikuju (imena varijabli i funkcija se obino piu malim slovom, imena simbolikih varijabli velikim) duljina moe biti proizvoljna (znaajno prvih 31 znakova) kljune rijei se ne smiju koristiti za imena varijabli ili funkcija

Osnovni tipovi podataka i prefiksi


Osnovni tipovi podataka
char int float double znakovni tip ili mali cijeli broj cjelobrojni tip realni tip realni tip u dvostrukoj preciznosti

Prefiksi ili kvalifikatori


short
long signed unsigned

- smanuje raspon cjelobrojnih vrijednosti koje varijabla moe sadravati - poveava raspon cjelobrojnihvrijednosti koje varijabla moe sadravati - dozvoljava pridruivanje pozitivnih i negativnih vrijednosti - dozvoljava pridruivanje samo pozitivnih vrijednosti

Cjelobrojne konstante
Konstante pisane u dekadskoj notaciji:

7 20 64 -110 8092 65535 34567821 34567821L -17698794l (na starim prevodiocima)


Konstante pisane u oktalnoj notaciji: 07 024 0100 0156 017634 0177777 Konstante pisane u heksadecimalnoj notaciji 0x7 0x14 0x40 0x6E 0x1F9C 0xFFFF

0xFFFFFFFF

Konstante bez predznaka piu se s U ili u na kraju 5645U 3978u 0x7EBU 0xFFFFFFFFU

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

Operatori i izrazi
Pridruivanje vrijednosti: u pseudokodu simbol := postaje u C-u simbol = npr. a := 7 a = 7; to znai naredba ? k = k + 1;
1

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 ponovo X i Y.
ZamjenaVarijabli

x y p void main () { ??? ??? ??? float x, y, p; 14.5 ??? ??? x=14.5; 14.5 -9.9 ??? y= -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); }

Ispis na zaslonu

x=14.500000, y=-9.900000 Nakon zamjene: x=-9.900000, y=14.500000

Osnovni aritmetiki operatori

Operator
+ * / %

Znaenje
zbrajanje oduzimanje mnoenje dijeljenje cjelobrojni ostatak (modulus)

Djelovanje aritmetikih operatora na cjelobrojne operande


int a, b; a = 10; b = 3;

Izraz
a a a a a + * / % b b b b b

Rezultat
13 7 30 3 1

Djelovanje aritmetikih operatora na realne operande


float a, b; a = 12.5; b = 2.;

Izraz
a a a a a + * / % b b b b b

Rezultat
14.5 10.5 25.0 6.25 pogreka

Aritmetika s razliitim tipovima operanada


AritmetikaSRazlicitimOperandima

float r, f, g; int i, j, k; f = 32000.5; g = 1; i = 1; j = 2147483647;

Izraz
r k k r r = = = = = f f f i g + + + + + i; g; i; j; j;
Kako to da ima 10 tonih znamenaka?

Rezultat
32001.5 32001 32001 -2147483648.0 2147483648.0

Eksplicitna promjena tipa operanda (CAST operator)


Neka je vrijednost 32-bitnih int) varijabli: i = 2147483647; j = 1; p = (float) i + j ; p = 2147483648.0 r = (float) (i + j); r =-2147483648.0

Kada su operandi razliitog tipa, vri se automatska pretvorba u vei (vaniji) tip:

16-bitno raunalo:
short int unsigned short int long int unsigned long int float
double long double

32-bitno raunalo:
short int unsigned short int long int unsigned long int float double long double

Prioritet osnovnih aritmetikih operatora

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

Koritenje okruglih zagrada

Koristiti okrugle zagrade ():


a) ako se eli promijeniti ugraeni redoslijed b) u sluaju vlastite nesigurnosti c) radi bolje itljivosti programa 2 + 3 / (2 * 4) - 5 * (6 % 8) -28

Primjer: Uitati vrijednosti za cjelobrojne varijable I, J


i K. Ispisati njihove vrijednosti i aritmetiku sredinu.

Struktogram
poetak deklariraj cijeli broj i, j, k deklariraj realni broj sredin proitaj brojeve i, j i k izraunaj (i + j + k) / 3

ispii("Aritmetika sredina brojeva x, x i x


iznosi x.xxxxxx", i, j, k, sredin);

svretak

Rjeenje primjera u C-u


AritmetickaSredina

#include <stdio.h> Nain prekida znakovnog void main () { niza i nastavak u novom int i, j, k; retku float sredin; scanf ("%d %d %d", &i, &j, &k); sredin = (i + j + k) / 3.; printf ("Aritmetika sredina brojeva %d, %d i" " %d iznosi %f", i, j, k, sredin); }

Rezultati testiranja programa


Ulazni podaci:

1 2 4
Ispis na zaslonu:

Aritmetika sredina brojeva 1, 2 i 4 iznosi 2.333333

Primjer: Povrina kruga


Pseudokod
poetak
definiraj PI=3.14 realni broj radijus, povrsina ispii ("Zadajte radijus kruga. . . ") uitajte (radijus) povrsina = (radijus * radijus) * PI ispii ("Povrsina kruga radijusa x.xxx je x.xxx", radijus, povrsina) kraj

Primjer: Povrina kruga


PovrsinaKrugaJednostavna #include <stdio.h> /* primjer koristenja simbolickih konstanti */ #define PI 3.14 void main ( ) { float radijus, povrsina; printf("Zadajte radijus kruga >"); scanf("%f", &radijus); /*definicija simbolicke konstante*/

povrsina = (radijus * radijus) * PI;


printf("Povrsina kruga radijusa %.3f je %.3f\n", radijus, povrsina); }

Primjer: Dijeljenje dva cijela broja


Dijagram toka

Poetak
cijeli broj x, y, rez x=8 y = 15 rez =10 + y / x rez Kraj

Primjer: Dijeljenje dva cijela broja


DijeljenjeDvaCijelaBroja

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

Rasponi razliitih tipova cijelih brojeva


Deklaracija int signed int short short int signed short int Broj bita 32 (16) 32 (16) 16 16 16 Interval brojeva [-2147483648, 2147483647] [-2147483648, 2147483647] [-32768, 32767] [-32768, 32767] [-32768, 32767] [0U, 4294967295U] [0U, 65535U] [-2147483648, 2147483647] [-2147483648, 2147483647] [-2147483648, 2147483647] [0U, 4294967295U]

unsigned int 32 (16) unsigned short int 16 long long int signed long int unsigned long int 32 32 32 32

char - znakovni tip podataka


Pohrana malih cijelih brojeva sa ili bez predznaka Pohrana slova, interpunkcija, posebnih znakova Zauzima 1 byte. Deklaracije u programskom jeziku C: char [-128, 127] unsigned char [0, 255]

Meunarodni standard: ASCII kod (American Standard Code for Information Interchange)

Znakovne konstante
'A' '\x41' '\101' '\a' znak iz ASCII tablice heksadecimalni zapis slova A oktalni zapis slova A simboliki zapis za znakove koji se ne mogu tiskati (Escape-sekvenca) znak \ ("backslash") jednostruki navodnik dvostruki navodnik

'\\' '\'' '\"'

Primjer: Ispisati neke znakove ASCII tablice kao broj i kao znak
IspisAsciiZnakova

#include <stdio.h> void main( ) { char x, y, p, q; x = 'A'; y = x + 32; p = '\n'; q = ' '; printf("%d %c %d %c %d %c\n", x, x, y, y, '0', '0'+1); printf("%d %c %d %c\n", p, p, q, q); }

Rezultati izvoenja programa

65 A 97 a 48 1 10 32

Niz znakova (string)


Navodi se unutar dvostrukih navodnika npr. "Fakultet" "Znak \\ zovemo \"backslash\"" Niz znakova uvijek zavrava NULL znakom ('\0'). Na primjer znakovni niz "Zagreb" u memoriji raunala zauzima 7 byte: Z A G R E B \0 Deklaracija u programskom jeziku C: char ime_niza[duljina_niza+1]; (kao polje znakova, paziti da se rezervira mjesto za '\0')

Pretvorba ASCII znamenke u cijeli broj


Treba uoiti da pojedine znamenke prikazane kao znak ne odgovaraju po binarnom prikazu odgovarajuem cijelom broju. Npr. znamenka 7 prikazana kao cijeli broj u 1 byteu iznosi 0000 0111, a prikazana kao ASCII znak 0011 0111. Pretvorba:
broj = znak - 48; broj = znak - '0'; broj = znak & 0x0f;

8-bitni ASCII kod


0-127 kao u 7-bitnom kodu, 128-255 prijeglasi i grafiki znakovi, ovisno o tzv. kodnoj stranici

Matematika logika
Osnovni pojam: logiki sud Moe biti istinit ili laan Primjeri:
1 < 2 je istinit 3 = 4 je laan

Osnovni ili atomni sud (atom): istinitost ili lanost utvruje se neposrednim zakljuivanjem Sloeniji sud tvori se formulama koje se sastoje od:
atoma logikih operatora zagrada

Matematika logika: osnovni operatori


Negacija
A A 1 0 0 1

Konjunkcija
A 0 1 0 1 B 0 0 1 1 A B 0 0 0 1

Disjunkcija A B A B 0 0 0 1 0 1 0 1 1 1 1 1 Ekskluzivna konjunkcija A B A B 0 0 0 1 0 1 0 1 1 1 1 0 Implikacija Dvostrana implikacija

Matematika logika: korisne ekvivalencije


S jednom varijablom i konstantama
(A) AA A1 A0 AA AA A1 A0 AA = = = = = = = = = A idempotentnost negacije A A 0 0 A 1 A 1

Matematika logika: korisne ekvivalencije


S dvije varijable
AB = BA komutativnost disjunkcije AB = BA komutativnost konjunkcije (AB) = BA de Morganov zakon (AB) = BA de Morganov zakon A(AB) = AB apsorpcija A(AB) = AB apsorpcija

S tri varijable
A(BC) A(BC) A(BC) A(BC) = = = = (AB)C (AB)C (AB)(AC) (AB)(AC) asocijativnost konjunkcije asocijativnost disjunkcije distributivnost konjunkcije distributivnost disjunkcije

Logika vrijednost
Odgovara vrijednosti logikog suda
DA ISTINITO TONO TRUE ili ili ili ili NE LANO POGRENO FALSE

U C-u ne postoji kljuna rije dok u nekim jezicima postoji poseban tip podataka tipa LOGICAL. U C-u se svaki tip podatka moe koristiti kao logiki.
TRUE FALSE <> = 0 0

Obino se u programu navodi kao simbolika konstanta


#define TRUE 1 #define FALSE 0

Usporedbeni (relacijski) operatori

Tvore atomne sudove

Operator
== != > >= < <=

Znaenje
jednako razliito vee vee ili jednako manje manje ili jednako

Logiki izraz
1 2 5 6 7 7 == 1 != 2 + 2 > 6 >= 6 < 10 <= 6

Rezultat
1 1 0 1 1 0 (Istina) (Istina) (La) (Istina) (Istina) (La)

Logiki operatori

Operator
&& || !

Znaenje
(AND, I) (OR, ILI) (NOT, NE)

Logiki izraz
1 > 3 && 2 < 4 0 1 > 3 || 2 < 4 1 !(1 > 3) 1

Rezultat
(La) (Istina) (Istina)

Koja je vrijednost logikog izraza ako cjelobrojne varijable imaju slijedee vrijednosti x=5, y=5, z=100: !( x>y && x<z )||( z<1000 && z%10==0 )
0 0 1 1 1 1 1 0 1

Primjer: Napisati program koji e utvrditi jeli neki zadani cijeli broj djeljiv s 3 ili 7

definiraj cijele brojeve x, t1, t2, test uitaj ( x )

postavi t1 na rezultat ispitivanja djeljivosti x sa 3


postavi t2 na rezultat ispitivanja djeljivosti x sa 7 test = t1 ili t2 ispii (x, test) kraj

Rjeenje u C-u

IspitivanjeDjeljivosti

#include <stdio.h> void main() { int x, t1, t2, test; scanf("%d", &x); t1 = (x - x/3*3) == 0; t2 = (x % 7) == 0; test = t1 || t2; printf("x = %d test = %d\n", x ,test); }

Naredbe za promjenu programskog slijeda (kontrolne naredbe)


Normalan programski slijed:
naredba_1 naredba_2

naredba_1 naredba_2 naredba_3

naredba_3 ...

Kontrolna naredba if - jednostrana selekcija


Pseudokd ako je logiki_izraz tada naredbe U C-u if (logiki_izraz) naredba ili if (logiki_izraz){ niz naredbi }
logiki_izraz D niz naredbi N

Kontrolna naredba if - dvostrana selekcija


Pseudokd ako je logiki_izraz tada niz_naredbi_1 inae D N logiki_izraz niz_naredbi_2 U C-u niz naredbi_1 niz naredbi_2 if (logiki_izraz){ niz_naredbi_1 } else { niz_naredbi_2 }

Primjer
Programski zadatak: Pronai najvei od tri zadana broja Pseudokod koji koristi iskljuivo termine govornog jezika

proitaj tri realna broja ispii proitane brojeve odredi najvei broj ispii naeni broj

Rjeenje u pseudokodu 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

Poboljanje prethodnog rjeenja


proitaj (x,y,z) ispii (x,y,z) {odredi najvei broj} rez := z ako je x > y tada ako je x > rez inae ako je y > rez ispii (rez) kraj

z tada := x z tada := y

Struktogram
poetak proitaj x,y,z ispii x, y, z rez := z ne y > z da rez := y ne da rez := x x > y x > z ne da

ispii rez kraj

Kd u programskom jeziku C
NajveciOdTriBroja

#include <stdio.h> void main() { float x, y, z, rez; scanf("%f %f %f", &x, &y, &z); printf("%f %f %f \n", x, y, z); /* odredi najvei broj */ rez = z; if ( x > y ) { if ( x > z) rez = x; } else { if ( y > z) rez = y; } printf("%f \n", rez); }

Zadatak: Potrebno je numerike vrijednosti triju varijabli a1, a2


i a3 pridruiti varijablama b1, b2 i b3 tako da je b1 b2 b3. zadaj: a1 = 5, a2 = 2, a3 = 8 ako je a1 a2 tada b1 := a1 b2 := a2 inae b1 := a2 b2 := a1 ako je a3 < b1 tada b3 := b2 b2 := b1 b1 := a3 inae ako je a3 < b2 tada b3 := b2 b2 := a3 inae b3 := a3 ispii (b1, b2, b3)

Rjeenje u C-u deklaracija i inicijalizacija varijabli


SortTriVarijable

#include <stdio.h> void main() { /* deklaracija varijabli */ int a1, a2, a3, b1, b2, b3; /* postavljanje poetnih vrijednosti */ a1 = 5; a2 = 2; a3 = 8;

if (a1 <= a2) { b1 = a1; b2 = a2; } else { b1 = a2; b2 = a1; } if (a3 < b1) { b3 = b2; b2 = b1; b1 = a3; } else { if (a3 < b2) { b3 = b2; b2 = a3; } else b3 = a3; } printf ("%d %d %d\n", b1, b2, b3);

Testiranje s razliitim skupovima podataka


a1 5 a2 2 a3 8 b1 2 b2 5 8
a1 8 a2 2 a3 5 b1 2 b2 8 5 b3

b3

a1 2

a2 5

a3 8

b1 2

b2 5

b3

Viestrana selekcija pomou naredbi if - else if - else


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 }

Odreivanje sjecita dvaju pravaca


Odrediti sjecite dvaju pravaca. Parametre pravaca uitati programom. Ako sjecite ne postoji, ispisati odgovarajuu poruku. Postupak:
x = (b2 - b1) / (a1 - a2) y = a1 x + b1

Rjeenje u pseudokodu
uitaj (a1,b1,a2,b2) ispii (a1,b1,a2,b2) izraunaj nazivnik izraza ako su pravci paralelni onda ispii poruku inae izraunaj x,y ispii (x,y) kraj

Rjeenje u C-u (I dio):


SjecistePravaca

#include <stdio.h> void main () { float a1, a2, b1, b2, x, y, anaz; scanf ("%f %f %f %f", &a1, &b1, &a2, &b2); printf("a1=%f b1=%f a2=%f b2=%f\n", a1, b1, a2, b2);
/* izraunaj nazivnik izraza */ anaz = a1 - a2;

Rjeenje u C-u (II dio)


if(anaz == 0.) { /* ako su pravci paralelni onda */ printf ("Pravci su paralelni\n"); } else { /* inae */ printf ("Nazivnik izraza: %f\n", anaz); x = (b2 - b1) / anaz; y = a1 * x + b1; printf("Koordinate sjecita su(%f,%f)\n", x, y); } }

Prvo testiranje programa


Ulazni podaci 1:
1 2 3 4

Ispis na zaslonu 1:

a1=1.000000 b1=2.000000 a2=3.000000 b2=4.000000 Nazivnik izraza: -2.000000 Koordinate sjecita su (-1.000000, 1.000000)

Drugo testiranje programa

Ulazni podaci 2:

1 2 1.000001 3
Ispis na zaslonu 2:
a1=1.000000 b1=2.000000 a2=1.000001 b2=3.000000 Nazivnik izraza: -0.000001 Koordinate sjecista su (-1048576.000000, -1048574.000000)
Pravi rezultat: (-1000000, -999998)

Primjer: Proitati neki troznamenkasti cijeli broj x. Ako je

uitani broj troznamenkast treba pronai srednju znamenku i ispisati proitani broj i naenu znamenku, a ako nije treba uz odgovarajuu poruku zavriti program.
proitaj cijeli broj x (x<100) (x>999) da ne

rez := x mod 100


ispii ("Broj", x, "nije troznamenkast") rez := rez / 10 ispii ("Srednja znamenka broja", x, "je", rez)

kraj programa

Realizacija u C-u
SrednjaZnamenka #include <stdio.h> void main ( ) { int x, rez; printf("Unesite troznamenkasti cijeli broj > "); scanf("%d",&x);

if( (x<100) || (x>999) ) {


printf("Broj %d nije troznamenkast\n", x); } else { rez = x % 100; rez = rez /10; printf("Srednja znamenka broja %d je %d\n", x, rez); } }

Programski odsjeak za pronalaenje srednje znamenke (jo neke mogunosti)


. . . } else { rez = ( x % 100) / 10; printf("Srednja znamenka broja %d je %d\n",x, rez); } ili . . . } else { rez = ( x - x/100*100) / 10; printf("Srednja znamenka broja %d je %d\n",x, rez); }

Programska petlja s ispitivanjem uvjeta ponavljanja na poetku


Pseudokod
dok je (logiki_izraz) | niz_naredbi

N logiki_izraz D niz_naredbi

U C-u
while(logiki_izraz) naredba ili while(logiki_izraz) { niz_naredbi }

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.

PovrsinaKruga

#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; } }

Rezultati izvoenja za g=55


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 3.1415901 12.5663605 28.2743111 50.2654419 78.5397530 113.0972443 153.9379158 201.0617676 254.4687996 314.1590118 380.1324043 452.3889771 530.9287300 615.7516632 706.8577766 804.2470703 907.9195442 1017.8751984 1134.1140327 1256.6360474

Komentirajte tonost prikazivanja 8. vaee znamenke

Komentirajte zato je petlja obavila samo 20 prolaza

Programska petlja s ispitivanjem uvjeta ponavljanja na kraju


U nekim programskim jezicima (npr. FORTRAN, PASCAL) postoji oblik: ponavljaj | niz_naredbi REPEAT...UNTIL dok ne bude (logiki_izraz)

Pseudokod za C ponavljaj | niz_naredbi dok je (logiki_izraz)

Programska petlja s ispitivanjem uvjeta ponavljanja na kraju


U C-u do naredba while (logiki_izraz); ili

do { niz_naredbi } while (logiki_izraz);


D

niz_naredbi

logiki_izraz
N

Primjer: Izraunaj aritmetiku sredinu brojeva koji se redom itaju s tipkovnice sve dok njihova suma ne premai neku zadanu gornju granicu. uitaj gornju broja n := 0 s := 0 ponavljaj uitaj i s := s + n := n+1 dok ne bude s as := s / n tiskaj( s, n, granicu gg

> gg
as )

Rjeenje zadatka u C-u


AritmetickaSredinaPunoBrojeva #include <stdio.h> void main ( ) { /* deklaracija varijabli */ int n=0, s=0, i, gg; float as; /* citanje gornje granice za sumu */ scanf("%d", &gg); do { scanf("%d", &i); s = s + i; n = n + 1; Uvjet iz pseudokoda je negiran } while (s <= gg); as = (float) s / n; printf("%d %d %10.3f\n", s, n, as); }

Programska petlja s poznatim brojem ponavljanja


Pseudokod
za i = poc do kraj (korak k) niz_naredbi naredbi niz_ i = poc, kraj, korak

U C-u
for(i = poc; i <= kraj; i = i + k) naredba; ili for (i = poc; i <= kraj; i = i + k) { niz_naredbi }

Primjer: Napisati program koji e ispisati tablicu potencija 2n i 2-n za brojeve od n od 1 do 32

PotencijeBroja2

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

Rezultati izvoenja programa


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 -32768 0 1.0000000000000000 0.5000000000000000 0.2500000000000000 0.1250000000000000 0.0625000000000000 0.0312500000000000 0.0156250000000000 0.0078125000000000 0.0039062500000000 0.0019531250000000 0.0009765625000000 0.0004882812500000 0.0002441406250000 0.0001220703125000 0.0000610351562500 0.0000305175781250 0.0000152587890625

Zato nije dobar rezultat?

Komentar rezultata izvoenja programa


Mnoenje s 10 u dekadskom sustavu: 15310 * 1010 = 153010 Mnoenje s 2 u binarnom sustavu: 1012 * 102 = 10102 to se je dogodilo? 00000000000000012 * 102 00000000000000102 * 102 ... 01000000000000002 * 102 10000000000000002 * 102 00000000000000002

Program za izraunavanje N faktorijela 1. nain


Rjeenje s programskom petljom u kojoj se uvjet ispituje na poetku uitaj (n) fakt:=1. i:=1 dok je i <= n fakt := fakt*i i := i+1 ispii (n,fakt)

Rjeenje u C-u (1.nain)


FaktorijeliPocetak

#include <stdio.h> void main () { int n, i; double fakt; scanf ("%d", &n); fakt = 1.; i = 1; while (i <= n) { fakt = fakt * i; i = i + 1; } printf ("%d! = %g\n", n, fakt); }

Program za izraunavanje N faktorijela 2. nain


Rjeenje s programskom petljom u kojoj se uvjet ispituje na kraju: ucitaj (n) fakt := 1. i := 1 ponavljaj fakt := fakt * i i := i+1 dok je i <= n ispisi (n,fakt)

Rjeenje u C-u (2. nain)


FaktorijeliKraj

#include <stdio.h> void main () { int n, i; double fakt; scanf ("%d", &n); fakt = 1.; i = 1; do { fakt = fakt * i; i = i + 1; } while (i <= n); printf ("%d! = %g\n", n, fakt); }

Program za izraunavanje N faktorijela 3. nain


Rjeenje s programskom petljom s poznatim brojem ponavljanja: uitaj (n) fakt := 1. za i = 1 do n fakt := fakt * i

ispii (n,fakt)

Program u C-u (3. nain)


FaktorijeliPoznato

#include <stdio.h> void main () { int n, i; double fakt; scanf ("%d", &n); fakt = 1.; for (i = 1; i <= n; i = i + 1){ fakt = fakt * i; } printf ("%d! = %g\n", n, fakt); }

Rezultati testiranja
Ulaz: 0 1 5 10 100 150 170 171 Rezultat 0! = 1 1! = 1 5! = 120 10! = 3628800 100! = 9.33262e+157 150! = 5.71338e+262 170! = 7.25742e+306 Floating point error: Overflow.

Unarni operatori
Operator
+ sizeof (tip) ++ -~ ! * &

Znaenje
unarni plus unarni minus zauzee memorije pretvorba tipa uveavanje za 1 umanjenje za 1 inverzija bitova logiko ne indirekcija adresni operator

Primjer
+4 / 2 -5 * 3 sizeof( int ) (cast) (double) i ++i ili k++ --j ili k-int x = ~0xFFFF; !( 5 > 2 ) *p scanf(%d,&n);

Prefix oblik:

... i = 2; j = ++i;

i 2 3

j ? 3

... i = 2; j = --i;

i 2 1

j ? 1

Postfix oblik:
... i = 2; j = i++; i 2 3 j ? 2

... i = 2; j = i--;

i 2 1

j ? 2

Binarni operatori
Operator
* / % + << >> < > <= >= == != & ^ | && ||

Znaenje
mnoenje, dijeljenje zbrajanje, oduzimanje pomak bitova u lijevo pomak bitova u desno relacijski operatori operatori jednakosti binarno AND binarno iskljuivi ili binarno ukljuivo ili logiki AND i OR

Primjer

n = n << 2; n = n >> 1;

znam & 0 f = f ^ f f = f | 0x80

Binarni operatori
Primjer: IzdvajanjeBitova
#include <stdio.h> void main () { int a, i; do { scanf ("%d", &a); for (i = 31; i >= 0; i--) { printf ("%u", (((unsigned)a & (1 << i)) >> i)); } printf ("\n"); } while (a != 0); }

Skraeno pridruivanje

i j a b d a a a a a

= = = = = = = = = =

i j a b d a a a a a

+ * / % &

7; k; (3 + 2); (c * 2); 2; b; ^ b; | b; << b; >> b;

i j a b d a a a a a

+= 7; -= k; *= 3 + 2; /= c * 2; %= 2; &= b; ^= b; |= b; <<= b; >>= b;

Odvajanje naredbi zarezom


Zarez kao operator koristi se za odvajanje naredbi obino tamo gdje je doputena samo jedna naredba. Na primjer : for ( i=0, j=60; i>j; i++, j--) { . . . }

Primjer izraunavanja faktorijela (uz koritenje novousvojenih operatora):


i=1; fakt=1.; do fakt *= i++; while (i <= n); /* ne pisati ovako! */ i =1; fakt = 1.0; do { fakt *= i++; } while (i <= n); i =1; fakt = 1.0; do { fakt *= i; } while (++i <= n);

Uvjetno pridruivanje
Primjer: U znak r pohraniti vrijednost 'Z' ako je znak c znamenka, a 'N' inae.

if (c >= '0' && c <= '9') {


r = 'Z'; } else { r = 'N'; }

r = c >= '0' && c <= '9' ? 'Z': 'N';

Prioritet do sada upoznatih operatora


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. + - sizeof (tip) ++ -- ~ ! * & * / % + << >> < <= >= > == != & ^ | && || ? : = += -= *= /= %= &= ^= |= <<= >>= ,

Prioritet do sada upoznatih operatora


Primjeri
k = !0 + 3 == 8; 1+3==8 k = !0 + (3 == 8); 1+0 k = !0 + 3; 1+3 4==8 1 1 0

You might also like