Programski jezik C - 1. deo. Struktura C-programa. Struktura programa u C-u. (materijal sa predavanja D. Vitasa)

Σχετικά έγγραφα
3.1 Granična vrednost funkcije u tački

Osnovni primer. (Z, +,,, 0, 1) je komutativan prsten sa jedinicom: množenje je distributivno prema sabiranju

DISKRETNA MATEMATIKA - PREDAVANJE 7 - Jovanka Pantović

UNIVERZITET U NIŠU ELEKTRONSKI FAKULTET SIGNALI I SISTEMI. Zbirka zadataka

Teorijske osnove informatike 1

Ispitivanje toka i skiciranje grafika funkcija

Kontrolni zadatak (Tačka, prava, ravan, diedar, poliedar, ortogonalna projekcija), grupa A

Računarska grafika. Rasterizacija linije

XI dvoqas veжbi dr Vladimir Balti. 4. Stabla

Osnovne teoreme diferencijalnog računa

Iskazna logika 3. Matematička logika u računarstvu. novembar 2012

Verovatnoća i Statistika I deo Teorija verovatnoće (zadaci) Beleške dr Bobana Marinkovića

18. listopada listopada / 13

Računarska grafika. Rasterizacija linije

IZVODI ZADACI (I deo)

IZVODI ZADACI ( IV deo) Rešenje: Najpre ćemo logaritmovati ovu jednakost sa ln ( to beše prirodni logaritam za osnovu e) a zatim ćemo

41. Jednačine koje se svode na kvadratne

(P.I.) PRETPOSTAVKA INDUKCIJE - pretpostavimo da tvrdnja vrijedi za n = k.

SISTEMI NELINEARNIH JEDNAČINA

Elementi spektralne teorije matrica

Zavrxni ispit iz Matematiqke analize 1

IZRAČUNAVANJE POKAZATELJA NAČINA RADA NAČINA RADA (ISKORIŠĆENOSTI KAPACITETA, STEPENA OTVORENOSTI RADNIH MESTA I NIVOA ORGANIZOVANOSTI)

numeričkih deskriptivnih mera.

Strukture podataka i algoritmi 1. kolokvij 16. studenog Zadatak 1

Iskazna logika 1. Matematička logika. Department of Mathematics and Informatics, Faculty of Science, University of Novi Sad, Serbia.

a M a A. Može se pokazati da je supremum (ako postoji) jedinstven pa uvodimo oznaku sup A.

MATRICE I DETERMINANTE - formule i zadaci - (Matrice i determinante) 1 / 15

PRAVA. Prava je u prostoru određena jednom svojom tačkom i vektorom paralelnim sa tom pravom ( vektor paralelnosti).

Univerzitet u Nišu Građevinsko-arhitektonski fakultet. Informatika2. 4. Ciklična algoritamska struktura 5. Jednodimenzionalno polje.

Konstruisati efikasan algoritam znači dati skup preciznih uputstava kako doći do rešenja zadatog problema Algoritmi se mogu opisivati:

IspitivaƬe funkcija: 1. Oblast definisanosti funkcije (ili domen funkcije) D f

2 tg x ctg x 1 = =, cos 2x Zbog četvrtog kvadranta rješenje je: 2 ctg x

Jednodimenzionalne slučajne promenljive

5. Karakteristične funkcije

PARCIJALNI IZVODI I DIFERENCIJALI. Sama definicija parcijalnog izvoda i diferencijala je malo teža, mi se njome ovde nećemo baviti a vi ćete je,

2log. se zove numerus (logaritmand), je osnova (baza) log. log. log =

IZVODI ZADACI (I deo)

7 Algebarske jednadžbe

Riješeni zadaci: Nizovi realnih brojeva

for <brojacka_promenljiva> := <pocetna_vrednost> to <krajnja_vrednost> do <naredba>

M086 LA 1 M106 GRP. Tema: Baza vektorskog prostora. Koordinatni sustav. Norma. CSB nejednakost

Pismeni ispit iz matematike Riješiti sistem jednačina i diskutovati rješenja sistema u zavisnosti od parametra: ( ) + 1.

Programiranje I - II deo, šk. 2008/09. g.

KVADRATNA FUNKCIJA. Kvadratna funkcija je oblika: Kriva u ravni koja predstavlja grafik funkcije y = ax + bx + c. je parabola.

Algoritmi i strukture podataka - 1.cas

5 Ispitivanje funkcija

Operacije s matricama

KOMUTATIVNI I ASOCIJATIVNI GRUPOIDI. NEUTRALNI ELEMENT GRUPOIDA.

MATEMATIKA 2. Grupa 1 Rexea zadataka. Prvi pismeni kolokvijum, Dragan ori

radni nerecenzirani materijal za predavanja

