Tehnike programiranja /kroz programski jezik C++/- Dr. Zeljko Juric

  • Upload
    etfunsa

  • View
    2.760

  • Download
    145

Embed Size (px)

Citation preview

A-PDF Merger DEMO : Purchase/kroz programski jezik C++/ Dr. eljko Juri: Tehnike programiranja from www.A-PDF.com to remove the watermarkRadna skripta za kurs Tehnike programiranja na Elektrotehnikom fakultetu u Sarajevu

Predavanje 1.

Predavanje 1Ovi materijali namijenjeni su onima koji su odsluali kurs Osnove raunarstva na Elektrotehnikom fakultetu u Sarajevu po novom nastavnom programu, kao i svima onima koji ve poznaju osnove programiranja u programskom jeziku C, a ele da preu na programski jezik C++. S obzirom da je programski jezik C++ isprva bio zamiljen kao nadgradnja jezika C, gotovo svi programi pisani u jeziku C ujedno predstavljaju ispravne C++ programe. Ipak, kompatibilnost izmeu C-a i C++-a nije stoprocentna, tako da postoje neke konstrukcije koje su ispravne u jeziku C, a nisu u jeziku C++. Takvi primjeri e biti posebno istaknuti. S druge strane, bitno je napomenuti da mnoge konstrukcije iz jezika C, mada rade u jeziku C++, treba izrazito izbjegavati u jeziku C++, s obzirom da u jeziku C++ postoje mnogo bolji, efikasniji i sigurniji naini da se ostvari isti efekat. Treba shvatiti da je C++ danas ipak posve novi programski jezik, bitno drugaiji od C-a, mada u principu visoko kompatibilan sa njim. Rjeenja koja su dobra (a ponekad i jedina mogua) u C-u, u C++-u mogu biti veoma loa. Stoga biti vrlo dobar programer u C-u najee ne znai biti dobar C++ programer. Vrijedi ak obrnuto: ispoetka su nabolji C programeri obino katastrofalno loi C++ programeri, sve dok se ne naviknu na filozofiju novog jezika i na novi nain razmiljanja. Stoga e uvodna poglavlja uglavnom biti posveena onim aspektima jezika C koje nije preporuljivo koristiti u C++-u, dok e specifinosti naina razmiljanja u C++-u doi kasnije. Ponimo od prvog C programa iz veine udbenika o C-u tzv. Hello world / Vozdra raja programa:#include main() { printf("Vozdra raja!\n"); return 0; }

ak ni ovaj posve jednostavan C program nije ispravan u C++-u prema posljednjem standardu ISO 98 jezika C++, kojeg emo se u ovim materijalima pridravati (bez obzira to e mnogi C++ kompajleri ipak prevesti i izvriti ovaj program). Naime, u ovom primjeru, funkcija main nema povratni tip. U C-u se tada podrazumijeva da je povratni tip int, dok se u C++-u povratni tip uvijek mora navoditi. Dakle, u C++-u bi ispravna bila sljedea varijanta:#include int main() { printf("Vozdra raja!\n"); return 0; }

Ovo je, bar za sada, ispravno C++ rjeenje. Meutim, ve pojavom sljedeeg C++ standarda, postoji velika mogunost da se ni ovo rjeenje nee smatrati ispravnim. Naime, standardna biblioteka funkcija prilagoena jeziku C, kojoj izmeu ostalog pripada i zaglavlje stdio.h, ne uklapa se dobro u neke moderne koncepte jezika C++. Stoga e veina kompajlera na gornji program dati upozorenje da je upotreba zaglavlja stdio.h izrazito nepreporuljiva (engl. deprecated) u jeziku C++, i da vjerovatno u budunosti nee biti podrana. Umjesto toga, po ISO 98 C++ standardu, napravljene su nove verzije zaglavlja standardne biblioteke za one elemente jezika C++ koji su naslijeeni iz jezika C, a koje su napravljene tako da se bolje uklapaju u koncepte jezika C. Stoga, ukoliko je pqr.h naziv nekog zaglavlja standardne biblioteke jezika C, u C++-u umjesto njega treba koristiti zaglavlje imena cpqr, dakle, bez sufiksa .h i sa prefiksom c (npr. cstdio umjesto stdio.h, cmath umjesto math.h, cctype umjesto ctype.h, itd.). Stoga, potpuno ispravna verzija gornjeg programa u C++-u glasi ovako:

1

