c++

December 8, 2017 | Author: Nikola Wolf Dussich | Category: N/A
Share Embed Donate


Short Description

c++...

Description

Robert Logožar

Uvod u programiranje i

jezik C/C++

Uvod u programski jezik C/C++ Predgovor Uvod u programski jezik C/C++ je udžbenik koji pokriva gradivo uobičajenih uvodnih kolegija programiranja na visokoškolskim učilištima. Iako su C i C++ relativno zahtjevni jezici, danas su upravo oni standardan izbor nastavnih kurikuluma iz područja računarstava. Većina studenata se u svom prethodnom školovanju već trebala susresti s programiranjem u nekim drugim, konceptualno jednostavnijim ili jasnijim jezicima, kao što su npr. BASIC, LOGO, Pascal, i sl. Stoga je danas uvriježeno mišljenje da je na studiju najbolje odmah krenuti s usvajanjem jezika C i C++, kao standardnih jezika struke. Dodatni argument je vrlo elegantna i učinkovita sintaksa ovih jezika, koja je postala uzor i drugim, danas popularnim računalnim jezicima, kao što su npr. Java, Perl, PHP… Svi ovi razlozi dovoljni su da, i one čitatelje koji su početnici u programiranju, potaknu na učenje upravo ovih jezika. S druge strane, nužno je istaći da savladavanje C++ jezika u cjelini, uz punu objektno orijentiranu funkcionalnost, zahtijeva poznavanje temelja računarstva i posjedovanje osnovnih vještina u pisanju programa. Da se tome udovolji, najčešće se u okviru jednosemestralnog kolegija utvrđuje znanje klasičnog programiranja, kao i usvajanje sintakse jezika. To i jest cilj prvog dijela ovog teksta: savladavanje „tradicionalnog“, proceduralnog programiranja, koje se u C-miljeu naziva i funkcijsko programiranje. Za ovakvo bi programiranje u potpunosti bio dostatan jezik C , koji je i formalni podskup jezika C++. Programi u prvom dijelu ovog teksta napisani su upravo u duhu funkcijskog programiranja jezika C. Međutim, kao što je to danas uobičajeno, odmah se koriste sintaksne i formalne specifičnosti nasljednika C++. Dakle, usporedo s izlaganjem osnovna programiranja u proceduralnom stilu, ukratko se obrazlažu posebnosti jezika C++ , i glede njegove dodatne objektne prirode, i glede sitnih sintaktičkih različitosti u odnosu na njegovog prethodnika. Time se vrši prirema za usvajanje objektne paradigme programiranja za koju je jezik C++ i pisan, i koja u punoj mjeri iskorištava njegove potencijale. To će biti izloženo u kasnijim dijelovima ovog teksta.* Gradivo je izloženo tako da se nakon kratkog teorijskog izlaganja određene teme, rano prelazi na primjere i zadatke. Time se studenti potiču da odmah provjeravaju uvedene koncepte i zamisli programskog jezika na konkretnim primjerima, te da kroz samostalan rad i istraživanje odgonetavaju detalje jezika. Programski jezik je alat koji programeru služi da riješi probleme i ostvare svoje zamisli, i nema boljeg načina da se taj alat upozna nego kroz njegovu uporabu. No, s druge strane, potrebno je kod čitatelja razviti apstraktno promišljanje programiranja. Stoga svako poglavlje počinje izlaganjem motiva i svrhe pojednih tipova tvrdnji i svojstava jezika, te njihovom „općenitom definicijom“. Definicije nisu formalno stroge, jer se radi o uvodnom tekstu programiranja, ali su dovoljno precizne da se iz njih mogu iščitati opća pravila jezika. S druge strane, za čitatelje kojemu su i ovako postavljene definicije previše apstraktne, dodana su pojašnjenja i primjeri. Usvajanje gore spomenutog apstraktnog znanja će zasigurno biti puno lakše nakon što čitatelj riješi primjere i zadatke, uspješno odgovori na postavljena pitanja, i potom ponovo promotri osnovnu ideju izloženu u teorijskom uvodu. Uspješno programiranje nije moguće bez poznavanja osnova računarstva, a upravo je jezik C/C++ idealan da se to dvoje upoznaje usporedno. Također, iako se radi o uvodnom kolegiju, nužno je da se kod studenata odmah razvija osjećaj za formalno korektno programiranje, za izbor ispravnih programskih i podatkovnih struktura, te za pisanje preglednog i jasnog izvornog koda. *

