Docsity
Docsity

Pripremite ispite
Pripremite ispite

Studirajte zahvaljujući brojnim resursima koji su dostupni na Docsity-u


Nabavite poene za preuzimanje
Nabavite poene za preuzimanje

Zaradite bodove pomažući drugim studentima ili ih kupite uz Premium plan


Školska orijentacija
Školska orijentacija


Koncepti jezika C++ koji nisu objektno orijentisani, Ispiti od Informatika

Objektno orjentisano programiranje Objektno orjentisano programiranje Objektno orjentisano programiranje

Tipologija: Ispiti

2016/2017

Učitan datuma 13.12.2017.

marko_projovi
marko_projovi 🇸🇷

4.8

(8)

13 dokumenti

1 / 39

Toggle sidebar

Ova stranica nije vidljiva u pregledu

Ne propustite važne delove!

bg1
OBJEKTNO ORIJENTISANO PROGRAMIRANJE
Oznaka predmeta: OOP
Predavanje broj: 3
Nastavna jedinica: Koncepti jezika C++ koji nisu objektno orijentisani .
Nastavne teme:
Pretprocesor. Direktive. Makrodefinicije i makrozamene. Uslovno
prevođenje Upotreba makrodefinicija Operatori # i ##. Leksička
analiza. Tokeni. Komentari. Ključne reči. Literali. Deklaracije i
definicije. Organizacija programa i povezivanje. Organizacija
programa po fajlovima. Fajlovi: *.h *.cpp. Standardna zaglavlja.
Struktura programskog fajla. Glavna funkcija (main) i završetak
programa.
Predavač: prof. dr Perica S. Štrbac, dipl. ing.
Literatura:
Dragan Milićev, “Objektno orijentisano programiranje na jeziku C++”,
Mikro knjiga, Beograd, 2005.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27

Delimični pregled teksta

Preuzmite Koncepti jezika C++ koji nisu objektno orijentisani i više Ispiti u PDF od Informatika samo na Docsity!

OBJEKTNO ORIJENTISANO PROGRAMIRANJE

Oznaka predmeta: OOP Predavanje broj: 3 Nastavna jedinica: Koncepti jezika C++ koji nisu objektno orijentisani. Nastavne teme: Pretprocesor. Direktive. Makrodefinicije i makrozamene. Uslovno prevođenje Upotreba makrodefinicija Operatori # i ##. Leksička analiza. Tokeni. Komentari. Ključne reči. Literali. Deklaracije i definicije. Organizacija programa i povezivanje. Organizacija programa po fajlovima. Fajlovi: *.h *.cpp. Standardna zaglavlja. Struktura programskog fajla. Glavna funkcija (main) i završetak programa. Predavač: prof. dr Perica S. Štrbac, dipl. ing. Literatura: Dragan Milićev, “Objektno orijentisano programiranje na jeziku C++”, Mikro knjiga, Beograd, 2005.

Pretprocesor

  • Pretprocesor ( preprocessor , makroprocesor) je program koji kao ulaz prihvata programski izvorni tekst, vrši određene transformacije tog teksta te kao izlaz daje ovaj transformisani tekst programa. - Transformacije nad izvornim tekstom zadaju se posebnim linijama u programu koje se nazivaju direktivama pretprocesoru. - Direktive utiču samo na pretprocesor. - Pretprocesor daje "prečišćen" tekst koji se prosleđuje prevodiocu.
  • Pretprocesor je skoro uvek integrisan sa prevodiocem.
  • Iako prevodioci jezika C++ vrlo često rade pretprocesiranje i prevođenje u istom prolazu kroz program, rezultat je potpuno isti kao da je pretprocesor radio potpuno nezavisno, prolaskom kroz program u celini pre prevođenja.
  • Glavne mogućnosti pretprocesora su:
    • makrozamene,
    • uključivanje teksta drugih fajlova u tekst programa
    • uslovno prevođenje

Makrodefinicije i makrozamene

  • Jedna od najvažnijih mogućnosti pretprocesora je izvršavanje tzv. makrozamene ( macroexpansion ). - Direktivom #define se pretprocesoru definiše jedan makro ( macro ). To je reč čije sve pojave u izvornom tekstu programa pretprocesor treba da zameni specificiranim nizom reči: #define Pi 3. - U ovoj direktivi (makrodefiniciji) reč Pi je makro. Ovom direktivom se nalaže da pretprocesor u tekstu programa iza direktive izvrši zamenu (tzv. makrozamena ili makroekspanzija) svih pojava reči Pi znacima 3.14. Pretprocesor razlikuje mala i velika slova.
  • Pošto se direktive mogu naći bilo gde u programu njihovo važenje počinje od mesta gde se nalaze do kraja fajla (osim ako se ne ukinu): a=b+Pi; #define Pi 3. c=a+Pi; pretprocesor će dati rezultat (izlazni tekst): a=b+Pi; c=a+3.14;

