Sortowanie char nie do końca dobrze sortuje

Sortowanie char nie do końca dobrze sortuje
MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 36
0
Kopiuj
   int i,j;     
     for(j=n-2;j>=0;j--)
     {
                         x=tablica[j];
                         i=j+1;
                         int comp=strcmp(x.nazwisko, tablica[i].nazwisko);
                         while(i<n && comp>0)
                         {
                         tablica[i-1]=tablica[i];
                         i++;
                          }
			 tablica[i-1]=x;
			 comp=strcmp(x.nazwisko, tablica[i].nazwisko);	
                                    
                         
                                                  
                         }          
                         }
                                
                               break;

Mam problem, bo to sortowanie przez wstawianie nie działa do końca. Sortuje nazwiska w ten sposób że poniższe dane są posortowane wg nazwisk, ale nie wszystkie. Pewnie jakiś głupi mój błąd ale potrzebuje pomocy
Przemyslaw Chlopek 2k 5.12
Ewelina Ciochon 2k 5.120
Agnieszka Cygan 2k 5.354
Grzegorz Cygan 2k 5.05
Michal Dadej 2k 6.01
Jaroslaw Fraczek 2k 5.242
Piotr Gawle 2k 5.121
Mateusz Hamowski 2k 5.144
Dariusz Rzepka 2k 4.445
Adrianna Pochron 2k 4.550
Bartlomiej Chamowski 2d 4.021

po sortowaniu wg nazwisk

Bartlomiej Chamowski 2d 4.021
Adrianna Pochron 2k 4.55
Dariusz Rzepka 2k 4.445
-------- dotąd dobrze ----
Mateusz Hamowski 2k 5.144
Piotr Gawle 2k 5.121
Jaroslaw Fraczek 2k 5.242
Michal Dadej 2k 6.01
Grzegorz Cygan 2k 5.05
Agnieszka Cygan 2k 5.354
Ewelina Ciochon 2k 5.12
Przemyslaw Chlopek 2k 5.12

Dlaczego? Jaki walnąłem błąd?

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 260
0

Porównaj 1 z listy i ostatnie z sortowania, 2 z listy i przedostatnie itp. To w ogóle nie sortuje.

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 36
0

Sortuje dopiero za drugim razem dobrze sam sobie odpowiedziałem na to pytanie, ma być wcześniej ponowne przypisanie do comp, w środku while'a

Macron napisał(a)

Porównaj 1 z listy i ostatnie z sortowania, 2 z listy i przedostatnie itp. To w ogóle nie sortuje.

Już działa ! A brzmi teraz tak i wiedz, że coś się dzieje

Kopiuj
 {
                         struct UCZEN x;
                                                  
     int i,j;     
     for(j=n-2;j>=0;j--)
     {
                         x=tablica[j];
                         i=j+1;
                         
                         int comp=strcmp(x.nazwisko, tablica[i].nazwisko);
                         while(i<n && comp>0)
                         {
                         tablica[i-1]=tablica[i];
                         i++;
                         comp=strcmp(x.nazwisko, tablica[i].nazwisko);
                          }
			 tablica[i-1]=x;
			 	
                                    
                         
                                                  
                         }          
                         }
                           

Jak macie jakieś sugestie co do kodu walcie

MJ
  • Rejestracja: dni
  • Ostatnio: dni
0

Podałem Ci algorytm sortowania, to czemu go nie przepisałeś tak jak tam było, wystarczyło zamienić na składowe struktury.

Kopiuj
#include <iostream>
#include <cstring>
using namespace std;

const int R = 3;

typedef struct
 {
 char imie[20];
 char nazwisko[40];
 char klasa[10];
 float srednia;
 } UCZEN;

void sortuj(UCZEN*);

int main()
{
	UCZEN tablica[R];

	cout << "Wprowadz dane:\n";

	for(int i = 0; i < R; i++)
	{
		cout << "Imie: ";
			cin >> tablica[i].imie;

		cout << "Nazwisko: ";
			cin >> tablica[i].nazwisko;

		cout << "Klasa: ";
			cin >> tablica[i].klasa;

		cout << "Srednia: ";
			cin >> tablica[i].srednia;
	}

	
	sortuj(tablica);

	for(int i = 0 ; i < R; i++)
		cout << "Imie: " << tablica[i].imie << " Nazwisko: " << tablica[i].nazwisko << " Klasa: " << tablica[i].klasa << " Srednia: " << tablica[i].srednia << endl;

	system("pause");
	return 0;
}

void sortuj(UCZEN* tab)
{
	int i,j;
	UCZEN x;
      
    for(j = 1; j < R; j++)
    {
		x = tab[j];
        i = j;
		while(i > 0 && strcmp(tab[i - 1].imie, x.imie) > 0)
        {
			tab[i] = tab[i - 1];
            i--;
        }
        
		tab[i] = x;
    }
}

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.