1. zadatak , 3 Dakle, sva kompleksna re{ewa date jedna~ine su x 1 = x 2 = 1 (dvostruko re{ewe), x 3 = 1 + i

Algoritmi zadaci za kontrolni

Sistemi veštačke inteligencije primer 1

Kaskadna kompenzacija SAU

Pismeni ispit iz matematike GRUPA A 1. Napisati u trigonometrijskom i eksponencijalnom obliku kompleksni broj, zatim naći 4 z.

ELEKTROTEHNIČKI ODJEL

Apsolutno neprekidne raspodele Raspodele apsolutno neprekidnih sluqajnih promenljivih nazivaju se apsolutno neprekidnim raspodelama.

Prvi pismeni zadatak iz Analize sa algebrom novembar Ispitati znak funkcije f(x) = tgx x x3. 2. Naći graničnu vrednost lim x a

Deljivost. 1. Ispitati kada izraz (n 2) 3 + n 3 + (n + 2) 3,n N nije deljiv sa 18.

INTELIGENTNO UPRAVLJANJE

Program testirati pomoću podataka iz sledeće tabele:

Trigonometrija 2. Adicijske formule. Formule dvostrukog kuta Formule polovičnog kuta Pretvaranje sume(razlike u produkt i obrnuto

Zadaci sa prethodnih prijemnih ispita iz matematike na Beogradskom univerzitetu

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

PID: Domen P je glavnoidealski [PID] akko svaki ideal u P je glavni (generisan jednim elementom; oblika ap := {ab b P }, za neko a P ).

4.7. Zadaci Formalizam diferenciranja (teorija na stranama ) 343. Znajući izvod funkcije x arctg x, odrediti izvod funkcije x arcctg x.

Pravilo 1. Svaki tip entiteta ER modela postaje relaciona šema sa istim imenom.

III VEŽBA: FURIJEOVI REDOVI

Δομημένος Προγραμματισμός (ΤΛ1006)

SKUPOVI I SKUPOVNE OPERACIJE

Algebarske strukture sa jednom operacijom (A, ): Ako operacija ima osobine: zatvorenost i asocijativnost, onda je (A, ) polugrupa

radni nerecenzirani materijal za predavanja R(f) = {f(x) x D}

EXIT. Programski jezik C - 6. deo. Funkcija exit. (materijal sa predavanja D. Vitasa)

DRUGI KOLOKVIJUM IZ MATEMATIKE 9x + 6y + z = 1 4x 2y + z = 1 x + 2y + 3z = 2. je neprekidna za a =

Cauchyjev teorem. Postoji više dokaza ovog teorema, a najjednostvniji je uz pomoć Greenove formule: dxdy. int C i Cauchy Riemannovih uvjeta.

Zadaci iz trigonometrije za seminar

Riješeni zadaci: Limes funkcije. Neprekidnost

TRIGONOMETRIJSKE FUNKCIJE I I.1.

Veleučilište u Rijeci Stručni studij sigurnosti na radu Akad. god. 2011/2012. Matematika. Monotonost i ekstremi. Katica Jurasić. Rijeka, 2011.

1. Pojam fazi skupa. 2. Pojam fazi skupa. 3. Funkcija pripadnosti, osobine i oblici. 4. Funkcija pripadnosti, osobine i oblici

APROKSIMACIJA FUNKCIJA

Klasifikacija blizu Kelerovih mnogostrukosti. konstantne holomorfne sekcione krivine. Kelerove. mnogostrukosti. blizu Kelerove.

POTPUNO RIJEŠENIH ZADATAKA PRIRUČNIK ZA SAMOSTALNO UČENJE

Numerička matematika 2. kolokvij (1. srpnja 2009.)

Univerzitet u Nišu Građevinsko-arhitektonski fakultet. Konstante, promenljive, identifikatori, operatori Biblioteka funkcija Milica Ćirić

4 Numeričko diferenciranje

Dvanaesti praktikum iz Analize 1

I.13. Koliki je napon između neke tačke A čiji je potencijal 5 V i referentne tačke u odnosu na koju se taj potencijal računa?

RIJEŠENI ZADACI I TEORIJA IZ

Trigonometrijske nejednačine

( ) ( ) 2 UNIVERZITET U ZENICI POLITEHNIČKI FAKULTET. Zadaci za pripremu polaganja kvalifikacionog ispita iz Matematike. 1. Riješiti jednačine: 4

Zadaci iz Osnova matematike

Diskretna matematika. Prof. dr Olivera Nikolić

Celi brojevi su svi nerazlomljeni brojevi, pozitivni, negativni i nula. To su

ANALIZA SA ALGEBROM I razred MATEMATI^KA LOGIKA I TEORIJA SKUPOVA. p q r F

Sume kvadrata. mn = (ax + by) 2 + (ay bx) 2.

Zadatak 2 Odrediti tačke grananja, Riemann-ovu površ, opisati sve grane funkcije f(z) = z 3 z 4 i objasniti prelazak sa jedne na drugu granu.

I Pismeni ispit iz matematike 1 I

Neka su A i B proizvoljni neprazni skupovi. Korespondencija iz skupa A u skup B definiše se kao proizvoljan podskup f Dekartovog proizvoda A B.

Matematička analiza 1 dodatni zadaci

Transcript:

Programski jezik C - 1. deo (materijal sa predavanja D. Vitasa) Struktura C-programa Struktura programa Promenljive i ključne reči Adresiranje Struktura programa u C-u Program se sastoji od funkcija. Sve funkcije imaju istu strukturu: povratni_tip ime( tipovi i imena parametara) { // početak bloka deklaracije; iskazi; // kraj bloka Glavna funkcija ima ime main 1

Promenljive Promenljiva u C-u je označena imenom. Ime je niz karaktera koji počinje slovom i koje se još naziva identifikator. Promenljiva ima adresu, tip i vrednost!!! ime adresa vrednost Primer: int n; n = n* n; ime n, adresa..., vrednost pre n = 12, posle n = 144 Promenljive Sintaksa Ime promenljive (identifikator) u C-u je niska koja počinje slovom ili _, a zatim sledi bilo koji niz slova, cifara ili _. [A-Za-z_][A-Za-z0-9_]* razlikuju se mala i velika slova dužina imena nije ograničena broj značajnih karaktera zavisi od implementacije, ali najmanje 31 za unutrašnje identifikatore (bar 6 za spoljašnje) Ključne reči U C postoje rezervisane (ili ključne) reči koje se ne mogu koristiti kao imena promenljivih: Npr. int, float, char, void, long,... struct, union, enum,... while, if, for, break, continue,... switch, default, goto,... register, static, extern,... 2

Unutrašnja memorija Podatak = 1 adresa + 1 niz bitova Bitovi su okupljeni u grupe po 8 (bajt), a zatim, u zavisnosti od mašine, u reči od 16, 32, 64 bita Svaka memorijska reč ima svoj broj: adresu u memoriji Sadržaj bajtova se kodira ASCII-kodom. Promenljive Operator adresiranja & Ako je x ime promenlljive, &x je memorijska adresa te promenljive (početak memorisjke zone koja je dodeljena promenljivoj x) Operator indirekcije (sadržaja) * Ako je (vrednost) promenljive p memorisjka adresa, onda je *p promenljiva koja je pridružena toj memorisjkoj adresi. Tada: x je *&x p je &*p Primeri strukture programa na C-u 3

Uvodni primer Potrebno je napisati program u C-u koji izračunava tablicu konverzije evra u RSD: 1 80 2 160 3 240 4 320 5 400, itd. sve do 10 evra. Evro je ~ 85 (oktobar 2005!), ali ga zaokružujemo na 80 dinara. Kako? Počinjemo tako što izračunamo koliko je dinara jedan evro, zatim dva, itd. sve do deset. Evro uzima vrednosti 1, 2,..., 10, a vrednost u dinarima se izračunava prema formuli dinar = evro * 80 Program #include <stdio.h> int main(void) { /* Tablica konverzije dinara u evre */ int evro, dinar; int pocetak, kraj, korak; pocetak = 1; kraj = 10; korak = 1; evro = pocetak; while( evro <= kraj ) { dinar = evro * 80; printf( "%d\t%d\n", evro, dinar); evro = evro + korak; return 0; 4

Program #include <stdio.h> int main(void) { /* Tablica konverzije dinara u evre */ KOMENTAR int evro, dinar; int pocetak, kraj, korak; pocetak = 1; kraj = 10; korak = 1; evro = pocetak; while( evro <= kraj ) { dinar = evro * 80; printf( "%d\t%d\n", evro, dinar); evro = evro + korak; return 0; Program #include <stdio.h> int main(void) { /* Tablica konverzije dinara u evre */ int evro, dinar; int pocetak, kraj, korak; pocetak = 1; kraj = 10; korak = 1; evro = pocetak; while( evro <= kraj ) { dinar = evro * 80; printf( "%d\t%d\n", evro, dinar); evro = evro + korak; return 0; DEKLARACIJE Program #include <stdio.h> int main(void) { /* Tablica konverzije dinara u evre */ int evro, dinar; int pocetak, kraj, korak; pocetak = 1; kraj = 10; INICIJALIZACIJE; ISKAZI DODELE korak = 1; evro = pocetak; while( evro <= kraj ) { dinar = evro * 80; printf( "%d\t%d\n", evro, dinar); evro = evro + korak; return 0; 5

Program #include <stdio.h> int main(void) { /* Tablica konverzije dinara u evre */... while( evro <= kraj ) { PETLJA ITERACIJE dinar = evro * 80; printf( "%d\t%d\n", evro, dinar); TELO PETLJE evro = evro + korak; return 0; Svaki red tablice se dobija na isti način --> ITERACIJA Smisao: ispitamo najpre uslov. Ako je tačan, izvršava se telo petlje (između {), pa se opet ispituje uslov. Ako uslov nije tačan, prelazimo na sledeći iskaz (ovde kraj). printf Iskaz printf( "%d\t%d\n", evro, dinar); se naziva funkcija printf. Njen prvi argument je format u kome će ispisati podatke. %d ukazuje da se ispisuje sledeći argument d ukazuje da će to biti ceo (decimalni) broj \t je escape-sekvenca za tabulator \n je escape-sekvenca za novi red. printf("%3d\t%6d\n", evro, dinar); je zapis brojeva fiksiranim brojem karaktera, poravnat nadesno. A pare (delovi dinara)? #include <stdio.h> int main(void) { /* Tablica konverzije dinara u evre */ float evro, dinar, kurs; int pocetak, kraj, korak; pocetak = 1; kraj = 10; korak = 1; evro = pocetak; kurs = 85.50; while( evro <= kraj ) { dinar = evro * kurs; printf( "%6.2f\t%6.2f\n", evro, dinar); evro = evro + korak; return 0; 6

Rezultat printf( "%3.0f\t%6.2f\n", evro, dinar); 1 85.50 2 171.00 3 256.50... Ako int kurs;... kurs = 85.50; => kurs = 85!!! Inverzno: kurs = 1/85.50 => kurs = 0!!! %6.2f znači: realan broj zapisan sa 6 karaktera na dve decimale. %3.0f bez decimala i bez decimalne tačke Alternativa - petlja for #include <stdio.h> int main(void) { /* Tablica konverzije dinara u evre */ int evro; for( evro = 1; evro <= 10; evro = evro + 1 ) printf( "%d %6.2f\n", evro, evro*85.50); return 0; evro = 1 evro <= 10 evro = evro + 1 - inicijalizacija - uslov - povećavanje brojača petlje Simboličke konstante #include <stdio.h> #define POCETAK 1 #define KRAJ 10 #define KORAK 1 int main(void) { /* Tablica konverzije dinara u evre */ int evro; for( evro = POCETAK; evro <= KRAJ; evro = evro + KORAK ) printf( "%d %6.2f\n", evro, evro*85.50); return 0; 7

Drugi primer Program koji čita ceo broj i ispisuje njegov kvadrat: #include <stdio.h> int main(void) { int n, m; scanf("%d", &n ); m = n * n; printf("kvadrat broja %d je:"); printf("%d\n", m ); return 0; Za n = 12, program ispisuje Kvadrat broja 12 je 144 Novi element #include <stdio.h> int main(void) { int n, m; scanf("%d", &n ); m = n * n; printf("kvadrat broja %d je:"); printf("%d\n", m ); return 0; &n - adresa promenljive n Treći primer Zadatak: Prebrojati slova u tekstu. Tekst - sekvencija ASCII-karaktera - stiže, karakter po karakter, sa standardnog ulaznog uređaja (stdin). Ulazna funkcija koja omogućava čitanje jednog karaktera je getchar( void ) 8

Treći primer Sekvenca char c; c = getchar( ); karakterskoj promenljivoj c dodeljuje vrednost pročitanog karaktera sa ulaza. Npr. ako pritisnemo dirku A (veliko A) na tastaturi, a u programu su gornji redovi, promenljiva c će sadržati vrednost 'A' (ASCII-karakter 65) Treći primer Program treba da broji karaktere sve do kraja teksta. Neka karakter '.' (tačka) označava kraj teksta. Takođe, neka program pravi razliku između blankokaraktera (razmak, ' ') i ostalih karaktera. Broj blanko-karaktera će biti upamćen u promenljivoj blanko, a broj ostalih karaktera u promenljivoj ostalo. Treći primer /* Brojanje.c - Program prebrojava karaktere */ #include <stdio.h> #define BLANKO ' ' #define TACKA '.' main(){ int blanko = 0, ostali = 0; char c; c = getchar(); while( c!= TACKA ) { if( c == BLANKO ) blanko = blanko + 1; else ostali = ostali + 1; c = getchar(); printf("tekst sadrzi %d blanko i %d ostalih karaktera\n",blanko,ostali); 9

Treći primer /* Brojanje.c - Program prebrojava karaktere */ ---> komentar #include <stdio.h> #define BLANKO '_' ---> makro-definicija za razmak (blanko) #define TACKA '.' ---> makro-definicija za tacku main(){ int blanko = 0, ostali = 0; ---> deklaracije sa inicijalizacijom char c; ---> deklaracija karakterske promenljive c = getchar(); ---> ucitavanje karaktera sa tastature while( c!= TACKA ) { ----> sve dok nije TACKA if( c == BLANKO ) blanko = blanko + 1; ---> ako je BLANKO... else ostali = ostali + 1; ---> ako nijje BLANKO.. c = getchar(); ---> procitajmo sledeci karakter printf("tekst sadrzi %d blanko i %d ostalih karaktera\n",blanko,ostali); Treći primer Unosimo sledeći tekst: Ovo je tekst. Program čita prvi karakter O, koji nije ni tačka, ni blanko, pa će povećati promenljivu ostali za 1. Slično i za karaktere v i o, pa promenljiva ostali dobija vrednost 3. Sledeći karakter je blanko, pa će i promenljiva blanko dobiti vrednost 1. Proces se nastavlja sve dok se ne pročita karakter opisan kao TACKA. Tada se izlazi iz whilepetlje i program ispisuje rezultat: Tekst sadrzi 3 blanko i 10 ostalih karaktera Varijacije Iskaz dodele blanko = blanko + 1; se može zapisati i drukčije: (a) blanko++; (b) blanko += 1; Slično i za promenljivu ostali. Kako iskaz dodele ima vrednost, vrednost iskaza c=getchar() će biti pročitani karakter. Zbog toga, se učitavanje može potisnuti u uslov petlje: while( ( c = getchar() )!= TACKA )... 10

Varijacije Sada se program može zapisati i na sledeći način: /* Brojanje.c - Program prebrojava karaktere */ #include <stdio.h> #define BLANKO ' ' #define TACKA '.' main(){ int blanko = 0, ostali = 0; char c; while( ( c = getchar() )!= TACKA ) { if( c == BLANKO ) blanko++; else ostali++; printf("tekst sadrzi %d blanko i %d ostalih karaktera\n",blanko,ostali); Primer za & i * (primer03.c) /* x = *&x; p = &*p */ main(){ int x, *p; p = &x; /* format %p je za adresu */ printf("adresa od x = %p = %p = %p\n", p, &x, &*p ); /* Dodela vrednosti = konstanta */ x = 1; printf("vrednost od x = %c = %c = %c\n", x, *p, *&x ); Rezultat: Adresa od x = 001D17 = 001D17 = 001D17 Vrednost od x = 1 = 1 = 1 Elementarni tipovi Šta je tip? Celobrojni tip Realni tip Karakterski tip Logički tip - neekspliciran u C-u 11

Tipovi Svaka promenljiva ima svoj tip. Promenljiva se deklariše sa svojim tipom: npr. int n; float evro; Osnovni (elementarni) tipovi su: char - karakterski tip int - celobrojni tip float - realni (u pokretnom zarezu) double - realni dvostruke tačnosti Postoje i složeniji tipovi (nizovi, strukture). Celobrojni tip Tip int se predstavlja sa 16 ili 32 bajta (u zavisnosti od mašine <limits.h>) Sa 16 bitova, vrednosti idu od -2 15 = 32768 do 2 15-1 = 32767 Sa 32 bita, vrednosti idu od -2 31 do 2 31-1 Operacije su +, -, *, / (celobrojno deljenje), % (ostatak pri deljenju). Celobrojni tip (nastavak) Operatori + : N N N <= : N N {,T Uslovi ( a + b ) + c = a + ( b + c ),... a b i b c a c,... Implementacija x = 547 10 BIN(547)= 0000001000100011 -x = -547 10 BIN(2 16 +547) = 1111110111011101 12

Celobrojni tip (nastavak) a N a + ( - a ) = 0 = 2 n (n - broj bitova) jer onda -a = 2 n -a= 2 0 + 2 1 +...+ 2 n-1 -a + 1 = (11...1111) 2 -a + 1 Celobrojni tip Kako deklarator int zavisi od implementacije, prenosivost programa se obezbeđuje deklaratorima short, koji se uvek predstavlja sa 2 bajta long, koji se uvek predstavlja sa 4 bajta Celobroji tip Modifikacija interne reprezentacije se može postići deklaratorima signed - binarni sadržaj sadržaj se interpretira kao označeni ceo broj ili unsigned - binarni sadržaj sadržaj se interpretira kao neoznačeni ceo broj (>=0) 13

Realni tip Realni broj x se predstavlja u pokretnom zarezu (zapeta, tačka) pomoću dva cela broja m i e: m (mantisa) m [-M, M], M > 0 e (eksponent) e [-E, E], E > 0 B (osnova) - je 2 x = m * B e Normalizovana mantisa: M/B < m < M Gustina: [0.1, 1] ima isto "realnih" brojeva kao i [10 4, 10 5 ] za osnovu B = 10. Realni tip (nastavak) Operatori su +, -, *, /,... + : R R R <= : R R {,T Uslovi uređeno telo Postoji konverzija između različitih tipova. Npr. ako je x float, x + 1 je float. Opseg: od 10-38 do 10 +38 Karakteristike implementacije Realni tip (nastavak) Tip float se predstavlja sa 32 bita u obliku (normalizovane) mantise i eksponenta. standard IEEE: x = ( -1 ) s. 2 E - 127. 1,F s - znak, E - eksponent, 1,F - normalizovana mantisa 24 bita za mantisu ==> 6 značajnih cifara (bez obzira na eksponent) znak mantise - 1 bit, eksponet - 8 bitova, mantisa - 23 bita 14

Realni tip (nastavak) 0,8 = (-1) 0. 2 126-127. 1,10011001100 2 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0,75 = (-1) 0. 2 126-127. 1,100 2 0 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,8-0,75 0 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0,05 = (-1) 0. 2 122-127. 1,10011001100 2 0 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 Realni tip (nastavak) float x, y; Kada je x == y? epsilon mašine to je najmanji r takav da je 1 + r!= 1 <float.h> - definicija konstanti za realni tip koje zavise od implementacije (maksimalni eksponent, preciznost, itd.) Karakterski tip Tip char se predstavlja jednim bajtom. To su karakteri opisani ASCII-kodom. Svaki karakter je i broj! Oprezno: '0' je 48, a '\0' je nula! Neki kontrolni karakteri se zapisuju na poseban način: '\n' '\r' '\t' Niske karaktera se pišu kao "Zdravo!\n" 15

Karakterski tip... podskup tipa celih brojeva... zavisi od implementacije (a) {-128,..., +127 (signed char) (b) {0,..., +255 (unsigned char) Operacije - kao za cele brojeve Posebne funkcije ( <ctype.h> ) Karakterski tip (primer25.c) kod nekih kompilatora /* Ako se stavi a <= 127, u poslednjem prolazu: * 127 + 1 = -128; pa imamo beskonacnu petlju */ char a; for( a = -128; a < 127; a++) printf("%d %c\n", a, a );? Šta se dešava ako: unsigned char x; for( x = 0; x < 255 ; x++) printf("%d %c\n", x, x );? Karakterske konstante 1. karakter pod navodnikom 'A', '1' 2. karakter kao ceo dekadni broj: 65, 49 3. karakter kao oktalni broj: '\101', '\61' 4. karakter kao heksadecimalni: '\x41', '\x31' 5. Escape-sekvence za grafičke karaktere? - '\?' " - '\"' \ - "\\" ' - '\'' Primer: '*' = 42 = '\52 ' = '\x2a' 16

Karakterske konstante int main( void ) { char a, b; a = 'A'; b = 65; printf(" %ch! %ch! \n", a, b ); printf(" %c %d\n", a, a ); rezultat: Ah! Ah! A 65 Logički tip Ne postoji eksplicitni logički tip kao što je boolean u Paskalu vrednost 0 je netačno, a 0 tačno Struktura izraza Aritmetički izrazi Logički izrazi Izrazi 17

Izrazi Sintaksa izraza ; izraz; Izrazi se konstruišu koristeći imena promenljvih i, konstanti koristeći operatore i to: aritmetičke operatore +, *, -, /,... relacione operatore >, >=, ==,!=, <, <=,... logičke operatore: && (i), (ili),! (ne) Izraz ima tip: char, int, float... Izraz ima vrednost: rezultat izračunavanja Izraz može imati akciju (bočni efekat) Izračunavanje izraza Izrazi se izračunavaju primenom 1. pravila o prioritetu i asocijativnosti operatora 2. pravila koja definišu tip podizraza 3. vrednost izraza zavisi od tipa elemenata koji u njemu učestvuju Primer. a = 5; b = a/2; Ako su a, b int, b = 2; Ako su a, b float, b = 2.5 Primeri char c; int i, j: float x; i - j je tipa int i * x je tipa float i + c je tipa int '2' < 'A' je neki ceo broj (1, tačno) 18

Aritmetički izrazi Primer (K&R): Pretvoriti temperaturu datu u Farenhajtima u Celzijuse. Formula je C = ( F - 32 ) * 5./9 Npr. 100 F = 37.8 C Program F -> C int main(void) { float F, C; printf("zadati temperaturu u Farenhajtima: "); scanf("%f",&f); C = (F - 32) * 5. / 9; printf("vrednost u Celzijusima": %3.1f\n",C); return 0; Zadati temperaturu u Farenhajtima: 100 &F <- 100; &C <- (F-32) * 5 / 9 = 37.7777 Vrednost u Celzijusima: 37.8 (zaokruženo na jednu decimalu) Aritmetički izrazi Izraz se izračunava prema pravilima o prioritetu i asocijativnosti C = (F - 32) * 5. / 9; * i / su istog prioriteta, koji je veći od prioriteta -. 19

Logički izrazi Logičke vrednosti se u C-u predstavljaju kao 0 (netačno) i 1 (tačno; zapravo 0 je tačno) Logički izraz se obrazuje od relacionih operatora (>, ==,...) i logičkih operatora. Logički operatori && 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 "Lenjo" izračunavanje Logički izraz se izračunava "lenjo": Ako je A tačno, onda je A B tačno, a B se ne izračunava; Ako je A netačno, onda je A && B netačno, a B se ne izračunava Ovo je opasno ako se nema u vidu! Primer main() { boolean x,y,z; int a = 1, b = 2, c = 3; x = 1; y = 0; z = x &&!y; printf(" %d\n", z ); /* Izlaz je 1 */ /* Lenjo izracunavanje logickog izraza */ x =!(a >= b); y = b == c; z = x!y; printf(" %d\n", z ); /* Izlaz je 1 */ 20

Pregled iskaza u C-u Blok Izraz dodele, slaganje (kompozicija) iskaza Uslovni iskazi i izrazi; složeno grananje Iterativni iskazi Deklaracije U C-u se deklaracije i iskazi okupljaju u blokove oblika: { lista deklaracja lista iskaza BLOK Deklaracija je oblika: tip ime; npr. int a; ili oblika tip ime = vrednost; (inicijalizacija), npr. int a = 1; Izraz dodele... je osnovni mehanizam u programiranju koji dopušta da se promeni vrednost neke promenljive: x = e; dodeljuje promenljivoj x vrednost izraza e. S leve strane iskaza dodele mora biti adresa (L-value). 21

Lvalue i Rvalue Ako jedan izraz ima tip i vrednost, ali mu nije pridružena adresa, on predstavlja Rvalue (desna strana, npr, dodele) Ako izraz ima tip, vrednost i adresu onda on može biti Lvalue (npr. leva strana dodele) Na primer, u izrazu x = y = 2*x+y, izraz 2*x+y će imati vrednost i tip (u zavisnosti od vrednosti i tipa x i y), ali ne i adresu, pa ne može biti Lvalue Sekvencije iskaza Iskazi se dopisuju jedan na drugi, a razdvaja ih simbol ; iskaz1; iskaz2; iskaz3; Primeri iskaza dodele 1. i = i + 1; /* povećava vrednost i za 1 */ Alternativno: i++; 2. Swap (trampa) int x, y, temp; // x = 1, y = 2 temp = x; // temp = x = 1 x = y; // x = 2 y = temp; // y = 1 3. Alternativa: x = x + y; // x = 2 + 1 = 3 y = x - y; // y = 3-2 = 1 x = x - y; // x = 3-1 = 2 22

Uslovni iskaz Kratki (nepotpuni) oblik if( uslov ) iskaz Puni oblik if( uslov ) iskaz else iskaz Uslov je logički izraz (izraz celobrojnog tipa)! Primer Minimum dva broja int x, y, min; // x = 2, y = 3 if( x < y ) { // x < y? da min = x; // min = 2 else { // ne izvršava se min = y; Skraćeno: min = ( x < y )? x : y Primer Minimum tri cela broja ( int, a, b, c, min;) if( a < b && a < c) // Ako nije, min je b ili c min = a; else if( b < c ) // b < c, b < a min = b; else // c < b, c < a min = c; Zagrade se izostavljaju ako je u bloku jedan iskaz! Kako u skraćenoj notaciji? 23

Uslovni izrazi main() { // primer27.c int x = -7, y = 6, z = 9; int abs, max, n; /* Apsolutna vrednost */ abs = x >= 0? x : -x; printf("%d\n", abs ); // abs = 7 /* Maksimum tri broja */ max = x > y? x > z? x : z : y > z? y : z; printf("%d\n", max ); // max = 9 /* Niske u uslovnom izrazu */ for( n = 1; n < 7; n ++ ) printf("ima %d elemen%s\n", n, n > 1? n > 4? "ata":"ta" :"t" ); Složeno grananje: switch Ako x uzima više vrednosti, onda se može koristiti switch-iskaz, npr. switch (x){ case 0: printf("nula"); break; case 1: printf("jedan"); break; case 2: printf("dva"); break;... case 9: printf("devet"); break; default: printf("greska"); Uloga iskaza break! Ako x = 0, bez break: nulajedandva... ITERACIJE (PONAVLJANJE) - PETLJE Tri moguća oblika za izražavanje ponovljenog izračunavanja su: petlja za (ključna reč for) petlja sve dok - radi (while) petlja radi - dok nije (do-while) 24

Petlja for Sintaksa: for(inicijalizacija; uslov; korak){ lista iskaza Značenje: izvršava se inicijalizacija, (ispitivanje uslova, lista iskaza, korak) (ispitivanje uslova, lista iskaza, korak)... Primeri 1. for( i = 1; i <= n; i++) { x = x + 1; znači da će se vrednost promenljive x uvećati za 1 n puta. 2. for ( i = 0; i <= 10; i++) printf("%d ", i); ispisuje 0 1 2 3 4 5 6 7 8 9 10 Primer 3. int p, i, n = 3; for( p = 1, i = 0; i < n; i++, p = p * x ); Dvostruka inicijalizacija! Na mestu koraka, može se naći i lista iskaza! 4. Zbir prvih n prirodnih brojeva: for( s = 0, i = 1; i <= n; s = s + i, i++ ); 25

Petlja while Sintaksa while( uslov ) { lista iskaza Značenje Ispitati da li je uslov pre nego što se izvrši lista iskaza. Ako je uslov ispunjen, izvršiti listu iskaza. Inače, završiti sa izvršavanjem. Lista iskaza se ne mora izvršiti nijednom. Primeri 1. Izračunati prvi stepen broja 2 koji je veći od zadatog N. p = 1; while( p < N ) { p = 2 * p; Za N = 100, p = 128, a za N = 200, p = 256... Primeri 2. Vreme izračunavanja - petlja može da se izvršava (ponekada) vrlo dugo! int main( void ) { while( 1 ); return 0; se nikada ne zaustavlja! 26

Petlja do - while Sintaksa do { lista iskaza while( uslov ); Značenje Ispitati da li važi uslov pošto se izvrši lista iskaza. Lista iskaza se izvršava bar jednom! Razlika između while i do-while while( i <= n ) i = i + 1; Ako je i <= n pre izvršananja while, posle izvršavanja će biti i = n + 1. Ako je i > n, posle izvršavanja, i očuvava svoju vrednost. do { i = i + 1; while( i <= n ); Ako i <= n pre, posle i = n + 1. Inače, vrednost i uvećana je za 1! Primeri 1. Proveriti da li je dati broj n prost. int main(void){ int d = 1, n, r; printf("uneti ceo broj: "); scanf("%d", &n); do { d = d+1; r = n % d; // r - ostatak pri deljenju n sa d while (r >= 1 && d*d <= n); // ako r == 0, deljive je sa d if (r == 0) printf("broj %d je deljiv sa %d\n",n, d); else printf("broj %d je prost\n", n); return 0; 27

Primeri 2.... do { printf("ceo broj između 0 i 10? "); scanf("%d", &a ); printf("broj je %d\n", a ); while( a < 0 a > 10 );... Prekidanje iteracije continue odnosi se na najbližu petlju, a izaziva prelaz na sledeći korak break odnosi se na najbližu petlju ili grananje, a izaziva prekid petlje ili grananja return - odnosi se na prekid funkcije Primer int x, zbir = 0;... while( 1 ) { scanf("%d", &x ); if( x == 0 ) break; // izlaz iz petlje else if( x < 0 ) continue; // čita sledeći else zbir = zbir + x; printf("suma pozitivnih brojeva: %d", zbir ); 28

Bezuslovno grananje Sintaksa goto etiketa;... etiketa: iskaz; Prenos izračunavanja na tačku programa obeleženu etiketom. Etiketa mora biti unutar funkcije u kojoj je definisana. Nema skoka iz jedne funkcije u drugu. OPASNO! Prevođenje iteracija Na nivou asemblera, iteracije se prevode na niz instrukcija koristeći iskaz GOTO. Npr. while( i <= n ) iskaz; se prevodi na 1: IF i > n GOTO 2 iskaz GOTO 1 2:... Prevođenje for( i = 1; i <= n; i++ ) iskaz; se prevodi u: i = 1; 1: IF i > n GOTO 2 iskaz; GOTO 1 2:... 29

Iteracija i rekurentne formule Iterativni programi omogućavaju da se implementiraju veze zadate rekurentnim formulama. Primer. Fibonačijev niz je definisan sa: f 0 = f 1 = 1 f n = f n-1 + f n-2 ili niz: 1, 1, 2, 3, 5, 8, 13, 21,... Prvih 20 u Fibonačijevom nizu int main(void) { int i,u,v,w; u = 1; v = 1; // inicijalizacija for (i = 1; i <= 20; i++) { w = u + v; // novi član printf("%d ",w); u = v; v = w; // reinicijalizacija return 0; Rezultat: 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 Invarijanta petlje Zaključivanje o tome šta jedan iterativni program radi se zasniva na principu indukcije. Da bi to bilo moguće, koristi se neko svojstvo koje je tačno prilikom svakog prolaska kroz petlju, a koje nazivamo invarijanta petlje. 30

Primer invarijante U programu za Fibonačijev niz, sledeće svojstvo je tačno prilikom svakog prolaska kroz petlju: P(i): u = f i-1, v = f i Da bi se ovo dokazalo, mora se pokazati: (a) da je tačno P(0) (tj. da je P tačno pri prvom ulasku u petlju) (b) Ako je P tačno u jednom prolazu (npr. i), onda je tačno i u sledećem (tj. za i+1). Još jedan primer Faktorijel izračunava sledeći program: int main(void) { int i, n, fakt; scanf("%d",&n); fakt=1; for (i=2; i<= n; i++) fakt = fakt * i; printf("%d!=%d\n", i, fakt); return 0; Invarijanta petlje je fakt = (i - 1)!. Primer: binarni zapis Binarni zapis celog broja x je niz (b k,..., b 1, b 0 ) definisan formulom: x = b k 2 k +... + b 1 2 1 + b 0 2 0 Izračunavanje u dva koraka: 1. Izračunava se y = kao najveći ceo broj y koji je stepen broja 2 i y x 2. Zamenjuje se y sa y/2 oduzimajući y od x svaki put kada je y x i ispisuje se 0 ili 1 prema vrednosti uslova. 31

Program int main(void) { int x,y,n; 1 scanf("%d", &n); x = n; y = 1; // inicijalizacija 2 while (2*y <= x) y = 2*y; // korak1 formiranje y = 2 k x // y + y = 2y u svakom koraku 3 while (y!= 0) { // y - najveći stepen od 2 < x 4 if (x < y) printf("0"); // binarna 0 5 else { 6 printf("1"); // binarno 1 7 x = x - y; // sledeće x 8 y = y / 2; // sledeće y return 0; Rezultat (red 1) n = 9, x = 9, y = 1 (red 2) y=8 (red 3) y!= 0 i ( red 4) y < x --> (red 6) 1 (red 6) x = 1, ( red 7) y = 4 (red 3) y!= 0 i ( red 4) y > x --> (red 4) 0 ( red 7) y = 2 (red 3) y!= 0 i ( red 4) y > x --> (red 4) 0 ( red 7) y = 1 (red 3) y!= 0 i ( red 4) y < x --> (red 6) 1 (red 6) x = 0, ( red 7) y = 0 n = 1 * 2 3 + 0 * 2 2 + 0 * 2 1 + 1 * 2 0 = (9) 10 Još o tipovima Modifikatori tipa Različiti zapisi konstanti Tip void Saglasnost tipova Prioritet i asocijativnost Podešavanje (koercija, cast) 32

Modifikatori tipa ili još o int int se može skladištiti na 2 ili 4 bajta. funkcija sizeof( tip ) kazuje koliko je bajtova potrebno za skladištenje tipa. Npr. sizeof( char ) je 1 Celobrojni tipovi mogu da se modifikuju: short/long signed/unsigned Primenjuju se na int i char (char - "mali" int) Modifikatori int 1. short int ~ short; sizeof( short ) = 2 2. long int ~ long; sizeof( long ) = 4 3. Predefinisani modifikator: signed int Primenjuje se signed (long short ε) int. 4. Modifikator: ceo neoznačen broj unsigned (long short ε) int unsigned short int {0,..., +65535 Celobrojne konstante Oktalna ako je prefiks 0 (nula): npr. (032) 8 = (26) 10 Heksadecimalna ako je prefiks 0x: npr. (0x32) 16 = (50) 10 Long ima sufiks l ili L: npr. (0xaf9fL) 16 = (44959) 10 Unsigned ima sufiks u ili U: npr. (0xffffu) 16 = (65535) 10 33

Tip void... je "prazan" tip. Omogućava: koristi se za funkcije bez parametara ili vrednosti npr. void main( void)... konverzija izraza u tip void znači da se njegova vrednost ne uzima u obzir koristi se kod pokazivača (kasnije!) Salasnost elementarnih tipova SVI ARITMETIČKI TIPOVI (celovrojni, karakterski, realni) SU MEĐUSOBNO SAGLASNI Ovo znači da kompilator dopušta da se u aritmetičkom izrazu koriste objekti ovih tipova, bez eksplicitne naznake konverzije! Pravila o salasnosti elementarnih tipova U izračunavanju jednog izraza poštuju se sledeće implicitne konvencije: 1. Ako u izrazu nema promenljivih koje su unsigned, onda se objekti konvertuju u najjači tip prema sledećem redosledu: long double, double, float, long int, int 2. Pravila za unsigned zavise od implementacije! 3. Celobrojna promocija: aritmetičke operacije se vrše najmanje na tipu int, što znači da se char i short konvertuju u int 4. U zavisnosti od implementacije, char može biti < 0! 34

Primer (promocija - democija) 1. char c; short s; long l; (primer28.c) float f; long double g; c = s * l; // s=100, l=100l --> c = 16! f = 2 * g; // g=1.333333331 --> f = 2.666667 // (gubitak decimala) U izračunavanju s*l, s se konvertuje u long, a rezultat s*l se konvertuje u char u dodeli vrednosti promenljivoj c. 2 se konvertuje u long double u izračunavanju 2*g, a rezultat se konvertuje u float prilikom dodele f i gube se decimale. Podešavanje tipova (casting)... tip izraza (promenljive) se može forsirati: (ime_tpa) izraz; primer29.c void main( void ) { int i, j; double x, y, z, t; i = 5/2; // 2 x = 5/2; // 2 y = (double) (5/2); // 2 j = (double) 5/2; // 2 z = (double) 5/2; // 2.5 t = 5./2; // 2.5 printf("%d %g %g %d %g %g\n", i, x, y, j, z, t); /* rezultat: 2 2 2 2 2.5 2.5 */ Oprezno sa podešavanjem! Prilikom dodele, leva strana dodele se pretvara u tip desne strane (tip rezultata). Ovo može dovesti do neoderđenosti rezultata, gubitka tačnosti (npr. double u float ili float u long int), gubitka bitova veće težine (long int u int). (primer30.c) char c = -126; short s; s= c; // Promocija 0111 1110 = 126 char c (1 bajt) 1000 0010 = - 126 // Dopuna do 2 n short s (2 bajta) 1111 1111 1000 0010 = -126 // Dopuna do 2 n char c; short s = -32767; c= s; // Democija short s (2 bajta) 1000 0000 0000 0001 = -32767 char c ( 1 bajt) 0000 0001 = 1 35

Oprezno sa podešavanjem! unsigned char c = 255; short s; c= s; char c (1 bajt) 1111 1111 = 255 short s (2 bajta) 1111 1111 1111 1111 = -1 // Democija unsigned char c; short s = 255; s= c; short s (2 bajta) 0000 0000 1111 1111 = 255 char c (1 bajt) 1111 1111 = 255 // Democija Prenosivost tipova Neka zaglavlja C-a sadrže karakteristike pojedinih tipova: <limits.h> - za elementarne tipove (max, min,..) <float.h> - za realne brojeve (max. eksponent, epsilon mašine,...) <stdlib.h> - funkcije za konverziju tipova Prioritet i asocijativnost 1. unarni operatori imaju isti prioritet (među najjačim) 2. multiplikativni operatori ( * / % ) imaju isti prioritet koji je veći od prioriteta aditivnih operatora (+ -) Npr. -a*b+c je ((-a)*b)+c 3. unutar iste klase prioriteta, operatori asociraju sleva na desno, osim unarnih operatora i operatora dodele (sdesna na levo) Npr. a/b*c je (a/b)*c,, a ne a/(b*c) 4. Redosled izračunavanja zavisi od implementacije osim za (a) logičke izraze &&, (b) uslovni izraz? : i (c) kompoziciju, (zapeta) 36

Primeri Svaki izraz koji zavisi od redosleda izračunavanja se smatra neispravnim!!! Korektni izrazi: x*y+z/4*7 'A' + 32 (int) 'A' - 20 x = 1, y = 3 * x Ali i x = y = z = 3 2 * ( x = 3 ) + 1 Nekorektni izrazi: i = i++ (x = 3) * x Operatori ++ i -- Primenjuju se na celobrojni i realni tip Vrednost je definisana sa: izraz ++i i++ --i i-- vrednost i+1 i i-1 i vrednost i posle i+1 i-1 ++ i -- se primenjuju na izraz koji označava objekat u memoriji, npr, na identifikator, ali ne na konstantu ili aritmetički izraz (++5 ili (i+j)-- nemaju smisla). Primeri i bočni efekat main() { // (primer26.c) int i = 0, j = 0,, z; /* Bocni efekti */ z = i++ && j ++; // i = 1 j = 0 printf( " %d %d %d\n", i, j, z ); // z = 0 i = 0; j = 0; z = j++ && i ++; // i = 0 j = 1 printf( " %d %d %d\n", i, j, z ); // z = 0 z = j++ && i ++; // i = 1 j = 2 printf( " %d %d %d\n", i, j, z ); // z = 0 z = j++ && i ++; // i = 2 j = 3 printf( " %d %d %d\n", i, j, z ); // z = 1 37

Dodela Dodela je izraz. x = <izraz> 1. tip izraza je tip x 2. vrednost izraza (posle izračunavanja) postaje vrednost x Primer Ako je deklarisano float x; onda je: x = sqrt(16); izraz tipa float, čija je vrednost 4. Promenljiva x, posle izračunavanja izraza, ima vrednost 4. Posledica: x = y = z = 4; je izraz koji se interpretira kao x = (y = (z = 4)) (asocijativnost sdesna) Proširena dodela x op = <izraz> je ekvivalentno sa x = x op (<izraz>) (osim ako se x ne izračunava samo jednom) op je neki od aritmetičkih operatora: += -= *= /= %= &=... 38

Primer 1. x *=a+b je ekvivalentno sa x = x * (a + b ), a ne sa x = x * a + b! 2. x /= x - 1 je ekvivalentno sa x = x / (x -1) 3. Pažnja = je različito od ==!!! r=1; if( r = 0 ) printf("nula"); else printf("%d", r); ==> 0!!! Obim tipa - sizeof Moguće su dve primene: sizeof( tip ) sizeof izraz... vraća dužinu u bajtovima datog tipa ili tipa izraza Primer. sizeof( short ) je 2; sizeof( long ) je 4 Povezivanje iskaza zapetom izraz1, izraz2,..., izrazn vrednosti se računaju sleva na desno vrednost povezanog izraza je vrednost poslednjeg izračunatog člana Primer. x = 1, y = 2, z = x * y + 1 Vrednost celog izraza je vrednost z (3) 39