C++ - pomoc

Discussion in 'Operativni sistemi, aplikacije i programiranje' started by Reznor, Jun 22, 2014.

  1. Reznor

    Reznor Overclocker

    Molim sve ljude dobre volje da pomognu i molim vas nemojte me kritikovati :)
    Dakle, dobio sam zadacu koju trebam predati do odredjenog roka i zapeo sam na zadnjem zadatku.
    Tako da trazim mali savjet ili neke smjernice kako ga rijesiti (da ne mislite da mi treba uradjena zadaca :D )

    Dat je problem sa dva tekstualna fajla. Za izbore se kandidovalo 10 kandidata i njihovi maticni brojevi, imena, datum rodjenja su u fajlu kandidati.txt
    U drugom fajlu izbori.txt su datum rodjenja kandidata i broj osvojenih bodova.
    U fajlu izbori.txt se nalazi 10 linija i po jedna za svakog kandidata, isto i u fajlu kandidati.txt
    Npr. za jednog:
    kandidati.txt
    050597413456 Meho Mehic 05.05.1974
    izbori.txt
    050597413456 3456

    Potrebno je napisati program koji ce procitati sve podatke iz ulaznih fajlova, a zatim tabelarno prikazati podatke u opadajucem redoslijedu (po broju osvojenih glasova), a onda izvan tabele napisati ime prezime i broj osvojenih glasova u % i ukupan broj glasova.
    Odabrati pogodnu strukturu podataka za pohranu podataka o kandidatima kao i o rezultatima izbora, a za sortiranje u opadajucem redoslijedu koristiti heapsort.

    Moje pitanje je slijedece: da li je dobra ideja napraviti recimo neki struct koji sadrzi jedan int i dva stringa za pohranu jmbg imena i datuma rodjenja iz kandidati.txt, jos jedan sa dva inta za izbori.txt i kako ocitati sekvencu po sekvencu svake linije a ne da mi uzima citavu liniju (ifstream). Ili ima neka skroz drugacija varijanta? Dakle, ono sto mi je nejasno je kako mogu ove ulazne podatke smjestiti.

    Hvala unaprijed.
     
  2. Ninja

    Ninja Komšija

    Napravi klasu u koju ćeš smjestit sve podatke o jednom kandidatu, ali joj odradi overload operatora <, > i ostalih koji budu neophodni za sortiranje.
     
  3. Reznor

    Reznor Overclocker

    hvala
     
  4. BoLa

    BoLa Aktivista

    nemoj int za jmbg, string stavi
     
  5. rijads

    rijads Aktivista

    Eo odradio sam ga ja iz dosade, nadam se da ce pomoci i da nije kasno :D
    EDIT: eo na forumu kod, posto pastebin nece da otvori: "Under heavy load".
    http://pastebin.com/gUdec3pN
    Code:
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    
    class datum{
    private:
    	int _d;
    	int _m;
    	int _g;
    public:
    	datum(int d=1,int m=1,int g=1900){
    		_d = d;
    		_m = m;
    		_g = g;
    	}
    	datum(const datum& d){
    		_d = d._d;
    		_m = d._m;
    		_g = d._g;
    	}
    	datum& operator=(datum d){
    		if (this != &d){
    			_d = d._d;
    			_m = d._m;
    			_g = d._g;
    		}
    		return *this;
    	}
    	friend ostream& operator<<(ostream& out, datum& d){
    		out << d._d << "." << d._m << "." << d._g;
    		return out;
    	}
    	bool dodajdan(int d){
    			_d = d;
    			return true;
    	}
    	bool dodajmjesec(int m){
    			_m = m;
    			return true;
    	}
    	bool dodajgodinu(int g){
    		_g = g;
    		return true;
    	}
    };
    class kandidat {
    private:
    	string ime;
    	string mat;
    	datum d;
    public:
    	kandidat(string i = "<nepoznato_ime>", string m = "<maticni_nepoznat>", datum d = datum(1, 1, 1900)){
    		ime = i;
    		mat = m;
    		this->d = d;
    	}
    	kandidat(const kandidat& obj){
    		ime = obj.ime;
    		mat = obj.mat;
    		d = obj.d;
    	}
    	string getime(){
    		return ime;
    	}
    	string getmat(){
    		return mat;
    	}
    	datum getdat(){
    		return d;
    	}
    	kandidat& operator=(kandidat& obj){
    		ime = obj.ime;
    		mat = obj.mat;
    		d = obj.d;
    	}
    	friend ostream& operator<<(ostream& out, kandidat& d){
    		out << "Kandidat: \t\t" << d.ime << endl << "JMBG: \t\t\t" << d.mat << endl << "Datum rodjenja:\t\t" << d.d<<endl;
    		return out;
    	}
    };
    class izbori{
    private:
    	string mat;
    	int bodovi;
    public:
    	izbori(string m="<nepoznato>",int b=0){
    		mat = m;
    		bodovi = b;
    	}
    	izbori(const izbori& obj){
    		mat = obj.mat;
    		bodovi = obj.bodovi;
    	}
    	string getmat(){
    		return mat;
    	}
    	int getbod(){
    		return bodovi;
    	}
    	izbori& operator=(izbori& obj){
    		mat = obj.mat;
    		bodovi = obj.bodovi;
    		return *this;
    	}
    	bool operator<(izbori& obj){
    		if (this->bodovi < obj.bodovi)
    			return true;
    		return false;
    	}
    	friend ostream& operator<<(ostream& out, izbori& d){
    		out << "Broj osvojenih bodova:\t" << d.bodovi << endl;
    		return out;
    	}
    };
    
    bool strtodat(string dat, datum &d){
    	int br = 0;
    	string dio = "";
    	for (string::iterator it = dat.begin(); it != dat.end(); it++){
    		if (br < 2){
    			dio += *it;
    		}
    		if (br == 2){
    			d.dodajdan(atoi(dio.c_str()));
    			dio.erase();
    			dio = "";
    		}
    		if (br > 2 && br < 5){
    			dio += *it;
    		}
    		if (br == 5){
    			d.dodajmjesec(atoi(dio.c_str()));
    			dio.erase();
    			dio = "";
    		}
    		if (br>5 && br < 10){
    			dio += *it;
    		}
    		if (br == 9){
    			d.dodajgodinu(atoi(dio.c_str()));
    			dio.erase();
    			dio = "";
    		}
    		br++;
    	}
    	br = 0;
    	return true;
    }
    bool dodajkandidate(vector<kandidat> &kand){
    	char* i = "kandidati.txt";
    	string mat = "";
    	string ime = "";
    	string dat;
    	datum d;
    	int b = 0;
    	bool nn = false;
    	ifstream ispis(i);
    	int x = 0;
    	bool p = false;
    	if (ispis.fail()){
    		cout << "Greska: Provjerite destinaciju i ime fajla. (Fajl se mora nalaziti u istom folderu gdje se nalazi i program)" << endl;
    		return false;
    	}
    	else{
    		char znak;
    		while (ispis.get(znak)){
    			if (znak == '\n')
    				nn = true;
    			if (znak == ' ')
    				b++;
    			if (nn){
    				strtodat(dat, d);
    				kandidat kan(ime, mat, d);
    				kand.push_back(kan);
    				ime.erase();
    				ime = "";
    				mat.erase();
    				mat = "";
    				dat.erase();
    				dat = "";
    				nn = false;
    				b = 0;
    			}
    			if (b == 0){
    				if (znak != '\n')
    					mat += znak;
    			}
    			if (b == 1){
    				if (znak!=' ')
    					ime += znak;
    			}
    			if (b == 2){
    				ime += znak;
    			}
    			if (b == 3){
    				if (znak != ' ')
    					dat += znak;
    			}
    		}
    	}
    	return true;
    }
    
    bool dodajizbore(vector<izbori> &izb){
    	char* i = "izbori.txt";
    	string mat = "";
    	string bodova = "";
    	int bod = 0;
    	ifstream ispis(i);
    	if (ispis.fail()){
    		cout << "Greska: Provjerite destinaciju i ime fajla. (Fajl se mora nalaziti u istom folderu gdje se nalazi i program)" << endl;
    		return false;
    	}
    	else{
    		char znak;
    		while (ispis.get(znak)){
    			if (znak == ' '){
    				while (ispis.get(znak)){
    					if (znak != ' ')
    						bodova += znak;
    					if (znak == '\n'){
    						bod = atoi(bodova.c_str());
    						izbori iz(mat, bod);
    						izb.push_back(iz);
    						mat.erase();
    						bodova.erase();
    						break;
    					}
    				}
    			}
    			if (znak != '\n')
    				mat += znak;
    		}
    	}
    	return true;
    }
    
    class povezano{
    public:
    	vector<kandidat>_kand;
    	vector<izbori>_izb;
    	bool dodati(vector<kandidat>&__kand, vector<izbori>__izb){
    		for (vector<kandidat>::iterator it = __kand.begin(); it != __kand.end(); it++){
    			kandidat kan(it->getime(), it->getmat(), it->getdat());
    			_kand.push_back(kan);
    			for (vector<izbori>::iterator it2 = __izb.begin(); it2 != __izb.end(); it2++){
    				if (it->getmat().compare(it2->getmat()) == 0){
    					izbori izb(it2->getmat(), it2->getbod());
    					_izb.push_back(izb);
    				}
    			}
    		}
    		return true;
    	}
    	bool poredi(izbori obj, izbori obj1){
    		return(obj < obj1);
    	}
    	bool sortirati(){
    		sort(_izb.begin(), _izb.end());
    		return true;
    	}
    
    	friend ostream& operator<<(ostream& out, povezano& obj){
    		for (vector<kandidat>::iterator it = obj._kand.begin(); it != obj._kand.end(); it++){
    			for (vector<izbori>::iterator it2 = obj._izb.begin(); it2 != obj._izb.end(); it2++){
    				if (it->getmat().compare(it2->getmat()) == 0)
    					out << "============================================"<<endl<<*it << *it2<<"============================================"<<endl<<endl;
    			}
    		}
    		return out;
    		}
    };
    
    int main(){
    	vector<kandidat> kand;
    	vector<izbori> izb;
    	povezano pov;
    	float bodovi = 0;
    	int trbodovi = 0;
    	float lokacija = 0;
    	int trlokacija = 0;
    	char* kandidati = "kandidati.txt";
    	dodajkandidate(kand);
    	dodajizbore(izb);
    	pov.dodati(kand, izb);
    	pov.sortirati();
    	cout << pov;
    	for (vector<izbori>::iterator it = pov._izb.begin(); it != pov._izb.end(); it++){
    		bodovi+=it->getbod();
    		if (it->getbod() > trbodovi){
    			trbodovi = it->getbod();
    			trlokacija = lokacija;
    		}
    		lokacija++;
    	}
    	vector<izbori>::iterator it = pov._izb.begin() + trlokacija;
    	vector<kandidat>::iterator it2 = pov._kand.begin();
    	cout << "Pobjednik: "<<endl<<*it2<<*it<<"Broj osvojenih glasova:\t"<<it->getbod()/bodovi*100<<"%"<<endl<<"Ukupan broj glasova:\t"<<bodovi<<endl;
    	system("pause>0");
    	return 0;
    }
    [​IMG]
    (Kandidati moraju imati 3 space-a i odvojeni enterom, izbori 1 space, odvojeni enterom, oba fajla u root-u programa)

    Nisam stigao sve testirati niti dealocirati alociranu memoriju...
     
  6. Reznor

    Reznor Overclocker

    Zakasnio si ali hvala u svakom slucaju, rok je bio do cetvrtka do 17:00, dobio sam na toj zadaci 5 od 6 bodova. Takodjer je trebalo tu napraviti svoju strukturu podataka, u koju ce se sve smjestiti, vector i drugi kontejneri se nisu mogli koristiti.