Wykorzystując c++ muszę posortować tekst wczytany z pliku save.txt
Oj niechcący wysłałem, jak mówiłem muszę posortować tekst z pliku save.txt
zawartość pliku:
63 pkt. --> jakub
11 pkt. --> marian
97 pkt. --> bartek
22 pkt. --> ania
5 pkt. --> józek
18 pkt. --> franek
45 pkt. --> basia
39 pkt. --> gosia
56 pkt. --> zdzisiek
Muszę posortować względem ilości punktów i zapisać do tego samego pliku już posortowane wyniki.
Nie mam pojęcia jak to zrobić :(
Nie wiem, ale może traktuj tekst w postaci ASCII czyli jeśli masz np taką budowę pliku:
Mama
Tata
Brat
Siostra
Wczytuj to do wektora, potem sortuj to tak jakbyś sortował liczby tylko zamieniaj sobie każdą literkę w stringu na odpowiednik liczby w ASCII, zsumuj te cyfry i porównaj z stringiem następnym i jak coś to zamień miejscami.
Nie wiem czy takie coś zadziała, ale to tylko taki pomysł.
Mówisz, o sortowaniu bąbelkowym, ale mi nie chodzi o to, aby posortować według imion, tylko tych liczb na początku, ale ja coś źle robię i sortuje mi się tylko pierwsza kolumna (tzn. pierwszy znak z każdego wiersza), a reszta pozostaje bez zmian.
Zrób klasę złożoną z imienia i ilosci punktów. Przeładuj w tej klasie operator<. Wczytaj do tablicy obiektów tej klasy dane z pliki. Posortuj. Zapisz z powrotem.
mogę ci to napisać za 70zł: http://www.programy-na-zamowienie.yoyo.pl/
Dzięki 'nnn', ale w końcu sam to zrobię, a może ktoś mi pomoże? Doszedłem do tego punktu, i nie wiem co dalej/co zmienić.
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
class zapis
{
public:
char nick[100];
int wynik;
};
class zapis2
{
public:
char nick2[100];
int wynik2;
};
int main(int argc, char *argv[])
{
zapis osoba;
zapis2 osoba2;
int m = 1;
fstream plik;
plik.open( "save.txt", ios::in | ios::out );
plik.seekg(ios_base::beg );
if( plik.good() == true )
{
while(!plik.eof())
{
plik>>osoba.wynik;
plik>>osoba.nick;
plik.seekg( + m*'\n', ios_base::beg );
plik>>osoba2.wynik2;
plik>>osoba2.nick2;
m=m+1;
if(osoba.wynik>osoba2.wynik2)
{
plik.seekg(ios_base::end);
plik<<osoba.wynik<<" "<<osoba.nick<<endl<<osoba2.wynik2<<" "<<osoba2.nick2;
}
}
plik.close();
}
else
{
cout<<"ERROR\n";
}
system("PAUSE");
return EXIT_SUCCESS;
}
- Przyjmuje się, że w klasach należy wszystkie pola umieszczać w private, i dać do tego metody.
- Po co ci dwie klasy, mające to samo?
- Wczytaj do tablicy, i tam sortuj!
enjoy:
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>
#define u32 unsigned int
using namespace std;
//pojedynczy wynik
class Wynik
{
private:
u32 _wynik;
string _nick;
public:
Wynik(string&s) ;
string GetString() ;
inline u32 GetWynik(){return _wynik;}
};
Wynik::Wynik(string&s)
{
istringstream ss(s);
ss>>_wynik;
_nick=s.substr(s.find_last_of(" ")+1) ;
}
string Wynik::GetString()
{
ostringstream ss;
ss<<_wynik<<" pkt. --> "<<_nick; //tutaj mozesz dac inny format
return ss.str() ;
}
//----------------------------------------------------------------------
class TablicaWynikow
{
private:
vector<Wynik*> tab;
static bool Porownaj(Wynik*w1,Wynik*w2){return w1->GetWynik() < w2->GetWynik();}
public:
TablicaWynikow(){};
~TablicaWynikow();
void Odczyt(const char*filename);
void Zapis(const char*filename);
void Sortuj();
};
TablicaWynikow::~TablicaWynikow()
{
for(int i=0;i<tab.size();++i)
{
delete tab[i];
}
}
//Odczyt : bez sprawdzania bledow, nie chce mi sie pisac
//wiec lepiej, by byly prawidlowe
void TablicaWynikow::Odczyt(const char*filename)
{
tab.clear();
ifstream we(filename);
if(!we.is_open())
return ;
string s;
while(getline(we,s))
if(s!="")
{
Wynik* _wyn = new Wynik(s) ;
tab.push_back(_wyn) ;
}
we.close() ;
}
void TablicaWynikow::Zapis(const char*filename)
{
ofstream we(filename);
for(int i=0;i<tab.size();++i)
we<<tab[i]->GetString()<<"\n" ;
we.close() ;
}
void TablicaWynikow::Sortuj()
{
sort(tab.begin(),tab.end(),Porownaj) ;
}
//----------------------------------------------------------------------
int main(int argc, char**argv)
{
TablicaWynikow tw;
tw.Odczyt("save.txt") ;
tw.Sortuj() ;
tw.Zapis("save.txt") ;
return 0;
}
w razie pytań, pytaj
Można tak:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
class Punkty
{
private:
int iPkt;
string strImie;
public:
bool operator<(const Punkty& rWart)
{
if(iPkt < rWart.iPkt) return true;
else return false;
}
friend ofstream& operator<<(ofstream& out, const Punkty& pkt);
friend ifstream& operator>>(ifstream& in, Punkty& pkt);
};
ofstream& operator<<(ofstream& out, const Punkty& pkt)
{
out << pkt.iPkt << " " << pkt.strImie;
return out;
}
ifstream& operator>>(ifstream& in, Punkty& pkt)
{
in >> pkt.iPkt;
getline(in, pkt.strImie);
return in;
}
int main()
{
ifstream in("save.txt");
vector<Punkty> vDane;
Punkty pktTmp;
while(in >> pktTmp)
vDane.push_back(pktTmp);
in.close();
sort(vDane.begin(), vDane.end());
ofstream out("save.txt");
for(int i = 0; i < vDane.size(); i++)
out << vDane[i] << endl;
out.close();
}
OOO, wielki dzięki :D