Nisu dodani u ovoj inačici.

i

ii

Prilikom odabira imena varijabli i funkcija uglavnom su poštovana načela tzv. mađarske notacije (engl. Hungarian notation), koja je danas široko usvojena, a pogotovo u razvojnoj okolini Microsoft Visual C++ koju ovdje koristimo. Tendencija uporabe engleskih imena je opravdana činjenicom da se radi o standardnom jeziku struke. I sam jezik C/C++ koristi engleski jezik kao osnovu za svoje ključne riječi. Studente je stoga potrebno navikavati na uporabu profesionalne literature i pomoćnih izbornika upravo na tom standardnom jeziku struke. Imajući na umu da pred početnicima leži veliki zadatak usvajanja mnogobrojnih znanja, većina komentara je, osim u nekoliko izuzetaka, pisana na hrvatskom. Jezik C/C++ često se karakterizira i kao «nisko postavljeni» viši programski jezik. Njegova fleksibilna sintaksa, velike mogućnosti s jedne i suštinska jednostavnost i elegancija s druge strane, namijenjene su profesionalnim programerima. To zasigurno otežava njegovo učenje početnicima, ali ih zato i potiče da prodube svoje znanje u svim aspektima računarstva. «Slobodu» koje prevodilac dopušta treba dobro razumjeti, i tek onda će se otkriti neosporna učinkovitost i ljepota ovog jezika. Ujedno, ta činjenica zahtijeva i opravdava usputna obrazloženja o radu računala i prevodioca. Već smo spomenuli da je obim izloženog gradiva i zadataka nešto veći od onog što mogu svladati početnici bez iskustva u programiranju. Naime, prejednostavan pristup može biti nezanimljiv i nemotivirajući za naprednije studente. Za njih su dodani teži dijelovi gradiva i složeniji zadaci koji su označeni zvjezdicom (*). Ovi dijelovi se u pravilu mogu preskočiti u prvom čitanju. S druge strane, oni često razmatraju važne i nezaobilazne teme nužne za temeljitije razumijevanje jezika C/C++, i bolje svladavanje znanja i vještina programiranja.

R. Logožar, ožujak 2009.

iii

Sadržaj Uvod u programski jezik C/C++ .......................................................................i  Predgovor ..............................................................................................................i  Poglavlje 1. 

Uvod u programiranje. Algoritmi ............................................ 1 

1.1 

Programiranje kao znanost i vještina...................................................................... 1 

1.2 

Algoritmi .................................................................................................................... 2 

1.3 

Temeljni pojmovi programiranja ............................................................................ 2 

Poglavlje 2. 

Jezici C i C++. Prvi programi u C++. ................................. 4 

Poglavlje 3. 

Osnovnih tipovi podataka u C / C++ .................................... 13 

Poglavlje 4. 

Osnovni operatori u jeziku C / C++ ....................................... 31 

Poglavlje 5.  Organizacija izvornog koda, programske strukture, i kontrola toka 39  Poglavlje 6.  Osnovna struktura podatka – poredak. Jedno i više dimenzionalni poredci ...................................................................................... 63  Poglavlje 7. 

Kazaljke – pokazivački tip. Navodi (reference) ................... 72 

Poglavlje 8. 

C (C++) funkcije .................................................................... 101 

Poglavlje 9. 

Znakovni poredci i C-nizovi. Primjer uporabe funkcija .. 122 

Poglavlje 10.  Strukturirano programiranje ............................................... 133  Poglavlje 11.  Pretraživanje i sređivanje ..................................................... 136  Poglavlje 12.  Dodatna poglavlja funkcijskog programiranja ................. 155  Poglavlje 13.  Dodatni zadaci ........................................................................ 162  Literatura ......................................................................................................... 178 

Poglavlje 1.

Uvod u programiranje. Algoritmi

