You are on page 1of 15

Prof. Dr. Agni Dika Material punues. Nuk sht pr shumzim!

0 3
Hapsira e emrave

Hyrje
N librari t ndryshme mund t prdoren edhe identifikator global. Por, ndodh q identifikator t njjt t shfrytzohet n disa librari. Nse librarit e tilla prdoren njkohsisht n nj program, kompjuteri nuk do t jet n gjendje t'i dalloj identifikatort. Kshtu, p.sh. ne mund t gabojm gjat definimit t nj klase, duke e quajtur ate me emrin e nj klase q sht definuar m par brenda nj librarije t ciln jemi duke e shfrytzuar. Me qllim t kufizimit t dukshmris s elementeve t programeve (konstanteve me emra, variablave ose funkcioneve), ato deklarohen brenda strukturave, klasave ose fajllave. Por, nj gj e till sht m rnd t realizohet, p.sh. pr emrat e strukturave, klasave ose objekteve. Pr kt qllim mund t prdoren hapsira emrash (angl. namespace), prmes s cilave dukshmria e emrave kufizohet vetm n hapsirn ku ato definohen. N programet standarde zakonisht shfrytzohen hapsira standarde e emrave (std). Pr kt qllim, n fillim t programit vendoset direktiva: using namespace std; Brenda ksaj hapsire standarde p.sh. prfshihen emrat cin, cout etj. Por, nse n fillim t programit nuk shnohet direktiva n fjal, sht i pamundur prdorimi i ktyre komandave, prkatsisht kompjuteri do t gjeneroj mesazhe pr gabim. Shembull
// Programi prg1 #include <iostream> int main() { int a; cout << "\nVlera a: "; cin >> a; cout << "\nVlera e lexuar a=" << a << "\n\n"; return 0; }

Nse ekzekutohet programi n formn e dhn, pr komandat cin dhe cout kompjuteri do t na njoftoj se ato jan undeclared identifier. Nnkuptohet se gabimet n fjal do t eliminohen nse shfrytzohet direktiva: using namespace std;

ose nse para komandave n fjal shkruhet emri i hapsirs std, n t ciln ato jan definuar si dhe operatori katr pika (::), kshtu:
// Programi prg2 #include <iostream> int main() { int a; std::cout << "\nVlera a: "; std::cin >> a; std::cout << "\nVlera e lexuar a=" << a << "\n\n"; return 0; }

Definimi i hapsirave me emra


Hapsira me emra, prve nga shtpit e ndryshme softverike, mund t definohen edhe nga t gjith ata q shkruajn programe. Pr definim t nj hapsire me emra shfrytzohet fjala namespace, e cila pastaj pasohet me emrin e hapsirs q definohet. Shembull Definimi i hapsirs me emra jeta.
namespace jeta { int i,m=5; void dita() { for (i=1;i<=m;i++) cout << "\nDita e bukur"; } }

Prmes ksaj pjese t programit definohet hapsira e emrave jeta, n t ciln prfshihen identifikatort e variablave i e m dhe funkcionit dita(), t cilt njihen edhe si antar t hapsirs s emrave. Shembull Programi n t cilin tregohet qasja te variabla m dhe funkcioni dita(), t cilt jan prfshir n hapsirn e emrave jeta.
// Programi prg3 #include <iostream> using namespace std; namespace jeta { int i,m=5; void dita() { for (i=1;i<=m;i++) cout << "\nDita e bukur"; }

} int main() { cout << "\nVlera e variables m=" << jeta::m << "\n"; jeta::dita(); cout << "\n\n"; return 0; }

Si shihet pr qasje ktu sht shfrytzuar operatori katr pika. Nse paraprakisht hapsira e emrave jeta vendoset n disk, si fajll tekstual me emrin omega.txt, programi do t duket kshtu:
// Programi prg4 #include <iostream> using namespace std; #include "C:\Alfa\omega.txt" int main() { cout << "\nVlera e variables m=" << jeta::m << "\n"; jeta::dita(); cout << "\n\n"; return 0; }

N program nuk do t duhej t shfrytzohej operatori katr pika gjat qasjes te variabla m dhe funkcioni dita, nse paraprakisht shfrytzohet direktiva: using namespace jeta; ashtu si shihet n vijim.
// Programi prg5 #include <iostream> using namespace std; #include "C:\Alfa\omega.txt" using namespace jeta; int main() { cout << "\nVlera e variables m=" << m << "\n"; dita(); cout << "\n\n"; return 0; }

Direktiva:

using namespace jeta;

mund t vendoset kudo n program, por patjetr pas definimit t hapsirs me emra jeta dhe para shfrytzimit t identifikatorve q paraqiten brenda saj. Qasja mund t relaizohet edhe duke e shfrytzuar direktivn using pr secilin identifikator, ashtu si shihet n programin vijues.
// Programi prg6 #include <iostream> using namespace std; #include "C:\Alfa\omega.txt" int main() { using jeta::m; using jeta::dita; cout << "\nVlera e variables m=" << m << "\n"; dita(); cout << "\n\n"; return 0; }