Dr. eljko Juri: Tehnike programiranja /kroz programski jezik C++/ Radna skripta za kurs Tehnike programiranja na Elektrotehnikom fakultetu u Sarajevu

Predavanje 1.

#include int main() { std::printf("Vozdra raja!\n"); return 0; }

Ovdje vidimo jo jednu novinu: kvalifikator std:: ispred imena funkcije printf. Ovo je jedna od novina zbog koje su uope i uvedena nova zaglavlja tzv. imenici. Imenici su osobina jezika C++ koja je uvedena tek nedavno. Naime, pojavom velikog broja nestandardnih biblioteka razliitih proizvoaa bilo je nemogue sprijeiti konflikte u imenima koje mogu nastati kada dvije razliite biblioteke upotrijebe isto ime za dva razliita objekta ili dvije razliite funkcije. Na primjer, biblioteka za rad sa bazama podataka moe imati funkciju nazvanu update (za auriranje podataka u bazi), dok neki autor biblioteke za rad sa grafikom moe odabrati isto ime update za auriranje grafikog prikaza na ekranu. Zbog toga je odlueno da se imena (identifikatori) svih objekata i funkcija mogu po potrebi razvrstavati u imenike (kao to se datoteke mogu razvrstavati po folderima). Dva razliita objekta ili funkcije mogu imati isto ime, pod uvjetom da su definirani u razliitim imenicima. Identifikatoru ime koji se nalazi u imeniku imenik pristupa se pomou konstrukcije imenik::ime. Dalje, standard propisuje da se svi objekti i sve funkcije iz standardne biblioteke jezika C++ moraju nalaziti u imeniku std. Odatle potie kvalifikacija std::printf. Slinu kvalifikaciju bismo morali dodati ispred svih drugih objekata i funkcija iz standardne biblioteke (npr. std::sqrt za funkciju sqrt iz zaglavlja cmath, koja rauna kvadratni korijen). Stalno navoenje imena imenika moe biti naporno, stoga je mogue pomou kljune rijei using navesti da e se podrazumijevati da se neki identifikator uzima iz navedenog imenika, ukoliko se ime imenika izostavi. Sljedei primjer pokazuje takav pristup:#include using std::printf; int main() { printf("Vozdra raja!\n"); return 0; }

Ovim smo naveli da se podrazumijeva da identifikator printf uzimamo iz imenika std, ako se drugaije ne kae eksplicitnim navoenjem imenika ispred identifikatora. Moemo takoer rei da se neki imenik (u naem primjeru std) podrazumijeva ispred bilo kojeg identifikatora ispred kojeg nije eksplicitno naveden neki drugi imenik, na nain kao u sljedeem primjeru:#include using namespace std; int main() { printf("Vozdra raja!\n"); return 0; }

Ovakvo rjeenje emo preteno koristiti u svim primjerima tokom kursa radi jednostavnosti, mada se ovakvo rjeenje ne preporuuje, jer na taj nain u program uvozimo cijeli imenik (ovo je logiki ekvivalentno pozicioniranju u neki folder pri radu sa datotekama), ime naruavamo osnovni razlog zbog kojeg su imenici uope uvedeni. Ipak, razvrstavanje identifikatora po razliitim imenicima je tehnika koja se koristi uglavnom pri razvoju vrlo velikih projekata. Mada su prethodni primjeri dotjerani tako da budu u potpunosti po standardu jezika C++, oni jo uvijek nisu u duhu jezika C++, zbog koritenja biblioteke cstdio i njene funkcije printf, koje su isuvie niskog nivoa sa aspekta jezika C++, koji je konceptualno jezik vieg nivoa nego C (zapravo,

2

Dr. eljko Juri: Tehnike programiranja /kroz programski jezik C++/ Radna skripta za kurs Tehnike programiranja na Elektrotehnikom fakultetu u Sarajevu

Predavanje 1.

C++ je hibridni jezik, u kojem se moe programirati na niskom nivou, na visokom nivou, u proceduralnom, neobjektnom stilu, kao i u objektno-orijentiranom stilu, pa ak i u nekim apstraktnim stilovima kao to su generiki i funkcionalni stil programiranja, za razliku od jezika kao to je Java, koji forsira iskljuivo objektno-orijentirani stil, i kad treba, i kad ne treba). Slijedi primjer koji radi isto to i svi prethodni primjeri, samo pisan u duhu jezika C++:#include using namespace std; int main() { cout