Professional Documents
Culture Documents
02
Direktivat paraprocesorike
Njohuri t prgjithshme
Kompjutert jan paisje elektronike digjitale t cilat i kuptojn nj numr t caktuar komandash, si jan komandat pr marrje t t dhnave prmes njsive hyrse, ato pr kryerje t operacioneve t ndryshme aritmetikore dhe logjike mbi t dhnat (prmes njsis aritmetiko-logjike t procesorit), komandat pr ruajtje t t dhnave n memorien periferike dhe pr paraqitje t rezultateve n njsit dalse. Grumbulli i komandave t cilat i ipen kompjuterit me qllim t zgjidhjes s nj problemi duke u mbshtetur n nj algoritm t caktuar quhet program (ang. program), kurse vet procesi i shkruarjes s programit njihet si programim (ang. programming). Puna e kompjuterit mbshtetet n shfrytzimin e sinjaleve digjitale (ang. digital signals), prmes t cilve paraqiten dy shifrat binare (ang. binary digit) 0 dhe 1 , zakonisht si dy nivele t ndryshme tensionesh. Pr kt arsye, komandat t cilat i ipen kompjuterit, si dhe t dhnat q prpunohen brenda tij, paraqiten si vargje t shifrave binare . Kurse gjuha prmes s cils komunikohet me kompjuterin njihet si gjuh e makins (ang. machine language). Shkruarja e programeve n gjuhn e makins sht nj pun e rnd, sepse duhet t mbahen n mend vargje t shifrave binare pr komandat e veanta si dhe t konvertohen t dhnat e zakonshme n nj kod binar (ang. binary code). Me qllim t lehtsimit t programimit n gjuhn e makins mund t shfrytzohet gjuha asembler (ang. assembly language), te e cila komandat paraqesin shkurtesa ose kode mnemonike (ang. mnemonic code), kurse vlerat q shfrytzohen gjat llogaritjeve ipen direkt si numra heksadecimal, ose indirekt prmes emrave t variablave prkatse. Kshtu, p.sh. komandat pr mbledhje, zbritje dhe shumzim kompjuterit i jepen prmes shkurtesave ADD , SUB dhe MULT . Gjat ksaj, kto komanda dhe vlerat numerike prcjellse kompjuteri nuk i kupton direkt sepse nuk jan t shkruara n form binare. Pr kt qllim ato duhet t prkthehen n gjuh t makins duke e shfrytzuar programin i cili quhet Asembler (ang. assembler). Gjuha e makins dhe gjuha asembler, meq jan t afrta me logjikn e puns s kompjuterit, njihen si gjuh t ulta programuese (ang. low-level languages). Por, me qllim t lehtsimit t procesit t programimit, shfrytzohen gjuh t larta programuese (ang. high-level languages), t cilat jan t afrta me logjikn e puns s njeriut. T tilla jan, p.sh. gjuht FORTRAN , BASIC , COBOL , C , PASCAL , C++ , JAVA , C# etj., ose versionet e ndryshme t tyre. Nnkuptohet se programet e shkruara n gjuht e larta programuese nuk kuptohen direkt nga kompjuteri. Prandaj ato duhet t prkthehen n gjuhn e makins duke e shfrytzuar programin i cili njihet si kompilues (ang. compiler). Pr programin e prkthyer n gjuhn e makins thuhet se paraqet nj program objektiv (ang. object program), ose nj kod objektiv (ang. object code).
Direktivat paraprocesorike 3 Programi i shkruar n gjuhn programuese C++ paraqet program burimor dhe si i till ruhet n nj fajll burimor . Me Editor procesin e kompilimit, kontrollohet saktsia e komandave t shkruara dhe, Programi burimor nse nuk ka gabime, programi burimor prkthehet n program objektiv , gj q Compiler shihet edhe n paraqitjen skematike e cila sht dhn n Fig.1.1 . Programi objektiv Fig.1.1 Procesi i krijimit t programit ekzekutiv nga programi burimor
Fajlla t tjer objektiv Linker Programi ekzekutiv
N fund, pr ta fituar programin ekzekutiv , prmes linkuesit (ang. linker) fajllit objektiv i shtohen edhe fajlla t tjer objektiv, t marra nga biblioteka standarde ose edhe prej bibliotekave tjera me fajlla. Programi ekzekutiv i cili fitohet si rezultat gjat procesit n fjal, ruhet n nj fajll ekzekutiv . Programet burimore n gjuhn C++ plotsohen edhe me funksione t domosdoshme q merren nga bibliotekat e shumta t ksaj gjuhe. Pr kt qllim, n fillim t programeve vendosen t ashtuquajturit fajlla t ballins , si direktiva paraprocesorike (ang. preprocessor directive), t cilat fillojn me simbolin # . Inkorporimi i tyre n programet Editor burimore, para kompilimit, bhet prmes programit i cili quhet paraprocesor (ang. Programi burimor preprocessor). Paraqitja skematike e Fajlla t ballins dhe Preprocessor procesit t krijimit t programit direktiva paraprocesorike ekzekutiv, n kt rast duket ashtu si sht dhn n Fig.1.2 . Compiler
Programi objektiv
Fig.1.2 Fajlla t tjer objektiv Linker Versioni i plotsuar i procesit t krijimit t programit ekzekutiv Programi ekzekutiv Direktivat paraprocesorike, pr dallim nga komandat tjera q paraqiten n program fillojn me simbolin # . Para kompilimit, prmes paraprocesorit kto direktiva insertohen brenda programit n pozitn prkatse. N gjuhn programuese C++ , fajllat burimor zakonisht e kan prapashtesn .cpp , fajllat e ballins - prapashtesn .h , ose jan pa prapashtes, fajllat objektiv - prapashtesn .obj , kurse fajllat ekzekutiv dallohen me prapashtesn .exe .
4 Programimi i avancuar n C++ Pasi t prfundoj procesi i krijimit t programit ekzekutiv, prmes programit Loader (shih Fig.1.3 ) ai vendoset n memorien kryesore t kompjuterit. N fund, si rezultat i Editor puns s hardverit (ang. hardware) prkats, programi ekzekutohet dhe i Programi burimor jep rezultatet e krkuara.
Fajlla t ballins dhe komanda paraprocesorike Preprocessor Compiler Programi objektiv Fajlla t tjer objektiv Linker Programi ekzekutiv
Paraprocesori
Rreshtat e programit t cilt fillojn me simbolin # (ang. number sign, shqip thurje) prmbajn direktiva paraprocesorike (ang. preprocessor directive), t cilat thjesht njihen edhe si komanda paraprocesorike . Kto direktiva prpunohen para kompilimit, prmes programit q quhet paraprocesor (ang. preprocessor), i cili sht pjes e kompilerit . Si rezultat, programi burimor modifikohet para se ai t kompilohet n kod objektiv . Kto direktiva nuk jan komanda t gjuhs programuese C++ dhe prandaj n fund t tyre nuk shnohet pikpresja ( ; ). Paraprocesori sht n gjendje t'i njohi direktivat praparocesorike t cilat jan prfshir n tabeln e dhn n Fig.1.4 . #include #ifdef #endif #define #ifndef #line #undef #elif #pragma #if #else #error
Direktivat paraprocesorike 5 N pjesn vijuese, prmes shembujve t programeve elementare do t tregohet shfrytzimi i ktyre direktiva paraprocesorike.
Direktiva #include
Prmes direktivs paraprocesorike #include n programin burimor insertohet kopja e fajllit, i cili sht shkruar paraprakisht dhe ruhet n disk. Zakonisht insertohen fajlla standard t cilt gjenden n prbrje t pakos s gjuhs programuese C++, por insertohen edhe fajlla jostandard t shkruar prej programerit.
e cila prdoret pothuajse n do program. Prmes saj n programin burimor insertohet fajlli iostream i klass n t cilin mes tjerash prfshihen definicionet e komandave pr lexim t vlerave hyrse dhe shtypje t rezultateve. Fajllat e till quhen edhe fajlla t ballins (ang. header file), ose fajlla insertues (ang. include file). Forma e dhn e ksaj direktive shfrytzohet pr fajllat q prfshihen n bibliotekn standarde t fajllave t ballins (ang. standard library header files) dhe zakonisht vendosen n fillim t programit.
6 Programimi i avancuar n C++ Fajlli q insertohet paraprakisht duhet t jet shkruar prmes nj tekstprocesori. Gjat ruajtjes s tij n disk, prve emrit fajlli mund t ket edhe prapashtes, p.sh. t forms .txt . Shembull Programi prmes s cilit tregohet shfrytzimi i direktivs paraprocesorike #include , pr insertimin e fajllit struct.txt .
// Program include1 #include <iostream> using namespace std; #include "C:\Alfa\struct.txt" int main() { koha dita; dita.a=5; dita.b=dita.a+15; cout << "a=" << dita.a << " b=" << dita.b << endl; return 0; }
Ktu, fajlli struct.txt sht shkruar duke e shfrytzuar programin Microsoft Notepad dhe ruhet n shtegun C:\Alfa . Prmbajtja e ktij fajlli sht: struct koha { int a; double b; }; Si rezultat i insertimit, para kompilimit pjesa e programit burimor duket kshtu:
.....................
Direktivat paraprocesorike 7
koha dita; dita.a=5; dita.b=dita.a+15; cout << dita.a << " " << dita.b << endl; return 0; }
Pr ta par prmbajtjen e pjess fillestare t programit t dhn m sipr, pas insertimeve prmes direktivs paraprocesorike standarde #include <iostream>, duhet t shfrytzohet doracaku i kompilerit prkats. Emri i fajllit mund t shnohet edhe nn kllapa kndore, kshtu:
#include <C:\Test.txt>
N kt rast kompjuteri e krkon fajllin n grupin e fajllave standard dhe pasi nuk e gjen, vazhdon me krkimin e tij n direktoriumin punues aktual, ose n direktoriumin q gjendet n shtegun e shkruar para fajllit (nse ai sht shnuar). Shembull Programi prmes s cilit n programin include2a insertohet fajlli alfa.txt i cili n veti e prmban definimin e funkcionit jeta pr shtypje t nj teksti.
// Programi include2a #include <iostream> using namespace std; #include "C:\Alfa\dita.txt" int main() { jeta(1,10); return 0; }
8 Programimi i avancuar n C++ Si rezultat, programi burimor pas insertimit t fajllit n fjal duket kshtu:
....................... void jeta(int m,int n) { int i; for (i=m;i<=n;i++) cout << "Koha e bukur\n"; return; } int main() { jeta(1,10); return 0; }
Rez. N vijim sht dhn versioni i programit paraprak te i cili fajlli dita.txt insertohet n fund t tij.
// Programi include2b #include <iostream> using namespace std; void jeta(int m,int n); int main() { jeta(1,10); return 0; } #include "C:\Alfa\dita.txt"
Direktivat paraprocesorike 9
Direktivat paraprocesorike mund t vendosen kudo brenda programit. Gjithashtu, fajllat q insertohet nuk sht e thn q t prmbajn trsi funkcionale komplete t programeve. Shembull Versioni i programit paraprak te i cili direktiva paraprocesorike pr insertimin e fajllit delta.txt sht vendosur brenda programit.
// Programi include3 #include <iostream> using namespace std; int main() { int i; #include "C:\Alfa\delta.txt" return 0; }
Nse prmbajtja e fajllit delta.txt sht: for (i=1;i<=10;i++) cout << "Koha e bukur\n"; pas insertimit t tij, para kompilimit programi burimor duket kshtu:
................................. int main() { int i; for (i=1;i<=10;i++) cout << "Koha e bukur\n"; return 0; }
Rez. si edhe m par. Insertimi i nj funkcioni pr gjetje t vlers maksimale t dy vlerave t dhna.
Shembull
Programi n t cilin shfrytzohen direktiva paraprocesorike pr insertim t dy fajllave jostandard InpOut.txt dhe max.txt .
// Program include2x #include <iostream> using namespace std; int max(int,int); int main() { int x,y,z; #include "C:\Alfa\InpOut.txt" z=max(x,y); cout << "Vlera maksimale: " << z << endl; return 0; } #include "C:\Alfa\max.txt"
Fajlli max.txt
int max(int a,int b) { int y; if (a>b) y=a; else y=b; return y; } Ktu kemi t bjm me funkcionin max prmes s cilit definohet gjetja e vlers maksimale mes dy numrave t dhn a dhe b . Programi, para kompilimit, pas insertimit t fajllave duket kshtu:
Direktivat paraprocesorike 11
................................ int max(int,int); int main() { int x,y,z; cout << "Vlera x: "; cin >> x; cout << "Vlera y: "; cin >> y; z=max(7,4); cout << "Vlera maksimale: " << z << endl; return 0; } int max(int a,int b) { int y; if (a>b) y=a; else y=b; return y; }
Ktu duhet pasur kujdes gjat insertimit t pjesve t programit q variablat e pjesve q insertohen t mos vijn n kundrshtim me ato q egzistojn n pogram (p.sh. inserimi i deklarimit t variablave, ose shfr ytzimi i variablave t cilat njkohsisht paraqitne n pjesn q insertohen dhe n pjesn tjetr t programit).
Direktiva #define
Duke e shfrytzuar direktivn #define mund t definohen konstante simbolike , ose makro paraprocesorike (ang. preprocessor macro). Prmes tyre programi bhet m i lexueshm, m i thjesht dhe mund t modifikohet m leht. N form t prgjithshme kjo direktiv shkruhet kshtu: #define emri tekst Gjat prpunimit t ksaj direktive nga paraprocesori , programi burimor modifikohet para se ai t kompilohet n kod objektiv duke e zvendsuar
12 Programimi i avancuar n C++ emri -in me tekst -in, kudo q ai paraqitet n program. Ktu, emri prcaktohet si identifikator dhe e paraqet emrin e konstantes simbolike ose emrin e makros , kurse tekst -in paraprocesori e sheh vetm si tekst dhe jo si dika q sht shkruar n gjuhn C++. Gjithashtu, identifikatort e shfrytzuar jan t veant dhe paraqesin simbole paraprocesorike (ang. preprocessor symbol), sepse njihen vetm nga paraprocesori. Pavarsisht nga lloji, t gjitha njihen me nj emr makro .
Konstantet simbolike
N formn m t thjesht t saj, direktiva paraprocesorike #define shfrytzohet pr definimin e konstanteve simbolike. Shembull Programi pr llogaritje t siprfaqes dhe perimetrit t rrethit me rreze r , n t cilin prmes direktivs #define fillimisht definohet konstanta simbolike pi ku ruhet vlera e konstantes matematikore 3.1415926 .
// Programi define1 #include <iostream> using namespace std; #define pi 3.1415926 int main() { double r,s,p; cout << "Rrezja e rrethit: "; cin >> r; s=pi*r*r; cout << "\nSiprfaqja e rrethit s=" << s; p=2*pi*r; cout << "\nPerimetri i rrethit p=" << p << endl; return 0; }
Paraprocesori n programin e dhn e krkon konstanten simbolike pi dhe sa her q e gjen at e zvendson me konstanten numerike 3.1415926 . Si rezultat, kodi burimor para kompilimit duket kshtu:
........................................ int main() { double r,s,p; cout << "Rrezja e rrethit: ";
Direktivat paraprocesorike 13
cin >> r; s=3.1415926*r*r; cout << "\nSiprfaqja e rrethit s=" << s; p=2*3.1415926*r; cout << "\nPerimetri i rrethit p=" << p << endl; return 0; }
Prmes direktivs #define mund t definohen edhe konstante simbolike t cilat prmbajn tekste t fardoshme. Shembull Programi pr llogaritje t shums s numrave natyror tek, ku prfshihet definimi i konstantes simbolike alfa , n t ciln ruhet teksti i shkruar nn thonjza.
// Programi define #include <iostream> using namespace std; #define alfa "Shuma e llogaritur: " int main() { double s=0; int i,n; cout << "Vlera hyrse n: "; cin >> n; for (i=1;i<=n;i=i+2) s=s+i; cout << alfa << s << endl; return 0; }
Ktu, paraprocesori e zvendson konstanten simbolike alfa me tekstin prkats dhe si rezultat para kompilimit, komanda e fundit pr shtypje duket kshtu:
cout << "Shuma e llogaritur: " << s << endl;
Makrot paraprocesorike
Prve pr definimin e konstanteve simbolike t cilat u shpjeguan m sipr, direktiva #define mund t shfrytzohen edhe pr definimin e makrove paraprocesorike .
Makrot e zakonshm
Nse direktiva #define shfrytzohet pr definimin e komandave t gjuhs programuese C++, shprehjeve aritmetikore, pjesve t ndryshme t programeve, ose edhe programeve komplete, mund t themi se kemi t bjm me makro paraprocesorike t zakonshme .
Definimi i komandave
Prmes direktivs n fjal, n program si makro mund t definohen pjes t komandave, ose edhe komanda komplete t gjuhs programuese C++. Shembull Programi pr llogaritje t shums s numrave natyror tek, ku definohet makroja shtyp me komandn pr shtypje cout.
// Programi define^ #include <iostream> #define shtyp cout using namespace std; int main() { double x,y,z; shtyp << "Vlera x="; cin >> x; shtyp << "\nVlera y="; cin >> y; z=-5; if (x<y) z=x+y; shtyp << "\nRezultati sht z=" << z << "\n"; return 0; }
Ktu, paraprocesori e zvendson emrin simbolik shtyp me komandn cout kudo q ky emr paraqitet n program. Si rezultat, pas paraprocesimit, kodi burimor duket kshtu:
...........................
Direktivat paraprocesorike 15
int main() { double x,y,z; cout << "Vlera x="; cin >> x; cout << "\nVlera y="; cin >> y; z=-5; if (x<y) z=x+y; cout << "\nRezultati sht z=" << z << "\n"; return 0; }
N makro mund t prfshihet edhe definimi i komandave me pjest prcjellse t tyre. Shembull Programi pr llogaritje t shums s numrave natyror tek , ku shfrytzohet makroja lexo pr definimin e tekstit cin >>.
// Programi define^ #include <iostream> #define lexo cin >> using namespace std; int main() { double x,y,z; cout << "Vlera x="; lexo x; cout << "\nVlera y="; lexo y; z=-5; if (x<y) z=x+y; cout << "\nRezultati sht z=" << z << "\n"; return 0; }
N kt rast, pas zvendsimit t emrit simbolik lexo nga paraprocesori, komandat prkatse n programin burimor duken kshtu:
........................... int main()
Shembull
// Shfrytezimi i #define # include <iostream> using namespace std; enum viti { pranvera, vera, vjeshta, dimri }; #define tekst "\ nStina e zgjedhur sht " #define shtyp cout << int main() { viti stina; stina=vera; shtyp tekst; switch (stina) { case pranvera: shtyp "pranvera"; break; case vera: shtyp "vera"; break; case vjeshta: shtyp "vjeshta"; break; case dimri: shtyp "dimri"; } cout << "\n\n"; return 0; }
Direktivat paraprocesorike 17 Shembull Programi n t cilin shfrytzohet makroja delta pr definimin e shprehjes matematikore z=2*x+y, si dhe makrot shtyp e lexo n format e dhna m shembujt paraprak.
// Programi #include <iostream> using namespace std; #define delta z=2*x+y #define shtyp cout << #define lexo cin >> int main() { double x,y,z; shtyp "Vlera x="; lexo x; shtyp "\nVlera y="; lexo y; delta; shtyp "\nRezultati sht z="; shtyp z << "\n"; return 0; }
Pas zvendsimit t emrave simbolik delta , shtyp dhe lexo nga paraprocesori, programi burimor duken kshtu:
..................................... int main() { double x,y,z; cout << "Vlera x="; cin >> x; cout << "\nVlera y="; cin >> y; z=2*x+y; cout << "\nRezultati sht z="; cout << z << "\n"; return 0; }
Ktu, edhe pikpresja e shnuar n fund t shprehjes matematikore mund t prfshihet n makro, kshtu:
#define delta z=2*x+y;
18 Programimi i avancuar n C++ Pas ksaj, gjat shfrytzimit t makros n program, pikpresja nuk shnohet pas emrit delta .
Definimi i makros n disa rreshta
Nse n makro definimi krkon m shum rreshta, pr vazhdimin n rreshtin vijues shfrytzohet vija e pjerrt ( \ ), pas s cils kalohet n rresht t ri duke e shtypur pulln Enter , pa ln asnj zbrazsir. Shembull Programi n t cilin shfrytzohet makroja llogaritja pr definimin e nj vargu komandash q shkruhen n disa rreshta.
// Programi #include <iostream> using namespace std; #define llogaritja \ if (x<y) \ z=x+y; \ else \ z=2*y; int main() { double x,y,z; cout << "Vlera x="; cin >> x; cout << "\nVlera y="; cin >> y; llogaritja cout << "\nRezultati sht z="; cout << z << "\n"; return 0; }
Pasi paraprocesori ta zvendsoj emrin simbolik llogaritja me shprehjen e prfshir n makron prkatse, programi burimor para kompilimit duken kshtu:
..................................... int main() { double x,y,z; cout << "Vlera x="; cin >> x; cout << "\nVlera y="; cin >> y;
Direktivat paraprocesorike 19
if (x<y) z=x+y; else z=2*y; cout << "\nRezultati sht z="; cout << z << "\n"; return 0; }
Definimi i makrove nuk sht e thn t bhet n fillim t programit. Ato mund t definohen kudo brenda tij, por patjetr para se t shfrytzohen. Shembull Programi n t cilin makroja llogaritja nga detyra paraprake sht vendosur brenda programit.
// Programi #include <iostream> using namespace std; int main() { double x,y,z; #define llogaritja \ if (x<y) \ z=x+y; \ else \ z=2*y; cout << "Vlera x="; cin >> x; cout << "\nVlera y="; cin >> y; llogaritja cout << "\nRezultati sht z="; cout << z << "\n"; return 0; }
Edhe n kt rast efekti i veprimit t paraprocesorit sht i njjt si edhe n detyrn paraprake dhe pamja e programit burimor para kompilimit sht e njjt.
Prmes nj makroje mund t definohet edhe komplet programi. Shembull Shfrytzimi i makros programi prmes s cilit definohet komplet programi pr gjetjen e vlers m t madhe t dy numrave q ruhen te variablat x dhe y .
// Programi defineXXXX #include <iostream> using namespace std; #define programi int main() { double x,y,z; cout << "Vlera x="; cin >> x; cout << "\nVlera y="; cin >> y; z=(x>y) ? x : y; cout << "\nVlear maksimale: " << z << "\n"; return 0; } programi
\ \ \ \ \ \ \ \ \ \ \ \ \
Direktivat paraprocesorike 21
Makro t paremtrizuara
Prmes direktivs #define mund t definohen edhe makro me argumente, ose si quhen ndryshe makro t parametrizuar . Meq makrot e tilla u prngjajn funkcioneve, ato njihen edhe si makro funkcione (ang. function macros). Shembull Programi n t cilin definohet makroja max prmes s cilit gjendet vlera m e madhe mes dy parametrave a dhe b t cilt jan shnuar brenda kllapave.
// Programi #include <iostream> using namespace std; #define max(a,b) ((a)>(b)) ? (a) : (b) int main() { double x,y,z; cout << "Vlera x="; cin >> x; cout << "\nVlera y="; cin >> y; z=max(x,y); cout << "Vlera maksimale: " << z << endl; return 0; }
Ktu, paraprocesori n kodin burimor e krkon sekuencn e simboleve max(x,y) dhe kur e gjen, at e zvendson me shprehjen:
(x>y) ? (x) : (y)
Kjo sht e ngjashme me funkcionin e tipit inline , i cili n program mund t duket ashtu si sht dhn n vijim.
// Programi define1 #include <iostream> using namespace std; inline int max(int a,int b) { return ((a)>(b)) ? (a) : (b); } int main() { double x,y,z; cout << "Vlera x="; cin >> x; cout << "\nVlera y="; cin >> y; z=max(x,y); cout << "Vlera maksimale: " << z << endl; return 0; }
Te makrot duhet pasur kujdes q variablat q prfshihen n shprehjen e saj t shkruhen brenda kllapave, sepse rez. mund t jet i pasakt. Shembull
// Programi #include <iostream> using namespace std; #define alfa(a) a/2 int main() { int x,y; cout << "Vlera x="; cin >> x; y=alfa(x+4); cout << "Vlera e llogaritur: "
Direktivat paraprocesorike 23 Ktu, nse pas ekzekutimit t programit si vler hyrse pr variabln x e japim numrin 2, kompjuteri si rez. e jep numrin e gabuar 4 sepse llogarit me shprehjen: y= x+4 /2=2+2=4 Nse makroja shkruhet sakt (me kllapa):
#define alfa(a) (a)/2
gjat llogaritjes, pr vlern hyrse x=2 n kt rast e kemi vlern e sakt: y=( x+4 )/2=( 2+4 )/2=3 Nj makro t parametrizuar brenda programit mund t shfrytzohet edhe disa her. Shembull
// Programi #include <iostream> using namespace std; #define prod(a,b) ((a)*(b)) int main() { int x,y,z; cout << "Vlera x="; cin >> x; cout << "\nVlera y="; cin >> y; z=3*prod(x,x+2*y)+2*prod(x+1,3*x); cout << "Vlera e llogaritur: " << z << endl; return 0; }
Makro t ndrthurura
Gjat definimit t makrove mund t shfrytzohen variabla t makrove q jan definuar paraprakisht, pr t fituar makro t ndrthurura . Shembull
// Programi define===== #include <iostream> using namespace std; #define k x>=y #define baraz = int main() { #define alfa if (k) z baraz 2 * x + y; else z baraz x + 3 * y; double x,y,z; cout << "Vlera x="; cin >> x;
\ \ \ \
Direktivat paraprocesorike 25
cout << "\nVlera y="; cin >> y; alfa cout << "\nRezultati z=" << z << endl; return 0; }
Ktu duhet pasur kujdes q gjat shfrytzimit t identifikatorit baraz , para dhe pas tij t lihet s paku nj zbrazsir. Shembull Makroja programi q sht dhn m par gjat definimit t s cilit thirren makrot shtyp dhe lexo .
// Programi defineyyy #include <iostream> #define shtyp cout << #define lexo cin >> using namespace std; #define programi int main() { double x,y,z; shtyp "Vlera x="; lexo x; shtyp "\nVlera y="; lexo y; z=(x>y) ? x : y; shtyp "\nVlear maksimale: " << z << "\n"; return 0; } programi
\ \ \ \ \ \ \ \ \ \ \ \ \
Njlloj mund t ndrthuren makrot e zakonshme edhe me makro parametrike. Shembull Makroja programi q sht dhn m par gjat definimit t s cilit thirren makrot shtyp dhe lexo .
// Programi define=====
Direktiva #undef
Duke e shfrytzuar direktivn #undef mund t eliminohet efekti i definimit me direktivn #define . Nj makro vlen derisa nuk eliminohet prmes direktivs #undef .
// Programi undef #include <iostream> using namespace std; #define n 3 int main() { int i,j; cout << "\ni="; for (i=1;i<=n;i++) cout << i << " "; #undef n #define n 5 cout << "\nj="; for (j=1;j<=n;j++) cout << j << " "; cout << endl; return 0; }
e shkruajm komandn:
cout << n;
gjat kompilimit do t paraqitet mesazhi undeclaret identifier , me t cilin na njofton se variabla n sht e padeklaruar. Shembull
// Programi undef #include <iostream> using namespace std; #define tekst "Koha e bukur" int main() { cout << "Teksti i par: " << tekst; #undef tekst #define tekst "Koha me bor" cout << "\nTeksti i dyt: " << tekst << endl; return 0; }
28 Programimi i avancuar n C++ Direktivat pr kompilim t kushtzuar t pjesve t programit Kto direktiva, p.sh. mund t prdoret kur ekzistohen disa versione t nj programi, gj q shfrytzohet nga shtpit softverike. N kt grup komandash bjn pjes komandat: #if #else #elif #endif Prmes ktyre komandave, kompilohen vetm pjes t caktuara t programit, t cilat e plotsojn kushtin e dhn. Shembull
// Programi if #include <iostream> using namespace std; #define n 5 int main() { int m=4; #if n>3 m=n+2; #endif cout <<"\nVlera: " << m << "\n"; return 0; }
Shembull
// Programi if
Direktivat paraprocesorike 29
#include <iostream> using namespace std; #define n 5 int main() { int m=4; #if n>7 m=n+2; #endif cout <<"\nVlera: " << m << "\n"; return 0; }
Shembull
// Programi if #include <iostream> using namespace std; #define n 5 int main() { cout << "Fillimi\n"; #if n==5 #include "C:\alfa\KlasaKoha.txt" koha dita; cout << "\nVlera per a: "; cin >> dita.a; cout << "\nVlera per b: "; cin >> dita.b; #endif cout << "\nFundi" << "\n"; return 0; }
Ku fajlli KlasaKoha.txt gjendet n C:\alfa i shkruar n Notepad dhe prmbajtja e tij sht: class koha { public: int a;
Direktivat paraprocesorike 31 double b; }; Pas paraprocesimit, prkatsisht para kompilimit, meq plotsohet kushti te komanda #if , programi duket kshtu:
.................. int main() { cout << "Fillimi\n";
Pas paraprocesimit, prkatsisht para kompilimit, meq nuk plotsohet kushti te komanda #if , programi duket kshtu:
.................. int main() { cout << "Fillimi\n"; cout << "\nFundi" << "\n"; return 0; }
Nse ka m shum degzime pas komands #if , n vend t #else prdoret #elif .
Direktiva #elif
Pas paraprocesimit, prkatsisht para kompilimit, meq nuk plotsohet kushti te komanda e par #if por te komanda #elif , programi duket kshtu:
.................. int main() { int k; k=3+3*5+1; cout << "Rezultati: " << k << endl; return 0; }
=============================================== Prdorimi i komandave paraprocesorike sht me rndsi nse shfrytzohen para programit, ku n fakt nuk kemi mundsi t'i shfrytzojm komandat e gjuhs C++.
Shembull // Programi #if65 #include <iostream> using namespace std; #define dimensioni 25 #if dimensioni==20 #undef dimensioni #define dimensioni 40 #elif dimensioni>15
Direktivat paraprocesorike 33
#undef dimensioni #define dimensioni 10 #else #undef dimensioni #define dimensioni 30 #endif int main() { int A[dimensioni],i,s; for (i=0;i<dimensioni;i++) if (i%2==0) A[i]=2*i+1; else A[i]=7; s=0; for (i=0;i<dimensioni;i++) if (A[i]==7) s=s+A[i]; cout << "\nShuma s: " << s << "\n\n"; return 0; }
Meq plotsohet kushti #ifdef , pas paraprocesimit, prkatsisht para kompilimit, programi duket kshtu:
.................. int main()
Meq plotsohet kushti #ifdef , pas paraprocesimit, prkatsisht para kompilimit, programi duket kshtu:
.................. int main() { int a=4,z; z=5 * a+1; cout << "Vlera e llogaritur z=" << z << endl; return 0; }
Direktivat paraprocesorike 35
pjesa:
#define m 10
kompilohet vetm nse nuk sht definuar m .
Direktiva #line
Prmes ksaj direktive programuesi i prcakton numrat rendor t rreshtave n program me qllim t zbulimit t rreshtit n t cilin ka ndodhur gabim. Shembull
// Programi line #include <iostream> using namespace std; int main() { double x,y; cout << "Vlera pr x: "; #line 50 cin >> x; if (x<0) y=2*x+1; else y=x+3; cout << "Vlera e llogaritur y=" << y << endl; return 0; }
i sht shoqruar numri rendor 50 . Pas ksaj, nse n rreshtat vijues ndodh ndonj gabim, n mesazhin e gabimit gjat kompilimit t tij paraqitet numri duke e marr si fillestar numrin e zgjedhur 50. P.sh. nse shprehja:
y=x+3;
N mesazhin e gabimit do t shnohet se gabimi ka ndodhur n rreshtin e 54, duke i pasur parasysh numrimet vijuese:
50 51 52 53 54 cin >> x; if (x<0) y=2*x+1; else y=x+3;
Kto numra rendor shfrytzohen edhe pr vrejtjet q lidhen me rreshtat e veant t programit. Brenda programit mund t vendosen edhe disa direktiva #line dhe te secila prej tyre t vendoset nj numr rendor. Kjo mund t shfrytzohet p.sh. kur programi sht m i gjat dhe numrat rendor fillohen pr tansi t veanta t tij.
Direktiva #error
Kjo direktiv shfrytzohet pr gjenerimin e mesazhit i cili shkruhet n vazhdim t saj. N kt mnyr mundsohet ndjekja e procesit t kompilimit deri n pozitn ku sht vendosur direktiva, gj q ka rndsi kur kemi t bjm me programe m t gjata. Shembull
// Programi error #include <iostream> using namespace std; int main() {
Direktivat paraprocesorike 37
double x,y; cout << "Vlera pr x: "; #error Pozita ku kontrollohet cin >> x; if (x<0) y=2*x+1; else y=a+3; cout << "Vlera e llogaritur y=" << y << endl; return 0; }
Kur kompileri e takon direktivn n fjal, e gjeneron mesazhin Pozita ku kontrollohet n ekran dhe e ndrpret kompilimin e mtejshm. Nse shfrytzohet direktiva #line , ajo ka ndikim n numrin rendor t cilin e jep si informat t gabimit t gjeneruar edhe nga direktiva #error .
Direktiva #pragma
Kjo direktiv mundson dhnjen e instrukcioneve t ndryshme pr kompilerin. N form t prgjithshme kjo direktiv shkruhet kshtu: #pragma emri Prmes emrit t shkruar n vazhdim t direktivs prcaktohet se cilat veori (ang. features) specifike t makins ose kompilerit aktivizohen. Meq kjo direktiv lidhet me kompilerin, para shfrytzimit t saj duhet t lexo het manueli i kompilerit prkats. ---------------------------- Vazhdimi 8.12.2009 ------------------------------------------
Operatort paraprocesorik
N gjuhn C++ prdoren 3 operator paraprocesorik: defined , # dhe ## .
Operatori defined
38 Programimi i avancuar n C++ Ky operator shfrytzohet pr t testuar se a sht definuar ose jo nj identifikator. Shembull
// Programi defined1 #include <iostream> using namespace std; #define pi 3.1515926 int main() { double s,p,r=7; #if defined(pi) { s=pi*r*r; cout << "Siprfaqja e rrethit: " << s << "\n"; p=2*pi*r; cout << "Perimetri i rrethit: " << p << "\n"; } #endif cout << "Fundi" << "\n\n"; return 0; }
Rez.
Nse nuk sht definuar identifikatori pi , do t shtypet vetm fjala Fundi , kjo sepse nuk hyet n llogaritje. Degzimit mund t'i shoqrohet edhe dega #else . Shembull
// Programi definedxx2 #include <iostream> using namespace std; #define pi 3.1515926 int main() { #if defined(pi) { double s,p,r=7; s=pi*r*r;
Direktivat paraprocesorike 39
cout << "Siprfaqja e rrethit: " << s << "\n"; p=2*pi*r; cout << "Perimetri i rrethit: " << p << "\n"; } #else { cout << "Nuk sht definuar pi\n"; // Ktu mund t prfshihen shum komanda } #endif cout << "Fundi" << "\n\n"; return 0; }
t shnohet brenda kllapave dhe jo para komands #if , sepse nse nuk plotsohet kushti i dhn, kompjuteri do ta kompiloj vetm pjesn pas #else , duke na njoftuar njkohsisht se variablave s dhe p nuk u referohemi askund. Efektet e operatorit defined mund t mbrrihen edhe prmes komandave paraprocesorike #ifdef , ose #ifndef . Shembull
// Programi defined1 #include <iostream> using namespace std; #define pi 3.1515926 int main() { double s,p,r=7; #ifdef pi { s=pi*r*r; cout << "Siprfaqja e rrethit: " << s << "\n"; p=2*pi*r; cout << "Perimetri i rrethit: " << p << "\n";
Operatori #
Shembull
// Programi # #include <iostream> using namespace std; #define alfa(x) #x int main() { cout << alfa(Jeta) << "\n"; return 0; }
Ktu, gjat ekzekutimit t komands cout , prmes thirrjes s funkcionit shtypja(bukur) , n ekran do t shtypet teksti Koha e bukur . Kjo sht rezultat i zvendsimit t argumentit x me fjaln bukur me thonjza, prkatsisht komanda cout q ekzekutohet sht kshtu: cout << "Koha e ""bukur";
Ktu kemi: cout << "Koha e " "bukur" << "\n"; ose cout << "Koha e bukur" << "\n";
Operatori ##
Ky operator prdoret pr bashkimin e dy pjesve.
// Programi ## #include <iostream> using namespace std; #define bashkimi(x,y) x ## y int main() { cout << bashkimi("Koha e ","bukur") << "\n"; return 0; }
Makro t paradefinuara
N gjuhn C++ mund t shfrytzohen 5 makro t paradefinuara.
Makroja __LINE__
Prmes saj jepet nj numr i plot i cili e paraqet numrin rendor t rreshtit aktual n program. Shembull
// Programi __LINE__ #include <iostream> using namespace std; int main() { const int m=8; int i,s; int A[m]={5,-2,7,4,1,8,10,6}; s=0; for (i=0;i<m;i++) if (A[i]>3) if (A[i]<9) s=s+A[i]; cout << "Rreshti numr: " << __LINE__; cout << "\nShuma s=" << s << "\n"; return 0; }
Makroja __FILE__
Prmes saj merret nj string i cili e paraqet emrin e fajllit q kompilohet. Shembull
// Programi __FILE__ #include <iostream> using namespace std; int main() { cout << "\nFajlli q kompilohet: " << __FILE__; const int m=8; int i,s; int A[m]={5,-2,7,4,1,8,10,6}; s=0; for (i=0;i<m;i++)
Direktivat paraprocesorike 43
if (A[i]>3) if (A[i]<9) s=s+A[i]; cout << "\nShuma s=" << s << "\n"; return 0; }
Makroja __cplusplus
Prmes saj merret nj numr i cili e identifikon kompilerin e gjuhs C++. Nse kompileri sht i pajtueshm me standardet e gjuhs C++, ai numr do t jet m i madh ose barazi me numrin 199711 , gj q varet nga versioni i kompilerit.