Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Rjecnik i pretrazivanje

[es] :: C/C++ programiranje :: C/C++ za početnike :: Rjecnik i pretrazivanje

[ Pregleda: 1559 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.144.*



Profil

icon Rjecnik i pretrazivanje05.01.2010. u 12:50 - pre 174 meseci
Citat:
Napisati program koji ucitava bosansko-engleski rjecnik, nakon cega od ko-
risnika trazi unos neke rijeci na bosanskom jeziku. Program pretrazuje
rjecnik i ispisuje odgovorajucu englesku rijec. Unos se nastavlja dok ko-
risnik eksplicitno ne prekine unos sa EOF uslovom.
U prilogu je dat tekstualni fajl ba_en.dic koji sadrzi rjecnik u obliku parova
rijeci na bosanskom i engleskom jeziku. Svaka rijec na bosanskom ima
samo jedan engleski prevod. Za rad sa fajlovima moze se koristiti objekat
tipa std::ifstream iz zaglavlja <fstream>. Objekat se moze de nisati na
sljedeci nacin:

std::ifstream in("imefajla");

Dalje je moguce tretirati objekat in na identican nacin kao i objekat cin.
Npr.,

std::string x;
in >> x;

cita sljedeci string iz datoteke sa imenom imefajla i njegovu vrijednost
dodjeljuje varijabli x.


Eh ovo je tekst zadatka koji sam imao na proslom parcijalnom iz Objektno orijentisanog programiranja, zadatak kojeg nisam znao ni poceti :) Moze li mi neko objasniti samo princip na kojem bih ovo trebao raditi, i kako spojiti neki tekstualni fajl sa rijecima iz kojeg bi crpio podatke? I kako u njemu pretrazivati, IF iskazi ili neka posebna procedura?

Hvala unaprijed
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Rjecnik i pretrazivanje05.01.2010. u 14:01 - pre 174 meseci
Imaš parove reči, bosansku i englesku reč. Najjednostavnije je koristiti map<string, string>. Ubacivanje novog para u rečnik ovog tipa se radi na sledeci način: moj_recnik.insert(pair<string, string>(bosanska_rec, engleska_rec)). Prevođenje je još jednostavnije: prevedena_engleska_rec = moj_recnik[zadata_bosanska_rec]. Ako imaš više reči da prevedeš onda ih prevodiš jednu po jednu. Nije baš idealan prevod, ali fercera kako-tako.
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.144.*



Profil

icon Re: Rjecnik i pretrazivanje05.01.2010. u 15:39 - pre 174 meseci
Hvala puno na odgovoru, evo pokušavam da uradim ovo.

Povezao sam program sa ba_en.txt fajlom (u kojoj se nalaze riječi), evo kako su poredane, mali uzorak iz tog fajla:

Citat:
jabuka apple
sunce sun
srce heart
ljubav love
more sea
student student
dom home
drvo tree
.
.
.


eh sad prilikom ubacivanja u mapu, kako kazati računaru da u prvi član para ubaci prvu riječ iz reda, a u drugi, drugu iz reda, znači prije i poslije praznog mjesta. Ako me razumijete šta hoću reći? Za sada sam to uradio pomoću vektora, na sljedeći način:

Code:
vector<string> a;
string rijec_privremena;
while(fajl)
            {
                        fajl >> rijec_privremena;
                        a.push_back(rijec_privremena);
            }
            map<string, string> rjecnik;
            map<string, string>::iterator it;
            int i;
            for(i=0;i<a.size()-1;i+=2)
            {
                                   rjecnik.insert(pair<string, string>(a[i], a[i+1]));
            }


ali ne čini mi se baš zgodno rješenje, i recimo da u rječniku ima 100 000 riječi, program prvo ubaci u vektor, pa onda sve to prebacuje u mapu, malo mi je prekomplikovano?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Rjecnik i pretrazivanje05.01.2010. u 15:47 - pre 174 meseci
Tako što učitaš obe reči pa onda radiš insert, fajl >> bosanska_rec >> engleska_rec. Ne treba ti vektor.
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.144.*



Profil

icon Re: Rjecnik i pretrazivanje05.01.2010. u 15:58 - pre 174 meseci
Hvala lijepo, sve radi izvrsno. E baš sam ga bio zakomplikovao :)

Izvinjavam se ako dajem neka banalna pitanja i "rješenja", ipak sam veliki noob još uvijek :)

I još jedno pitanje ako nije problem: ako npr jedna domaća riječ ima više prevoda na engleskom (avion - airplane, avion - plane), kako odraditi da ispiše sve engleske prevode?

Hvala još jednom.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Rjecnik i pretrazivanje05.01.2010. u 16:20 - pre 174 meseci
U tom slučaju umesto klase map treba koristiti multimap. Za pronalaženje svih elemenata koji imaju istu bosansku reč može da se koristi funkcija equal_range. Evo objašnjenja i primera: http://www.cplusplus.com/reference/stl/multimap/equal_range/
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.144.*



Profil

icon Re: Rjecnik i pretrazivanje05.01.2010. u 16:56 - pre 174 meseci
Code:
            pair<multimap<string, string>::iterator,multimap<string, string>::iterator> par_istih;
            for (int i=0; i<rjecnik.size();i++)
                {
                    par_istih = rjecnik.equal_range(rijec_pretraga);
                    for (it=par_istih.first; it!=par_istih.second; it++)
                          cout << " " << (*it).second;
                    cout<<endl;
                    break;
  }


hvala, evo radi ovako, ali da sam ga razumio - nisam ništa :) Kopirao sam iz primjera, malo mijenjao po svojim varijablama, ali nisam razumio, prije svega za šta mi treba ovo pair, tj šta ono radi, ako može malo pojašnjenja molim vas?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Rjecnik i pretrazivanje05.01.2010. u 18:45 - pre 174 meseci
Funkcija multimap::equal_range vraća opseg iteratora koji zadovoljavaju uslov da svi elementi opsega imaju isti ključ (baš ono što tebi treba). Za opseg ti trebaju dva podatka, početak i kraj opsega. Zato je neophodno vratiti pair, tako da je pair::first početak opsega, a pair::second element posle kraja opsega (ovo "element posle kraja" je standardna STD fora, koja u 95% slučajeva omogućava elegantan rad sa opsezima). Svaki put kad u STD svetu treba raditi sa parom nečega koristi se taj pair. Zgodan mališa.
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
92.36.144.*



Profil

icon Re: Rjecnik i pretrazivanje05.01.2010. u 18:58 - pre 174 meseci
Heh :D Mislim da sam skužio, hvala puno!
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Rjecnik i pretrazivanje

[ Pregleda: 1559 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.