Permalänk
Medlem

c++ char stortering

Här är koden:

#include <iostream> #include<fstream> #include<string.h> using namespace std; void tjugoTva() { } void tjugoEtt() { char vekt[99]; char namn[30]; bool ok=false; cout <<"Ange bilmodell: "; cin>>namn; ifstream lasa("bilreg.txt"); while( lasa.getline(vekt, 99)) { if (strcmp (vekt,namn) == 0) { ok=true; break; } } if (ok) cout<<" modellen du söker finns kvar!"<<endl; else cout<<" modellen du söker finns inte kvar!"<<endl; lasa.close(); } void bilReg() { char vekt[50][99]; ifstream lasa("bilreg.txt"); int antal=0; while( lasa.getline(vekt[antal], 99)) { antal++; } for( int i=0;i<antal;i++) cout<<vekt[i]<<" "<<endl; } void menyTva() { int tal=1; cout<<"\n21. Söka\n22. Sortera\n23. Se registret\n24. Till huvudmenyn\nAnge ditt val:"; while(tal != 24) { cin>>tal; if (tal == 21) { tjugoEtt(); } if (tal == 22) { tjugoTva(); } if (tal == 23) { bilReg(); } } } int main() { { int tal; while(tal != 0) { cout<<"0. Avsluta\n1. Se registret\n2. Sok/Sortera\n3. Sälj\nAnge ditt val:"; cin>>tal; if (tal == 1) { bilReg(); } if(tal == 2) { menyTva(); } } } return 0; }

Det jag vill är att när jag går in på andra menyn (skriv 2) och skriver 22 så ska programmet sortera alla bilamodeller (från bilreg.txt) i bokstavsordning.

Jag har googlat mm och jag har inte fått något svar som kan hjälpa mig jag har fastnat helt...

Så finns det någon bra guide eller något annat, för jag är helt fast och kommer ingen vart.

Permalänk
Medlem

Sök på bubble sort på google, finns massor med förklaringar och kodexempel till båda c++, java osv.
En engelsk förklaring på wiki:
Bubble sort - Wikipedia, the free encyclopedia
och svenska:
Bubbelsortering - Wikipedia

Permalänk
Medlem
Skrivet av Dalton Sleeper:

Sök på bubble sort på google, finns massor med förklaringar och kodexempel till båda c++, java osv.
En engelsk förklaring på wiki:
Bubble sort - Wikipedia, the free encyclopedia
och svenska:
Bubbelsortering - Wikipedia

underbart , tack!

EDIT:

här är bildreg.txt

Ford Antal sålda bilar under detta år: 6 Antal osålda bilar under detta år: 3 Inköpspriset: 20 000 Försäljningspriset: 25 000 Volvo Antal sålda bilar under detta år: 10 Antal osålda bilar under detta år: 4 Inköpspriset: 10 000 Försäljningspriset: 15 000 Saab Antal sålda bilar under detta år: 0 Antal osålda bilar under detta år: 15 Inköpspriset: 30 000 Försäljningspriset: 31 000 Volkswagen Antal sålda bilar under detta år: 2 Antal osålda bilar under detta år: 3 Inköpspriset: 20 000 Försäljningspriset: 25 000 Peugeot Antal sålda bilar under detta år: 20 Antal osålda bilar under detta år: 0 Inköpspriset: 17 500 Försäljningspriset: 20 000

Den koden jag kör med:

vector<string> sV; ifstream in("bilreg.txt"); string word; while(in >> word) sV.push_back(word); cout << "Unsorted words:" << endl; for(int i = 0; i < sV.size(); i++) cout << sV[i] << endl; cout << "---------------" << endl; cout << "Sorted words:" << endl; sort( sV.begin(), sV.end() ); for(int i = 0; i < sV.size(); i++) cout << sV[i] << endl;

Den sorterar allt som finns i den men jag vill att den ska sortera bilarna i bokstavsordning om du förstårt

