Sortowanie tablic - co robię źle?

Sortowanie tablic - co robię źle?
R6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

witam mam problem z posortowaniem tablic według jednego elementu. co jest źle ?

Kopiuj
for(int kk=0;kk<99;kk++){
    for(int bb=0;bb<99;bb++){
        if((tablica[bb][1])<(tablica[bb+1][1])){
            cout<<tablica[bb][1]<<" "<<tablica[bb+1][1]<<endl;
            //cout<<"wieksza"<<endl;

            //swap(tablica[0],pomocnicza[0]);
            //pomocnicza[0][0]=tablica[bb+1][0];
            //pomocnicza[0][1]=tablica[bb+1][1];

            swap(tablica[bb],tablica[bb+1]);
            //tablica[bb+1][0]=tablica[bb][0];
            //tablica[bb+1][1]=tablica[bb][1];

            //swap(tablica[0],pomocnicza[0]);
            //tablica[bb][0]=pomocnicza[0][0];
            //tablica[bb][1]=pomocnicza[0][1];
        }
    }

poprawienie formatowania kodu - fp

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Jedno z (wystarczy że jedno, możliwe że wszystko naraz):

  1. Wyłazisz poza zakres (najbardziej prawdopodobne)
  2. Nie wiesz wg którego elementu sortujesz
  3. Nie wiesz co wymieniasz w swap.

Do stwierdzenia co konkretnie brakuje definicji i deklaracji tablicy.

R6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

problem polega na tym że jeśli w pętli if wsio jest przypisane wszystko ładnie ale jeśli wyjdę poza zakres to już wsio wraca do normy przed sortowaniem.

R6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0
Kopiuj
float tablica[100][2];
float pomocnicza[1][2];

dodanie znacznika <code class="cpp"> - fp

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Nie możesz tak skopiować tablicy jak to próbujesz robić.

Kopiuj
swap(tablica[bb][0],tablica[bb+1][0]);
swap(tablica[bb][1],tablica[bb+1][1]);

lub:

Kopiuj
float pomocnicza[2];
memcpy(pomocnicza,tablica[bb],2*sizeof(float));
memcpy(tablica[bb],tablica[bb+1],2*sizeof(float));
memcpy(tablica[bb+1],pomocnicza,2*sizeof(float));

Nazywaj zmienne angielskimi nazwami.
Nie nazywaj zmiennych nic nieznaczącymi nazwami typu bb już lepiej dla indeksów w pętlach stosować nazwy i,k.

R6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

nie działa.:(

R6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0
Kopiuj
if(strcmp(argv[i], "-trzy")==0){

    float tablica[100][2];
    float pomocnicza[1][2];
                        //float pomocnicza2[1][2];

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

                    for(int k=0;k<50;k++){

                        if((ludziska[i].oznaczenie.compare(waluty[k].oznaczenie))==0){

                            tablica[i][0]=i;
                            tablica[i][1]=(ludziska[i].zadluzenie*waluty[k].kde);
                        }
                                //else break;
                    }

                }
                        
            for(int kk=0;kk<100;kk++){

                for(int bb=0;bb<99;bb++){

                    if((tablica[bb][1])<(tablica[bb+1][1])){

                        cout<<tablica[bb][1]<<" "<<tablica[bb+1][1]<<endl;
                        cout<<"wieksza"<<endl;

                        memcpy(pomocnicza[0],tablica[bb],2*sizeof(float));
                        memcpy(tablica[bb],tablica[bb+1],2*sizeof(float));
                        memcpy(tablica[bb+1],pomocnicza[0],2*sizeof(float));


                    }
                }
                            //else cout<<"mniejsza"<<endl;
                }
                for(int kk=0;kk<3;kk++){

                    int liczba=tablica[kk][0];
                    cout<<tablica[liczba][0]<<endl;
                            /
                }
            }

zmniejszenie wcięć w kodzie - fp

unikalna_nazwa
  • Rejestracja: dni
  • Ostatnio: dni
0

za długi ten program
to Twoje sortowanie wygląda na upośledzone bubblesort (nie przerywasz sortowania gdy już jest posortowane)

w każdym razie czy musisz się tak męczyć, nie możesz skorzystać z gotowej funkcji sortującej?
nie znam się na c++ ale można zrobić choćby

Kopiuj
int sortuj_wedlug_drugiej_kolumny(const void *a, const void *b)
{
	float fa = ((float*)a)[1],
		fb = ((float*)b)[1];
	return fa < fb ? -1 : fa > fb ? 1 : 0;
}
Kopiuj
qsort(tablica, /* l. el */ sizeof(tablica) / sizeof(tablica[0]), /* roz. el */ sizeof(tablica[0]), sortuj_wedlug_drugiej_kolumny);

//

Kopiuj
for(int kk=0;kk<3;kk++){
int liczba=tablica[kk][0];
cout<<tablica[liczba][0]<<endl;

nie bardzo rozumiem co ten fragment kodu miał robić, ale robi to że wyciąga indeks pierwszych trzech po posortowaniu krotek (w tablica[x][0] wpisujesz indeksy)
następnie pokazuje indeks elementów pod tymi indeksami - czyli totalnie losowe dane bo to jakie indeksy zostaną przypisane do liczba zależy od danych

R6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

powiem tak na wyrzucenie kodu nie ma czasu... kod długi bo wygodnie mi się z funkcji używa... co 13 smoku co masz na myśli odnośnie tej inicjalizacji zmiennych ? chodzi Ci o to że nie przypisuje od razu jakieś wartości? unikalna nazwa to coś drugie wyświetla mi dany index w tablicy struktur.. chodzi o to że do każdej wartości tzn zadłużeniu w ojro przypisałem sobie jaki indeks ma gościu który był takim idiotom, że się zadłużał.... i potem mam wyświetlić 3 takich baranów. i problem polega na tym że w momencie sortowania tzn w pętli if wartości są dobre czyli widać że coś jest większe a coś mniejsze i wykrywany jest warunek po posortowaniu wsio wyglada tak jakby sie to wsio z sortowaniem przez kołdrę macało ...

unikalna_nazwa
  • Rejestracja: dni
  • Ostatnio: dni
0
rastaman697 napisał(a):

unikalna nazwa to coś drugie wyświetla mi dany index w tablicy struktur.. chodzi o to że do każdej wartości tzn zadłużeniu w ojro przypisałem sobie jaki indeks ma gościu który był takim idiotom, że się zadłużał.... i potem mam wyświetlić 3 takich baranów. i problem polega na tym że w momencie sortowania tzn w pętli if wartości są dobre czyli widać że coś jest większe a coś mniejsze i wykrywany jest warunek po posortowaniu wsio wyglada tak jakby sie to wsio z sortowaniem przez kołdrę macało ...

no to chyba się pomyliłeś w kodzie bo korzysta z tej samej tablicy

najpierw wypełniasz tablicę powiedzmy tak:

tablica:
0 => {0, 0.52345}
1 => {2, 0.42355}
2 => {1, 0.62345}

potem ją sortujesz według drugiej kolumny czyli otrzymujesz:

0 => {2, 0.42355}
1 => {0, 0.52345}
2 => {1, 0.62345}

potem w pętli przypisujesz do zmiennej liczba, tablica[k][0], a następnie wypisujesz tablica[liczba][0] czyli kolejno robisz tak:

k = 0
liczba = tablica[k][0] = 2
wypisujesz tablica[liczba][0] = {1, 0.62345}[0] = 1

k = 1
liczba = 0
tablica[0][0] = 2

k = 2
liczba = 1
wypisujesz: 0

totalnie bez sensu i wygląda to tak jakby tablica była posortowana losowo (to jaki indeks się wyświetli zależy od zadłużenia wszystkich pozostałych)

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Podsumowując, ta pętla powinna wyglądać tak:

Kopiuj
for(int kk=0;kk<3;++kk)
  {
   int i=tablica[kk][0];
   cout<<ludziska[i].nazwisko<<' '<<ludziska[i].imie<<' '<<ludziska[i].zadluzenie<<endl;
  }

Z tym że w tym kodzie jest takich kwiatków znacznie więcej. Kod nadaje się wyłącznie do śmietnika.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.