Sortowanie przez wstawianie - problem z wypisaniem.

0

Cześć!
Dostałem za zadanie napisać program, który będzie sortował pewne dane. Najpierw mam posortować studentów według ich indeksów, następnie imion a potem nazwisk. Problem jest w tym, że nie mogę znaleźć sposobu na "połączenie" ze sobą tych danych, nie mam żadnego pomysłu na to. Nie pisałbym tutaj, gdybym nie przesiedział nad tym kilka dobrych godzin :D Tutaj jest screen jak to wygląda. Indeksy nie łączą się z odpowiednimi imionami i nazwiskami. W kodzie nie uwzględniłem wypisywania imion i nazwisk, gdyż kolejność była niepoprawna. Próbowałem za pomocą struktury, lecz tak samo nie znalazłem na to rozwiązania. Jakieś podpowiedzi? Nie jestem zbyt dobry w ANSI C :D

KOD:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int studenci[15];

    printf("____________LISTA STUDENTOW_________\n");
    studenci[0]=" 150001    Jan         Kowalski";
    studenci[1]=" 150033    Pawel       Nowak";
    studenci[2]=" 150450    Andrzej     Wolny";
    studenci[3]=" 150601    Przemyslaw  Duda";
    studenci[4]=" 150331    Szymon      Wolny";
    studenci[5]=" 150232    Kamil       Stoch";
    studenci[6]=" 150686    Robert      Lewandowski";
    studenci[7]=" 150111    Piotr       Zielinski ";
    studenci[8]=" 150326    Piotr       Zyla";
    studenci[9]=" 150780    Justyna     Kowalczyk";

    for(int x=0;x<10;x++)
    {
        printf("%s\n",studenci[x]);
    }

    int pom[10];

    pom[0]=150001;
    pom[1]=150033;
    pom[2]=150450;
    pom[3]=150601;
    pom[4]=150331;
    pom[5]=150232;
    pom[6]=150686;
    pom[7]=150111;
    pom[8]=150326;
    pom[9]=150780;

    int c;
    int d;
    int t;
    int n=10;
    int i;

    for(c=1;c<=n-1;c++)
    {
     d=c;
        while (d>0&&pom[d-1]>pom[d])
        {
        t=pom[d];
        pom[d]=pom[d-1];
        pom[d-1]=t;
        d--;
        }

    }

printf("____PO POSORTOWANIU_____\n");

for(i=0;i<10;i++)
{
    printf("%d\n",pom[i]);
}

}
1

studenci to tablica int-ów, jakim cudem ma pamiętać nazwiska?
Proponuję zapoznać się z konceptem struktury, i zdefiniować sobie następującą:

struct DaneStudenta
{
   int numerIndeksu;//te numerki u ciebie przypisywane do pom[] to indeksy, tak?
   char imie[30];
   char nazwisko[50];
}

następnie stworzyć tablicę struktur:

DaneStudenta studenci[15];

i wypełniać je wg wzorca:

