Kam pas bėrė njė program tė ngjashėm nė shkollė dhe vendosa tė pėrdorja strukturėn e hartės (MAP) pėr ndėrtimin e pemės.
Pėr ata qė nuk i kanė pėrdorur mė parė, hartat janė si matricat por tė lejojnė tė zgjedhėsh vetė tipin e indeksit. Janė pak a shumė si hash array tė PERL dhe associative array tė PHP.
Nė matrica janė vetėm indekset me numra matrica[0], matrica[1], ... ndėrsa pėr hartat mund tė kesh indekse tė ēdo tipi. Pėr kėtė program do mjaftonte indeksi char sepse kemi vetėm njė shkronjė por unė zgjodha strings qė programi tė punojė edhe me fjalė.
Shikoni figurėn e bashkėngjitur si shėmbull.
Hartat nė brėndėsi janė ndėrtuar mbi pemėt. Dmth kemi tre shtresa strukturash:
pemė me dy degezime -> hartė -> pemė me shumė degėzime
Programuesi menaxhon vetėm njė shtresė ndėrsa tė tjerat janė tė gatshme nė STL (STANDARD TEMPLATE LIBRARY).
Pyetje, kėshilla, kritika?
Kodi PHP:
// Programi: Llogaritja e lidhjeve
// Data: 20/12/04
// Pershkrim: Sfida e Javes nga Grupi Teknologjik i Prishtines
// Perpiluesi: Dev-C++ 4.9.9.1
// Perdorimi:
// Formo nje peme nga skedari databaza.txt dhe llogarit numrin e lidhjeve
// per kerkesat e perdoruesit.
// Databaza mund te permbaje shkronja (psh. P T) ose fjale (psh. PRISHTINA TECH).
// Programi ben dallime midis shkronjave te medha dhe te vogla. A != a
// Nuk ka kufizim per numrin e degezimeve. 0 -> oo
//
#include <iostream>
#include <fstream> // File Stream: Per leximin e skedareve
#include <string>
#include <map> // harte[celes] = vlere // C++ STL
using namespace std;
// nyje[dege] = nyje1
// nyje1[dege] = nyje2
// nyje3[dege] = nyje4
// ...
typedef map < string, void * > nyje;
typedef nyje peme; // edhe pema mund te mendohet si nje nyje
//*****************************************************************************
// lexon skedarin dhe kthen treguesin e nje peme
// pema eshte bosh nqs skedari nuk mund te hapet
//
peme * lexo_databazen( string skedari );
//*****************************************************************************
// lidh fillimin me fundin ne pemen p
// kthen PO (true) nqs ben lidhjen
// kthen JO (false) nqs nuk e ben dot lidhjen (fillimi nuk gjendet ne peme)
// funksion veteperserites/rekursiv
//
bool hidh_ne_peme( peme * p, const string & fillimi, const string & fundi );
//*****************************************************************************
// kerkon nyjen me emrin varg ne pemen p
// kthen treguesin nqs e gjen ose NULL nqs nuk e gjen.
// rezultati = distanca nga renja e pemes p deri tek nyja me emrin varg
// shkalla tregon distancen (qe natyrisht fillon nga 1)
// funksion veteperserites/rekursiv
//
peme * kerko( peme * const p, const string & varg, int & rezultati, int shkalla = 1);
//**************************** MAIN *******************************
int main(int argc, char *argv[])
{
peme * p = lexo_databazen("databaza.txt"); // formojme pemen p
if( p->empty() ) // nqs databaza eshte bosh
{
cerr << "Gabim: Databaza nuk mund te hapej ose eshte bosh" << endl;
return 0;
}
string fillimi, fundi; // fillimi ----- lidhja -----> fundi
int rezultati = 0; // permban distancen nga filimi --> fundi
nyje * n; // tregues per nje nyje te pemes
cout << "Jep komandat per te kerkuar (psh: 'A G' pa thonjza gjen distancen nga A ne G)." << endl;
cout << "Shkruaj 'mbyllu' pa thonjza per te mbyllur programin." << endl;
while( true ) // merr komanda nga perdoruesi
{ // deri sa perdoruesi te shkruaj komanden "mbyllu"
cin >> fillimi;
if( fillimi == "mbyllu" ) return 0;
cin >> fundi; // merr fundin
n = kerko(p, fillimi, rezultati); // kerkojme fillimin ne peme
rezultati = 0;
if( n != NULL ) // nqs nyja e fillimi ka dege te tjera
kerko(n, fundi, rezultati); // kerkojme fundin
cout << fillimi << " -> " << fundi << " = " << rezultati << endl;
rezultati = 0;
}
return 0;
}
//**************************** LEXO DATABAZEN *******************************
peme * lexo_databazen( string skedari )
{
ifstream db (skedari.c_str(), ios::in); // hapim db per lexim
peme * p = new peme; // assert(p != null) // krijojme pemen kryesore
string fillimi, fundi;
while( db.good() ) // per aq kohe sa mund te lexojme nga skedari
{
db >> fillimi; // lexojme fillimin
db >> fundi; // lexojme fundin
// nqs nuk i lidhim dot
if( !fillimi.empty() && !fundi.empty() && !hidh_ne_peme( p, fillimi, fundi ) )
{
nyje * n = new nyje; // assert(n != null) // formo nje nyje te re
n->insert(make_pair(fundi, (void *)NULL)); // lidh fundin
p->insert(make_pair(fillimi, n)); // lidh fillimin
}
}
return p; // kthejme mbrapsh pemen/databazen
}
//**************************** HIDH NE PEME *******************************
bool hidh_ne_peme( peme * p, const string & fillimi, const string & fundi )
{
peme::iterator i = p->find(fillimi); // kerkojme fillimin ne pemen p
if( i != p->end() ){ // nqs e gjejme
if( i->second == NULL ) // po te mos kete dege te tjera
{ // formojme degen e pare
nyje * n = new nyje; // assert(n != null)
n->insert(make_pair(fundi, (void *)NULL)); // lidhim fundin
i->second = n; // lidhim fillimin
}
else // nqs ka dege te tjera, shtojme nje me shume
((peme *)(i->second))->insert( make_pair(fundi, (void *)NULL));
return true; // lidhja u be me sukses
}
// nqs nuk e gjetem fillimin ne kete peme, do kerkojme nyjet e tjera
// duke thirrur vetvetet per cdo nyje te pemes (nen-peme)
for( i = p->begin(); i != p->end(); i++ )
if( (peme *)i->second != NULL )
if( hidh_ne_peme( (peme *)i->second, fillimi, fundi ) )
return true; // kthejme PO (true) nqs e gjejme fillim
return false; // kthejme JO (false) nqs fillimi nuk gjendet ne peme
}
//**************************** KERKO PEMEN *******************************
peme * kerko( peme * const p, const string & varg, int & rezultati, int shkalla )
{
peme::iterator i = p->find(varg); // kerkojme vargun ne pemen p
if( i != p->end() ) // nqs e gjejme
{
rezultati = shkalla; // = numri i degezimeve nga renja deri tek vargu
return (peme *)i->second; // kthejme degezimet e vargut (mund te mos kete)
}
nyje * n;
shkalla++;
// mqns nuk e gjetem ne kete nyje, shikojme nyjet e tjera (nen-pemet)
for( i = p->begin(); i != p->end(); i++ )
{
if( i->second != NULL )
{
n = kerko( (peme *)i->second, varg, rezultati, shkalla );
if( rezultati != 0 ) return n;
}
}
return NULL;
}
// fund
Krijoni Kontakt