Programiranje računala je djelatnost stara koliko i sami računalni strojevi. Današnji, viši programski jezici, uvelike olakšavaju pisanje programa jer su orijentirani prema problemu (engl. problem oriented languages), za razliku od strojnih jezika koji su orijentirani prema računalu. (engl. machine oriented languages). * Dakle, dok su strojni jezici izravno povezani sa strojnim instrukcijama i načinima adresiranja memorije koje određeni procesor može izvoditi, viši programski jezici apsthrahiraju tehničke detalje rada računaula kroz primjenu izbora simbola, ključnih riječi, i načina pisanja programa koji su bliži ljudskom načinu izražavanja i matematičkom jeziku i logici. Danas postoji mnošto viših programskih jezika od opće do specijalizirane uporabe. Takvi jezici olakšavaju stručnjacima iz nekog područja da sami pišu svoje programe. Pri tom je poznavanje svojstava jezika i načina pisanja programa nužno, ali ne i dovoljno za uspješno programiranje. Jasno je da samom pisanju programskog koda mora prethoditi analiza problema koji želimo riješti na računalu. U ovom početnom poglavlju dajemo kratak osvrt upravo na taj dio programiranja, koji je neovisan o rabljenom programskom jeziku, a tiče se izražavanja rješenja problema u algoritamskom obliku.

1.1 Programiranje kao znanost i vještina. Da bismo uspješno izradili program, potrebno je potpuno razumijevanje problema ili zadatka koji želimo riješiti, u smislu da njegovo rješenje možemo precizno razraditi „na papiru“. Za uspješno programiranje nepohodno je: i. razumijevanje problema ili zadatka koji želimo riješti; ii. osmišljavanje rješenja i njegovo izražavanje u algoritamskom obliku; iii. poznavanje programskog jezika (alata) u kojem se to rješenje piše. Iz ovoga je jasno da dobri programeri moraju imati široko predznanje mnogih temeljnih disciplina. Tu u prvom redu ističemo matematiku, za koju je tipično apstrahiranje problema, tj. izvlačenje njegovih najbitnijih i općih odrednica koje su primjenjive na sve konkretne instance. Također, u matematici se redovito primjenjuju precizno formulirani postupci, jednako kao i u računarstvu. Za programiranje u jeziku kao što je C/C++ nužno je i poznavanje osnova o radu računala. Konačno, ako se radi o problemu iz nekog specijalnog područja, potrebno je usvojiti i osnovna znanja iz njega. Uvriježeno je mišljenje da programiranje ne predstavlja samo znanost, nego i umijeće. Isti se problem često može riješiti na nekoliko različitih i podjednako dobrih načina. Pogotovo se rješenja i pristupi razilaze u izvedbi vrlo opsežnih programa, iako oni često rabe slične sastavne dijelove. No slično kao i u umjetnosti, iako postoje različiti autorski pristupi istim temama, kritičari će lako razlučiti dobra djela od loših. Istina je da i loš program može davati zadovoljavajuće, ili barem donekle prihvatljivo rješenje. Međutim, tu računarska znanost postavlja jasne kriterije glede korektnosti, brzine rada programa (algoritma), količine utrošene memorije, robustnosti, mogućnosti nadogradnje, i sl.. Nadalje, računarstvo propisuje podatkovne strukture i algoritme s njima u svezi koje treba rabiti. To je nezaobilazna osnovica znanja na kojem se dalje izgrađuje vještina. *

Strojni jezici se kod nas u računarskom žargonu nazivaju asemblerski jezici (od engl. izvornika assembly languages) što se često krati u naziv asembleri (engl. assembler). Ovaj kraći naziv preklapa se s programom za prevođenje programskog koda napisanog u strojnom jeziku u formi čitkoj i razumljivoj čovjeku, u objektni binarni kôd (sastavljen od 0 i 1) „razumljiv“ računalu.

1

2

Od samog početka važno je istaći činjenicu da je bit programiranja u rješavanju zadanog problema za najširi i najopćenitiji broj slučajeva. Programi koji rade samo uz vrlo ograničene kriterije, i koji se stalno moraju mijenjati i usklađivati i za najmanje promjene ulaznih podataka, su nevaljali i besmisleni. Njih treba izbjegavati čak i kao školske primjere. Loše navike u programiranju lako se stječu i kasnije mogu predstavljati ozbiljnu kočnicu pri nailasku na teže probleme. Programiranje je tehnička disciplina koja zahtijeva jasnoću, preglednost i uporabu «elegantnih rješenja». Da bi programer razvio osjećaj za to, mora dobro razumjeti sintaksu i semantiku programskog jezika, te detaljno proučiti mnogobrojne primjere. Zadovoljenje lošim programom pod izlikom da su današnja računala brza i da količina utrošene memorije nije problem, je nedopustivo. Mnogi studenti ignoriraju potrebu za usvajanjem novih znanja i čvrstih računarskih principa, te nastavljaju rješavati probleme na svoj stari, «intuitivan», način. Takav pristup onemogućava napredak i rezultira neuspjehom pri prvim ozbiljnijim programskim zadacima. Nadalje, neke naizgled nevažne stvari kod jednostavnih programa, postaju presudne kod kompleksnih. Učestale loše navike kod programiranja su nemarnost u programskoj formi, loš i nekonzistentan stil, ignoriranje potrebe za uvlačenjima linija koda (tzv. identacija) prema njihovoj funkcionalnoj razini, izostanak odgovarajućih komentara, itd. Gotovo da nema poznatog autora na području programiranja koji ne ističe važnost programskog stila i važnost preglednosti napisanog koda (vidi npr. [3]). Bez poštivanja tih načela će ono što u trenutku pisanja izgleda kao jasno, već sutra biti potpuno nerazumljivo i samom autoru.