studenci[indeks_tablicy].numerIndeksu = 150001;
/* trik - tablice do przechowywania imienia i nazwiska prawdopodobnie trzeba 
strcpy(studenci[indeks_tablicy].imie, "Imie1");
strcpy(studenci[indeks_tablicy].nazwisko, "Nazwisko1");

ot i tyle.

0

Właśnie nie mogę znaleźć sposobu na przypisanie string'a do konkretnej wartości indeksu. Przed posortowaniem wszystko jest OK. Wszystko się sypie dopiero po posortowaniu.
Spróbuję sposobem, który podałeś.

EDIT: Stworzyłem strukturę, lecz dalej brakuje mi funkcji, która by "śledziła" to, jak porusza się dany indeks w czasie sortowania.
KOD:

#include <stdlib.h>
#include <stdio.h>

int main()
{
    typedef struct student
	{
		int indeks;
		char imie[30];
		char nazwisko[50];
	} student;

    struct student lista[]=
    {
      { 150100, "Jan         ", "Kowalski" }, //1
      { 150032, "Andrzej     ", "Duda" }, //2
      { 150045, "Adam        ", "Kopacz" },  //3
      { 150670, "Przemyslaw  ", "Bak"},//4
      { 150311, "Jakub       ", "Janda"},   //5
	  { 150456, "Kamil       ", "Stoch"},   //6
	  { 150099, "Damian      ", "Nowak"},  //7
	  { 150125, "Daniel      ", "Chmielowiec"},//8
	  { 150189, "Gabriela    ", "Marzec"},//9
	  { 150333, "Marek       ", "Szybki"},  //10
	  { 150671, "Elzbieta    ", "Zasowska"},//11
    };

     int i=0;

     for(i;i<11;i++)
        {
            printf("NR INDEKSU: %d", lista[i].indeks);
            printf("   IMIE: %s",lista[i].imie);
            printf(" NAZWISKO: %s\n",lista[i].nazwisko);
        }

      int n=11;
      int d;
      int t;
      int x;
      int j;

        for(j=0;j<n-1;j++)
        {
            d=j;
                while(d>0&&lista[d-1].indeks>lista[d].indeks)
                {
                    t=lista[d].indeks;
                    lista[d].indeks=lista[d-1].indeks;
                    lista[d-1].indeks=t;
                    d--;
                }

        }
printf("%s", "\n_________________PO POSORTOWANIU INDEKSOW________________\n");
printf("%s", "__________________________________________________________\n");
        for(x=0;x<n;x++)
        {
            printf("NR INDEKSU: %d   IMIE: %s NAZWISKO: %s\n",lista[x].indeks,lista[x].imie,lista[x].nazwisko);
        }
}

W załączniku jest screen, jak działa program.

Jest jakaś funkcja, która by zamieniała string'i? Coś ala strcpy, tyle, że ta funkcja kopiuje zamiast zamieniać. Myślę, że jakbym wrzucił w pętlę sortowania funkcję, która by zamieniała string'i a nie je kopiowała to by coś zdziałało. Ktoś coś?

0

Twój błąd polega na tym, że sortując przenosisz indeksy, gdy tymczasem należy przenieść całą instancję struktury student.
Co może być przydatne do skopiowania instancji studenta - funkcja memcpy()

0

Że ja na to nie wpadłem :D zapewne muszę po prostu podmienić w pętli while lista[d].indeks na lista[d] i będzie po sprawie :) dam znać jak wrócę z wykładu :D
EDIT: może jednak źle myślę, ale sam muszę przy tym posiedzieć i posprawdzać, też myślałem nad funkcją memcpy :)

1

Funkcja memcpy jest tutaj nieodpowiednia. Powinieneś użyć zwyczajnego przypisania (czyli innymi słowy nie musisz zmieniać w kodzie zamieniania nic), brakuje Tobie jeszcze funkcji, która porównuje z sobą dwa obiekty typu struct student.

0

O porównanie których obiektów chodzi? Mam stworzyć drugą strukturę i przyrównać ją do początkowej? Wynik nie będzie czasami identyczny?

0

Masz stworzyć funkcję, która porównuje struktury. Całe. Dla intów istnieje taka "funkcja", jest to operator <. Chcesz mieć funkcję cmp taką, że cmp(s1, s2) == 1 gdy s2 ma się znaleźć dalej w posortowanej liście, cmp(s1, s2) == 0 gdy są równe oraz cmp(s1, s2) == -1, gdy s1 ma na tej liście być dalej.

1

@siliconek: porównywanie indeksów według których chcesz sortować masz dobrze, tych funkcji o jakich wspomina enedil nie potrzebujesz.
Natomiast kopiowanie struktur można jak się okazuje zrobić bez memcpy, zgodnie z sugestią @enedil

t = lista[d];
lista[d] = lista[d-1];
lista[d-1] = t;

1 użytkowników online, w tym zalogowanych: 0, gości: 1