Vlerat e variablave q prfshihen brenda hapsirs me emra mundet edhe t lexohen. Gjat shkruarjes s komands prkatse pr lexim veprohet plotsisht njlloj si edhe gjat shtypjes s vlerave t tyre. Shembull Verzioni i programit i cili u dha m sipr, n t cilin vlera e variabls m lexohet.
// Programi prg7 #include <iostream> using namespace std; namespace jeta { int i,m; void dita() { for (i=1;i<=m;i++) cout << "\nDita e bukur"; } } int main() { cout << "\nVlera e variables m: "; cin >> jeta::m; jeta::dita(); cout << "\n\n"; return 0; }

Brenda hapsirs me emra mund t prfshihen edhe konstante.

Shembull
// Programi prg8 #include <iostream> using namespace std; namespace jeta { double const pi=3.1415926; double perimetri(double r) { double p; p=2*pi*r; return p; } } int main() { cout << "\nVlera e variabls pi=" << jeta::pi << "\n"; cout << "\nVlera e llogaritur p=" << jeta::perimetri(5.5) << "\n\n"; return 0; }

Definimi i njkohshm i disa hapsirave me emra


N nj program, prve hapsirs standarde t emrave, mund t shfrytzohen njkohsisht edhe disa hapsira emrash, t definuara brenda programit ose t inseruara prmes direktivs paraprocesorike #include. Shembull Definimi i hapsirave me emrave alfa dhe beta n t cilat njkohsisht paraqiten variabla a dhe b.
// Programi prg9 #include <iostream> using namespace std; namespace alfa { int a = 10; double b = 55.55; } namespace beta { double a = 77.77; int b = 20; } using namespace alfa; using namespace beta; int main () { cout << "\nVlera e variabls a: "

<< a << endl; cout << "\nVlera e variabls b: " << b << endl; return 0; }

N kt rast pr variablat a dhe b kompjuteri do ta lajmroj gabimin ambiguous symbol. Q t mos vij deri te nj gabim i till, kompjuterin duhet ta njohtojm sakt se nga cila hapsir me emra merren variablat, p.sh. si n programin vijues.
// Programi prg10 #include <iostream> using namespace std; namespace alfa { int a = 10; double b = 55.55; } namespace beta { double a = 77.77; int b = 20; } int main () { cout << "\nVlera e variabls a: " << alfa::a << endl; cout << "\nVlera e variabls b: " << beta::b << endl; return 0; }

N kt rast do t shtypet vlera e variabls a q prfshihet n hapsirn alfa, kurse pr variabln b do t shtypet vlera e prcaktuar n hapsirn beta. Si zgjidhje m praktike ktu mund t merret ajo e shfrytzimit t direktivs using vetm pr njrn hapsir, p.sh. ashtu si sht dhn n vijim.
// Programi prg11 #include <iostream> using namespace std; namespace alfa { int a = 10; double b = 55.55; } namespace beta { double a = 77.77; int b = 20; } using namespace alfa; int main () {

cout << "\nVlera e variabls a: " << a << endl; cout << "\nVlera e variabls b: " << beta::b << endl; return 0; }

Problemi i konfliktit mund t paraqitet edhe nse identifikatori i njjt paraqitet n nj hapsir dhe n programin kryesor. Shembull
// Programi prg12 #include <iostream> using namespace std; void dita(); namespace jeta { int i; void dita() { for (i=1;i<=7;i++) cout << "\nDita e bukur"; } } int main() { jeta::dita(); dita(); cout << "\n\n"; return 0; }

// Prej namespace jeta

void dita() { int i; for (i=1;i<=5;i++) cout << "\nKoha me bor"; }

Ktu funkcioni me emrin dita() njkohsisht definohet n programin kryesor dhe n hapsirn e emrave jeta.

Pjesa e pasistemuar
1.
// Programi prg13 #include <iostream> using namespace std; namespace alfa { int a;

double b; } using namespace alfa; int main() { int a,x; double y; alfa::a=5; a=4; alfa::b=7; x=3; y=a+2*x+alfa::a-2*alfa::b; cout << "\nRezultati y=" << y << endl; return 0; }

// b mund t shkruhet pa alfa

2. Vlerat jepen direkt.


// Programi prg14 #include <iostream> using namespace std; namespace alfa { int a; double b=7; } using namespace alfa; int main() { int a=4,x; double y; alfa::a=5; x=3; y=a+2*x+alfa::a-2*alfa::b; cout << "\nRezultati y=" << y << endl; return 0; }

3. Definimi jasht i funkcionit q prfshihet n namespace.


