112
  Ćć ć ć

C skripta - TVZ

Embed Size (px)

DESCRIPTION

Skripta namjenjena programiranju u C jeziku. Skripta nije recenzirirana.

Citation preview

  • Programiranje u C-u i vjebe

    (radni nerecenzirani materijal )

    Autori: Slavica osovi Baji, Goran Trutani

  • SADRAJ

    OSNOVEPROGRAMIRANJAIVJEBE............................................................. 4 1. UVOD...........................................................................................................................

    5

    1.1 Nastanak programskog jezika C. 5 1.2 C jezik srednje razine... 5 1.3 Primjena programskog jezika C.. 5 1.4 Kompiler, interpreter...

    7

    2. UVOD U PROGRAMIRANJE..

    8

    3. TIPOVI PODATAKA. 11 3.1 Osnovni tipovi podataka. 11 3.2 Dodatni tipovi podataka.. 11 3.3 Oktalne i heksadecimalne konstante... 11 3.4 Znakovne( String) konstante... 12 3.5 Kontrolni znakovi

    12

    4. KONSTANTE I VARIJABLE... 13 4.1 Lokalne varijable. 14 4.2 Globalne varijable... 15 4.3 Modifikatori

    16

    5. OPERATORI.. 17 5.1 Operator dodjeljivanja. 17 5.2 Aritmetiki operatori... 17 5.3 Kombinacija aritmetiih operatora.. 17 5.4 Bit operatori 17 5.5 Operatori usporeivanja (relacioni).... 18 5.6 Logiki operatori.

    18

    6. IZRAZI

    19

    7. HEADER DATOTEKE (stdio.h, conio.h, math.h, string.h)..

    20

    8. FUNKCIJE.. 21 8.1 main ().. 22 8.2 printf (). 22 8.3 scanf ()..

    23

    9. NAREDBE ZA KONTROLU TIJEKA PROGRAMA... 25 9.1 Naredba if 26 9.2 Nested if (ugnjeeni if).... 27 9.3 Naredba switch 30 9.4 for petlja.. 32 9.5 while petlja.. 33 9.6 do while petlja. 33 9.7 Continue.. 34 9.8 Break... 34

  • 1

    9.9 Return..

    34

    10. POLJE (indeksirana varijabla).. 35 10.1 Jednodimenzionalno polje 35 10.2 Dvodimenzionalno polje..

    36

    11. VJEBE: OSNOVE PROGRAMIRANJA.

    37

    PROGRAMIRANJEIVJEBE.. 58 12. POLJE

    59

    12.1 Viedimenzionalno polje... 59 12.2 Inicijalizacija polja

    59

    13. POKAZIVAI.. 60 13.1 Jednostruka indirekcija. 60 13.2 Viestruka indirekcija... 62 13.3 Pokazivai na polja...

    62

    14. STRING (polje znakova)... 63 14.1 String konstante 63 14.2 Strcpy ( ) 63 14.3 Strcat ( ). 63 14.4 Strlen ( ).... 64 14.5 NULL terminator..

    64

    15. FUNKCIJE 65 15.1 Lokalne varijable... 66 15.2 Formalni parametri (argumenti).... 66 15.3 Globalne varijable. 66 15.4 Poziv s vrijednou... 67 15.5 Poziv adresom... 67 15.6 Polje argument funkcije 68 15.7 Funkcija vraa ne cijelobrojnu vrijednost. 69 15.8 Funkcija tipa void. 69 15.9 Rekurzivna funkcija.. 70 15.10 Vrijeme izvravanja

    71

    16. DATOTEKE.. 72 16.1 Otvaranje datoteke 72 16.2 Zatvaranje datoteke.. 72 17. DINAMIKO ALOCIRANJE MEMORIJE. 73 17.1 calloc. 73 17.2 malloc 73 17.3 sizeof. 73 17.4 free

    73

  • 2

    18. VJEBE: PROGRAMIRANJE...

    74

    19. ZADACI ZA VJEBANJE..

    94

    20. ZAKLJUAK

    110

    21. LITERATURA..

    111

  • 3

    OSNOVEPROGRAMIRANJAIVJEBE

  • 4

    1. UVOD Gradivo predmeta Osnove programiranja obuhvaa osnove programskog jezika C, sve naredbe za upravljanje tijekom programa , te koritenje jednodimenzionalnih polja. U prvom dijelu detaljnije su opisani tijek programa, nain pisanja programa, naredbe i osnovne funkcije. Iza oblika funkcije ili naredbe slijedi primjer, a nakon njega navode se zadaci iz tog podruja na koje se prelazi dvostrukim klikom na miu.U drugom dijelu Programiranje obuhveena su: viedimenzionalna polja, pokazivai, funkcije i datoteke. Iza rjeenih primjera za ilustraciju oblika naredbe navode se zadatci na koje se moe direktno pristupiti dvostrukim klikanjem mia. 1.1 Nastanak programskog jezika C

    Kasne 60 - te godine 20. stoljea bile su turboletno razdoblje za razvoj kompjutorskih sistema u Bell Telephone Laboratories. Tada je Ken Thompson u razdoblju od 1969. - 1970. kreirao B programski jezik . Denis Ritchie je 1971. na osnovi programskog jezika B poeo razvoj programskog jezika C na raunalima DEC PDP-11 za upotrebu na UNIX operativnim sustavima. Denis Ritchie, Alan Snyder, Steven C. Johnson, Michael Lesk i Ken Thompson razvijali su program u razdoblju od 1972. - 1977. U tom razdoblju je koliina rutina rasla zahvaljujui njima i svima ostalim u Bell Laboratories. Godine 1978. Brian Kernighan i Denis Ritchie napisali su knjigu tzv. White book koja je postala definicija jezika slijedeih godina. Do tada se smatralo da je C jezik povlateni jezik dostupan samo odreenoj skupini ljudi , te da je teak za koritenje. C nije izravno preao sa UNIX-a na DOS, ve je to ilo postupno. Najprije je preao na operacijski sustav CP/M koji je tada bio dosta popularan, no zbog premalenih 8 bitnih procesora i samo 64k RAM nije poluio uspjeh. No ubrzo uvoenjem 16 bitnih procesora i razvojem tvrtki kao Microsoft i IBM, koristi se sve vie u razvoju software-a.

    Poetkom 1983. godine osnovan je odbor ANSI X3J11 za standardiziranje jezika, a 1988. zavrena je prva standardizacija jezika koje podrava i veina dananjih prevoditelja. 1.2 C jezik srednje razine

    C - je jezik srednje razine jer sadri i kombinirane elemente visokih jezika, i funkcionalnost asemblera ( strojnih jezika ). esto se C naziva jezik za graenje jer se programer prvo kreira funkcije a nakon toga ih slae u program. Uz vlastite funkcije koje pie programer postoji velika biblioteka C funkcija . Tako se pomou C-a moe rijeiti gotovo svaki problem. Visoka razina prema [1] u jezik je ugraeno sve to bi programer mogao trebati za pisanje

    aplikacije. Srednja razina prema [1] ima sve prednosti jezika visoke razine a takoer posjeduje

    funkcionalnost jezika niske razine ( strojni jezik ). C ima mogunost direktnog koritenja bit-ova, bytova i adresa

    Niska razina prema [1] daje samo pristup strojnim instrukcijama. Prednosti u odnosu na druge programske jezike prema [1] :

    vrlo mali broj narebi ; kod je prenosiv, lako se prenosi s raunala na raunalo (uz razliit procesor,

    operativni sustav, ili oboje). Najee je potrebno aplikaciju kompilirati s C kompilerom pisanim za novi procesor. Na taj nain stvara se uteda u vremenu i novcu ;

  • 5

    sve funkcije koje koristimo u programu deklariraju se u pomonim datotekama koje nazivamo Header datoteke i naredbom icllude prikljuuju se na poetku programa ;

    operatori za direktno upravljanje stanja BIT-ova i BYTE-ova nazivaju se Bitwise.

    Prikaz 1. Visoka, srednja i niska razina jezika primjeri 1.3 Primjena programskog jezika C

    Prve primjene C jezika prema [1] bile su u sistemskom programiranju. Sistemsko programiranje odnosi se na klasu programa koji pokreu ili su dio operativnog sustava raunala. Sistemski programi omoguavaju raunalu obavljanje brojnih korisnih zadaa. Primjeri takvih zadaa su : Operativni sustavi Jezini prevodioci Asembleri Editori teksta Network Drivers Modem Programs Baze podataka Interpreteri

    Brojni su razlozi zbog kojih se C koristi za pisanje sistemskih programa. Prvi je razlog brzina izvoenja koja gotovo jednaka brzini izvoenja strojnih jezika. Drugi razlog je da je C zanimljiv programerima zbog mogunosti rada s bitovima , bytovima i adresama s jedne i naredbama i mogunostima jezika visoke razine s druge strane. Zbog velike popularnosti meu programerima danas je C jezik ope namjene . Nakon to se jednom familijariziramo s C om moemo slijediti precizan tijek i logiku programa te realizacije vlastitih modula. Listinzi C programa izgledaju jasno i itljivo. Glavni je razlog ato se jezik tako rairio je da je zgodan za koritenje ( it is simly fun to use prema [1] ). C je strukturni jezik a strukturni jezici koriste blokove. Blok je skup naredbi koje su logiki povezane. Strukturni jezici dozvoljavaju razliite programerske mogunosti, podravaju koncepciju vlastitih funkcija s lokalnim varijablama. Lokalna varijabla je varijabla kojoj je vrijednost poznata samo u bloku gdje je definirana. C podrava iterativne naredbe za ponavljanje ( petlje) while , do while i for.

    VISOKA ADA FORTRAN PASCAL COBOL MODULA-2 BASIC

    SREDNJA C FORTH

    NISKA MACRO ASSEMBLER ASSEMBLER

  • 6

    1.4 Kompiler, interpreter Prema [1] pojam kompiler i interpreter odreuje nain kako se program izvrava (

    izvodi). Bilo koji programski jezik moe teoretski biti compiliran ili interpretiran. Nain izvoenja programa ne definira nain kako je jezik napisan. Kompileri i interpreteri su sofisticirani programi koji operiraju na naem ulaznom ili SOURCE kodu. SOURCE kod je izvorni tekst programa koji ste napisali. Kompiler prema [1] prvo proita program, nakon toga program prevodi u objektni kod, oblik koji raunalo direktno moe izvriti. Objektni kod povezuje izvorni kod s binarnim ili strojnim. Nakon kompiliranja izvorni ( SOURCE ) kod bitan za izvoenje programa. Kompilirani programi bre se izvode od interpretiranih programa. Interpreter prema [1] ita source program liniju po liniju i izvodi instrukcije koje ta linija sadri . Razlikuje se vrijeme prevoenja ( compile time ) od vremena izvoenja ( run time ). Razlikujemo etiri koraka za svaki novi C program:

    1. Editiranje - pisanje i pohranjivanje izvornog koda 2. Kompiliranje ( prevoenje)- ako u programu ima formalnih pogreaka , program

    prevodilac e nam na njh ukazati a nakon ispravki program valja ponovo kompilirati. Postupak se ponavlja sve dok se ne dobije korektan izvorni kod.

    3. Linkanje ( povezivanje ) programa sa potrebnim bibliotekama 4. Izvoenje ( execute )

  • 7

    2. UVOD U PROGRAMIRANJE Prvi korak u uenju novog programskog jezika je najtei jer su sve komponente jezika

    meusobno povezane.Moramo stoga poeti s opom idejom to C program sadri ukljuujui neke osnovne kontrolne naredbe , oblike i funkcije. Time se omoguava razumjevanje primjera programa koji se pojavljuju kao ilustracija razliitih mogunosti C jezika . Za demonstraciju elemenata jezika u ovom dijelu daje se prikaz jednostavnijihh primjera C programa koje treba paljivo prouiti. Ovdje se ne prouavaju svi detalji, ali su dati koncepti zajedniki za sve C programe. Neki od koncepata kasnije se obrauju detaljnije.

    Primjer 1. Prvi C program

    /* Moj prvi C program */ #include main(){ printf("Ovo je moj prvi C program."); return 0; }

    Ovo je moj prvi C program.

    - Linija komentara - poinje s /* a zavrava */ sve to je izmeu kompajler ignorira

    - Header files - sadrideklaracije funkcija koje su potrebne u programu stdio.h sadri deklaracije ulazno izlaznih funkcija -main() - funkcija koju svaki C program mora sadravati.C program

    zapoinje pozivom funkcije main(), a zavrava u veini sluajeva povratkom iz funkcije main().

    - { - poetak bloka - printf() - ispisuje poruku na ekranu, standardna funkcija printf()

    ispisuje sve to se nalazi izmeu navodnika. - ; - kraj naredbe

    - } - kraj bloka

  • 8

    Primjer 2. Program deklarira cjelobrojnu varijablu value, zatim joj pridrui vrijednost 1023, te je ispisuje na zaslon

    /* Program #2 */

    #include main() { int value = 1023; printf("Ovaj program ispisuje vrijednost %d", value) ; return 0; }

    Ovaj program ispisuje vrijednost 1023

    -int value - varijablu value deklarira kao cjelobrojnu .

    - u C jeziku sve varijable prije upotrebe treba deklarirati. - = - znak pridruivanja - printf() - sadri dva argumenta odvojena zarezom

    - prvi argument je tekst u kome se nalazi format %d za ispis cjelobrojne vrijednosti

    - drugi dio je ime cjelobrojne varijable value koja e se ispisati. na mjestu formata %d

    Primjer 3a. Program pretvara galone u litre, 1galon = 3.7854 4 litre jer se koriste cijeli brojevi.

    /* Program pretvara galone u litre */ #include main() { int galoni, litre; printf("Unesite kolicinu galona :") ; scanf("%d", & galoni) ; litre = galoni * 4 ; printf("%d l", litre); return 0; }

    Unesite kolicinu galona : 3 12 l

    - int galoni,litre - dvije cjelobrojne varijable

    - imena odvajamo zarezom - * - mnoenje - scanf() - funkcija za unos vrijednosti sa tipkovnice

    - prvi argument sadri format %d (cjelobrojna vrijednost) - drugi argument je &galoni (ime cjelobrojne varijable koja se

    uitava) a predhodi joj &adresni operator. - printf("%d l", litre); - sadri dva argumenta odvojena zarezom

    - prvi dio sadri tekst i format koji poinje sa %d a to znai da ispisuje vrijednost int varijable

    - drugi dio sadri ime int varijable koja e se ispisati

  • 9

    Primjer 3b. Program pretvara galone u litre uz upotrebu floating-point brojeva.

    /* Program pretvara galone u litre uz upotrebu floating-point brojeva */ #include main() { float galoni, litre ; printf("Unesite kolicinu galona :") ; scanf("%f", & galoni) ; litre = galoni * 3.7845 ; /* naredba pridruivanja*/ printf("To je:""%f l", litre); return 0; } Unesite kolicinu galona : 3,4 11.356200 l - float - deklaracija realanih varijanti sa pominom tokom. - imena odvajamo zarezom - printf() - sadri jedan argument za ispis teksta na zaslon - %f - format u printf()i scanf() funkciji koji omoguuje upis i ispis broja sa pominom tokom - scanf() - funkcija za unos vrijednosti sa tipkovnice - prvi argument sadri format %f za uiavanje float varijable - drugi argument je adresni operator & i ime varijable koja se uitava - printf()- sadri dva argumenta odvojena zarezom - prvi dio sadri tekst i format koji poinje sa %f a to znai da ispisuje vrijednost float varijable - drugi dio sadri ime varijable koja e se ispisati

  • 10

    3. TIPOVI PODATAKA Programski jezik C sadri vie tipova podaka, a prema ANSI standardu [1] osnovni

    tipovi podataka su char (znakovni), int (cjelobrojni), float i doouble (realni) pri emu se float i double razlikuju po veliini koju podatak moe poprimiti te void podatak koji ne zauzima memorijski prostor( nema vrijednosti ).

    Prilagoenjem mogue je primjeniti osnovne tipove podataka tako da bolje odgovaraju potrebama.

    Konstante su podaci koji se ne mijenjaju tijekom izvoenja programa, podaci na koje program ne moe utjecati.

    3.3 Oktalne i heksadecimalne konstante Baza 8 0, 1, 2, 3, 4, 5, 6, 7 znamenke Baza 16 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

    znamenke Primjer: int hex = 0 x FF /* 255 */ x iza nule int oct = 011 /* 9 */ poinje nulom

    3.1 Osnovni tipovi podataka Tip podataka: Broj bita: Vrijednosti od do

    char 8 -127 do 128 int 16 -32 768 do 32 767

    float 32 3.4e-38 do 3.4e38 double 64 1.7e-308 do 1.7e+308

    3.2 Dodatni tipovi podataka Tip podataka: Broj bita: Vrijednosti od do

    unsingned char 8 0 do 255 signed char 8 -128 do 127 unsigned int 16 0 do 65.535

    signed int 16 -32 768 do 32 767 short int 16 -32 768 do 32 767

    unsigned short int 8 0 do 65535 signetdshort int 8 -32 768 do 32 767

    long int 32 -2147483648 do 2147483647 signed long int 32 -2147483648 do 2147483647

    unsingnet long int 32 0 do 4294967295 long double 128 1.7e-308 do 1.7e+308

  • 11

    3.4 Znakovne( String) konstante Niz znakova. Pie izmeu dvostrukih navodnih znakova.

    Primjer 4.: #include

    main() {

    printf("%s %s %s ", "Ovo", "je", "proba"); return 0;

    }

    Ovo je proba

    %s konstanta za ispis stringa 3.5 Kontrolni znakovi Kod Znaenje \n novi red \b backspace \r carriage return \t tab \ dvostruki navodnik \ jednostruki navodnik \0 nula \\ backslash \ vertikalni tabulator \a alarm \N oktalna konstanta \xN heksadecimalna konstanta \b pomie kursor u lijevo za

    jedan znak \f ide na poetak nove

    stranice (form feed) \r ide na poetak tekue

    linije (carriage return)

  • 12

    4. KONSTANTE I VARIJABLE Konstante su prema [4] nepromjenjive veliine , podaci koji su za vrijeme obrade konstantni. Konstante mogu biti brojane ( dekadske, oktalne, heksadekadske ) i nebrojane. Nebrojane se konstante piu izmeu navodnika koji ne ulaze u njihovu duljinu i nee se vidjeti na ispisu. Kada se u kodu pojavljuju brojane konstante, prevoditelj ih pohranjuje u formatu nekog od osnovni tipova S brojevima koji sadre decimalnu toku ili slovo e (E) prevoditelj barata kao s podacima tipa double dok sve ostale brojeve tretira kao int. Za specificiranje konstanti mogu se koristiti i sufiksi posebni znakovi za eksplicitno odreivanje tipa brojane konstante. Varijabla je imenovani dio memorije. Deklarirati varijablu [4] znai imenovati je i jednoznano odrediti njezin tip.To je postupak imenovanja i dodjele memorijskog prostora varijabli cjelobrojnoj najmanje 16, znakovnoj 8, logikoj 1 a eralnoj 32 bita. Znak jednakosti je operator pridruivanja. Lijeva strana ( ime varijable) je adresa a desna vrijednost je sadraj. Djeluje tako da se desna vrijednost preslika u sadraj na adresi lijevo pri emu se prekriva sadraj koji se do tada tamo nalazio.Definirati varijablu znai inicijalizirati je ( zadati joj poetnu vrijednost ) pridruiti joj vrijednost ( sadraj ). Imena varijabli nazivaju se identifikatori . Identifikator je ime varijable koje jednoznano odreuje objekt. Dozvoljeni znakovi za sastavljanje imena varijable su mala i velika slova engleske abecede, znamenke 0 do 9 i znak za podcrtavanje ( underscore ). Na poetku ne smije biti broj a znak za podcrtavanje niti na poetku niti na kraju. Proizvoljan je broj znakova identifikatora, meutim raunalo najee kontrolira 31 znak ( The ANSI standard : A Summary for the C Programmer. http:// www.ericgiguere.com/articles/ansi-c-summary.html ). Memorijski prostor se varijablama dodjeljuje u skladu s deklaracijom tipa Duljina ovisi i o duljini kompjutorske rijei Tako e 16 bitno raunalo za int brojeve trebati jednu 16 bitnu rije, za long int i float 2 rijei ( 32 bita ), za dvostruke realne ( double ) 4 rijei ( 64 bita ) a za dvostruko dugake realne ( long double ) trebati prostor od 5 kompjutorskih rijei ( 80 bitova ). Moramo paziti prilikom upotrebe malih i velikih slova, jer nemaju isto znaenje Primjer=1 i primjer=1. Sve varijable koje se koriste moraju se deklarirati.

    Inicijalizacija varijabli tip varijable_ime= konstanta ;

    char ch = a ; int prvi = 0 ;

    float bla = 123.23F ;

  • 13

    4.1 Lokalne varijable Lokalne varijable deklariraju se unutar funkcije prilikom ulaska, a gube se kod izlaska. Poznate su unutar funkcije (bloka).

    Primjer 5. #include #include

    func(); void main() { int x; x = 10; func(); printf("%d\n", x); getch(); } func() { int x; x = -199; printf("%d\n", x); return 0; }

    -199 10

    - - Header datoteka conio.h u uvom sluaju zbog funkcije

    getch()

    - inicijalizacija - inicijalizacija varijable x, u prvom sluaju unutar funkcije main(), a u drugom sluaju funkcije func()

    -getch() - funkcija za itanje znakova sa tipkovnice , u naem sluaju

    sliku izlaznog zaslona dok ne pritisnemo neku tipku.

  • 14

    4. 2 Globalne varijable Globalna varijabla daje mogunost zadravanja vrijednosti unutar vremena izvravanja programa. Deklarira se na poetku programa, prije main() funkcije. Vrijednosti globalne varijable moe se pristupiti iz bilo koje funkcije. U programu koji slijedi varijabla br je globalna i deklarirana je prije main() funkcije . Unato tome to br nije deklarirana u main() niti u func1() obje funkcije mogu je koristiti. Primjer 6. #include int br; func1(); func2(); void main() { int i; br=10; for (i=0; i

  • 15

    4.3 Modifikatori Primjer 7.: Razlika izmeu signed i unsigned #include void main() { int i; /* signed integer */ unsigned int j; /* unsigned integer */ j = 60000; i = j; printf("%d %u", i, j); }

    -5536 60000

    - int i - signed integer - unsigned int - unsigned integer

    Varijabla tipa char moe se koristiti na mjestu int kao u primjeru 7a za kontrolnu varijablu petlje koja ispisuje slova abecede na zaslon u obrnutom redoslijedu. ASCII ( ameriki standardni kod za razmjenu informacija) je kod za prikazivanje engleskih znakova u obliku brojeva.Svakom je znaku pridruen broj od 0 do 127. Primjer 7a..For petlja za ispis slova abecede na zaslon u obrnutom redoslijedu. (A je zapisano u raunalu kao broj a vrijednosti rastu u smjeru A do Z. #include void main() { char slovo; for(slovo='Z'; slovo>='A'; slovo--) printf("%c", slovo); }

    ZYXWVUTSRQPONMLKJIHGFEDCBA

  • 16

    5. OPERATORI Operatori su [4] su znakovi koji odreuju neku akciju Brojni operatori omoguavaju

    rukovanje brojevima ili tekstom.Aritmetiki operatori omoguavaju izvoenje aritmetikih operacija. Logiki opeatori omoguavaju ispitivanje tonosti / netonosti nekog izraza ili tvrdnje a relacioni se operatori upotrebljavaju za usporeivanje jedne vrijednosti s drugom. Operator je znak ili rije koja odreuje vrstu akcije. Akcija je postupak koji elimo izvrti. Operand je podatak koji sudjeluje u akciji a izraz je saeta uputa raunalu, odnosno prikaz akcije koju elimo izvriti pomou operanada.

    5.1 Operator dodjeljivanja = dodjeljivanje

    5.2 Aritmetiki operatori - oduzimanje + zbrajanje * mnoenje / dijeljenje

    % Modul ( ostatak int dijeljenja ) -- dekrament ++ inkrement

    5.3 Kombinacija aritmetiih operatora kratica ekvivalent

    += x + = 2 ; x = x + 2 ; -= x - = 2 ; x = x 2 ; *= x * = 2 ; x = x * 2 ; /= x / = 2 ; x = x / 2 ;

    %= x % = 2 ; x = x % 2 ; -- x + = 2 ; x = x + 2 ;

    5.4 Bit operatori

    & I | ili ^ ekskluzivni ili ~ komplement

    > shift desno

  • 17

    5.5 Operatori usporeivanja( relacioni ) > vee od

    >= vee ili jednako < manje od

  • 18

    6. IZRAZI Izraz je saeta uputa raunalu, odnosno prikaz akcije koju elimo izvriti pomou

    operanada. Konstante, varijable, operateri i zagrade ine izraz.

    Konverzija na isti tip prema gore, ovisno o najviem operateru char ch; int i; float f; double d; result = ( ch / i ) + ( f * d ) ( f + i ) ; int double double

    double double

    Cast operatori Odreuju tip izraza, unarni operator.

    ( type ) izraz char int float double

    Cast operator float u bloku koji slijedi osigurava ispis decimala. { int i ; for ( i = 1 ; i

  • 19

    7. HEADER DATOTEKE

    stdio.h Sadri deklaracije ulazno izlaznih funkcija.

    #include

    printf() Ispis znakova na ekranu scanf() Unos znakova sa tipkovnice

    conio.h

    Sadri deklaracije funkcija za brisanje zaslona te unos znaka sa zaslona. #include

    clrscr() Brie ekran getch() Unos znaka sa tipkovnice

    math.h

    Sadri deklaracije matematikih funkcija. #include

    sqrt(x) x pox(x,y) yx fabs(x) apsolutna vrijednost exp(x) xe

    sin(x) cos(x) tan(x) log(x) log10(x) asin(x) acos(x) atag(x) sinh(x) cosh(x) tanh(x) ceil(x)

    string.h

    Sadri deklaracije znakovnih funkcija. #include

    toupper() Pretvara mala slova u velika tolower() Pretvara velika slova u mala.

  • 20

    8. FUNKCIJE C program je skup jedne ili vie funkcija. Za pisanje programa potrebno je prvo

    napisati funkcje a nakon toga ih treba sloiti zajedno. Funkcija u C-u [ 4 ] je podprogram tj. logiki samostalan dio programa koji predstavlja djelomino rjeenje problema. Funkcija moe ali ne mora imati parametre. Parametri su vrijednosti koje se proslijeuju funkciji iz okoline, ime joj se omoguava da prilikom svakog poziva, pomou istih naredbi radi s razliitim vrijednostima.Parametri mogu biti stvarni ( argumenti ) i formalni. Argument je vrijednost koja se funkciji proslijeuje prilikom poziva . Ukoliko se radi o vrijednosti koju funkcija vraa okoliniiz koje je pozvana ( izlaz ) argument nazivamo rezultatom funkcije. Formalni parametar je slobodna varijabla ( za vrijeme izvoenja funkcije nalazi se na rezervnoj memorijskoj lokaciji ) kojoj se u trenutku poziva pridruuje vrijednost argumenta.

    Opi oblik fukcije

    funkcija_ime ( lista parametara ) { ... tijelo funkcije }

    Svaka funkcija ima : - Ime koje se koristi za poziv, daje se proizvoljno, uvjet da nije rezervirano u jeziku (main() i naredbe)

    - Iza funkcije slijedi zagrada da bi se funkcija razlikovala od varijable.Ukoliko funkcija ne treba parametre tada se lista parametara ostavlja prazna ali se moraju staviti zagrade

    - parametari se dijele na stvarne( argumente ) i fomalne koji se uvijek pojavljuju u paru i istog su tipa.Ukoliko ih ima vie redoslijed se mora podudarati.

    { - Poetak funkcije - Tijelo funkcije naredbe izmeu lijeve i desne vitice - sadri naredbe

    koje definiraju rad funkcije } - Kraj funkcije i povrat na pozivnu proceduru

    Funkcija moe ali i ne mora vraati podatke na pozivnu rutinu, ukoliko ne vraa podatke

    mora se deklarirati kao tip void.

  • 21

    8.2 printf() Opi oblik:

    printf(kontrolni string ili polje znakova,argument )

    Kontrolni string sadri znakove ( tekst ) koji se ispisuju na zaslonu ili naredbe formata . Formati i argumenti pridruuju se s lijeva na desno. Primjer 8a. #include void main() { printf(Ovo je string %d, 100); }

    Ovo je string 100

    Primjer 8b. #include void main() { printf(Ovo je malo slovo %c, ovo je veliko slovo %c ., a, A); } Ovo je malo slovo a, ovo je veliko slovo A.

    8.1 main() Funkcija main() je glavna funkcija i ona je satavni dio jezika. Ako je ispred rije void funkcija ne vraa vrijednost .Za sluaj kada pie int main() funkcija vraa int a int vraa i ako pie samo main(). U tom sluaju u tijelu funkcije mora pisati npr.naredba return 0 . Opi oblik

    void main( ) { ... tijelo funkcije } ili int main( ) { ... tijelo funkcije return 0; } ili main( ) { ... tijelo funkcije return 0; }

  • 22

    Primjer 8c. #include void main() { printf(Ovo je malo slovo %c, ovo je veliko slovo %c ., a, A); } Ovo je malo slovo a, ovo je veliko slovo A. Postoji mogunost ispisa u novi red, na novu stranicu, a za to se koristi posebni kontrolni znak.

    Primjer 8d. Kako uz pomo \n prei u drugi red

    #include void main() { printf("jedan\n"); printf("dva\n"); printf("tri"); printf("cetri"); }

    jedan dva tri cetri

    Dvostrukim klikom na pojedini zadatak ide se direktno na primjer ( za ilustraciju primjene objanjenih naredbi )

    8.3 scanf() Opi oblik:

    scanf(,argument list);

    Scanf() je ulazna funkcija za uitavanje vrijednosti varijable. U prvi argument upisuje se format ovisno od tipa podatka koji se uitava prema tabeli formata u nastavku.

    Primjer 9. #include void main() { char poruka[20]; printf(" Unesite poruku \n"); scanf("%s",poruka); printf(" \nVasa poruka je %s ",poruka); }

    Unesite poruku programiranje Vasa poruka je programiranje

  • 23

    Formati za uitavanje i ispisivanje %c znakovi %d cjelobrojne vrijednosti %i cjelobrojne vriednosti %e eksponencijalni prikaz %E eksponencijalniprikaz %f realne vrijednosti %g realne vrijednosti %G realne vrijednosti %o oktalne vrijednosti %s stringovi %u cjelobrojne vrijednosti(unsigned) %x heksadecimalne vrijednosti (mala slova) %X heksadecimalne vrijednosti (velika slova) %p prikaz pointera %% ispis znaka %

  • 24

    9. NAREDBE ZA KONTROLU TIJEKA PROGRAMA

    Selekcije if

    Uvijet je bilo koji izraz koji sadri kombinaciju varijabli ili konstanti, ako je istinit izvri se naredba 1, a ako nije istinit naredba 2.

    switch Testira varijablu i niz integer ili character konstanti. Ako niti jedan nije ispunjen izvrava se default.

    Iteracije

    for

    Petlja se izvodi dok je uvjet istinit, kad uvjet postane neistinit izvrava se naredba koja slijedi.

    while

    Nareba ili blok naredbi izvoditi e se dok je logiki uvijet istinit.

    do while

    Uvjet se testira na kraju petlje pa e se naredba izvesti barem jedanput.

    Skoka

    break

    Nain vraanja vrijednosti iz funkcije. Bilo koja vrijednost varijable unutar zagrada ili vrijednost izraza biti e vraen na poetnu funkciju.

    continue

    Nain vraanja vrijednosti iz funkcije. Bilo koja vrijednost varijable unutar zagrada ili vrijednost izraza biti e vraen na poetnu funkciju.

    return

    Upotrebom returna prenose se podaci iz aktivne funkcije u pozivajuu , a ujedno se i zavrava aktivna funkcija.

  • 25

    9.1 Naredba if Opi oblik:

    if ( uvjet ) naredba1; else naredba2;

    Uvijet je bilo koji izraz koji sadri kombinaciju varijabli ili konstanti, ako je istinit izvri se naredba 1, a ako nije istinit naredba 2. if bolk if ( uvjet ) { blok 1 } else { blok 2 } Primjer 10. Program ita dva razliita broja te ih usporeuje. #include void main() { int a, b; printf(" Unesite dva razlicita broja 1.,2.\n "); scanf("%d ,%d", &a, &b); if (a>b) printf("%d\n Prvi broj je veci" ); else printf("\n Drugi broj je veci"); } Unesite dva razlicita broja 1.,2. 3,5 Drugi broj je veci - if - poetak if naredbe

    - a>b - uvijet, ako je a>b izvodi se naredba 1, a ako je a

  • 26

    9. 2 Nested if (ugnjeeni if) Opi oblik

    if ( i ) { if ( j ) naredba 1; if ( k ) naredba 2; /* ovaj if */ else naredba 3; /* pripada ovom else */ } else naredba 4; /* pridruena je if ( i ) */

    Primjer 11. Magini broj #include #include void main() {

    int magicni, pokusaj; magicni=rand(); /* nasumice odabere broj */ printf(" Vas pokusaj: "); scanf("%d", &pokusaj ); if (pokusaj==magicni)

    { printf(" **tocno** "); printf("\n %d Magicni broj je\n", magicni);

    } else{

    printf(" ...zao mi je krivo..."); if (pokusaj>magicni) printf("\n Vas pokusaj je prevelik.\n"); else printf("\n Vas pokusaj je premalen. \n"); }

    } Vas pokusaj: 4 ...zao mi je krivo... Vas pokusaj je premalen.

    - - Header datoteka iz koje u ovom sluaju koristimo rand(). - magicni=rand() - varijabli magini pridruujemo nasumice generiran broj. - if - poetak naredbe if. - (pokusaj==magicni) - poetni uvjet. - prvi blok naredbi - izvrava se ako je poetni uvijet ispunjen. - drugi blok naredbi - izvrava se ako petni uvijet nije ispunjen. - ugnjeeni if - poetak nove if naredbe unutar drugog bloka naredbi prve

    if nardbe. - (pokusaj>magicni) - uvijet ugnjeene if naredbe. - prva naredba - izvrava se ako je uvjet ugnjeene if naredbe ispunjen. - druga naredba - izvrava se ako uvjet ugnjeene if naredbe nije ispunjen.

  • 27

    9.3 Naredba switch Opi oblik:

    switch ( variable ) { case konstanta 1 : blok naredbi; break; case konstanta 2 : blok naredbi; break; default : blok naredbi; }

    Testira varijablu i niz integer ili character konstanti. Ako niti jedan nije ispunjen izvrava se default. - switch za razliku od if testira samo jednakost - u istoj switch naredbi ne moe biti dva case-a s istom vrijenosti - switch je bri od niza if-ova - dijelovi naredbi pridrueni svakom case-u nisu blokovi Primjer 12. #include void main() { int i; for(i=0; i

  • 28

    Primjer 12a. #include void main() { int i; clrscr(); printf("Unesite broj 2 za parne i 5 za neparne\n"); scanf("%d",&i); switch(i) { case 1 : break; case 2 :printf("parni"); break; case 5 : printf("neparni"); } } Unesite broj 2 za parne i 5 za neparne 5 neparni Ne moraju sve case konstante biti ispunjene, moemo ispuniti samo one koje su nam potrebne.

    Primjer 12b. Viestruki switch

    #include void main() { int a,b; printf("0 ili 1\n"); scanf("%d",&a); switch(a) { case 0 :printf("\n%d",a); break; case 1 : printf("\n1 ili 2\n"); scanf("%d",&b); switch(b){ case 1 :printf("\n%d",b); break; case 2 :printf("\n%d,%d",a,b); } } }

    0 ili 1 1 1 ili 2 2 1,2

    Kao blok naredbi unutar prvog switch-a moe se dodati jo switch naredbi sa drugim uvjetima.

  • 29

    9.4 for petlja Opi oblik:

    for ( inicijalizacija; uvjet; increment ) naredba;

    Petlja se vrti sve dok je uvjet istina, kad uvjet postane la izvrava se naredba koja sljedi Inicijalizacija naredba pridruivanja, postavlja vrijednost kontrolne varijable. Uvjet odreuje kad e se izai iz petlje. Increment definia kako se kontrolna varijabla mjenja pri svakom ponavljanju petlje. Primjer 13. Ispis brojeva od 100 do 95 s dekrementom 5. #include void main() { int i; for (i=100 ; i>-100 ; i=i-5 ) printf("%d" , i); } 100 95 90 85 80 75 70 65 60 55 50 45 40 35 30 25 20 15 10 5 0 -5 -10 -15 -20 -25 -30 -35 -40 -45 -50 -55 -60 -65 -70 -75 -80 -85 -90 -95

    - for - poetak for petlje - i=100 - inicializacija varijable i - uvijet - dok je uvijet ispunjen for petlja e izvravati naredbu. - korak - za koliko e se u svakom prolazu kroz petlju u ovom primjeru

    umanjiti varijabla i - naredba - izvrava se kada je uvijet ispunjen

    for bolk

    for ( inicijalizacija; uvjet; korak ) { blok naredbi }

    Primjer 13a. Program ispisuje vrijednosti drugog korijena brojeva od 1 do 100. #include #include void main() { int broj; double korijen; for (broj=1 ; broj

  • 30

    Primjer 13c. #include main() { int x, y; x = 10; for(y=10; y!=x; ++x) printf("%d", y); /* printf naredba se nee izvriti */ } Poto uvijet nije ispunjen naredba unutar for petlje nee se izvriti. Primjer 13d. Nedostaje increment #include void main() { int x; for(x=0; x!=123; ){ printf(" Unesite broj: "); scanf("%d", &x); } }

    Unesite broj: 2 Unesite broj: 3 Unesite broj: 4 Unesite broj: 3 Unesite broj: 3 Unesite broj: 123

    Primjer 13e. Nedostaje inicijalizacija #include void main() { x = 0; for ( ; x < 10 ; ) { printf ( %d, x ); ++ x; } Inicijalizacija je provedena prije for petlje. Primjer 13f. Beskonana petlja #include void main() { for ( ; ; ) { } Primjer 13g. Petlja za vremensko kanjenje #include main() {

    for ( x = 0; x < 1000; x ++ ); }

  • 31

    9.5 while petlja Opi oblik:

    while (logiki uvjet) naredba ;

    Broj izvravanja while petlje odreen je logikim uvijetom .Naredba ili blok naredbi izvravati e se dok je logiki uvjet istinit. Logiki uvjet se ispituje prilikom ulaska u petlju te na poetku svakog prolaza kroz petlju.

    Primjer 14. Ispis zankova. #include void main() {

    char ch; ch = 1; while(ch!=0){ printf("%c", ch); ch++; }

    } - !"#$%&'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^ _`abcdefghijklmnopqrstuvwxyz{|}~ ___++++--+-+++---+++____-_

    - while - poetak funkcije i postavljanje uvijeta, dok je uvijet ispravan izvravaju se naredbe u bloku.

    - blok naredbi - izvravaju se dok je uvijet ispravan

  • 32

    9.6 do while petlja Opi oblik:

    do { naredbe; } while (uvjet);

    Slina je while petlji s razlikom to se logiki uvijet ispituje na kraju petlje to znai da e naredba ili blok naredbi biti izvreni barem najmanje jednom. Primjer 15. #include void main() { int broj; do { scanf("%d", &broj); } while(broj!=100); }

    1 2 99 100

    - do - poetak petlje - blok naredbi - izvravju se naredbe i nakon toga se provjerava uvijet, ako

    je uvijet nezadovoljava vraa se na poetak dok se uvijet ne zadovolji

    - uvijet - dok se uvijet ne ispuni ne izlazi iz petlje

    9.7 continue Opi oblik:

    continue

    Nain vraanja vrijednosti iz funkcije. Bilo koja vrijednost varijable unutar zagrada ili vrijednost izraza biti e vraen na poetnu funkciju.

    Primjer 16.

    #include void main()

    { int x; for(x=0; x

  • 33

    9.8 Break Opi oblik:

    break

    Zaustavlja petlju u kojoj se nalazi. Upotrebom u naredbi switch djeluje samo na naredbu switch, ali ne i na petlju u kojoj se nalazi.

    Primjer 17. #include void main() { int t, brojac; for(t=0; t

  • 34

    10. POLJE (indeksirana varijabla ) Polje je [4] sloena jedno ili viedimenzionalna podatkovna struktura sastavljena od

    odreenog broja istovrsnih elemenata-lanova. Polja pripadaju statikim podacima to znai da im se odmah dodjeljuje kompletan memorijski prostor.

    Jednodimenzionalno polje moemo zamisliti kao linearni niz podataka isto tipa i identifikatora. U pravilu indeks je redni broj elementa koji ga jednoznano odreuje. Indeks prvog lana je nula. Naime raunalo e ostale lanove koje dohvaamo kombinacijom identifikatora i pripadajueg indeksa, pronalaziti tako da poetnoj adresi doda onoliko memorijskih lokacija, koliko je lan udaljen od poetka polja. Koritenje identifikatora bez indeksa ima efekt pokazivaa njime se dohvaa poetna tkzv. nulta dresa polja. Definirati polje znai pridruiti lanovima poetni sadraj.

    10.1 Jednodimenzionalno polje Opi oblik:

    tip var_ime[vel];

    Tip podatka slijedi identifikator nakon toga u uglatoj zagradi navodi se maksimalan broj lanova polja. U naredbi inicijalizacije moe se izostaviti jer e se dimenzija polja odrediti po broju vrijednosti pisanih u vitiastoj zagradi. int i [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; ili int i [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; i[0] = 1 i[9] = 10 Primjer 18 a. Upisuje u polje x vrijednosti 0 do 9

    t x[t] 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8

    #include main ( )

    { int x[10]; int t; for (t = 0; t

  • 35

    10.2 Dvodimenzionalno polje Opi oblik:

    tip var_ime [red][stup];

    Prema [4] dvodimenzionalno polje zamiljamo kao mreu redaka i stupaca. lanovi dvodimenzionalnog polja dohvaaju se pomou dvaju indeksa prvi nadreen je indeks retka , a drugi podreen je indeks stupca. Prilikom deklaracije indeksi se navode iza identifikatora svaki u svojoj zagradi. Ukoliko se polju ele pridruiti poetne vrijednosti ( inicijalizacija ) tada se to izvodi pomou vitiaste zagrade s desne strane operatora pridruivanja. U memoriji se dvodimenzionalnom polju dodjeljuje prostor kao da je jednodimenzionalno. Na primjer polju num[3][4] biti e dodjeljen memorijski prostor kao za jednodimenzionalno polje s 12 elemenata. Redoslijed zapisa je po redcima. Primjer 18b: Upisuje brojeve 1 do 12 u polje num [3][4] #include void main( ) { int t,i,broj[3][4]; for (t = 0; t

  • 36

    11. VJEBE: OSNOVE PROGRAMIRANJA

    Zadatak 1.1 Unesi naziv i povrinu neke zemlje sa tipkovnice, a zatim ih ispii na ekranu. #include void main(){ char zemlja[20]; float povrsina; printf("\nUnesi naziv zemlje->"); scanf("%s",zemlja); printf("\nUnesi povrsinu zemlje->"); scanf("%f",&povrsina); printf("\n%s ima povrsinu %7.0f kvadratnih kilometara.", zemlja,povrsina); return; } Unesi naziv zemlje->Hrvatska Unesi povrsinu zemlje->56610 Hrvatska ima povrsinu 56610 kvadratnih kilometara.

    Zadatak 1.2

    Unesi decimalni broj u slobodnom formatu sa vrstim zarezom (%f) i zatim ga ispii ga u definiranom formatu sa vrstim zarezom (npr. %6.2f) te u eksponencijanom obliku (%e). Mijenjajui format ispisa podatka provjerite kako postavke formata utjeu na oblik ispisa. #include #include #include int main(){ float broj; printf("Unesi decimalni broj u formatu sa vrstim zarezom ->"); scanf("%f",&broj); printf("\nDec. broj %f u formatu sa vrstim zarezom ispisuje se kao =%6.2f,"// "\n a u eksp. obliku se ispisuje kao =%.3e!",broj,broj,broj); getch(); return 0; } Unesi decimalni broj u formatu sa vrstim zarezom ->24.56 Dec. broj 24.559999 u formatu sa vrstim zarezom ispisuje se kao = 24.56, a u eksp. obliku se ispisuje kao =2.456e+01!

  • 37

    Zadatak 1.3 Unesi katete pravokutnog trokuta i izraunaj hipotenuzu, te kutove trokuta u stupnjevima. #include #include #include int main(){ float a,b,c,alfa,beta; printf("Unesi katete pravokutnog trokuta a,b="); scanf("%f,%f",&a,&b);

    c=sqrt(a*a+b*b); alfa=asin(a/c); beta=asin(b/c); printf("\na=%5.1f b=%5.1f c=%5.1f",a,b,c); printf("\n%20s alfa=%4.1f beta=%4.1f stupnjeva.","Kutevi u trokutu su:", alfa* 180/3.14, beta*180/3.14); printf("\nProvjera, alfa+beta=%4.1f stupnjeva.",(alfa+beta)*180/3.14); getch(); return 0; } Unesi katete pravokutnog trokuta a,b=3,4 a= 3.0 b= 4.0 c= 5.0 Kutevi u trokutu su: alfa=36.9 beta=53.1 stupnjeva. Provjera, alfa+beta=90.0 stupnjeva.

    Zadatak 1.4

    Izraunaj vrijednosti polinoma x^3+2x^2+3x+4 pomou funkcije POW. Vrijednost x unesi sa tipkovnice. #include #include #include int main() { double x,y; printf("Unesi vrijednost x="); scanf("%lf",&x); y=pow(x,3)+2*pow(x,2)+3*x+4; printf("\nZa x=%5.1f, polinom x^3+2x^2+3x+4 ima vrijednost %5.1f !",x,y); getch(); return 0; } Unesi vrijednost x=4 Za x= 4.0, polinom x^3+2x^2+3x+4 ima vrijednost 112.0 !

  • 38

    Zadatak 1.5 Napravi program koji rauna povrinu krunog isjeka. Polumjer krunice i kut u stupnjevima unesite sa tipkovnice odvojene razmakom. #include #include #include int main(){ float r,alfa,povrsina; printf("Unesi vrijednost polumjera i kut u stupnjevima ="); scanf("%f %f",&r,&alfa); povrsina=r*r*3.14 *alfa/360; printf("\nZa r=%5.1f i alfa=%5.1f, %25s=%10.2e!",r,alfa,"povrina krunog isjeka je",povrsina); getch(); return 0; } Unesi vrijednost polumjera i kut u stupnjevima =10 40 Za r= 10.0 i alfa= 40.0, povrsina kruznog isjecka je= 3.49e+01!

    Zadatak 1.6

    Napravi program koji rauna kapacitet ploastog kondenzatora. Radi jednostavnosti razmak elektroda unesi u metrima, a povrinu ploa u kvadratnim metrima. Kapacitet izrazi u mikrofaradima. #include #include #include int main(){ double epsilon0=8.854e-12; float epsilonr=1,razmak,povrsina,kapacitet; printf("\nDiel. konst. vakuuma je%10.3e!",epsilon0); printf("\nUnesi relativnu dielektrinu konstantu ="); scanf("%f",&epsilonr); printf("\nUnesi razmak i povrsinu ploa odvojeno zarezom ="); scanf("%f,%f",&razmak,&povrsina); kapacitet=epsilon0*epsilonr*povrsina/razmak*1e+06; printf("\nKapacitet kondezatora je%10.3e mikrofarada!",kapacitet); getch(); return 0; } Diel. konst. vakuuma je 8.854e-12! Unesi relativnu dielektrinu konstantu =6 Unesi razmak i povrsinu ploa odvojeno zarezom =0.002,0.09 Kapacitet kondezatora je 2.391e-03 mikrofarada!

  • 39

    Zadatak 2.1 Z 2_1. Izraunajte zbroj prvih n prirodnih brojeva. n zadajte sa tipkovnice. U zadatku ne treba provjeravati da li trenutni zbroj prelazi raspon prikaza odabrane vrste broja. Pokuajte odgovoriti kakav bi bio rezultat da se to dogodi. #include #include int main(){ int n,i,suma=0; printf("\nUnesi prirodni broj n="); scanf("%d",&n); for (i=1;i

  • 40

    Zadatak 2.3 Ispiite lanove geometrijskog niza i izraunajte njegovu sumu. Prvi lan niza, njegov kvocijent i broj lanova niza zadajte sa tipkovnice. #include #include int main(){ float prvi,clan,q,suma; int i,broj; printf("\nUnesi prvi lan niza i kvocijent="); scanf("%f,%f",&prvi,&q); printf("\nUnesi broj lanova niza="); scanf("%d",&broj); suma=prvi; clan=prvi; printf("\n\nNiz je: %5.2f,",prvi); for (i=1;i

  • 41

    Zadatak 2.4 Unesite tekst sa tipkovnice (do 80 znakova)malim slovima. Uneeni tekst ispiite tako da ispisujete svako tree slovo teksta velikim slovima. #include #include #include #include int main(){ char tekst[80]; int i,duljina; printf("\nUnesite tekst malim slovima ="); gets(tekst); duljina=strlen(tekst); printf("\nDuljina teksta je %2d slova",duljina); getch(); printf("\nTekst sa ispisanim svakim 3. slovom velikim je: "); for (i=0;i

  • 42

    Zadatak 2.6 Ispiite prvih n prim brojeva, n zadajte sa tipkovnice. #include #include int main(){ int i,j,n; printf("Zadaj krajnji broj="); scanf("%d",&n); printf("\n Prim brojevi do %4d su :\n%4d, ",n,1); for (i=1;i

  • 43

    Zadatak 3.2 Unesite tekst sa tipkovnice (do 80 znakova). Izbrojite koliko je velikih slova, malih slova i brojeva u tekstu. #include #include #include int main(){ char tekst[80]; int duljina, i, br_vel=0, br_mal=0, br_br=0, br_ostalo=0; printf("Unesite tekst:"); gets(tekst); duljina=strlen(tekst); for (i=0;i='A' && tekst[i]='a' && tekst[i]='0' && tekst[i]

  • 44

    Zadatak 3.3 Napiite program koji pretvara cijeli broj upisan u bazi.B (2, 8 ili 16) u decimalni broj. #include #include #include #include #include #include int main(){ char tekst[20],ch_znam; int baza, duljina, znamenka,rezultat=0,i; printf("Unesite cijeli broj: "); gets(tekst); duljina=strlen(tekst); printf("Unesite bazu: "); scanf("%d",&baza); if (!(baza==2 || baza ==8 || baza==16)){ printf("Nije upisana ispravna baza - prekid programa"); getch(); exit(0); } for (i=0;i='0' && ch_znam='A' && toupper(ch_znam)baza){printf("\nUneena %d. znamenka vea ili jednaka bazi",i+1); getch(); exit(0); } /* printf("\nZnamenka je %d",znamenka); */ /* Stvarna konverzija */ rezultat+=znamenka*pow(baza,duljina-1-i); } printf("\nDecimalni broj je: %8d",rezultat); getch(); return 0; } Unesite cijeli broj: e Unesite bazu: 16 Decimalni broj je: 14

  • 45

    Zadatak 3.4 Napiite program koji ispisuje tablicu ASCII koda poev od znaka razmaka (ASCII kod je 32 dekadski) do znaka sa kodom 127 (dekadski). Znakovi sa kodom manjim od 32 su kontrolni znakovi i ne mogu se ispisivati. Ispiite tablicu tako da prvo ispiete zaglavlje stupaca tablice u kojem su decimalni brojevi 32, 48, 64, 80, 96, 112. Ispod toga ispiite u zaglavlju iste brojeve u heksadekadskom formatu. U recima tablice ispiite prvo dekadske brojeve od 0 do 15, a zatim heksadekadske ekvivalente tih brojeva te napokon ASCII kodove znaka u %c formatu. Kodove znakova ispisujete po 6 u retku pozionirano ispod vodoravnog zaglavlja tablice. Uoite da su kodovi malih slova za 32 dekadski (odnosno 20 heksadekadski) vei od kodova istih velikih slova. #include #include int main(){ int i, j=0; char kod=32; // moglo se staviti i kod=' '; clrscr(); printf("\nTablica ASCII koda \n\n"); printf ("\t\t 32 48 64 80 96 112 dekadski"); printf ("\n\t\t 20 30 40 50 60 70 heksadekadski"); printf("\n"); for(i=0;i

  • 46

    11 b + ; K [ k { 12 c , < L \ l | 13 d - = M ] m } 14 e . > N ^ n ~ 15 f / ? O _ o

    Zadatak 3.5

    Nainite program koji ispituje da li se toka sa koordinatama zadanim sa tipkovnice nalazi na krunici, unutar krunice ili van nje. #include #include #include int main(){ float x1,y1,xs,ys,r,udaljenost; printf("\n Unesi koordinate sredita krunice, a zatim i polumjer,"// "\n separator unosa neka je razmak xs ys r ="); scanf("%f %f %f",&xs,&ys,&r); printf("\n Unesi koordinate toke razdvojene zarezom x,y ="); scanf("%f,%f",&x1,&y1); // Sljedi provjera gdje se nalazi toka // Udaljenost je varijabla kojom se po Pitagorinom pouku // odreuje udaljenost toke od sredita krunice udaljenost=sqrt(pow((x1-xs),2)+pow((y1-ys),2)); printf ("\nUdaljenost toke od sredita krunice je : %6.2f", udaljenost); if (udaljenost>r) printf("\nToka se nalazi izvan krunice"); else if (udaljenost

  • 47

    Zadatak 4.1 Napravite program za izraunavanje trigonometrijskih funkcija. Kut zadajte u stupnjevima. Za izbornik koristite naredbu switch. #include #include #include int main(){ float kut,kutrad; int izbor; do { printf("\nIzaberite funkciju: 1. Sinus"); printf("\n 2. Kosinus "); printf("\n 3. Tangens "); printf("\n 4. Kotangens "); printf("\n 5. Kraj "); printf("\n\t\t\t\t"); scanf("%d",&izbor); if (izbor !=5) { printf("\nUnesi kut u stupnjevima: "); scanf("%f",&kut); kutrad=kut*3.14/180;} switch (izbor){ case 1: printf("Sinus od %4.1f stupnjeva je %4.3f", kut, sin(kutrad)); getch(); break; case 2: printf("Kosinus od %4.1f stupnjeva je %4.3f", kut, cos(kutrad)); getch(); break; case 3: printf("Tangens od %4.1f stupnjeva je %6.2f", kut, tan(kutrad)); getch(); break; case 4: printf("Kotangens od %4.1f stupnjeva je %6.2f", kut, 1/tan(kutrad)); getch(); break; } } while (izbor!=5); return 0; } Izaberite funkciju: 1. Sinus 2. Kosinus 3. Tangens 4. Kotangens 5. Kraj 2 Unesi kut u stupnjevima: 48 Kosinus od 48.0 stupnjeva je 0.669

  • 48

    Zadatak 4.2 Napravite program koji rauna broj samoglasnika u reenici. Za ispitivanje koristite naredbu switch. #include #include #include int main(){ char tekst[80], slovo; int duljina, i; int br_a=0, br_e=0, br_i=0, br_o=0, br_u=0; printf("\nUnesi reenicu: "); gets(tekst); duljina=strlen(tekst); for (i=0;i

  • 49

    Zadatak 4.3 Napravite program za pogaanje broja znakova u reenici. Broj pogaanja ograniite na pet. #include #include #include int main(){ char tekst[80]; int br_pok=1, br_char=0, duljina; printf("\nUnesi recenicu: "); gets(tekst); duljina=strlen(tekst); while (br_pok

  • 50

    Zadatak 4.4 Unesite sa tipkovnice cjelobrojnu kvadratnu matricu sa najvie 10x10 lanova. Zatim generirajte novu matricu tako da u uneenoj matrici pozitivne lanove zamijenite sa +1, a negativne lanove sa -1. Ispiite novu matricu. #include #include int main(){ int mat[10][10],d,i,j; do{ printf("Unesite veliinu matrice(do 10x10 lanova):"); scanf("%d",&d); if(d>10)printf("\nPreveliki broj\n"); }while(d>10); //Unos matrice for(i=0;i

  • 51

    mat[3][2]= -4 mat[3][3]= 5 Ispis uneene matrice ! 1 2 3 0 -1 -2 3 -4 5 Ispis generirane matrice ! 1 1 1 0 -1 -1 1 -1 1

    Zadatak 4.5

    Napravite program za ispis i pomicanje male loptice po ekranu. Lopticu pomiite tipkama w (gore), a (lijevo), s (dolje) i d (desno). #include #include #include #include #include #include void main(){ int n,v=1,h=1; char izbor; printf("Pomicete malu lopticu tipkama:"); printf("\n\n\n w (gore)"); printf("\na s d (lijevo)(dolje)(desno) "); printf("\n\n\n\n i x za izlaz"); getch(); do{ gotoxy(h,v); printf(" ## "); gotoxy(h,v+1); printf(" #### "); gotoxy(h,v+2); printf(" ## "); n=0; izbor = getch(); switch (toupper(izbor)) { case 'S': v++; break; case 'W': v--; break; case 'A': h--; break; case 'D': h++; break; case 'X': exit(0); default: n=5; }

  • 52

    if (v>20) v=1; if (v40) h=1; if (h20); for(i=0;i

  • 53

    Unesi 1. clan niza: 2 Unesi 2. clan niza: 1 Nesortirani niz je : 2, 1, Sortirani niz je : 1, 2,

    Zadatak 5.2

    Napiite program koji pretvara cijeli dekadski broj u binarni. #include #include #include #include #include int main(){ int bin_broj[30], baza=2, broj; int bin_znam, br_znam=0, i, kvoc; /* double br_pom; printf("Unesite cijeli dekadski broj: "); scanf("%d",&broj); /* Broj bin. znamenki za prikaz je dualni logaritam od broja koji se prikazuje */ /* br_pom=log(broj)/log(2); /* /* br_znam=(int)br_pom; /* /* if (br_znam

  • 54

    Zadatak 5.3 Napiite program koji uitava cjelobrojnu kvadratnu matricu reda n te izraunajte aritmetiku sredinu dijagonalnih lanova. #include #include #define MAX 20 int main(){ int i,j,n,mat[MAX][MAX]; float sred=0.; printf("\nUnesi velicinu cjelobrojne kvadratne matrice nxn: "); scanf("%d",&n); printf("\nUnesi elemente matrice:\n\n"); for(i=0;i

  • 55

    Zadatak 5.4 Napiite program koji uitava niz otpornika koji sainjavaju paralelni spoj otpornika i izraunajte ekvivalentni otpor. #include #include #define MAX 20 int main(){ int n,i; float R[MAX],Ruk=0; printf("\nUnesi broj otpornika u paralelnom spoju: "); scanf("%d",&n); printf("\nUnesi otpornike redom:\n\n"); for(i=0;i

  • 56

    Zadatak 5.5 Napiite program koji izraunava vrijednost polinoma. Polinom zadati sa tipkovnice i raunati ga koristei funkciju poly. #include #include #include int main(){ int n, i; double pol[10], x, y; clrscr(); printf("\nUnesi potenciju polinoma (do 9. stupnja): "); scanf("%d",&n); printf("\nUnesi koeficijente polinoma poev od slobodnog lana:\n\n"); for(i=0;i

  • 57

    PROGRAMIRANJEIVJEBE

  • 58

    12. POLJE

    12.1 Viedimenzionalno polje Opi oblik:

    tip var_ime [red][stup].......[str N];

    Polje s tri ili vie dimenzija ne koriste se esto zbog memorijskih ogranienja. Program moe vrlo brzo doi izvan memorije Primjer 1. #include void main(){ int t[10][10][10],i; for(i=0;i

  • 59

    13. POKAZIVAI Pokaziva je prema [4] objekt , odnosno varijabla kojoj e se pridruiti adresa nekog

    drugog objekta. Znak (*) u deklaraciji se pie ispred identifikatora i ima funkciju dereferenciranja ( dereferencing operator ) koji oznaava da se radi o pokazivakoj varijabli.

    13.1 Jednostruka indirekcija

    Znak (*) u deklaraciji se pie ispred identifikatora i ima funkciju dereferenciranja ( dereferencing operator ) koji oznaava da se radi o pokazivakoj varijabli.

    Opi oblik: tip *ime_varijable Primje 3a. #include void main() { int b; int * adresa; int vrijednost; b=3200; adresa=&b; vrijednost= * adresa; printf( "b je : %d\n" ,vrijednost); }

    b je : 3200

    int b; int * adresa; b=3200; u ovim naredbama varijabla je definirana , a pokaziva deklariran ali jo nije usmjeren. Rezultat je alokacija, a ne inicijalizacija pokazivaa. adresa = & b; Nakon toga pokaziva se moe koristiti kako slijedi vrijednost= * adresa; printf( "b je : %d\n" ,vrijednost); U tom sluaju dohvaa se vrijednost objekta ija mu je adresa pridruena.

    POKAZIVAADRES A

    VARIJABLA

    VRIJEDNOST

  • 60

    Primjer 3b. Inkrement i dekremet #include void main() { int *p,broj ; p=&broj; *p=100; printf("%d,broj"); (*p)++; printf("%d,broj"); (*p)++; printf("%d,broj"); }

    100 101 100

    Postupak pridruivanja adrese objekta pokazivau naziva se postupkom usmjeravanja , pri emu je vano da pokaziva i objekt , osim u iznimnim sluajevima budu istog tipa. Pomou znaka ( & ) tzv. operatora adrese pokazivau emo pridruiti adresu objekta, usmjeriti.ga adresa = & b; Nakon toga pokaziva se moe koristiti na razne naine. vrijednost= * adresa; printf( "b je : %d\n" ,vrijednost); Pokaziva se moe koristiti u kombinaciji sa zvjezdicom i nakon deklaracije . U tom sluaju dohvaa se vrijednost objekta ija mu je adresa pridruena. Znak zvjezdica (*) sada je u funkciji tzv. operatora indirekcije ( engl. indirection operator ) .Pokaziva kojem u naredbi prethodi operator indirekcije moe utjezati na promjenu vrijednosti objekta kao u primjeru 3b. Ovdje se u promjeni vrijednosti objekta koristi inkrement i dekrement Napokon pokazivau se moe pridruiti vrijednost nekog drugog pokazivaa- preusmjeriti ga. U tom sluaju - budui

    da se radi o klasinom postupku pridruivanja , identifikator se koristi bez zvjezdice.

  • 61

    13.2 Viestruka indirekcija

    Pokaziva na pokaziva u naredbi deklaracije ima dvije zvjezdice ispred identifikatora.

    Opi oblik:

    tip **ime_varijable

    Primjer 4.Dvostruka indirekcija. #include void main() { int x,*p,**q; x=10; p=&x; q=&p; printf("%d",**q); }

    10

    13.3 Pokazivai na polja char str[80]; char *p1; p1=str; Pointer p1 postavljen je na prvu adresu polja str. eli li se pristupiti 5 elementu polja piemo str[4] ili *(p1+4) ili (str+4)++ Osim pomou indeksa elementu polja moe se pristupiti pomou identifikatora polja bez naznake indeksa . Identifikator polja ( ime polja ) ima znaenje pokazivaa na prvi element. Primjer 5. pokazivau se moe pridruiti vrijednost nekog drugog pokazivaa #include void main() { char s[10]= "Dobar dan" ; char *p; int i; p=s; for(i=0;p[i]; i++) printf("%c" ,toupper(p[i])); }

    DOBAR DAN

    POKAZIVA ADRES A

    POKAZIVA

    ADRES A

    VARIJABLA

    VRIJEDNOST

  • 62

    14. STRING ( polje znakova )

    14.1 String konstante Ako se string konstanta upotrebljava u bilo kojem izrazu, tretira se kao pokaziva na prvi znak u stringu. Primjer 6. #include void main() { char *s; s= Zabavno je koristiti pokazivace ; printf(s); }

    Zabavno je koristiti pokazivace

    14.2 strcpy ( ) Opi oblik: strcpy (ulazni, izlazni ); Kopira sadraj stringa izlazni u ulazni. Primjer 7. # include # include void main ( ) { char str [80]; strcpy (str, bok); printf (%s,str); }

    bok

    14.3 strcat ( ) Opi oblik:

    strcat (s1,s2);

    Funkcija dodaje string s2 na kraj s1; s2 je nepromijenjen. Oba stringa moraju zavravati nul znakom ( ASCI 0 ). Primjer 8. # include # include void main ( ) { char s1[80],s2[80]; strcpy(s1,"Programiranje je "); printf("\n%s\n",s1); gets (s2); strcat(s1,s2); printf("%s",s1); }

    Programiranje je zabavno Programiranje je zabavno

  • 63

    14.4 strlen ( ) Opi oblik:

    strlen (s);

    Funkcija vraa duljinu stringa s. Primjer 9. # include # include void main ( ) { char str [80]; printf (Unesite znakove:); gets (str); printf (%d, strlen (str)); }

    Unesite znakove: programiranje 13

    14.5 NULL terminator proba u for petlji je string str[i]. Radi jer je to ne nula vrijednost. Petlja se zaustavlja kad dostigne nul-terminator. To je pravi trenutak jer oznaava kraj polja znakova. Primjer 10. Pretvaranje malih slova u velika. # include # include # include void main ( ) { char str [80]; int i; strcpy (str, Ovo je proba); for (i = 0; str[i]; i ++) str[i] = toupper (str[i]); printf (%s,str); }

    OVO JE PROBA

  • 64

    15. FUNKCIJE C program je skup jedne ili vie funkcija. Za pisanje programa potrebno je prvo

    napisati funkcje a nakon toga ih treba sloiti zajedno.Funkcija u C-u je logiki samostalan dio programa .

    Funkcija moe ali ne mora imati parametre. Parametri su vrijednosti koje se proslijeuju funkciji iz okoline, ime joj se omoguava da prilikom svakog poziva, pomou istih naredbi radi s razliitim vrijednostima.Parametri mogu biti stvarni ( argumenti ) i formalni. Argument je vrijednost koja se funkciji proslijeuje prilikom poziva . Ukoliko se radi o vrijednosti koju funkcija vraa okolini iz koje je pozvana ( izlaz ) argument nazivamo rezultatom funkcije. Formalni parametar je slobodna varijabla ( za vrijeme izvoenja funkcije nalazi se na rezervnoj memorijskoj lokaciji ) kojoj se u trenutku poziva pridruuje vrijednost argumenta.

    Opi oblik fukcije

    funkcija_ime ( lista parametara ) { ... tijelo funkcije }

    Svaka funkcija ima : - Ime koje se koristi za poziv, daje se proizvoljno, uvjet da nije rezervirano u jeziku (main() i naredbe)

    - Iza funkcije slijedi zagrada da bi se funkcija razlikovala od varijable.Ukoliko funkcija ne treba parametre tada se lista parametara ostavlja prazna ali se moraju staviti zagrade

    - parametari se dijele na stvarne( argumente ) i fomalne koji se uvijek pojavljuju u paru i istog su tipa.Ukoliko ih ima vie redoslijed se mora podudarati.

    { - Poetak funkcije - Tijelo funkcije naredbe izmeu lijeve i desne vitice - sadri

    naredbe koje definiraju rad funkcije } - Kraj funkcije i povrat na pozivnu proceduru

    Funkcija moe ali i ne mora vraati podatke na pozivnu rutinu, ukoliko ne vraa

    podatke mora se deklarirati kao tip void.

    Opi oblik

    tip ime_ funkcije(tip ime_varijabe1, tip ime_varijabe2,..., tip ime_varijabeN) { tijelo funkcije }

    - tip - ako postoji odreuje tip podataka koji funkcija vraa, ako ne

    postoji funkcija vraa integer. - tip ime_varijable - poprima vrijenost argumenta , mora se pisati tip i ime - () - zagrade moraju biti zatvorene i ako je lista parametara

    prazna.

  • 65

    15.1 Lokalne varijable Deklariraju se unutar funkcije. Varijable mogu biti lokalne u bloku. Poznate su unutar svoje funkcije (bloka), tj. doseg je ogranien na funkciju (blok). Kreiraju se ulaskom u blok, a gube se kod izlaza. Primjer 11. #include void f1(); void main() { char str[]="Ovo je string iz main()"; printf("%s\n",str); f1(); printf("%s\n",str); } void f1() { char str[80]; printf("Unesite nesto:"); gets(str); printf("%s\n",str); }

    Unesite nesto:bok bok Ovo je string iz main()

    Ako se drugaije ne odredi, lokalne varijable pohranjuju se na stack. injenica da je stack dinamian i da mijenja memorijalno podruje objanjava zato lokalne varijable ne mogu zadrati vrijednost izmeu poziva funkcije.

    15.2 Formalni parametri( argumenti )Parametri mogu biti stvarni ( argumenti ) i formalni. Moraju biti istog tipa kao argumenti, i po broju ih ima jednako. Argument je vrijednost koja se funkciji proslijeuje prilikom poziva 15.3 Globalne varijable Globalna varijabla daje mogunost zadravanja vrijednosti unutar vremena izvravanja programa. Deklarira se na poetku programa, prije main() funkcije. Vrijednosti globalne varijable moe se pristupiti iz bilo koje funkcije. Ako nije nuno ne koriste se zbog:

    - zauzimaju memoriju za cijelo vrijeme izvoenja programa, a ne samo kad ih trebamo - funkcija se poziva na neto izvan sebe same

    Primjer 11a. Opi: Specifini: Mul(int x,int y) { return(x*y); } /* Vraa vrijednost bilo koja dva broja */

    int x,y; mul() { return (x*y);} /* Nalazi produkt globalnih n (x*y);}

  • 66

    15.4 Poziv s vrijednou Ova metoda pridruuje vrijednost argumenta formalnom parametru. Primjer 12. #include void main() { int t=10; printf("%d %d",funkcija(t),t); } funkcija(int x) { x=x*x; return (x); }

    100 10

    Vrijednost argumenta 10, pridruuje se parametru x. Nakon pridruenja x=x*x jedino se mijenja lokalna varijabla x. Varijabla t koritena u pozivu, imat e i dalje vrijednost 10.

    15.5 Poziv adresom Adresa argumenta pridruuje se formalnom parametru. Unutar funkcije adresa se koristi za pristup stvarnom argumentu. Primjer 13. #include void main (){ int x,y; x=10; y=20; printf("Unesite pocetne vrijednosti x i y :%d %d\n",x,y); zamjeni(&x,&y); printf("Zamjenjene vrijednosti x i y :%d %d\n",x,y); } zamjeni(int *x,int *y){ int temp; temp = *x; *x = *y; *y=temp; } Pocetne vrijednosti x i y :10 20 Zamjenjene vrijednosti x i y :20 10 U ovom primjeru, varijabli x je pridruena vrijednost 10, a varijabli y vrijednost 20. Funkcija zamjeni() pokazivaima *x i *y pridruuje adrese x i y .

  • 67

    15.6 Polje argument funkcije Polje je argument u funkcijama u primjerima koji slijede. Primjer 14a. Polje istog tipa i veliine kao u pozivnoj funkciji. #include void main(){ int t[10],i; for(i=0;i

  • 68

    15.7 Funkcija vraa ne cijelobrojnu vrijednost Funkcija vraa double vrijednost.

    Primjer 15. #include double opseg(); double povrsina(); void main(){ double r; printf(Unesite polumjer :); scanf(%lf,&r); printf(%lf\n,opseg(r)); printf(%lf\n,povrsina(r)); } double opseg(double r) { return r*2*3.1416; } double povrsina(double r) { return r*r*3.1416; }

    Unesite polumjer :1 6.283200 3.141600

    15.8 Funkcija tipa void Funkcije koje ne vraaju vrijednost. Primjer 16. #include void okomito(char *str); main() { char i[]="znak"; okomito(i); } void okomito(char *str){ while (*str) printf("%c\n",*str++); }

    z n a k

    Prije upotrebe mora se deklarirati, ako ne onda e vratiti integer. Dobro je sve funkcije koje ne vraaju vrijednost deklarirati kao void.

  • 69

    15.9 Rekurzivna funkcija Funkcija je rekurzivna ako naredba u tijelu funkcije zove samu sebe. Ponekad se koristi naziv cirkularna definicija. Primjer 17a. Klasian primjer rekurzije je funkcija factr (), koja rauna faktorijele od integera. Faktorijel od broja n je produkt svih brojeva od 1 do n. 3! = 1*2*3 = 6. Primjer daje rekurzivnu i nerekuzivnu verziju funkcije. factr (int n) { int answer; if(n==1) return (1) answer = factr (n-1) * n; return (answer); } fact(int n) { int t,answer; answer=1; for(t=1;t

  • 70

    Primjer 17b. Ispisuje znakove na zaslon obrnutim redoslijedom. #include void obrnuto(char *s); void main() { char str[]="Ovo je proba"; obrnuto(str); } void obrnuto(char *s) { if(*s) obrnuto(s+1); printf("%c",*s); }

    aborp ej ovO

    Funkcija prvo provjerava dali je dostignut kraj stringa. Ako nije zove samu sebe s slijedeim znakom. Kad se nae nula poziv se nastavlja i znakovi se ispisuju u reverznom slijedu.

    15.10 Vrijeme izvravanja Primjer 18. U glavnoj funkciji. Pozivom funkcije #include void main() { int x; for(x=1;x

  • 71

    16. DATOTEKE

    Da bi se moglo itati ili pisati u datoteku moramo koristiti file pointere. File pointere pokreemo naredbom:

    FILE *fp;

    16.1 Otvaranje datoteke Opi oblik

    FILE *fopen ( char *ime_datoteke, char *nacin );

    - ime_datoteke - niz znakova naziv datoteke koju elimo otvoriti - nain - nain otvavranja

    -znak- -nain otvaranja- r otvara datoteku za itanje w otvara datoteku za pisanje a nadopunjuje datoteku

    16.2 Zatvaranje datoteke Osnovni oblik

    int fclose (FILE *fp);

    - ime_datoteke - niz znakova naziv datoteke koju elimo zatvoriti Primjer 19. Otvaranje, itanje i zatvaranje datoteke

    #include #define dat 80 void main ( void ) { FILE *f; char buffer[dat]; f = fopen ( "c:\\proba.txt", "r" ); if ( f == NULL ) printf ( "Ne mogu pronaci datoteku\n" else { while ( fgets ( buffer, dat, f ) != NULL ) printf ( "%s", buffer ); if ( fclose ( f ) == EOF ) printf ( "Ne mogu je zatvoriti datoteku" ); }

    Moja prva datoteka.

  • 72

    17. DINAMIKO ALOCIRANJE MEMORIJE Dinamiki se alocira memorijski prostor za varijable tijekom izvoenja programa.

    17.1 calloc Opi oblik

    void *calloc(size_t nmemb, size_t size);

    Ova funkcija koristi se za alokaciju prostora za pohranu varijable dok se program izvrava. Funkcija prima dva argumenta koji odreuju broj elemenata za koje rezerviramo prostor u memoriji i veliinu svakog elementa u byte-ovima. Funkcija vraa pokaziva na karakter koji je alociran u prostoru za pohranu koji je inicijaliziran nulama.

    17.2 malloc Opi oblik

    void *malloc(number_of bytes );

    Funkcija je slina funkciji calloc ali ima jedan argument koji odreeje broj bajtova koje alociramo u memoriji. char *cp; cp = malloc(100); Alocira 100 baytova na poetak adrese cp.

    17.3 sizeof Opi oblik

    sizeof (tip ili varijabla );

    Vraa memorijsku veliinu dane varijable. Trebalo bi ga koristiti zajedno sa funkcijom calloc, tako da je alocirana samo potrebna memorija, a ne tono odreena veliina. int *ip; ip = (int *) malloc(100*sizeof(int)); Ako dodamo to na primjer ispred u ovom sluaju se zauzme tono onoliko memorije koliko treba.

    17.4 free Opi oblik

    free()

    Kada nam varijable vie nisu potrebne, prostor koji je dodjeljen treba vratiti sistemu.

  • 73

    18. VJEBE: PROGRAMIRANJE Zadatak 6.1

    6_1. Napiite program koji za uneeni niz cijelih brojeva izmeu 1 i 100 provjerava koliko je uneeno brojeva djeljivih sa 3. Koristite pokazivae i dinamiko alociranje memorije. Unesite najvie do 10 brojeva, a za raniji kraj unosa upiite '0' (ako unosite manje od 10 brojeva). #include #include #include int main(){ int *b, broj,unos=0, djeljivo=0 ,i; clrscr(); if ((b = (int *) malloc(10*sizeof(int))) == NULL) { printf("\nNema dovoljno memorije za alociranje spremnika"); exit(1);} while (unos

  • 74

    Zadatak 6.2 Napiite program koji zbraja dvije uitane matrice. Koristite pokazivae i dinamiko alociranje memorije. #include #include #include int main(){ double *a, *b, *c, temp; int n,m,i,j; clrscr(); printf("\nUnesi broj redaka matrice : "); scanf("%d",&m); printf("\nUnesi broj stupaca matrice : "); scanf("%d",&n); /* Dinamiko alociranje memorije */ if ((a = (double *) malloc(m*n*sizeof(double))) == NULL) { printf("\nNema dovoljno memorije za alociranje spremnika"); exit(1); } if ((b = (double *) malloc(m*n*sizeof(double))) == NULL) { printf("\nNema dovoljno memorije za alociranje spremnika"); exit(1); } if ((c = (double *) malloc(m*n*sizeof(double))) == NULL) { printf("\nNema dovoljno memorije za alociranje spremnika"); exit(1); } printf("\nUnesi prvu matricu : \n"); for(i=0;i

  • 75

    for(j=0;j

  • 76

    Zadatak 6.3 Unesi tekst sa tipkovnice, a zatim unesi slovo iju prvu pojavu u uneenom tekstu traite. Ako je slovo pronaeno ispiite njegov poloaj rijei. Koristite pokazivae. #include #include #include int main(){ char tekst[80], slovo, *pok; int brojac=0; clrscr(); printf("Unesite tekst : "); gets(tekst); printf("\nUnesite slovo : "); slovo=getche(); pok=tekst; while (*pok){ if (*pok==slovo) break; brojac++; pok++; } if(brojac==strlen(tekst)) printf("\nSlovo nije naeno u rijeci! "); else printf("\nSlovo se prvi puta pojavljuje na %3d. mjestu u rijeci!", brojac+1); getch(); return 0; } Unesite tekst : Pozdrav Unesite slovo : o Slovo se prvi puta pojavljuje na 2. mjestu u rijeci!

  • 77

    Zadatak 6.4 Unesite reenicu sa tipkovnice, a zatim unesite rije iju pojavu u uneenom tekstu traite. Ako je rije pronaena ispiite njen poloaj u reenici. Koristite pokazivae. Uoite, ako se rije ponavlja u reenici rjeenje e ukazivati na poetno slovo zadnje upisane rijei. #include #include #include int main(){ char tekst[80], rijec[30], *pok_tekst, *pok_temp, *pok_rijec; int nalaz=0, brojac=0, polozaj=0; clrscr(); printf("Unesite tekst : "); gets(tekst); printf("\nUnesite rijec : "); gets(rijec); pok_tekst=tekst; while (*pok_tekst){ pok_rijec=rijec; pok_temp=pok_tekst; while (*pok_rijec){ if (*pok_tekst != *pok_rijec) break; else if (*(pok_rijec+1)=='\0'){nalaz=1; polozaj=brojac+1;} pok_rijec++; pok_tekst++;; } brojac++; pok_tekst=++pok_temp; } if (nalaz==1) printf("\nRijec je nadjena i pocinje od %d. slova! ", polozaj); else printf("\nRijec nije nadjena! "); getch(); return 0; } Unesite tekst : ovo je prvi prvi tekst. Unesite rijec : prvi Rijec je naena i poinje od 13. slova!

  • 78

    Zadatak 6.5 Unesite tekst sa tipkovnice. Iz teksta izdvojite novi niz zadan poloajem poetnog i krajnjeg znaka koji izdvajate. Ispiite izdvojeni niz. Koristite pokazivae. #include #include int main(){ char tekst[80], niz[80],*pok_tekst, *pok_niz; int i, poc, kraj; clrscr(); printf("Unesite tekst : "); gets(tekst); printf("\nUnesite polozaj pocetnog znaka = "); scanf ("%d", &poc); printf("\nUnesite polozaj krajnjeg znaka = "); scanf ("%d", &kraj); pok_tekst=tekst; pok_niz=niz; for (i=0;i

  • 79

    Zadatak 7.1 Napiite program za ispis tablice prirodnih brojeva u zadanom intervalu i njihovih logaritama. Za ispis linija u zaglavlju napravi funkciju. #include #include #include void crtice(void); int main(){ int broj, poc_broj=1, kraj_broj=20; while(poc_broj>0 && kraj_broj>0){ clrscr(); crtice(); printf("\n\tBroj\t\tLogaritam"); crtice(); for(broj=poc_broj; broj

  • 80

    Zadatak 7.2 Napiite program za ispis tablice prirodnih brojeva 1 do 7 i njihovih faktorijela. Za ispis linija u zaglavlju te raun faktorijela napravite funkciju. #include #include #include void crtice(void); int faktorijel(int); int main(){ int broj; clrscr(); crtice(); printf("\n\tBroj\t\tFaktorijel"); crtice(); for(broj=1; broj

  • 81

    Zadatak 7.3 Napiite program za provjeru da li je uneeni tekst palindrom. Za provjeru para znakova napravite funkciju. #include #include #include #include int provjera_znakova(char, char); int main(){ char tekst[80]; int duljina, brojac=0, i; clrscr(); printf("Unesite tekst koji ispitujete :"); gets(tekst); duljina=strlen(tekst); for (i=0;i

  • 82

    Zadatak 7.4 Napiite funkciju koja iz zadanog niza izdvaja podniz odreden poloajem pocetnog i krajnjeg znaka u nizu. Niz deklarirajte pokazivacem. U funkiji formirajte novi niz i vratite pokazivac na njega. U glavnoj funkciji unesite izvorni niz te poloaj pocetnog i krajnjeg znaka novog niza (to su argumenti funkcije) i ispiite novoformirani niz. #include #include #include char * midstr(char *, int, int); int main(){ char *orig_niz, *novi_niz; int poc, kraj; clrscr(); orig_niz=(char *) malloc(30*sizeof(char)); printf("Unesite niz : "); gets(orig_niz); printf("\nUnesite poloaj pocetnog znaka = "); scanf ("%d", &poc); printf("\nUnesite poloaj krajnjeg znaka = "); scanf ("%d", &kraj); novi_niz=midstr(orig_niz, poc, kraj); printf("\nNovi niz je :"); puts(novi_niz); getch(); return 0; } char * midstr(char *orig_niz,int poc,int kraj){ char *novi_niz; int i; novi_niz=(char *) malloc((kraj-poc+1+1)*sizeof(char)); for (i=0;i

  • 83

    Zadatak 7.5 Napiite funkciju koja dohvaa realni broj zapisan kao string od najvie 20 znakova i vraa njegovu vrijednost (funkcija identina funkciji atof). #include #include #include #include double alfa2float(char[20]); int main(){ char tekst[20]; double iznos; clrscr(); printf("\nUnesi broj: "); gets(tekst); iznos=alfa2float(tekst); printf("\nUneseni broj je: %f",iznos); getch(); return 0; } double alfa2float(char str_broj[20]){ double iznos=0; int duljina, d_cijeli_dio, d_realni_dio, i; duljina=strlen(str_broj); for (i=0;i

  • 84

    Zadatak 8.1 Napiite funkciju koja izraunava koordinate sjecita dva pravca. Ulazni argumenti neka su koeficijenti smjera i odsjeci na y osi pravaca. #include #include int presjek(float, float, float, float, float *, float *); int main(){ float k1, l1, k2, l2, xs, ys; int paralelni; clrscr(); printf("\nUnesi koef. smjera i odsjecak na y osi 1. pravca: "); scanf("%f,%f",&k1,&l1); printf("\nUnesi koef. smjera i odsjecak na y osi 2. pravca: "); scanf("%f,%f",&k2,&l2); paralelni=presjek(k1, l1, k2, l2, &xs, &ys); if (paralelni==1) printf ("\nPravci su paralelni!"); else printf("Sjecite pravaca je toka (%5.2f,%5.2f).",xs,ys); getch(); return 0; } int presjek(float koef1, float ods1, float koef2, float ods2, float *xsjec, float *ysjec){ int paralelni; if (koef1==koef2) return paralelni=1; *xsjec=-(ods2-ods1)/(koef2-koef1); *ysjec=koef1*(*xsjec)+ods1; return paralelni=0; } Unesi koef. smjera i odsjecak na y osi 1. pravca: 2,3 Unesi koef. smjera i odsjecak na y osi 2. pravca: 5,3 Sjecite pravaca je tocka (-0.00, 3.00).

  • 85

    Zadatak 8.2 Napiite funkciju koja kut u radijanima pretvara u stupnjeve, minute i sekunde. #include #include #include void rad2stup(float, int *, int *, int *); int main(){ float kut_rad; int stup, min, sek; clrscr(); printf("\nUnesi kut u radijanima: "); scanf("%f",&kut_rad); rad2stup(kut_rad, &stup, &min, &sek); printf("Kut ima %4d stupnjeva, %4d minuta i %4d sekundi!",stup,min,sek); getch(); return 0; } void rad2stup(float kut_rad, int *stup, int *min, int *sek){ float kut_stup, temp; kut_stup=kut_rad*180/M_PI; *stup=kut_stup; temp=(kut_stup-*stup)*60; *min=temp; *sek=(temp-*min)*60; } Unesi kut u radijanima: 23 Kut ima 1317 stupnjeva, 48 minuta i 10 sekundi!

  • 86

    Zadatak 8.3 Zadane su dvije stranice kosokutnog trokuta i kut u vrhu nasuprot jedne od stranica. Napiite funkciju koja izraunava preostale stranice i kuteve u trokutu. ##include #include #include void trokut(float, float, float, float *, float *, float *); int main(){ float a, b, c, alfa, beta, gama; clrscr(); printf("\nUnesi stranice a i b: "); scanf("%f,%f",&a, &b); printf("\nUnesi kut alfa (u stupnjevima): "); scanf("%f",&alfa); alfa=alfa*M_PI/180; trokut(a, b, alfa, &c, &beta, &gama); printf("\nStranice trokuta su: %5.2f, %5.2f i %5.2f", a,b,c); printf("\nKutevi trokuta su: %5.2f, %5.2f i %5.2f", alfa*180/M_PI, beta*180/M_PI, gama*180/M_PI); getch(); return 0; } void trokut(float a, float b, float alfa, float *c, float *beta, float *gama){ *beta=asin(b*sin(alfa)/a); *gama=M_PI-(alfa+*beta); *c=a*sin(*gama)/sin(alfa); } Unesi stranice a i b: 20,10 Unesi kut alfa (u stupnjevima): 24 Stranice trokuta su: 20.00, 10.00 i 28.72 Kutevi trokuta su: 24.00, 11.73 i 144.27

  • 87

    Zadatak 8.4 Napiite program koji zbraja ili oduzima dvije realne matrice sa mxn lanova. Za unos, raunanje i ispis matrica koristiti funkcije. Koristiti pokazivae umjesto polja. #include #include #include #include void unosm(float *,int,int,char); void ispism(float *,int,int,char); void racun(float *,float *,float *,int,int,int); int main(){ int m,n,k; char *pom,ch; float *a, *b ,*c; clrscr(); printf("\nUnesi dimenzije matrica (mxn):\n\n"); printf("\tUnesi m: "); gets(pom); m=atoi(pom); printf("\tUnesi n: "); gets(pom); n=atoi(pom); a=(float *) malloc(m*n*sizeof(float)); b=(float *) malloc(m*n*sizeof(float)); c=(float *) malloc(m*n*sizeof(float)); unosm(a,m,n,'A'); unosm(b,m,n,'B'); printf("\n\nIzaberi '+' za zabrajanje ili '-' za oduzimanje: "); ch=getch(); switch(ch){ case '+': k=1; break; case '-': k=-1; break; } racun(a,b,c,m,n,k); ispism(a,m,n,'A'); ispism(b,m,n,'B'); ispism(c,m,n,'C'); getch(); return 0; } void unosm(float *mat,int m,int n, char c){ int i,j; char *pom; printf("\n\nUnesi matricu %c:\n\n",c); for(i=0; i

  • 88

    gets(pom); *mat++=atof(pom); } } } void ispism(float *mat,int m,int n, char c){ int i,j; printf("\n\nMatrica %c:\n",c); for(i=0; i

  • 89

    Zadatak 8.5 Napiite funkciju koja vraa pokaziva na najvei lan cjelobrojnog polja. U glavnom programu unijeti polje te pozvati funkciju i ispisati najvei lan. #include #include #include int * najveci(int, int *); int main(){ int *polje, n, i, *pok_najveci; clrscr(); printf("\nUnesi broj clanova polja n: "); scanf("%d",&n); polje=(int *) malloc(n*sizeof(int)); printf("\nUnesi clanove polja: "); for (i=0;i

  • 90

    #include #include long faktorijel(int); int main(){ int n; clrscr(); printf("\nZadaj broj n: "); scanf("%d",&n); if (n>=0){ printf("\n%d! = %ld",n,faktorijel(n)); } getch(); return 0; } long faktorijel(int n){ if (n==0) return 1; return n* faktorijel(n-1); } Zadaj broj n: 3 3! = 6

    Zadatak 9.2 Napiite rekurzivnu funkciju koja e izraunati zbroj prvih n prirodnih brojeva. #include #include int zbroj(int); int main(){ int n; clrscr(); printf("\nZadaj broj n: "); scanf("%d",&n); printf("\nZbroj prvih %d prirodnih brojeva je %d!", n,zbroj(n)); getch(); return 0; } int zbroj(int n){ if (n==0) return 0; return n+zbroj(n-1); } Zadaj broj n: 44 Zbroj prvih 44 prirodnih brojeva je 990 !

  • 91

    Zadatak 9.3 Napiite rekurzivnu funkciju koja e prikazati binarno zadani decimalni broj. #include #include void dec2bin(int); int main(){ int n; clrscr(); printf("\nZadaj prirodni broj n: "); scanf("%d",&n); printf("\nBinarni zapis broja %d je ", n); dec2bin(n); getch(); return 0; } void dec2bin(int n){ if (n>=1){ dec2bin(n/2); printf("%d",n%2); } } Zadaj prirodni broj n: 3 Binarni zapis broja 3 je 11

  • 92

    Zadatak 9.4 Napiite rekurzivnu funkciju koja izraunava sumu neparnih brojeva do zadanog (u glavnoj funkciji) prirodnog broja n. U glavnoj funkciji ispiite rezultat. #include #include int sumanep(int); int main(){ int broj, suma; clrscr(); printf("\nUnesi prirodan broj :"); scanf("%d",&broj); if (broj%2==0) broj--; suma=sumanep(broj); printf("\nSuma neparnih brojeva do %d je %d !",broj,suma); getch(); return 0; } int sumanep(n){ if (n==1) return 1; else return n + sumanep(n-2); } Unesi prirodan broj :9 Suma neparnih brojeva do 9 je 25 !

  • 93

    19. ZADACI ZA VJEBANJE Zadatak v.1

    Unesite kordinate vrhova trokuta.Izracunajte duljine stranica trokuta i ispisite ih, te odredite da li je trokut raznostranican,istokracan ili istostranian. U zadatku ne treba provjeravati da li zadani vrhovi ine trokut kada se spoje toke. #include #include #include void main(){ float ax,ay,bx,by,cx,cy,a,b,c; printf("\nUnesi kordinate trokuta"); printf("\nUnesi kordinate tocke A"); printf("\nX,Y= ");scanf("%f,%f",&ax,&ay); printf("\nUnesi kordinate tocke B"); printf("\nX,Y= ");scanf("%f,%f",&bx,&by); printf("\nUnesi kordinate tocke C"); printf("\nX,Y= ");scanf("%f,%f",&cx,&cy); //ispis stranica c=sqrt(pow((ax-bx),2)+pow((ay-by),2)); printf("\nDuljina stranice c je->%f",c); b=sqrt(pow((ax-cx),2)+pow((ay-cy),2)); printf("\nDuljina stranice b je->%f",b); a=sqrt(pow((cx-bx),2)+pow((cy-by),2)); printf("\nDuljina stranice a je->%f",a); // usporedivanje if((a!=b)&&(a!=c)&&(b!=c)) printf("\nTrokut je raznostranican"); else if((a==b)&&(b==c)) printf("\n Trokut je istostranican!!!"); else printf("\nTrokut je istokracan!!!"); getch(); }

    Unesi kordinate trokuta Unesi kordinate tocke A X,Y= 1,0 Unesi kordinate tocke B X,Y= -1,0 Unesi kordinate tocke C X,Y= 0,3 Duljina stranice c je->2.000000 Duljina stranice b je->3.162278 Duljina stranice a je->3.162278 Trokut je istokracan!!!

  • 94

    Zadatak v.2 Unesite koordinate sredita te polumjer kruga. Izracunajte koordinate presjecista kruznice i y osi. Ako presjeciste ne postoji ispisite poruku. #include #include #include void main(){ float y1,y2,p,q,r; printf("\nUnesite kooordinate sredista (p,q): "); scanf("%f,%f",&p,&q); printf("\nUnesite polumjer kruga: "); scanf("%f",&r); if((r*r-p*p)0){ y1=q+sqrt(r*r-p*p); y2=q-sqrt(r*r-p*p); printf("\nPresjeciste se nalazi u tocki (0,%5.2f) i tocki (0,%5.2f).",y1,y2); } else if((r*r-p*p)==0){ printf("\nDodirna tocka je u (0,%5.2f).",q); } getch(); } Unesite kooordinate sredista (p,q): 0,0 Unesite polumjer kruga: 5 Presjeciste se nalazi u tocki (0, 5.00) i tocki (0,-5.00).

  • 95

    Zadatak v.3 Unesite koordinate prve toke (x1,y1) i druge toke (x2,y2). Odredite koeficijent smjera pravca koji prolazi tim tokama kao i jednadbu pravca. Zatim zadajte treu toku (x3,y3) i provjerite da li lei na pravcu.

    #include #include #include int main(){ float x1,y1,x2,y2,k,l,x,y,g,m; printf ("\nUnesi koordinate 1. tocke X1,Y1= "); scanf ("%f,%f",&x1,&y1); printf ("\nUnesi koordinate 2. tocke: X2,Y2= "); scanf ("%f,%f",&x2,&y2); k = (y2-y1)/(x2-x1); l = y1-(k*x1); printf("\n\nJednadzba pravca je: y = %5.2f * X + %5.2f", k,l); printf ("\n\nUnesite koordinate 3. tocke X3,Y3= "); scanf ("%f,%f",&x,&y); g = y - y1; m = k*(x-x1); if (g==m) printf ("\aTocka lezi na pravcu!!!"); else printf ("\n\aTocka ne lezi na pravcu!!!"); getch(); return 0; }

    Unesi koordinate 1. tocke X1,Y1= 0,0 Unesi koordinate 2. tocke: X2,Y2= 2,2 Jednadzba pravca je: y = 1.00 * X + 0.00 Unesite koordinate 3. tocke X3,Y3= 5,5 Tocka lezi na pravcu!!!

  • 96

    Zadatak v.4 Unesite do 20 prirodnih brojeva sa tipkovnice i odredite koji je najmanji, a koji najvei broj u tom nizu. Ispiite niz i granine vrijednosti.

    #include #include int main(){ int niz[20], najm, najv, d, i; clrscr(); do{ printf("Upiite broj elemenata niza (do 20 lanova):"); scanf("%d",&d); if(d>20)printf("\nPreveliki niz pokusaj ponovo\n"); }while(d>20); for(i=0;i

  • 97

    Zadatak v.5 Unesite prvi clan aritmetickog niza i njegovu razliku. Zatim unesite broj clanova niza za koji se trai suma niza. Ispiite sumu i taj niz.

    #include #include void main(){ float prvi_cl, razlika, broj_cl, suma=0, i, clan; printf("Unesite prvi clan aritmetickog niza: "); scanf("%f", &prvi_cl); printf("\nUnesite razliku: "); scanf("%f", &razlika); printf("\nUnesite broj clanova niza: "); scanf("%f", &broj_cl); printf("\nClanovi niza su: \n"); clan=prvi_cl; for (i=0; i

  • 98

    Zadatak v.6 Zadajte koeficijent smjera i odsjeak na y osi nekog pravca. Zatim odredite drugi prava