Permalänk
Medlem

skapa en struct/class för bilar och lagra i en array. Sortera efter Car.Name/Manufacturer/Brand vad din variabel nu heter. Sortera rakt i txtfilen blir ju inge bra.

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Hedersmedlem
Skrivet av E_maN:

Sortera rakt i txtfilen blir ju inge bra.

En lösning vore att istället spara filen på formatet

Ford 6 3 20000 25000 Volvo 10 4 10000 15000 Saab 0 15 30000 31000

, läsa in radvis och sedan sortera som ovan.

Permalänk
Medlem
Skrivet av Elgot:

En lösning vore att istället spara filen på formatet

Ford 6 3 20000 25000 Volvo 10 4 10000 15000 Saab 0 15 30000 31000

, läsa in radvis och sedan sortera som ovan.

Det förvisso men det beror ju på om han får ändra strukturen i filen, ser ut som en skoluppgift tänker jag lite på.

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Hedersmedlem
Skrivet av E_maN:

Det förvisso men det beror ju på om han får ändra strukturen i filen, ser ut som en skoluppgift tänker jag lite på.

Jo, och det är ju dessutom en ganska otymplig lösning; förmodligen vill man ändå någon form av objekt för att hantera informationen.

Permalänk
Medlem

Kanske kan jobba vidare på detta? obs, kladd!
Vet inte hur du skall lagra infon, men jag tog helt enkelt i 5 rader där första bör vara bilnamnet.
Bör gå att göra med egen sortering som bubblesort, kanske med överlagrad jämförelse samt egen swap, va inne på det först men orkade helt enkelt inte
Tänk på att om det är en skoluppgift så måste man förstå allt!

class Car{ public: Car(string nt, string nt1, string nt2, string nt3, string nt4){ t=nt;t1=nt1;t2=nt2;t3=nt3;t4=nt4; } //bool operator < ( const Car &cmp ); //bool operator > ( const Car &cmp ); string t,t1,t2,t3,t4; //bör ej vara public, dock private med tillhörande funktioner :D };

Här ovan har jag plats för 5 rader där den första är bilnamnet, har ingen aning om hur du skall lagra din info... man kan ju söka igenom raderna, leta efter tecknet ':' och konvertera siffrorna bakom till int med förslagsvis substring och atoi eller liknande... varje rad slutar också med en radbrytning om det kan vara till hjälp, '\n'.

struct CarCmp{ bool operator()(const Car *a,const Car *b) const{ if (a->t.compare(b->t)>0) return true; return false; } } CarCmp_;

Här är en egen compare struct som man kan använda med sort i algorithm, går också med enkel funktion, fungerar ju annars med bubblesort och swap om man så vill, antagligen det man brukar göra i skoluppgifter.

int main(int argc, char* argv[]) { vector<Car*>cars; ifstream in("c:/a.txt"); char type[255];char t1[255];char t2[255];char t3[255];char t4[255]; while(in.good()){ in.getline(type,255,'\n'); if(strcmp(type,"")==0){ //skip empty lines or whatever } else{ //is the rest always 4 rows? in.getline(t1,255,'\n'); //max 255 signs, otherwise untill new row in.getline(t2,255,'\n'); in.getline(t3,255,'\n'); in.getline(t4,255,'\n'); //add car cars.push_back(new Car(type, t1,t2,t3,t4)); } } sort(cars.begin(),cars.end(),CarCmp_); for(unsigned int c=0;c<cars.size();c++){ cout << cars[c]->t.c_str() << endl << cars[c]->t1.c_str() << endl << cars[c]->t2.c_str() << endl << cars[c]->t3.c_str() << endl << cars[c]->t4.c_str() << endl << endl; } cars.erase(cars.begin(),cars.end()); in.close(); system("pause"); }

Här läser man in rad för rad, ignorerar tomma, sorterar med sort i algorithm samt skriver ut vektorn.

förenkling