programski jezik c#

download programski jezik c#

of 237

Transcript of programski jezik c#

Programski jezik Cpredavanjaak. g. 2003/04.M.JurakSadrzaj1 Uvod 81.1 Programskijezici . . . . . . . . . . . . . . . . . . . . . . . . . 81.2 OsnovepisanjaprogramauUnixokruzenju . . . . . . . . . . 101.2.1 Editorteksta . . . . . . . . . . . . . . . . . . . . . . . 101.2.2 Compiler . . . . . . . . . . . . . . . . . . . . . . . . . . 101.2.3 man . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.2.4 Debugger . . . . . . . . . . . . . . . . . . . . . . . . . 111.2.5 Linker . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.2.6 make. . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.2.7 Programskebiblioteke . . . . . . . . . . . . . . . . . . 122 OsnoveprogramskogjezikaC 132.1 Prviprogram . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.2 Varijable. whilepetlja . . . . . . . . . . . . . . . . . . . . . . 162.3 forpetlja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.4 ifnaredba . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.5 Funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.5.1 Funkcijamain . . . . . . . . . . . . . . . . . . . . . . . 302.5.2 Prototipfunkcije . . . . . . . . . . . . . . . . . . . . . 302.6 Polja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.6.1 . . . . . . . . . . . . . . . . . . . . . . . . . 362.7 Pokazivaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372.8 Poljaznakova . . . . . . . . . . . . . . . . . . . . . . . . . . . 413 Konstanteivarijable 463.1 Znakovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.2 Komentari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.3 Identikatoriikljucnerijeci . . . . . . . . . . . . . . . . . . . 473.4 Osnovnitipovipodataka . . . . . . . . . . . . . . . . . . . . . 493.4.1 Cjelobrojnipodaci . . . . . . . . . . . . . . . . . . . . 493.4.2 Znakovnipodaci . . . . . . . . . . . . . . . . . . . . . 522SADRZAJ 33.4.3 Logickipodaci . . . . . . . . . . . . . . . . . . . . . . . 533.4.4 Realnipodaci . . . . . . . . . . . . . . . . . . . . . . . 533.4.5 Kompleksnipodaci . . . . . . . . . . . . . . . . . . . . 553.5 Varijableideklaracije. . . . . . . . . . . . . . . . . . . . . . . 553.5.1 Polja. . . . . . . . . . . . . . . . . . . . . . . . . . . . 563.5.2 Pokazivaci . . . . . . . . . . . . . . . . . . . . . . . . . 573.6 Konstante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593.7 Inicijalizacijavarijabli . . . . . . . . . . . . . . . . . . . . . . 633.8 Enumeracije . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644 Operatoriiizrazi 664.1 Aritmetickioperatori . . . . . . . . . . . . . . . . . . . . . . . 664.1.1 Konverzije . . . . . . . . . . . . . . . . . . . . . . . . . 674.1.2 Prioritetiiasocijativnost . . . . . . . . . . . . . . . . . 684.2 Unarnioperatori . . . . . . . . . . . . . . . . . . . . . . . . . 694.2.1 Inkrementiranje,dekrementiranje . . . . . . . . . . . . 704.2.2 sizeofoperator . . . . . . . . . . . . . . . . . . . . . . 714.3 Relacijskiilogickioperatori . . . . . . . . . . . . . . . . . . . 724.4 Operatoripridruzivanja . . . . . . . . . . . . . . . . . . . . . . 744.5 Uvjetnioperator: ? . . . . . . . . . . . . . . . . . . . . . . 754.6 Prioritetiiredoslijedizracunavanja . . . . . . . . . . . . . . . 765 Ulaziizlazpodataka 785.1 Funkcijegetchariputchar . . . . . . . . . . . . . . . . . . . 785.2 Funkcijeizdatoteke . . . . . . . . . . . . . . . . . 805.3 Funkcijegetsiputs . . . . . . . . . . . . . . . . . . . . . . . 815.4 Funkcijascanf . . . . . . . . . . . . . . . . . . . . . . . . . . 825.4.1 Ucitavanjecijelihbrojeva . . . . . . . . . . . . . . . . . 835.4.2 Ucitavanjerealnihbrojeva . . . . . . . . . . . . . . . . 855.4.3 Drugiznakoviukontrolnomnizu . . . . . . . . . . . . 855.4.4 Ucitavanjeznakovnihnizova . . . . . . . . . . . . . . . 865.4.5 Preks* . . . . . . . . . . . . . . . . . . . . . . . . . 875.4.6 Maksimalna sirinapolja . . . . . . . . . . . . . . . . . 885.4.7 Povratnavrijednost. . . . . . . . . . . . . . . . . . . . 895.5 Funkcijaprintf . . . . . . . . . . . . . . . . . . . . . . . . . . 905.5.1 Ispiscijelihbrojeva . . . . . . . . . . . . . . . . . . . . 915.5.2 Ispisrealnihbrojeva . . . . . . . . . . . . . . . . . . . 925.5.3Sirinaipreciznost. . . . . . . . . . . . . . . . . . . . . 935.5.4 Ispisznakovnihnizova . . . . . . . . . . . . . . . . . . 945.5.5 Zastavice . . . . . . . . . . . . . . . . . . . . . . . . . 954 SADRZAJ6 Kontrolatokaprograma 966.1 Izraziinaredbe . . . . . . . . . . . . . . . . . . . . . . . . . . 966.1.1 Izrazi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 966.1.2 Naredbe . . . . . . . . . . . . . . . . . . . . . . . . . . 976.1.3 Slozenenaredbe. . . . . . . . . . . . . . . . . . . . . . 986.1.4 Popratnepojaveisekvencijsketocke . . . . . . . . . . 986.2 Naredbeuvjetnoggrananja . . . . . . . . . . . . . . . . . . . . 1006.2.1 if naredba . . . . . . . . . . . . . . . . . . . . . . . 1006.2.2 if-elsenaredba . . . . . . . . . . . . . . . . . . . . . 1016.2.3 Primjer: Djeliteljibroja . . . . . . . . . . . . . . . . . 1026.2.4 Visestrukaif-elsenaredba . . . . . . . . . . . . . . . 1046.2.5 Primjer. Visestrukiizbor. . . . . . . . . . . . . . . . . 1066.2.6 Sparivanjeifielsedijela. . . . . . . . . . . . . . . . 1066.3 switchnaredba . . . . . . . . . . . . . . . . . . . . . . . . . . 1076.4 whilepetlja. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106.5 forpetlja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1116.5.1 Operatorzarez . . . . . . . . . . . . . . . . . . . . . . 1136.5.2 Datotekazaglavlja . . . . . . . . . . . . . 1136.6 do - whilepetlja . . . . . . . . . . . . . . . . . . . . . . . . 1146.7 Naredbebreakicontinue. . . . . . . . . . . . . . . . . . . . 1156.8 gotonaredba . . . . . . . . . . . . . . . . . . . . . . . . . . . 1167 Funkcije 1197.1 Denicijafunkcije. . . . . . . . . . . . . . . . . . . . . . . . . 1197.2 Deklaracijafunkcije. . . . . . . . . . . . . . . . . . . . . . . . 1237.3 Prijenosargumenata . . . . . . . . . . . . . . . . . . . . . . . 1267.4 Inlinefunkcije . . . . . . . . . . . . . . . . . . . . . . . . . . . 1297.5 Rekurzivnefunkcije. . . . . . . . . . . . . . . . . . . . . . . . 1307.6 Funkcijesvarijabilnimbrojemargumenata. . . . . . . . . . . 1328 Preprocesorskenaredbe 1348.1 Naredba#include . . . . . . . . . . . . . . . . . . . . . . . . 1348.2 Naredba#define . . . . . . . . . . . . . . . . . . . . . . . . . 1358.3 Parametrizirana#definenaredba. . . . . . . . . . . . . . . . 1368.4 Uvjetnoukljucivanje . . . . . . . . . . . . . . . . . . . . . . . 1388.5 Predeniranimakroi . . . . . . . . . . . . . . . . . . . . . . . 1418.6 assert. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1429 Strukturaprograma 1449.1 Dosegvarijable . . . . . . . . . . . . . . . . . . . . . . . . . . 1449.1.1 Lokalnevarijable . . . . . . . . . . . . . . . . . . . . . 144SADRZAJ 59.1.2 Globalnevarijable . . . . . . . . . . . . . . . . . . . . . 1459.1.3 Argumentifunkcijskogprototipa . . . . . . . . . . . . . 1489.1.4 LokalnevarijableistandardC99 . . . . . . . . . . . . . 1489.1.5 Funkcijskidoseg. . . . . . . . . . . . . . . . . . . . . . 1499.2 Vijektrajanjavarijable. . . . . . . . . . . . . . . . . . . . . . 1499.2.1 Automatskevarijable . . . . . . . . . . . . . . . . . . . 1499.2.2 Identikatorimemorijskeklase. . . . . . . . . . . . . . 1509.2.3 auto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1509.2.4 register . . . . . . . . . . . . . . . . . . . . . . . . . 1509.2.5 Statickevarijable . . . . . . . . . . . . . . . . . . . . . 1519.2.6 Statickelokalnevarijable . . . . . . . . . . . . . . . . . 1519.3 Vanjskisimboli . . . . . . . . . . . . . . . . . . . . . . . . . . 1529.3.1 Funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . 1539.3.2 Globalnevarijable . . . . . . . . . . . . . . . . . . . . . 1559.3.3 Vanjskaimena. . . . . . . . . . . . . . . . . . . . . . . 15610Polja 15710.1 Denicijaiinicijalizacijapolja . . . . . . . . . . . . . . . . . . 15710.2 Poljaznakova . . . . . . . . . . . . . . . . . . . . . . . . . . . 16010.3 Funkcijezaradsastringovima. . . . . . . . . . . . . . . . . . 16110.4 sscanf(), sprintf() . . . . . . . . . . . . . . . . . . . . . . 16410.5 Poljekaoargumentfunkcije . . . . . . . . . . . . . . . . . . . 16510.6 Visedimenzionalnapolja . . . . . . . . . . . . . . . . . . . . . 16610.7 Poljavarijabilneduljine . . . . . . . . . . . . . . . . . . . . . 17011Pokazivaci 17311.1 Deklaracijapokazivaca . . . . . . . . . . . . . . . . . . . . . . 17311.2 Pokazivaciifunkcije . . . . . . . . . . . . . . . . . . . . . . . 17511.3 Operacijenadpokazivacima . . . . . . . . . . . . . . . . . . . 17711.3.1 Povecavanjeismanjivanje . . . . . . . . . . . . . . . . 17711.3.2 Pokazivaciicijelibrojevi . . . . . . . . . . . . . . . . . 17911.3.3 Usporedivanjepokazivaca . . . . . . . . . . . . . . . . 17911.3.4 Oduzimanjepokazivaca. . . . . . . . . . . . . . . . . . 17911.3.5 Primjer . . . . . . . . . . . . . . . . . . . . . . . . . . 18011.3.6 Generickipokazivac. . . . . . . . . . . . . . . . . . . . 18111.4 Pokazivaciijednodimenzionalnapolja . . . . . . . . . . . . . . 18311.5 Pokazivaciiconst . . . . . . . . . . . . . . . . . . . . . . . . 18511.6 Poljapokazivaca . . . . . . . . . . . . . . . . . . . . . . . . . 18611.7 Pokazivaciivisedimenzionalnapolja . . . . . . . . . . . . . . . 18711.7.1 Matricakaopokazivacnapokazivac. . . . . . . . . . . 18811.8 Dinamickaalokacijamemorije . . . . . . . . . . . . . . . . . . 1896 SADRZAJ11.9 Pokazivacnafunkciju. . . . . . . . . . . . . . . . . . . . . . . 19111.10Argumentikomandnelinije . . . . . . . . . . . . . . . . . . . . 19211.11Slozenedeklaracije . . . . . . . . . . . . . . . . . . . . . . . . 19412Strukture 19612.1 Deklaracijastrukture . . . . . . . . . . . . . . . . . . . . . . . 19612.1.1 Varijabletipastrukture . . . . . . . . . . . . . . . . . . 19612.1.2 Inicijalizacijastrukture . . . . . . . . . . . . . . . . . . 19712.1.3 Strukturaunutarstrukture . . . . . . . . . . . . . . . . 19812.2 Radsastrukturama . . . . . . . . . . . . . . . . . . . . . . . . 19812.2.1 Operatortocka . . . . . . . . . . . . . . . . . . . . . . 19812.2.2 Strukturaifunkcije. . . . . . . . . . . . . . . . . . . . 20012.3 Struktureipokazivaci . . . . . . . . . . . . . . . . . . . . . . 20012.3.1 Operatorstrelica(->) . . . . . . . . . . . . . . . . . . 20012.3.2 Slozeniizrazi . . . . . . . . . . . . . . . . . . . . . . . 20212.4 Samoreferentnestrukture. . . . . . . . . . . . . . . . . . . . . 20312.4.1 Jednostrukopovezanalista. . . . . . . . . . . . . . . . 20312.5 typedef. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20912.6 Unija. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21113Datoteke 21313.1 Vrstedatoteka. . . . . . . . . . . . . . . . . . . . . . . . . . . 21313.1.1 Tekstualneibinarnedatoteke . . . . . . . . . . . . . . 21413.1.2 Razineulaza/izlaza . . . . . . . . . . . . . . . . . . . . 21413.1.3 Standardnedatoteke . . . . . . . . . . . . . . . . . . . 21513.2 Otvaranjeizatvaranjedatoteke . . . . . . . . . . . . . . . . . 21613.2.1 Standardnedatoteke . . . . . . . . . . . . . . . . . . . 21713.3 Funkcijeza citanjeipisanje . . . . . . . . . . . . . . . . . . . 21813.3.1Citanjeipisanjeznakpoznak. . . . . . . . . . . . . . 21813.3.2Citanjeipisanjelinijupoliniju . . . . . . . . . . . . . 22013.3.3 Prepoznavanjegreske . . . . . . . . . . . . . . . . . . . 22113.3.4 Formatirani ulaz/izlaz . . . . . . . . . . . . . . . . . . 22213.3.5 Binarniulaz/izlaz. . . . . . . . . . . . . . . . . . . . . 22213.3.6 Direktanpristuppodacima. . . . . . . . . . . . . . . . 22414Operacijenadbitovima 22714.1 Operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22714.2 Poljabitova . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231SADRZAJ 7A 234A.1 ANSIzaglavlja . . . . . . . . . . . . . . . . . . . . . . . . . . 234A.2 ASCIIznakovi. . . . . . . . . . . . . . . . . . . . . . . . . . . 235A.3 Matematickefunkcije . . . . . . . . . . . . . . . . . . . . . . . 236Poglavlje1Uvod1.1 ProgramskijeziciMikroprocesori drugi logicki sklopovi racunalaimajusvoj vlastiti pro-gramski jezik koji se naziva strojni jezik, a sastoji se od nizovabinarnih rijecikoje predstavljaju instrukcije logickim sklopovima i podatke koje treba obra-diti. Programnapisanustrojnomjezikunazivamoizvrsniprogramiliizvrsnik od buduci da ga racunalo moze neposredno izvrsiti. Strojni jezik je odredenarhitekturom racunala, a deniraga proizvodac hardwarea. Izvrsniprogramjestrojnozavisan, stoznaci dasek odnapisannajednomracunalumozeizvrsavatijedinonaracunalimaistogtipa.Pisanje instrukcijau binarnom k odu posve je neprakticnopa su razvijenisimbolicki jezici ukojimasubinarneinstrukcijezamijenjenemnemonickimoznakama. Programer unosi programnapisanumnemonickimoznakamautekstualnudatotekupomocueditoratekstai zatimpozivaprogramkojimnemonickeoznakeprevodi ubinarneinstrukcijestrojnogjezika. Programkoji vrsi konverzijunazivaseasembler(eng. assembler)asamseprogram-skijeziknazivaasemblerskijezikili jednostavnoasembler. Program napisanuasemblerskomjezikunazivamoizvorni program(eng. sourcecode). Pisa-njeprogramatimepostajedvostepeniproceskoji cinepisanjeizvornogpro-grama i prevodenje izvornog programa u izvrsni program. Programer se takooslobada mukotrponogpisanja binarnih instrukcijate se dobiva doodredenemjerestrojnaneovisnostizvornogprograma.Sljedeci primjer pokazuje dio izvrsnog k oda (strojni jezik) i njemu ekviva-lentan izvorni, asemblerski k od. Rad se o asembleru za Intelov mikroprocesor8086([5]).81.1. PROGRAMSKIJEZICI 9Strojnijezik Ekvivalentan asemblerski k od00011110 PUSH DS00101011 SUB AX,AX1100000010111000 PUSH AX10111000 MOV AX,MYDATA000000011000111011011000 MOV DS,AXPisanjeprogramauasemblerskomjezikudajeprogramerupotpunukon-trolunadsvimkomponentamaracunala. Programerstogamorapoznavatiarhitektururacunalazakojepiseprogramtekontrolirati sveoperacijekojeracunalo izvrsava. Programiranje i najjednostavnijih zadaca rezultira velikimi slozenimprogramimapaseprogramiranjeuasemblerukoristi sesamozaspecicne zadace vezane uz manipulacije s hardwareom. Izvorni program na-pisanuasemblerunijeprenosivizmeduracunalarazlicitearhitekture. Zbogsvihtihrazlogazavecinuprogramerskihzadacakoristesevisi programskijezici.Visi programski jezici (C, Pascal, FORTRAN, C++, Java, Perl, Python,. . . ) razvijeni sukakobi seprevladali nedostaci asemblerskogjezika. Onioslobadajuprogramerapotrebepoznavanjaarhitektureracunala, omoguca-vajuprenosivostprogramaizmeduracunalarazlicitiharhitekturatebrzeijednostavnije programiranje. Programi napisani u visem programskom jezikumorajuprijeizvodenjaprocipostupakprevodenjauizvrsnik od stojezada-takprevodioca(eng. compiler)zadani jezik. Naredbevisegprogramskogjezikaprilagodenesutipupodatakaskojimaprogramski jezikmanipuliraioperacijamakojenadpodacimatrebavrsiti. Tojeosnovnarazlikanaspramasemblerakoji jeprilagodennacinufunkcioniranjamikroprocesorai drugihlogickihsklopova. Zadatakjeprevodiocadaprogramnapisanuvisempro-gramskom jeziku prevede u k od koji se moze izvrsavati na zadanom racunalu.Natajsenacinprogramnapisanunekomvisemprogramskomjezikumozeizvrsavatinasvakomracunalukojeimaprevodilaczatajjezik.Programski jezikCvisi jeprogramski jezikopcenamjene. RazviogajeDennis Ritchie sedamdestih godina proslog stoljeca u Bell Telephone Labora-tories, Inc. Opis jezika dan je u knjizi Brian W. Kernighan, Dennis M. Ritchie:TheCProgrammingLanguage, Prentice-Hall, 1978. Tijekomsedamdesetihi osamdesetihgodinajeziksebrzosiriotejeAmericanNational StandardInstitute(ANSI) pristupionjegovoj standardizaciji kojajedovrsena1989.godine. Novi standarduveojeznacajne izmjeneujezikkoji sestoga, za10 POGLAVLJE1. UVODrazlikuodprvotneverzije, cestonazivaANSI-C. Novi jestandardopisanuknjiziBrianW.Kernighan,DennisM.Ritchie: TheCProgrammingLanguage,2nded.,Prentice-Hall, 1988. DanasgotovosvimoderniC-prevodiociimple-mentirajuANSI-Cverzijujezika. ANSIstandardusvojilajeiMedunarodnaorganizacijazastandarde(International OrganisationforStandardization)1990. godine (ISO C). Konacan ANSI/ISO standard cemo jednostavno nazi-vati C90 standard. Godine 1999. ISO je prihvatio novi C standard koji uvodimanjedopuneuC90standard,akoji cemozvatiC99standard.1.2 OsnovepisanjaprogramauUnixokruze-njuPostupakprogramiranjauprogramskomjezikuC,pod operacijskimsus-tavima unix i linux, sastoji se od tri koraka: prvo se programski k od smjestiu tekstualnudatoteku kojaimaekstenziju.c (npr. prvi.c). Zatim senapi-sani program transformira u izvrsni k od pozivom programa prevodioca. Kaorezultatdobivaseizvrsnadatotekacijimsepozivomizvrsavanapisani pro-gram. Buducidaseu pisanjuprogramaredovitojavljaju greske,trecikorakupostupkuprogramiranjajenalazenjeiispravljanjegresaka.1.2.1 EditortekstaDabismoprogramupisaliutekstualnudatotekupotrebannamjeeditorteksta. Svakiunixsustavimaeditorkojisenazivavi(visual editor)ikojise moze koristitii bez grackog sucelja. Poredvi editora moguce je koristitisvakidrugieditorkojineumeceznakoveformatiranjaudatoteku.1.2.2 CompilerNakon stojeprogram napisan ipohranjen udatoteku,recimodasezoveprvi.c, potrebnoje pozvati C-prevodilac. Podunix-omnjegovo je imenajcesce cc (ili gcc ako se radi o GNU prevodiocu). Tako bismo na komandnojlinijiotipkalicc prvi.ci ukoliko je program napisan bez greske prevodilac ce kreirati izvrsni programi dati muimea.out; uslucajuneispravnosti programaprevodenjecebitizaustavljenoiprevodilac cedatiporukeopronadenimgreskama. Nakon stojeizvrsniprogramkreiranpodunix-omjedovoljnootipkati1.2. OSNOVEPISANJAPROGRAMAUUNIXOKRUZENJU 11./a.outiprogram cebitiizvrsen.1.2.3 manPrevodilacccimabrojneopcijekojesuopisaneunjegovojmanstranici(manjeskracenoodmanual). Dovoljnojenakomandnojlinijiutipkatiman cci opiskomandecc bit ce izlistan. Naistinacin mozemodobiti opisbilokojenaredbeoperacijskogsustavatenizaprogramaialata. Dovoljnojeotipkatiman naslovgdje je naslov naredba ili program koji nas zanima. Jednako tako man ce namdatiinformacijeofunkcijamaizstandardnebibliotekajezikaC.Naprimjer,otipkajteman scanfidobit ceteopisfunkcijezaucitavanjepodatakascanf.1.2.4 DebuggerUkolikoprogramupisanudatotekuprvi.cnijeispravnonapisantosemoze manifestirati na tri nacina. Prvi, najpovoljniji, je onaj u kome prevodi-lac javi poruke o greskama i zaustavi proces prevodenja u izvrsni k od. Drugamogucnost je daproces prevodenjabude uspjesani dacckreiraizvrsnudatotekua.out, noizvrsavanjeprogramazavrsavasporukomoperacijskogsustavaoneispravnomizvrsnomprogramu. Trecamogucnost, cestonajne-povoljnija, jeonaukojojjeizvrsni programispravanali neradi onostojeprogramer zamislio. U svakom slucaju, kod pojave gresaka potrebno je greskepronaci,korigiratiiponovitipostupakprevodenjauizvrsni k od. Buducidase greske redovitojavljaju, programiranje je iterativanproces ukojemjeispravljanjegresakatreci(inajvazniji)korak.Prilikom pronalazenja gresaka mogu nam pomoci dva alata. Jedan je lint(ukucajteman lint na komandnojliniji) koji provjeravasintaksunapisanogprograma i daje detaljniju dijagnostiku od poruka o greskama koje daje samprevodilac. Drugi alat jedebugger (dbxili gdb), programpomocukojeganas k od mozemoizvrsavatiliniju poliniju, pratiti vrijednostivarijabli, zaus-tavljatiganapojedinimmjestimaitd.Debuggerjenajekasnijesredstvozaotkrivanjerazloganeispravnogfunkcioniranjak oda.12 POGLAVLJE1. UVOD1.2.5 LinkerSlozeniji Cprogrami sastojeseodvisedatotekasekstenzijama.ci .h.Datotekesekstenzijom.csadrzedijeloveCprogramaodnosnoizvorni k od(eng. sourcecode). Datotekesekstenzijom.hnazivajusedatotekezaglavlja(eng. headerles)i sadrzeinformacijepotrebneprevodiocuzaprevodenjeizvornogk odaustrojni jezik. Tosutekstualne datoteke koje programerkreirazajednos.cdatotekama.Svakupojedinu.cdatotekuprevodilacprevodi ustrojni jeziknotimesejosnedobivaizvrsniprogramjernjegacineteksve.cdatotekezajedno.Prevodilaczasvaku.cdatotekugenerirastrojni k odi smjestagaudato-teku istog imena ali s ekstenzijom.o. Dobiveni se k od naziva objektni k od iliobjektni program. Zadatak je linkera1kreirati izvrsni program povezivanjemsvihobjektnihprogramaujednucjelinu. Prevodilaccenakongeneriranjaobjektnogk odaautomatskipozvatilinkertakodanjegovoneposrednopozi-vanjenijepotrebno. Ukolikopovezivanjeobjektnogk odanijebilouspjesnolinker cedatiporukeogreskama.1.2.6 makePri prevodenjuuizvrsni k odprogramakoji jerazbijenuvisedatotekapotrebno je svaku pojedinu.c datoteku prevestiu objektni k od, a zatim sveobjektnedatotekepovezati,eventualnoisvanjskimbibliotekama. Pritomenampomazeprogramski alatkoji senazivamake. Onprovjeravadatumezadnjeizmjenepojedinihdatotekaiosiguravadasepreveduuobjektnik odsamoone datotekekojesu mijenjanenakon posljednjeggeneriranja izvrsnogprograma.1.2.7 ProgramskebibliotekeSvaki slozeniji C-programkoristi nizfunkcijakaostosuprintf, exit,fgets itd. kojesu pohranjene u standardnim bibliotekamafunkcija. Potpunpopis funkcija dostupnih programeru razlikuje se od racunala do racunala nojedan brojtih funkcijaprisutan je na svakomsustavukoji ima C prevodilac.U ovoj skripti bit ce opisan dio najcesce koristenih funkcija iz standardne bi-blioteke. Potpuniji popis moze se naci u [4] ili u prirucnicima za C-prevodilacnadanomracunalu.1Koristi se jos i naziv punjac.Poglavlje2OsnoveprogramskogjezikaCU ovom poglavlju dajemopregled programskogjezikaC uvodeci osnovneelementejezikakrozjednostavneprimjere. Sviovdjeuvedenipojmovibit cedetaljnijeanaliziraniunarednimpoglavljima.2.1 PrviprogramJedanjednostavanalipotpunCprogramizgledaovako:#include int main(void){printf("Dobar dan.\n");return 0;}Programtrebaspremiti udatotekus ekstenzijom.ckakobi se znalodaseradi oC-programu. Nazovimostogadatotekuprvi.c. Programzatimkompiliramonaredbomcc prvi.cnakon cega prevodilac kreira izvrsni program i daje mu ime a.out. Da bismoizvrsiliprogramdovoljnojeotipkati./a.outRezultatizvrsavanjaprogramajeispisporuke1314 POGLAVLJE2. OSNOVEPROGRAMSKOGJEZIKACDobar dan.Svi C-programi sastoje se od funkcija i varijabli. Funkcije sadrze instruk-cije koje odreduju koje ce operacije biti izvrsene,a varijable sluzememorira-njupodataka.Izvrsavanjeprogramapocineizvrsavanjemfunkcijemainkojamorabitiprisutnausvakomprogramu. Funkcijamainsvojuzadacuobavljaopcenitopozivanjemdrugihfunkcija. Tako se unasemprogramupoziva funkcijaprintf iz standardne biblioteke, koja je zaduzena za ispis podataka naekranu. Dabismomoglikoristitifunkcijeizstandardnebibliotekezaduzenezaulaziizlazpodatakaprogramzapocinjemonaredbom#include Njom se od prevodioca trazi da ukljuci (include) u program datoteku stdio.hkojasadrzi informacije nuzneza koristenjefunkcijeprintfi mnogih drugih.Datotekesekstenzijom.hnazivajusedatotekezaglavlja(eng. headerles)i njihovostavljanjeuostrezagrade< >informiraprevodilacdaseradi ostandardnimdatotekamazaglavlja, kojesenalazenaunaprijedodredenimmjestimaudatotecnomsustavu.Sljedecalinijapredstavljadeklaracijufunkcijemain:int main(void)Funkcijamozeuzimatijedaniliviseargumenataiobicnovracanekuvrijed-nost. Deklaracijomseuvodiimefunkcije, brojitipargumenatakojeuzimai tippovratnevrijednosti. Unasemprimjeruimefunkcijejemaini onaneuzimaniti jedanargument. Tojedeklariranotakostojeuoblezagradestavljenakljucna rijecvoid (eng. void=prazan). Povratnavrijednost je tipaint, stojeoznakazacijelibroj.1Izaoblihzagradadolazeviticastezagradekojeomedujutijelofunkcije.Tijelofunkcijejesastavljenooddeklaracijavarijabliiizvrsnihnaredbi. Svedeklaracije varijabli dolaze prije prve izvrsne naredbe. U nasem primjeru ne-mamo deklaracijavarijabli. Tijelosadrzi samodvijenaredbe: poziv funkcijeprintfireturnnaredbu:{printf("Dobar dan.\n");return 0;}Svakanaredbazavrsavaznakomtocka-zarez(;). Toomogucavadasevisenaredbistavinaistuliniju. Moglismo,naprimjer,pisati1int=integer.2.1. PRVIPROGRAM 15#include int main(void){printf("Dobar dan.\n"); return 0;}Funkcija se poziva tako da se navede njezino ime iza koga idu oble zagradeslistomargumenatakojisefunkcijipredaju. Funkcijaprintfdobivasamojedanargument: toje niz znakova "Dobar dan.\n". Navodnici sluze zaogranicavanjekonstantnihznakovnihnizova. Svestosenalazi izmeduipredstavlja niz znakova koji cini jednucjelinu. Poredobicnihznakovaizmedunavodnikamogusenaci i specijalni znakovi koji pocinjuznakom \(eng. backslash). Tako \noznacavaprijelazunovi red. Funkcijaprintfnakonzavrsenogispisaneprelazi automatski unovi rednegojepotrebnoubaciti znak \ntamogdjetakavprijelazzelimo. Programsmostogamoglinapisatiuobliku#include int main(void){printf("Dobar ");printf("dan.");printf("\n");return 0;}idobilibismoposveistiispis.Izvrsavanje funkcije zavrsava naredbom return. Kad funkcija vraca nekuvrijednost u pozivni program ta se vrijednost navodi u return naredbi. Funk-cijamainvracanulupajestogazadnjanaredbareturn 0;Funkcijamainmorabitiprisutnausvakomprogramu. Kadanakoman-dnojlinijiotipkamo./a.outoperacijskisustavpozivafunkcijumain. Zatimseredomizvrsavajunaredbeunutar funkcije mainsve dokse ne dode do returnnaredbe. Onaope-racijskomsustavuvracacjelobrojnuvrijednost kojaimaznacenjeizlaznogstatusa. Nula se interpretira kao uspjesni zavrsetak programa, a svaka drugavrijednostsignalizirazavrsetakuslijedgreske.16 POGLAVLJE2. OSNOVEPROGRAMSKOGJEZIKAC2.2 Varijable. whilepetljaNapisimoprogramkoji ispisujeprvihdeset faktorijela. Brojeve1!, 2!,3!,. . . ,10! zelimoispisatiuoblikutablice21 12 23 64 24. . . . . .#include /* Program koji ispisujeprvih 10 faktorijela. */int main(void){int n,fakt;n=1;fakt=1;while(np_ime=(char *) malloc(strlen(line)+1);if(novi->p_ime == NULL) {printf("Nema dovoljno memorije ...");exit(-1);}strcpy(novi->p_ime,line);if(start==KRAJ) /* prazna lista */start=novi;else { /* pronadji kraj liste */for(zadnji=start; zadnji->next != KRAJ; zadnji=zadnji->next); // ne radi nista/* neka zadnji pokazuje na novi element */zadnji->next=novi;}}K odprvoalociramemorijuzanovi element. Buduci daceonbiti zadnji ulisti, njegovnextclansepostavljanaKRAJ. Zatimsealociramemorijazanovoimekojeseucitavauspremniklinepomocuscanffunkcijei kopirana rezerviranu memoriju sastrcpy. K od ne uzima u obzir eventualni pretekspremnikaline.12.4. SAMOREFERENTNESTRUKTURE 205KRAJ startNovi elementjesadainicijalizirani lokalnavarijablanovipokazujenanjega. Ukolikojelistapraznapocetaklisteinicijaliziramosnovi. Akonije,nalazimozadnji elementi njegovnextclanpostavljamonanovikoji timepostajezadnjielementliste.Sljedecafunkcijaispisujelistu.void ispis(void) { /* Ispis liste */struct ime *element;int i=1;if(start == KRAJ ) {printf("Lista je prazna.\n");return;}printf("Ispis liste \n");for(element=start; element != KRAJ; element=element->next) {printf("%d. %s\n",i,element->p_ime); i++;}return;}Ukoliko lista nije prazna u jednoj for petlji se prolazi svim njenim clanovima.Zapretrazivanjelistekoristimoistuforpetljukojomobilazimocitavulistu.void trazi(void) { /* Pretrazivanje liste */struct ime *test;char line[128];int i;printf("Nalazenje imena u listi.\n");printf("Unesite ime ");scanf(" %[^\n]",line);i=1;for(test=start; test != KRAJ; test=test->next) {if( !strcmp(test->p_ime,line) ) {printf("Podatak je %d. u listi\n",i);return;206 POGLAVLJE12. STRUKTURE}i++;}printf("Podatak nije u listi.\n");}Funkcijavrsitestusporedivanjaupisanogimenasasvakimpodatkomulistilinearno, pocevsi od prvog do zadnjeg elementaliste. Ukolikoime nije u listibit ceispisano: Podatak nije u listi.Brisanjeelementaizlistejenestoslozenije.void brisi(void) /* Brisanje elementa iz liste */{struct ime *test, *tmp;char line[128];int i;printf("Brisanje imena iz liste.\n");if(start == KRAJ){printf("Lista je prazna.\n");return;}printf("Unesite ime ");scanf(" %[^\n]",line);/* ako je prvi element onaj koji trazimo */if( !strcmp(start->p_ime,line) ) {printf("Podatak je 1. u listi\n");tmp=start;start=start->next;free(tmp->p_ime);free(tmp);return;}i=1;for(test=start; test != KRAJ; test=test->next) {i++;if(!(tmp=test->next)) break; // elm. nije nadjenif( !strcmp(tmp->p_ime,line) ){printf("Brisemo podatak br. %d u listi\n",i);test->next=test->next->next;12.4. SAMOREFERENTNESTRUKTURE 207free(tmp->p_ime);free(tmp);return;}}printf("Podatak nije u listi.\n");return;}Kod brisanja elementa iz liste prvo provjeravamo da li je lista prazna. Akonije,unosimoimekoje zelimoizbrisatii provjeravamodalije ononaprvommjestuulisti. Toradimostogastojebrisanjeelementanaprvommjestunestojednostavnije odbrisanjaproizvoljnogelementa. Dovoljnoje samostart postaviti da pokazuje na drugi element: start=start->next. Buducidajememorijazasvaki elementalociranadinamicki, prilikombrisanjaele-menta treba ju osloboditi. Stoga se stara vrijednost pokazivacastart pamtiu lokalnoj varijablitmp i memorija se oslobada pozivom funkcijefree(tmp).Kod brisanja elementa na proizvoljnom mjestu porebno je imati pokazivacnaelement koji prethodi elementuzabrisanje jer njegovnextclantrebapreusmjeritinaelementizaonogkojibrisemo. Stogaupetljifor(test=start; test != KRAJ; test=test->next)provjeravamopokazujeli tmp=test->nextnaelementzabrisanje. Akoda,ondasetest->nextpostavljanatest->next->next, prvielementizaonogkojeg brisemo i time je izvrseno izbacivanje iz liste. Ostaje jos samo delociratimemorijuizbrisanogelementa.Uovomk odupostoji problemzadnjegelemeta. Akojetestzadnji ele-ment, ondajetmp=test->next=KRAJpabi tmp->pimeustrcmpfunkcijidalogresku. Stoga tesiramotajpokazivac i izlazimoiz petlje pomocubreaknaredbeakosmonazadnjemelementu.Konacnodabismokompletiraliprogramuvodimofunkcijumenukojais-pisujemenusmogucimoperacijamaint menu(void) {int izbor;printf("\n\n\n");208 POGLAVLJE12. STRUKTUREprintf("\n OPERACIJE : ");printf("\n =========");printf("\n 1. Unos novog elemeta ");printf("\n 2. Ispis liste ");printf("\n 3. Pretrazivanje liste ");printf("\n 4. Brisanje iz liste ");printf("\n 5. Izlaz ");printf("\n izbor = ");scanf("%d",&izbor);return izbor;}idajemoglavniprogram:int main(void) {int izbor;do {switch(izbor=menu()) {case 1:unos();break;case 2:ispis();break;case 3:trazi();break;case 4:brisi();break;case 5:break;default:printf("\n Pogresan izbor.");}} while(izbor != 5);return 0;}12.5. TYPEDEF 20912.5 typedefPomocukljucnerijeci typedefmozemopostojecimtipovimapodatakadati novaimena. Naprimjer, akoneki podaci tipadoubleimajuznacenjemase,ondamozemopisatitypedef double Masa;iMasa ce postati sinonim zadouble. Nakontoga mozemodeklarirati varija-bletipadoublekaoMasa m1,m2,*pm1;Masa elementi[10];itakodalje. Opcenitotypedefimaobliktypedef tip_podatka novo_ime_za_tip_podatka;Vidimodajetypedefvrloslicanpreprocesorskojnaredbi#define,nokakotypedef interpretira prevodilac moguce su slozenije supstitucije. Na primjer,pokazivacnadoublemozemonazvatiPdouble:typedef double * Pdouble;imozemopisatiPdouble px;void f(Pdouble,Pdouble);px= (Pdouble) malloc(100*sizeof(Pdouble));Znacenjesimbolakoji seuvodi typedefdeklaracijomjesljedece: Akoseispusti kljucnarijectypedefizdeklaracije, dobivaseobicnadeklaracijavarijable ukojoj deklarirani simbol postaje varijabla. Deklarirani simbolpredstavljatipkojibitavarijablaimala.typedef se cesto koristi sa strukturama kako bi se eliminirala potreba daseprideklaracijivarijablinavodistruct. Naprimjer,akoimamostruct tocka {int x;int y;};ondavarijabletipatockadeklariramokaostruct tocka p1, *pp1;210 POGLAVLJE12. STRUKTUREUmjestotogamozemoiskoristititypdef:typedef struct {int x;int y;} tocka;isadamozemopisatitocka p1, *pp1;ilistruct pravokutnik {tocka pt1;tocka pt2;};Slozenija je situacija ako zelimo napravititypedef samoreferentne struk-ture. Tadamoramouvestijednuprethodnudeklaracijutipa. Naprimjer,typedef struct element *Pelement;typedef struct element {char ime[64];Pelement next;} Element;SadamozemodeniratiElement root;islicno.Sljedecacestaupotrebatypedef-ovajezaskracivanjekompleksnihdek-laracijakao stosutopokazivacinafunkcije. Naprimjer,nakontypedef int (*PF)(char *, char *);PFpostajeimezapokazivacnafunkcijukojauzimadvapokazivacanacharivracaint. Sadaumjestodeklaracijevoid f(double x, int (*g)(char *, char *)){ ......mozemopisati12.6. UNIJA 211void f(double x, PF g){ ......typedefsekoristi zaparametrizacijuk odakojaomogucavavecupreno-sivostk odasjednognadrugoracunalo: naprimjer sizetjeizvedenkaotypedef. Drugo, uvodenjesmislenihimenazastandardnetipovepodatakapridonosiboljojdokumentacijiprograma.12.6 UnijaUnijakao i strukturasadrzi clanoverazlicitogtipa, ali dok kod strukturesvaki clanimazasebnumemorijskulokaciju,kodunijesvi clanovidijeleistumemorijskulokaciju. Memorijskacelokacijabiti dovoljnosirokadaunjustanenajsiri clanunije.Sintaksaunijeanalognajesintaksistrukture. Opcenitoimamounion ime {tip_1 ime_1;tip_2 ime_2;.... ....tip_n ime_n;};Varijablatipaimemozesedeklarirati prideklaraciji unijeiliodvojeno, kaokodstruktura.union ime x,y;Naprimjer,union pod {int i;float x;} u, *pu;Komponentama varijable u mozemo pristupiti preko operatora .ili operatora->. Tako su u.i i pu->i varijable tipa int, a u.x i pu->x varijable tipa float.Osnovnasvrhaunijejeustedamemorijskogprostora. Naistoj memo-rijskoj lokaciji mozemocuvati varijablerazlicitihtipova. Pri tomemoramopaziti dauniji pristupamokonsistentno. Naprimjer, udijeluprogramaukojem smo uniju u inicijalizirali kao varijablu tipaint moramo joj pristupitikao varijabli tipa int i obratno. Ako u uniju upisemo vrijednost jednog tipa,212 POGLAVLJE12. STRUKTUREa onda vrijednost unije procitamo kao varijablu drugog tipa rezultat ce ovisitioracunaluinajvjerojatnije cebitibesmislen.Unijupodmozemoiskoristiti kakobismoispisali binarni zapis brojaspokretnimzarezomnasljedecinacin:u.x=0.234375;printf("0.234375 binarno = %x\n",u.i);Ovaj sek odoslanjanacinjenicudase(nadanomracunalu) zapamcenjevarijablitipafloatiintkoristiistibrojokteta.Poglavlje13DatotekeUovompoglavljuopisujemofunkcijeizstandardneulazno-izlaznebibli-oteke koje sluze za rad s datotekama. Program koji koristi ove funkcije moraukljucitidatotekuzaglavlja.13.1 VrstedatotekaDatotekajeimenovanopodrucjeusekundarnoj memoriji, najcescetvr-domdisku(disketi, CD-uislicno), kojesluzizasmjestajpodataka. Sasta-novistaoperacijskogsustavadatotekajeslozenobjektkojiseobicnosastojiodvisepovezanihfragmenatasmjestenihnarazlicitimlokacijamausekun-darnoj memoriji. Kakooperacijski sustavbrine osvimdetaljima radasdatotekama, Cpromatradatotekuposvefunkcionalnokaocjelinuukojujemoguceupisatinizznakovailigaiznjeprocitati.Preciznije,uC-ujedatotekakontinuiraninizokteta1(eng. stream)kojejemogucedohvatiti individualno. Prilikomcitanjaizdatotekenizoktetajeusmjerenoddatotekepremaprogramu; programmozecitati ulazni nizznak-po-znak. Kodpisanjaudatotekunizznakovaideodprogramapremadatoteci. Najmanja jedinica koja moze biti procitan ili upisana je jedan znak(oktet).Ovakva apstraktna denicijadatoteke omogucava da se tastatura i ekranracunalatretirajukaodatoteke. Stastaturejemogucesamocitati, dokjenaekranmogucesamopisati.1Niz znakova, odn. niz varijabli tipachar.213214 POGLAVLJE13. DATOTEKE13.1.1 TekstualneibinarnedatotekeANSIstandardpoznajedvijevrstedatoteka: tekstualneibinarne. Raz-likamedunjimajeunacinunakojiseinterpretirasadrzajdatoteke.Binarna datotekaje niz podatakatipa char. Buduci da se svaki tippodatka u C-u (int, double, struct ...)moze preslikati u niz vrijednostitipachar, ubinarnuje datotekumoguce upisati podatke onakokakosureprezentiraniuracunalu.Teksualna datoteka je niz znakova podijeljenih u linije. Svaka linija sadrzinulailiviseznakovaizakojihslijediznakzaprijelazunovired\n. Teks-tualnedatotekesunamijenjenepohranjivanjutekstualnihpodataka.Vidimodapojambinarnedatotekeodgovaranasojprethodnojdenicijidatoteke kao niza znakova. Tekstualna datoteka je isto tako niz znakova ali seon interpretira na malo drugaciji nacin. Potreba za razlikovanjem izmedu tek-stualnih i binarnihdatoteka pojavilasestoga storazliciti operacijskisustavikoriste razlicite nacine oznacavanja kraja linije: programski jezik C oznacavakrajlinijeznakom\n.PodoperacijskimsustavomUNIX, znakzakraj linijeje\n(kaoi uC-u) te stoga pod UNIXom nema razlike izmedu binarne i tekstualne datoteke.Dvijevrstedatotekaimplementiranesunaistinacin.Operacijski sustavMS-DOSkraj linijeoznacavasdvaznaka\r\n,doknpr. Macintoshkoristi znak\r. KadaCotvori tekstualnudatotekukreiranupodMS-DOSomoncesvaki parznakova\r \npretvoriti uznak\n. Analognasetransformacijaprovodi sMacintoshovimtekstual-nim datotekama. Pored toga neki MS-DOS editori oznacavaju kraj datotekeznakomCtr-ZdokCnemaposebanznakzakrajdatoteke.Treba uociti da C omogucava da danu datoteku promatramo kao binarnuili tekstualnu prema nasim potrebama, neovisno o tome da li datoteka sadrzitekstualne podatke ili ne. Tekstualnudatotekuformiranunpr. podMS-DOSom mozemo otvoriti i kao tekstualnu i kao binarnu. Razlika je prikazananaslici13.1.1.13.1.2 Razineulaza/izlazaPostojedvijerazineulazno-izlaznihoperacija. 1)Mogucejeneposrednokoristiti funkcije za ulaz/izlaz koje nudi operacijski sustava; to je niska razinaulaza/izlaza. 2)Mogucejekoristiti standardneulazno/izlaznefunkcijecijisuprototipovi dani udatoteci. Tojestandardnavisokarazinaulaza/izlaz. FunkcijeizstandardnebibliotekejezikaCskrivajuodkorisnikajedanniz detaljavezanihuz operacijski sustavpasustogajednostavnijezakoristenjeodfunkcijakojenudi operacijski sustav. Poredtogak odkoji13.1. VRSTEDATOTEKA 215slika13.1.1TekstualnaibinarnadatotekaMS-DOStekstualnadatotekaPromotrimojednostavnipokus \r\nbacanjasimetricnognovcica \r\nilipopularnonazvanuigrupismo-grb. \r\n^ZPromotrimojednostavnipokus \r\nbacanjasimetricnognovcica \r\nilipopularnonazvanuigrupismo-grb. \r\n^ZPromotrimojednostavnipokus \nbacanjasimetricnognovcica \nilipopularnonazvanuigrupismo-grb. \notvorenabinarnootvorenatekstualnokoristi standardnubibliotekulaksejeprenosivnadrugesustave. Nasuprottome funkcijeoperacijskogsustavapruzaju programeru visefunkcionalnosti,notakavk odnijeprenosivnadrugeoperacijskesustave. Mi cemouovompoglavljuopisatisamonekefunkcijeizstandardnebiblioteke.13.1.3 StandardnedatotekeCautomatski otvaratri datotekezakorisnika. Tosustandardni ulaz,standardni izlazi standardni izlazzagreske. Standardni ulazjepovezanstastaturom, astandarni izlazi izlazzagreskesekranom. IstaknimodaCtastaturui ekrantretirakaodatotekebuduci dadatotekapredstavljakon-ceptualno naprosto ulazni ili izlazni niz oktetat. Na nekimoperacijskimsustavima(Unix, DOS,..) mogucejestandardni ulaz, izlazi izlazzagreskepreusmjeriti.216 POGLAVLJE13. DATOTEKE13.2 OtvaranjeizatvaranjedatotekeFILE *fopen(const char *ime, const char *tip)int fclose(FILE *fp)Komunikacijas datotekamavrsi seprekospremnika(buer) ukojise privremenopohranjujuinformacije koje sesaljuudatoteku. Svrhajespremnika smanjiti komunikacijus vanjskommemorijom(diskom) i takopovecati ekasnost ulazno-izlaznihfunkcija. Udatoteci dekla-riranajestrukturaFILEkojasadrzi svepodatkepotrebnezakomunikacijusdatotekama(ukljucujuci velicinui polozaj spremnika). Programkoji zeliotvariti datotekumoraprvodeklarirati pokazivacnaFILEkaouovompri-mjeru:FILE *ptvar;Datotekamorabitiotvorenapomocufunkcijefopenprijeprveoperacijepi-sanjaili citanja. Tipicnosefopenkoristinasljedecinacin:ptvar=fopen(ime,tip);if(ptvar==NULL){printf("Poruka o gresci"):......}gdjejeimeimedatotekekojaseotvara,atipjedanodsljedecihstringova:tip Znacenje"r" Otvaranjepostojecedatotekesamoza citanje"w" Kreiranjenovedatotekesamozapisanje."a" Otvaranjepostojecedatotekezadodavanjeteksta."r+" Otvaranjepostojecedatotekeza citanjeipisanje."w+" Kreiranjenovedatotekeza citanjeipisanje."a+" Otvaranjepostojecedatotekeza citanjeidodavanjeteksta.Pritometrebaznatida:Akosepostojecadatotekaotvori swili w+njensadrzaj cebitiizbrisanipisanje cepocetiodpocetka.Akodatotekakojuotvaramos tipomaili a+nepostoji bitcekreirana.13.2. OTVARANJEIZATVARANJEDATOTEKE 217Akose datoteka otvara s tipom a ili a+ novi tekst ce biti dodavannakrajudatoteke(adolaziodeng.append).Pomocugornjihoznakatipovadatotekacebiti otvorenautekstualnommodu. Dabi seotvorilaubinarnommodutrebatrebasvakomtipudodatib. Timedolazimodotipova "rb", "wb", "ab"=binarno citanje,pisanje,dodavanje; "rb+"ili"r+b"=binarno citanje/pisanje(otvaranje); "wb+"ili"w+b"=binarno citanje/pisanje(kreiranje); "ab+"ili"a+b"=binarnododavanje.Funkcija fopen vraca pokazivac na strukturu FILE povezanu s datotekomiliNULLakodatotekanijemoglabitiotvorena.Nakrajuprogramadatotekatrebabitizatvorenafunkcijomfclosekojauzimakaoargumentpokazivacnaspremnik:fclose(ptvar);Na primjer, otvaranje i zatvaranje datoteke primjer.dat izgledalo biovako:#include .......FILE *fpt;if((fpt=fopen("primjer.dat","w"))==NULL)printf("\nGRESKA: Nije moguce otvoriti datoteku.\n");.....fclose(fpt);FunkcijafclosevracanuluakojedatotekauspjesnozatvorenateEOFuslucajugreske.13.2.1 Standardnedatotekestdin,stdout,stderrUdatoteci denirani sukonstantni pokazivaci na FILEstrukturupovezanusastandardnimulazom,izlazomiizlazomzagreske. Tipokazivaci imajuimenastdin(standardni ulaz), stdout(standardni izlaz)istderr(standardniizlazzagreske).218 POGLAVLJE13. DATOTEKE13.3 FunkcijezacitanjeipisanjeFunkcijegetchar, putchar, gets, puts, printfi scanfimajuana-logne verzije getc, putc, fgets, fputs, fprintf i fscanf koje rade s da-totekama. Sve te funkcije kao prvi argument uzimaju pokazivac na spremnik(pokazivacnaFILE)povezansdatotekom.13.3.1CitanjeipisanjeznakpoznakFunkcijeint getc(FILE *fp)int fgetc(FILE *fp)vracajusljedeciznakizdatotekenakojupokazujefp. Razlikaizmedugetci fgetc je u tome dagetc moze biti implementiranakao makro naredba dokfgetc ne smije. U slucaju greske ili kraja datoteke vraca se EOF. To je razlogstojetipvracenevrijednosti intumjestochar. Funkcijagetchar()kojusmouveliuPoglavlju5implementirasekaogetc(stdin).Programusljedecemprimjerubrojiznakoveudatotecikojajenavedenakaoargumentkomandnelinije.#include #include int main(int argc, char *argv[]){int ch,count=0;FILE *fpt;if(argc==1){ /* ime datoteke nedostaje */printf("\nUporaba: %s ime_datoteke\n",argv[0]);exit(-1);}else if((fpt=fopen(argv[1],"r"))==NULL){printf("Ne mogu otvoriti datoteku %s\n",argv[1]);exit(-1);}while((ch=fgetc(fpt))!=EOF) count++;fclose(fpt);printf("\nBroj znakova = %d\n",count);13.3. FUNKCIJEZACITANJEIPISANJE 219return 0;}Znakprocitansagetcili fgetcmoze biti vracenudatotekupomocufunkcijeint ungetc(int c, FILE *fp);Prviargumentjeznakkojivracamo. Zavisedetaljavidi[7].Znakmozebitiupisanudatotekupomocufunkcijaint putc(int c, FILE *fp)int fputc(int c, FILE *fp)Ponovo, razlikaizmeduputci fputcjeutomestoputcmozebiti imple-mentirana kao makro naredba dokfputc ne smije. Funkcije vracaju ispisaniznakili EOFakojedoslodogreskeprilikomispisa. Funkcijaputchar(c)izPoglavlja5deniranajekaoputc(c,stdout).Funkcija koja kopira jednu datoteku u drugu moze biti napisana nasljedecinacin:void cpy(FILE *fpulaz, FILE *fpizlaz) {int c;while((c=getc(fpulaz))!=EOF)putc(c,fpizlaz);}Pomocu te funkcije mozemo napisati program cat koji uzima imena datotekai ispisuje datoteke na standardnom izlazu u poretku u kojem su njihova imenanavedena. Ukoliko se ne navede niti jedno ime, onda se standardni ulaz kopiranastandardniizlaz.#include void cpy(FILE *, FILE *);int main(int argc, char *argv[]) {FILE *fpt;if(argc==1) /* ime datoteke nedostaje */cpy(stdin,stdout);elsewhile(--argc>0)220 POGLAVLJE13. DATOTEKEif((fpt=fopen(*++argv,"r"))==NULL){printf("cat: ne mogu otvoriti datoteku %s\n",*argv);exit(1);}else {cpy(fpt,stdout);fclose(fpt);}return 0;}Uocimodasmouprogramuposveizbjegliupotrebubrojacatime stoinkre-mentiramoidekrementiramoargciargv.13.3.2CitanjeipisanjelinijupolinijuFunkcijakojaucitavapodatkeizdatotekeliniju-po-linijujechar *fgets(char *buf, int n, FILE *fp);Prvi argumentjepokazivacnadiomemorije(eng. buer)ukojiceulaznalinijabiti spremljena, adrugi jevelicinamemorijenakojuprvi argumentpokazuje. Treciargumentjepokazivacnadatotekuizkojeseucitava.Funkcijaceprocitati linijuukljucujuci i znakzaprijelazunovi redi nakraj cedodatinulznak\0. Pritome cebitiucitanonajvisen-1znakova,ukljucivsi \n. Ukoliko je ulazna linija dulja od toga, ostatak ce biti procitanprisljedecempozivufunkcijefgets.Funkcija vraca buf ako je sve u redu ili NULL ako se doslo do kraja datotekeilisepojavilagreska.Funkcijachar *gets(char *buf);uvedena u Poglavlju 5 cita uvjek sa standardnog ulaza. Ona ne uzima velicinubuerakaoargumenti stogasemozedesiti dajeulaznalinijavecaodme-morije koja je za nju rezervirana. Stoga je bolje umjestogets(buf)koristitifgetf(buf,n,stdin). Pri tome treba uzeti u obzir razliku da fgets ucitavai znak\n, dokgetsznakzaprijelazunovi reducitava, ali nanjegovomjestostavlja\0.Funkcijazaispispodatakaudatoteku,liniju-po-linijuje13.3. FUNKCIJEZACITANJEIPISANJE 221int fputs(const char *str, FILE *fp);Funkcijavracanenegativnuvrijednost akojeispis uspioili EOFuslucajugreske.fputsispisuje znakovni niz nakoji pokazuje strudatotekunakojupokazujefp. Zadnji nul znaknecebiti ispisaniznakzaprijelazunovi rednecebitidodan.Funkcijaint puts(const char *str);ispisujeznakovniniznakojipokazujestrnastandardniizlaz. Nakrajnizaona dodaje znak za prijelaz u novi red sto ju razlikuje od fputs(str,stdout).13.3.3 PrepoznavanjegreskeBuduci da ulazne funkcije vracajuEOF i u slucaju kada je doslo do greskeiuslucajukadasenaidenakrajdatotekepostojefunkcijeint ferror(FILE *fp);int feof(FILE *fp);koje sluze zarazlikovanje izmedupojedinihsituacija. ferrorvracabrojrazlicit od nule (istina) ako je doslo do greske, a nulu (laz) ako nije. Funkcijafeofvracabrojrazlicitodnule(istina)akosmodosli dokrajadatoteke, anulu(laz)usuprotnom.Sljedeci programkopirastandardni ulaznastandardni izlazi detektiraulaznugreskupomocufunkcijeferror.#include #define MAXLINE 128int main(void) {char buf[MAXLINE];while(fgets(buf,MAXLINE,stdin) != NULL)if(fputs(buf,stdout)==EOF) {fprintf(stderr,"\nIzlazna greska.\n");exit(1);}if(ferror(stdin)) {222 POGLAVLJE13. DATOTEKEfprintf(stderr,"\nUlazna greska.\n");exit(2);}return 0;}13.3.4 Formatiraniulaz/izlazZa formatirani ispis u datoteku i upis iz datoteke mozemo koristiti funkcijeint fprintf(FILE *fp, const char *format,...);int fscanf(FILE *fp, const char *format,...);One su identicne funkcijama printf i scanf s jedinom razlikom da im je prviargumentpokazivacnadatotekuukojusevrsiupisodn.izkojese cita.fscanf vraca broj ucitanih objekata ili EOF ako je doslo do greske ili krajadatoteke. fprintfvracabrojupisanihznakovaili negativanbrojuslucajugreske. Konacno, printf(...) jeekvivalentnosfprintf(stdout,...), ascanf(...)jeekvivalentnosfscanf(stdin,...).13.3.5 Binarniulaz/izlazZazapisivanjestrukturamogusepokazatipogodnijesljedecefunkcije:sizet fread(void *ptr, sizet size, sizet nobj, FILE *fp);sizet fwrite(const void *ptr, sizet size, sizet nobj, FILE *fp);Ove funkcije vrse binarno citanje i pisanje. To znaci da ne dolazi do konverzijepodatakaizbinarnogzapisa, ukojemseononalazeuracunalu, uznakovnizapiskojisemoze citati.Funkcijefreadcitaizdatotekenakojupokazujefpnobjobjekatadi-menzije sizei smjestaihupoljenakojepokazuje ptr. Vrijednost kojufunkcijavracajebrojucitanihobjekata. Tajbrojmozebiti manji odnobjako je doslo do greske ili kraja datoteke. Da bi se ispitao uzrok treba koristitifunkcijeferrorifeof.Funkcijefwriteupisujeudatotekenakojupokazujefpnobjobjekatadimenzijesize iz polja na koje pokazuje ptr. Vrijednost koju funkcija vracajebrojupisanihobjekata. Tajbrojmozebitimanjiodnobjakojedoslodogreske.13.3. FUNKCIJEZACITANJEIPISANJE 223Primjerupotrebejezapisstruktureudatotekudanjeusljedecempro-gramu.#include #include #define SIZE 2struct account{short count;long total;char name[64];};int main(void){struct account lista[SIZE]={{3,1000L,"Ivo"},{7,2000L,"Marko"}};FILE *fp;int i;if((fp=fopen("1.dat","wb"))==NULL){fprintf(stderr,"Error: nije moguce otvoriti"" datoteku 1.dat.\n");exit(-1);}for(i=0;i>= 1;maskirnibitpomicemosnajznacajnijegmjestapremanajmanjeznacajnomitakoispitujemosvebitoveuvarijabli.14.2 PoljabitovaPolja bitova namomogucuju rad s pojedinimbitovima unutar jednekompljutorske rijeci. Deklaracija polja bitova posve je slicna deklaracijistrukture:struct ime {clan 1;clan 2;.....clan n;};s tom razlikom da clanovi strukture imaju drugacije znacenje nego u obicnojstrukturi. Svaki clan polja bitova predstavlja jedno polje bitova unutar kom-pjutorskerijeci. Sintaksajetakvadaizimenavarijabledolazi dvotockaibrojbitovakoji clanzauzima. Naprimjer,struct primjer {unsigned a : 1;unsigned b : 3;unsigned c : 2;unsigned d : 1;};struct primjer v;Prvadeklaracijadenirastruktururazbijenuucetiri poljabitova, a, b, ci d. Tapoljaimajuduljinu1,3,2i1bit. Prematomezauzimaju7bitova.Poredaktihbitovaunutarjednekompjutorskerijeciovisioimplementaciji.Pojedineclanovepoljabitovamozemodohvatiti istomsintaksomkaoikodstruktura,daklev.a,v.bitd.Ako broj bitova deklariran u polju bitova nadmasuje jednu kompjutorskurijec,zapamcenjepoljabit ceupotrebljenovisekompjutorskihrijeci.Jednostavanprogramkojiupotrebljavapoljebitovajesljedeci:#include 232 POGLAVLJE14. OPERACIJENADBITOVIMAint main(void){static struct{unsigned a : 5;unsigned b : 5;unsigned c : 5;unsigned d : 5;} v={1,2,3,4};printf("v.a=%d, v.b=%d, v.c=%d, v.d=%d\n",v.a,v.b,v.c,v.d);printf("v treba %d okteta\n", sizeof(v));return 0;}Poredak polja unutar rijeci moze se kotrolirati pomocuneimenovanihclanovaunutarpoljakaouprimjerustruct {unsigned a : 5;unsigned b : 5;unsigned : 5;unsigned c : 5;};struct primjer v;Neimenovaniclancijaje sirinadeklariranakao0bitovatjeraprevodilacdasljedecepoljesmjestiusljedecuracunalnurijec. Naprimjer,#include int main(void){static struct{unsigned a : 5;unsigned b : 5;unsigned : 0;unsigned c : 5;} v={1,2,3};printf("v.a=%d, v.b=%d, v.c=%d\n",v.a,v.b,v.c);printf("v treba %d okteta\n", sizeof(v));return 0;}14.2. POLJABITOVA 233Poljabitovamogusekoristiti kaoidrugestrukturesodredenimograni-cenjima.Clanovi mogubiti tipaunsignedi tipaint. Adresni operatorsenemozeprimijeniti naclanapoljabitovaniti seclanmozedoseci pomocupokazivaca.DodatakAA.1 ANSIzaglavlja 234A.2. ASCIIZNAKOVI 235A.2 ASCIIznakoviChar Dec | Char Dec | Char Hex | Char Dec------------------------------------------------(nul) 0 | (sp) 32 | @ 64 | 96(soh) 1 | ! 33 | A 65 | a 97(stx) 2 | " 34 | B 66 | b 98(etx) 3 | # 35 | C 67 | c 99(eot) 4 | $ 36 | D 68 | d 100(enq) 5 | % 37 | E 69 | e 101(ack) 6 | & 38 | F 70 | f 102(bel) 7 | 39 | G 71 | g 103(bs) 8 | ( 40 | H 72 | h 104(ht) 9 | ) 41 | I 73 | i 105(nl) 10 | * 42 | J 74 | j 106(vt) 11 | + 43 | K 75 | k 107(np) 12 | , 44 | L 76 | l 108(cr) 13 | - 45 | M 77 | m 109(so) 14 | . 46 | N 78 | n 110(si) 15 | / 47 | O 79 | o 111(dle) 16 | 0 48 | P 80 | p 112(dc1) 17 | 1 49 | Q 81 | q 113(dc2) 18 | 2 50 | R 82 | r 114(dc3) 19 | 3 51 | S 83 | s 115(dc4) 20 | 4 52 | T 84 | t 116(nak) 21 | 5 53 | U 85 | u 117(syn) 22 | 6 54 | V 86 | v 118(etb) 23 | 7 55 | W 87 | w 119(can) 24 | 8 56 | X 88 | x 120(em) 25 | 9 57 | Y 89 | y 121(sub) 26 | : 58 | Z 90 | z 122(esc) 27 | ; 59 | [ 91 | { 123(fs) 28 | < 60 | \ 92 | | 124(gs) 29 | = 61 | ] 93 | } 125(rs) 30 | > 62 | ^ 94 | ~ 126(us) 31 | ? 63 | _ 95 | (del) 127236 DODATAKA.A.3 Matematickefunkcijedouble cos(double x) -- cos(x)double sin(double x) -- sin(x)double tan(double x) -- tg(x)double acos(double x) -- arccos(x)double asin(double x) -- arcsin(x)double atan(double x) -- arctg(x)double atan2(double y, double x) -- arctg(y/x)double cosh(double x) -- ch(x)double sinh(double x) -- sh(x)double tanh(double x) -- th(x)double exp(double x) -- e^xdouble pow (double x, double y) -- x^y.double log(double x) -- ln(x).double log10 (double x ) -- log(x)double fabs (double x ) -- |x|labs(long n) -- |n|double sqrt(double x) -- korijendouble ceil(double x) -- Najmanji cijeli broj veci od xdouble floor(double x) -- Najveci cijeli broj manji od xBibliograja[1] C-faq,http://www.eskimo.com/scs/C-faq/top.html.[2] B. S. Gottfried, Theory and Problems of Programming with C, Schaumsoutlineseries,McGraw-Hill,1996.[3] S.P.HarbisonIII,G.L.SteeleJr.,C,AReferenceManual, FifthEdi-tion,PrenticeHall,2002.[4] B. W. Kernighan, D. M. Ritchie, TheCProgrammingLanguage, 2ndEdition,1988.[5] W. H. Murray, III, C. H. Pappas, 8036/8026AssemblyLanguagePro-gramming,OsborneMcGraw-Hill,Berkeley,1986.[6] S.Prata,CPrimerPlus,4thedition,SAMS,2002.[7] W.R.Stevens, AdvancedProgrammingintheUNIXEnviroment, Ad-disonWesley,1992.237