Sintaksa makrodefinicije

  • Makrodefinicija ima sledeću sintaksu: #define identifikator niz_reči
  • Identifikator je reč koja predstavlja makro, a niz reči iza ovog identifikatora predstavlja telo makrodefinicije - tekst kojim će svaka pojava makroa u tekstu programa iza direktive biti zamenjena. #define MAKRO ovo je tekst kojim ce rec MAKRO biti zamenjena
  • Sledeća direktiva: #define MAX 100 uzrokuje da tekst: int a[MAX]; pretprocesor pretvori u tekst: int a[100];
  • Pretprocesor "slepo" zamenjuje makro nizom reči. Tako na primer direktiva: #define IZRAZ a+b; uzrokuje da tekst: c=IZRAZ+c; pretvari u tekst: c=a+b;+c; što verovatno nije bio cilj (dvotačka u makrodefiniciji je višak).

Sintaksa makrodefinicije

  • U tekstu zamene se ponovo traže identifikatori definisanih makroa tako da se i oni zamenjuju, osim makroa koji je upravo zamenjen. #define MAKRO svaka pojava reci MAKRO #define BezVeze #define MAKRO kraj tekst BezVeze posle pretprocesiranja postaje: #define svaka pojava reci MAKRO kraj sada bi završetkom pretprocesiranja prevodilac dojavio grešku jer ne prepoznaje #define
  • Definicija makroa može da se ukine direktivom #undef. a=Pi+b; #define Pi 3. c=Pi+d; #undef Pi e=Pi+f; ovaj tekst posle pretprocesiranja postaje: a=Pi+b; c=3.14+d; e=Pi+f;

