[c++]sortowanie danych pobranych z pliku


(Damiankominiak) #1

Próbuje n

To jest zrobione dla dwóch studentów , numer indeksu składa się z 6 cyfr i nie wiem jak to porównać i wypisać linie


(Sawyer47) #2

Co to wg Ciebie ma robić?

int k[6];

...

name.find(k[6]);

Deklarujesz tablicę liczb całkowitych, a następnie do metody std::string::find przesyłasz wartość spoza tej tablicy (6-elementowa indeksowana jest wartościami 0..5). Bezsens, który sprawia wrażenie, że nie znasz zupełnie C++. O ile można to nie ma sensu się bawić w samodzielne rozdzielanie wartości, skoro może to zrobić biblioteka. Wczytywałbym raczej w formie

plik >> string >> string >> int;

W ten sposób możesz uzyskać poszczególne wartości w osobnych zmiennych.

PS Jeśli w przyszłości będziesz zamieszczał swój kod na forum, zadbaj o jego formatowanie inne niż losowe, to naprawdę utrudnia pisanie i znajdowanie błędów.


(Damiankominiak) #3

ok, dzięki, sory ale jestem początkujący,

czyli zrobić bez pętli for i żeby było w jednej lini mogę coś takiego?

plik>>string>>string>>int;

....................

cout<

(Sawyer47) #4

Jeśli chcesz te dane sortować to i tak siłą rzeczy musisz jest w pętli wszystkie pobrać, a następnie w drugiej pętli wypisać.


(Damiankominiak) #5

i jeszcze jedno pytanie dlaczego przy deklarowaniu tablicy stringów wyskakuje mi błąd programu

string name[1],s[1];

int k[1];

while (!plik.eof()){

      for(int i=0;i<2;++i){   

                  plik>>name[i]>>s[i]>>k[i];

                  cout<
}}

(Drobok) #6

Bo takim zapisem tworzysz dwie jednoelementowe tablice ;], a chcesz pobrać dwa elementy :stuck_out_tongue:


([alex]) #7

Czy przypadkiem to s[] nie służy ci do przechowywania odstępu ?


(Damiankominiak) #8

proszę o sprawdzenie

#include 

#include 

#include 

#include 

using namespace std;


int main(int argc, char *argv[])

{

    ifstream plik ("imiona.txt");

    string name[2],s[2];

     int k[2];

     while (!plik.eof()){

      for(int i=0;i<2;++i){      

            plik>>name[i]>>s[i]>>k[i];

      }

       for(int i=0;i<2;){

             if(k[i]>k[++i]){

              cout<
           }

}

    system("PAUSE");

    return EXIT_SUCCESS;

}

chyba coś jest nie tak z wypisywaniem


(Sawyer47) #9

No na pewno coś jest nie tak. Nie mam pojęcia co chciałeś osiągnąć, ale na pewno nie działa to dobrze.

Ogólnie kod mógłby wyglądać tak (zwróć uwagę na formatowanie kodu - czytelność), jeśli w pliku są tylko 2 wiersze

#include 

#include 

#include 

using namespace std;


int main(int argc, char *argv[])

{

    ifstream plik ("imiona.txt");

    string name[2], s[2];

    int k[2];


	while (!plik.eof())

	{

		for(int i = 0; i < 2; ++i)

		{     

			plik >> name[i] >> s[i] >> k[i];

		}

	}



	int a = 0, b = 1;


	if(k[0] > k[1])

	{

		a = 1;

		b = 0;

	}


	cout << name[a] << s[a] << k[a] << endl;

	cout << name[b] << s[b] << k[b] << endl;


	return 0;

}

W przypadku ogólnym

→ wczytujesz dane

→ sortujesz

→ wypisujesz

Sensowne jest storzenie struktury Student z polami imię, nazwisko, numer indeksu i napisani operatora porównującego po indeksie - wtedy można by użyć standardowych funkcji sortowania.


([alex]) #10

Może przy wypisywaniu warto dodać spacje/tabulacje lub setw() rozdzielające imie, nazwisko i indeks.


(Damiankominiak) #11

ja chciałem uniwersalnie to zrobić, tak żeby nie podawać indeksu , tylko żeby automatycznie porównało i wyświetliło w odpowiednim porządku.

-- Dodane 01.05.2011 (N) 14:47 --

a jak zrobić żeby nie wpisywać k[0] itp. tylko w pętli for porównywało?? Bo jak bym miał z 10 numerów, to nie będę ręcznie porównywac


([alex]) #12

Użyj sort() z lub napisz sam jakieś sortowanie.


(Damiankominiak) #13

jakie parametry pobiera ta funkcja??


(Sawyer47) #14

sort: http://www.cplusplus.com/reference/algorithm/sort/