// Programi prg15 #include <iostream> using namespace std; namespace alfa { int a;

const double b=7; void omega(); } using namespace alfa; int main() { int a=4,x; double y; alfa::a=5; x=3; y=a+2*x+alfa::a-2*b; cout << "\nRezultati y=" << y << endl; omega(); // Mund t shkruhat edhe alfa::omega() return 0; } void alfa::omega() { double z; z=a+b; cout << "vlera z=" << z << endl; }

// Shfrytzohen variablat n alfa

Nse nuk prdoret:


using namespace alfa;

patjetr duhet t shfrytzohet operatori :: pr varibalat q jan pjes e alfa.


// Programi prg16 #include <iostream> using namespace std; namespace alfa { int a; const double b=7; void omega(); } int main() { int a=4,x; double y; alfa::a=5; x=3; y=a+2*x+alfa::a-2*alfa::b; cout << "\nRezultati y=" << y << endl; alfa::omega(); return 0;

} void alfa::omega() { double z; z=a+b; cout << "vlera z=" << z << endl; }

Vazhdimi i deklarimit t hapsirs me emra


Hapsira me emra mund t vazhdohet t plotsohet me emra t rinj. Shembull
// Programi prg17 #include <iostream> using namespace std; namespace alfa { int a = 10; } namespace beta { double a = 77.77; int b = 20; } namespace alfa { double b = 55.55; } int main () { using alfa::a; using beta::b; cout << "\nVersioni i par:\n"; cout << a << endl; cout << b << endl; cout << "\nVersioni i dyt:\n"; cout << alfa::b << endl; cout << beta::a << endl; return 0; }

Hapsira emrash t ndrthurura


Hapsira e emrave mund t deklarohet edhe brenda nj hapsire tjetr. Shembull

// Programi prg18 #include <iostream> using namespace std; namespace alfa { int i,x=44,m=5; void dita() { for (i=1;i<=m;i++) cout << "\nDita e bukur"; } namespace beta { double z=88.8; } } int main() { cout << "\nVlera pr x=" << alfa::x << "\n"; alfa::dita(); // Prej namespace t jashtm cout << "\n\nVlera pr z=" << alfa::beta::z; cout << "\n\n"; return 0; }

Shfrytzimi lokal i hapsirs s emrave


Nse direktiva using pr hapsir emrash shkruhet para programit, ajo ka efekt global dhe do t vlej n komplet programin. Prndryshe, nse diraktiva shkruhet brenda programit, vlefshmria e saj do t kufizohet vetm brenda bllokut q prcaktohet me kllapat e mdha t hapura dhe mbyllura.
// Programi prg19 #include <iostream> using namespace std; namespace alfa { int a = 77; } namespace beta { double a = 55.44; } int main () { { using namespace alfa; cout << "\nVlera e hapsirs alfa: " << a

<< endl; } { using namespace beta; cout << "\nVlera e hapsirs beta: " << a << endl; } return 0; }

Rez.

Ktu shihet se direktivat e veanta using kan efekt vetm brenda blloqeve t programit q prcaktohen me kllapat. Nse mes blloqeve t prcaktuara me dy kllapat e mdha shkruhet komanda:
cout << "\nVlera pas bllokut t par: " << a << endl;

kompjuteri do t lajmroj:
error C2065:'a': undeclared identifier

Me kt duhet nnkuptuar ate q u tha m sipr se efekti i direktivave using brenda programit kufizohet n blloqet q prcaktohen me kllapat e mdha.

Emri alternativ i hapsirs s emrave


Hapsirs s emrave mund t'i shoqrohet edhe nj emr alternativ, prkatsisht nj pseudonim. Shembull
// Programi prg20 #include <iostream> using namespace std; namespace jeta { double x = 77.25; } namespace dita=jeta; // Emri alternativ dita using namespace dita; int main() {

cout << "\nVlera n hapsirn jeta: " << x << endl; return 0; }

Hapsir emrash pa emr


Para programit lejohet deklarimi pa emr i hapsirs s emrave. Qasja te identifikatort e ksaj hapsire nuk ka kufizim n asnj pjes t programit. Shembull
// Programi prg21 #include <iostream> using namespace std; namespace { double h = 33.66; } int main() { cout << "\nVlera n hapsirn pa emr: " << h << endl; return 0; }

Funkcionet e mbingarkuara n hapsirn e emrave


Shembull
// Programi prg22 #include <iostream> using namespace std; namespace jeta { double dita(int a) { return a; } int i; void dita() { for (i=1;i<=7;i++) cout << "\nDita e bukur"; } } using namespace jeta; int main() {

double y; dita(); // Prej namespace jeta y=dita(7); cout << y; cout << "\n\n"; return 0; }

----------------------------------------------------------------------------------------------------------------------------

You might also like