[ grabber @ 05.01.2010. 12:50 ] @
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
[ Mihajlo Cvetanović @ 05.01.2010. 14:01 ] @
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.
[ grabber @ 05.01.2010. 15:39 ] @
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?
[ Mihajlo Cvetanović @ 05.01.2010. 15:47 ] @
Tako što učitaš obe reči pa onda radiš insert, fajl >> bosanska_rec >> engleska_rec. Ne treba ti vektor.
[ grabber @ 05.01.2010. 15:58 ] @
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.
[ Mihajlo Cvetanović @ 05.01.2010. 16:20 ] @
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/
[ grabber @ 05.01.2010. 16:56 ] @
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?
[ Mihajlo Cvetanović @ 05.01.2010. 18:45 ] @
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.
[ grabber @ 05.01.2010. 18:58 ] @
Heh :D Mislim da sam skužio, hvala puno!