Direktiva #include

  • Direktiva: #include <ime_fajla> rezultujućem tekstu umesto sebe uključuje sadržaj fajla označenim kao ime_fajla. #include prethodna direktiva nalaže pretprocesoru da u fajl u kome se direktiva nalazi, na njeno mesto, uključi ceo tekst iz fajla sa imenom iostream.
  • Naznačeni fajl traži se na nizu mesta koja su specificirana implementacijom pretprocesora (najčešće neki direktorijum u kome su smešteni fajlovi samog prevodioca predviđeni za uključivanje (standardni direktorijum).
  • Drugi oblik direktive #include je : #include "ime_fajla" radi kao i prethodna direktiva, ali se fajl traži najpre na nekom posebno definisanom mestu (tekući direktorijum), a ako se tu ne nađe, pretraživanje se nastavlja na istom onom mestu koje se pretražuje za direktivu prvog oblika.
  • Direktive #include se mogu ugnežđavati. To znači da se u tekstu fajla koji se uključuje može naći nova direktiva #include.

Uslovno prevođenje

  • U izrazima uslovnog prevođenja može se naći i operator defined. Njegova upotreba je: defined identifikator ili defined (identifikator) Vrednost ovakvog izraza je 1 ako je identifikator prethodno definisan kao makro direktivom #define, a nije ukinut direktivom #undef; inače je vrednost nula. #define _DEBUG //obicno pocinju sa _NAZIV ... #if defined _DEBUG // moze i #ifdef _DEBUG stampaj(); // nešto štampa #endif
  • Direktiva: #ifndef identifikator ili #if !defined identifikator znači suprotno: uslov je ispunjen ako identifikator nije definisan ( not defined ).

Upotreba makrodefinicija

  • Pretprocesor jezika C++ vodi svoje poreklo iz jezika C gde su direktive za definisanje makroa korišćene su za uvođenje konstanti u program.
  • Tada je postavljanje nove vrednosti konstante rađeno promenom jedne makrodefinicije. Identifikator konstante je pisan velikim slovima da bi se razlikovale od promenljivih pri čitanju programa. #define MIN 2 #define MAX 99 ... if (i<MIN) ... if (i>MAX) ...
  • U jeziku C++ prethodnu upotrebu sasavim je potisnulo postojanje konstantnih objekata.
  • Makroi sa argumentima su pozivani pozivom nalik na funkcije, ali bez suvišnih režija za poziv "prave" funkcije. #define max(a,b) a>b?a:b ... x=max(y,z); Za ovu se u jeziku C++ koriste funkcije ugrađe u kôd ( inline functions ).

Operatori

  • Operator ## u tekstu zamene makroa između dve reči znači spajanje tih reči (konkatenaciju). - Najpre se te dve reči u tekstu eventualno zamenjuju stvarnim argumentima ako predstavljaju formalne argumente, pa se rezultat spaja u jednu reč. - Samo tako spojena reč se dalje analizira kao makro za eventualnu zamenu. Primer: #define promenljiva(i) Prom##i promenljiva(1)=promenljiva(2)+promenljiva(3); rezultat je tekst: Prom1=Prom2+Prom3;
  • Iz svega što je rečeno sledi da je pretprocesor jezika C++ orijentisan na tokene, a ne na znakove. - Pretprocesor najpre rastavlja tekst na tokene, pa tek onda tokene zamenjuje ako su definisani kao makroi.

Ostale direktive

  • Direktiva: #line konstanta "ime_fajla" u predefinisanom (ugrađenom) makrou koji se naziva LINE dodeljuje se navedena konstanta.
  • Prevodilac će smatrati da je redni broj sledeće linije programa jednak toj konstanti (pomoć programeru u porukama o greškama u programu).
  • Sličan smisao ima i ime_fajla. Ovaj naziv (može i da se izostavi) dodeljuje se predefinisanom makrou FILE.
  • Direktiva kojom prevodilac daje poruku o grešci sa navedenim tekstom #error tekst
  • Direktiva: #pragma tekst ima značenje koje je definisano implementacijom prevodioca. Za uključivanje fajla samo jednom u program koristili smo direktivu: #pragma once
  • Prazna direktiva: # nema nikakvog efekta.

Leksička analiza

  • Na početku analize programa, prevodilac rastavlja tekst programskog fajla na elementarne gramatičke jedinice - tokene ( token ).
  • Posle ovog rastavljanja, pretprocesor transformiše izvorni tekst programa: - vrši makrozamene, uključivanje fajlova, uslovno prevođenje.
  • Rezultat pretprocesiranja je tekst - niz tokena. Tokeni su elementi pomoću kojih prevodilac kasnije vrši sintaksnu analizu programa i generiše kôd.
  • Faza rastavljanja teksta programa na tokene naziva se leksičkom analizom.
  • Tokeni
  • Jezik C++ poseduje pet grupa tokena: ključne reči, separatore, identifikatore, operatore i literale. ( if x>5 y+=3.14; )
  • Blanko znaci, horizontalni i vertikalni tabulatori, znaci prelaska u novi red i na novu stranicu nazivaju se zajedničkim imenom belinama ( white space ). Beline su separatori tokena.
  • Prelazak u novi red i blanko znak rastavljaju tokene.

Tokeni

  • Na primer, deo programa: if (a<b) if (c<d) for (i=0; i< ; i++) niz[i]=niz[i+1]; je identičan (za prevodioca) sledećem delu: if (a<b) if (c<d) for (i=0; i<100; i++) niz[i]=niz[i+1];
  • Na prevodiocu je zadatak da tekst rastavi na tokene.
  • Prevodilac izdvaja redom jedan po jedan token iz teksta programa pri čemu uzima najduži niz znakova koji predstavljaju token. Kod: a=b+++c; znači isto što i: a=b++ +c; jer se iza znaka b, koji predstavlja token, uzima niz od dva znaka + koji mogu predstavljati token (operator ++).

Identifikatori

  • Identifikator je proizvoljno dug niz slova i cifara. Za prvi znak identifikatora uzmite slovo engleske abecede.
  • C++ razlikuje velika i mala slova pa bi trebalo paziti.
  • Setite se da se i znak donja crta () smatra slovom, pa se može naći i na početku identifikatora. - Identifikatori koji počinju jednim znakom donja crta najčešće se koriste u posebne svrhe, u bibliotekama koje se daju uz prevodioce. - Identifikatori koji počinju sa dva znaka donja crta (_)su rezervisani za upotrebu u implementacijama C++ prevodilaca, pa se izričito ne preporučuju za običnu upotrebu.
  • Postoje, u osnovi, dva stila pisanja identifikatora koji se sastoje od više reči iz govornog jezika: BankovniRacun bankovni_racun

Identifikatori

  • Ključne reči jezika C++ su rezervisane (ne mogu se upotrebljavati sa dugim značenjem osim onog propisanog u jeziku). Evo nekih:
  • Znaci koji se u C++ programu koriste kao operatori ili znaci interpunkcije: ! % ^ & * ( ) - + = { } | ~ [ ] \ ; ' : " < >? ,. /
  • Kombinacije znakova se tretiraju kao tokeni (to su operatori jezika C++):
    • ++ -- .* - >* << >> <= >= == != && || *= /= %= += - = <<= >>= &= ^= |= :: asm continue float new signed try auto default for operator sizeof typedef break delete friend private static union case do goto protected struct unsigned catch double if public switch virtual char else inline register template void class enum int return this volatile const extern long short throw while