1.2 Algoritmi Programeri moraju razvijati svoje sposobnosti za algoritamski pristup rješavanju problema. Algoritam ukratko možemo definirati kao precizno definirani postupak koji na temelju nekih zadanih veličina, u konačnom broju koraka rješava određenu zadaću i daje odgovarajući rezultat. Razumijevanje algoritama i njihovo programiranje iziskuje razvijeno apstraktno razmišljanje, i analitičko i sintetičko. Potrebna je i kreativnost, od osmišljavanja potrebnih varijabli i struktura, davanja prikladnih imena, korištenja prikladnih podatkovnih i programskih struktura, do razmatranja različitih rješenja i odabira najpovoljnijih. Rješenje problema iz nekog područja možemo predočiti u algoritmom u nekom prikladnom obliku, te ga zatim preformulirati u računarski algoritam u vidu dijagrama toka ili pseudo-koda. Ostatak posla je prevođenje takvog rješenja u programski kod specifičan za rabljeni jezik. Za jednostavnije probleme vješti programeri mogu tih nekoliko faza odmah razriješiti u glavi i izravno pisati programe. Za početnike je preporučljivo da isprva na papiru skiciraju rješenje i tek onda pređu pretvorbi tog rješenja u kompjuterski program.

1.3 Temeljni pojmovi programiranja Četiri su ključne faze u izradi i primjeni programa: 1. 2. 3. 4.

Pisanje izvornog koda; Prevođenje izvornog koda; Povezivanje u izvedbeni kôd; Testiranje programa.

Pisanje izvornog koda možemo realizirati u bilo kojem programu za uređivanje teksta (engl. text editor). Danas postoje integrirane razvojne okoline (npr. Microsoft© Visual Studio), koje uz prevodioca i povezivača imaju ugrađene programe za upis i ispravljanje izvornog koda. U C++ jeziku, datoteku izvornog koda pohranjujemo pod fizičkim imenom ime_programa.cpp (u jeziku C to je bila datoteka ime_programa.c )

3

Prevođenje izvornog koda je postupak u kojem prevodilac (engl. compiler) provjerava sintaksu (gramatičku ispravnost, vidi kasnije) napisanog izvornog koda uz javljanje mogućih pogrešaka za vrijeme prevođenja (engl. compile-time errors), te prevodi tvrdnje (engl. statements) ili naredbe višeg programskog jezika u strojni kôd, koji se sastoji od binarno kodiranih strojnih instrukcija (engl. instructions), razumljivih datom procesoru kao osnovnoj sastavnici računarske platforme (engl. computing platform). Stvara se datoteka objektnog koda pod imenom ime_programa.obj. Povezivanje (engl. linking) u izvedbeni kôd je postupak u kojem povezivač (engl. linker) obavlja povezivanje objektnog koda u datoteci ime_programa.obj, s objektnim datotekama već gotovih funkcija koje smo koristili u programu, sadržanih u bibliotekama (engl. libraries) funkcija. Greške koje se pri tome mogu javiti su tzv. greške u vrijeme povezivanja (engl. link-time errors). Nakon uspješnog povezivanja stvara se datoteka izvedbenog koda: ime_programa.exe. Ovu datotkeu operacijski sustav prepoznaje kao program koji je moguće izvršiti na datoj računarskoj platformi. Testiranje. Izvedbeni kôd još uvijek ne jamči da će program uspješno raditi. Program treba testirati. Preostale greške spadaju u tzv. logičke greške, koje se još nazivaju i greške pri izvođenju (engl. run-time errors). Za testiranje programa služi dodatni program, kojeg bismo mogli nazvati uklanjač grešaka (engl. debugger), kojim testiramo program tvrdnju po tvrdnju, uz moguću analizu vrijednosti pojedinih varijabli u programu, stanja registra procesora, memorije itd. Također, programer po potrebi sam kreira programe koji služe za provjeru drugih programa za karakteristične i kritične vrijednosti ulaznih podataka. Osim pogrešaka (engl. errors), prevoditelj i povezivač mogu javiti i upozorenja (engl. warnings). Ta upozorenja ne onemogućavaju prevođenje, povezivanje i izvršavanje programa, ali predstavljaju opasnost. Iz tih razloga, najbolje je da se uklone.

4

Poglavlje 2.

Jezici C i C++. Prvi programi u C++.

U ovom poglavlju dajemo kratak pregled nastanka programskih jezika C i C++, te njihovih osnovnih značajki. Objektno orijentirani programski jezik C++ konstruirao je Bjarne Stroustrup 1983.-1985. iz Bell Laboratories u SAD. On predstavlja de-facto standard suvremenog računarstva, i jednako je prisutan i u znanstvenoj i industrijskoj praksi. Nastao je na temelju jezika C (Dennis Ritchie 1972, Bell Laboratories) kao najzastupljenijeg klasičnog programskog jezika, poznatog između ostalog i po tome što je u njemu bio napisan operacijski sustav Unix, te mnogi drugi, računarski najsloženiji primjenski (aplikativni) programi. Jezik C++ u sebi kao podskup sadrži jezik C i dosljedno nastavlja njegovu sintaksu. Pošto je za objektno programiranje potrebno imati vještinu i razumijevanje uobičajenog, tzv. proceduralnog programiranja, uvodno izučavanje se svodi na jezik C. Kako što je već napomenuto u predgovoru, jezik C je u sebi sažeo i unaprijedio mnogobrojna rješenja iz drugih viših programskih jezika, jednako kao što je uveo i najnovija dostignuća, te odgovorio zahtjevima suvremenog računarstva. Istovremeno, to je jezik stvoren da u prvom redu služi za profesionalnu uporabu. Zato C zasigurno nije jezik za početnike koji to namjeravaju i ostati. Također, teorijski gledano, postoje formalno elegantniji i konzistentniji jezici (npr. Pascal, Modula 2, i drugi), koji su, s vremenom izašli iz profesionalne uporabe. C je izgrađen na temeljima koji se oslanjanju na standardna arhitekturalna rješenja procesora, kao npr. tretiranje nizova ili poredaka, inkrementirajući i dekrementirajući operatori, rad s pokazivačkim tipom, itd., a istovremeno omogućuje pisanje kratkog i elegantnog programskog koda. U tom smislu je C/C++ najsnažniji programski jezik današnjice, ali istovremeno i alat kojim nije lako potpuno ovladati. Sve to iziskuje povećani trud koji početnici moraju uložiti u njegovo razumijevanje. Funkcijsko programiranje. Pisanje C programa svodi se na pisanje programskih funkcija, pa govorimo o funkcijskom programiranju (engl. functional programming). Čak i ono što se u drugim jezicima zvalo «glavni program», u jeziku C je elegantno svedeno na funkciju. To je posebna glavna funkcija, engl. main() funkcija, sa ili bez argumenata (za funkcije vidi pogl. 6, za uporabu glavne funkcije main vidi primjere niže). Glavna funkcija može pozivati druge funkcije koje je napisao programer ili koje su sadržane u standardnim bibliotekama funkcija. Postoji potpuna analogija između funkcijskog programiranja i proceduralnog programiranja, pa se jezik C ubraja u skupinu proceduralnih programskih jezika gdje spadaju npr. Pascal, Modula 2, Ada.

Prvi programi i kratak pregled sintakse jezika C / C++ Sav rad računala svodi se na izvršavanje računalnih programa, što se opet svodi na izvršavanje niza strojnih instrukcija razumljivih računalnom procesoru. Cilj programa je da na način propisan određenim programskim jezikom omogući izvršenje željenog zadatka. Kao uobičajeni početni primjer navodimo program «Zdravo svijete!», koji na ekran računala ispisuje prvu poruku budućih programera. Primjer 1. Program „Zdravo svijete“. Napišite program u C++ kojim ćete iz C++ programa pozdraviti svijet. #include

// Pretprocesorska direktiva (uputa).

5 int main() // Glavna funkcija, pod nazivom "main". { // Program ispisuje znakovni niz (string): std::cout
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF