Sortowanie elementów

0

Witam. Mam następny problem. Otóż chcę posortować elementy w bazie danych, znajdujące się w strukturze, jednak coś mi nie wychodzi. Program nie sortuje danych, mimo że próbowałem wielu pomysłów, algorytmów i nic ;/ Jestem początkującym programistą więc proszę o pomoc.Program wygląda tak:

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

typedef struct
{
    char imie[15];
    int id;
}dane;

dane imiona[10];

....
int sortuj();
...

int main()
{
....
sortuj();
....
}
....
sortuj()
{
    char eniek, *do_enka, *first, *next;
    imie = fopen("D:\\baza_danych\\data\\imie.bin","r");
    for(i=1; i<wiersz; i++)
    {
        fscanf(imie, "%s", imiona[i].imie);
    }


    for(i=1; i<wiersz; i++)
    {
        first = &imiona[i].imie;
        next = &imiona[i+1].imie;
        char tmp;
        if(first > next)
        {
            for(i=0; i<wiersz; i++)
            {
                tmp = first;
                first = next;
                next = tmp;
                printf("%d : %s\n", i, first);
            }
        }

    }
} 
0

Nie początkującym programistą, tylko osobą uczącą się programowania. To dosyć spora różnica.

W funkcji sortuj jako granicy pętli używasz zmiennej wiersz, lecz nigdzie nie widzę jej deklaracji ani inicjalizacji. Przetrzymywanie id danego elementu w strukturze w Twoim wypadku nie ma sensu, bo nie zamieniasz kolejnością obiektów typu dane, ale same imiona, więc zawsze masz id 0,1...n. Przy porównywaniu masz dwie pętle z tą samą granicą - "wiersz". Zastanawiałeś się choć przez chwilę jak taki program będzie działa i co będzie robił? Jeśli tak to sam powinieneś móc odpowiedzieć na swoje pytanie. Jeżeli nie, to poszukaj sobie najprostszego algorytmu jakim jest chociażby sortowanie bąbelkowe.

0

Ok, chcę posortować elementy bublesortem, ale mam mały problem, ponieważ otrzymuję nieposortowaną listę:

int sortuj_ros()
{
    int i, j;
    DANE *imieh, *imiehp, *cox;
    imieh = &imiona[i];
    imieh->imie;
    imiehp = &imiona[i+1];
    imiehp->imie;
    cox = &imiona[i];
    cox->temp;
    imie = fopen("D:\\baza_danych\\data\\imie.bin","r");
    for(i=1; i<wiersz; i++)
    {
        fscanf(imie, "%s", imiona[i].imie);
    }
    for (j = 1; j<wiersz; j++)
    {
            for (i=1; i<wiersz-1; i++)
            {
                if (imieh > imiehp)
                {
                    cox = imiehp;
                    imiehp = imieh;
                    imieh = cox;
                    ++imieh;
                    ++imiehp;
                    printf("Imie %d : %s\n", j, imieh);
                }
            }
    }

} 

Bardzo prosze o pomoc :(

0

I co, wpadł ktoś na jakiś pomysł? :D

0

A mógłbyś pomóc mi zmienić ten kod? Nie chodzi o to że mi się nie chce, ale nie za bardzo wiem jak to zrobić;/

0

Musisz posortować po id (używając po prostu wsk->id przy porównywaniu i *wsk przy zamianie elementów), albo po imieniu używając do porównywania np. funkcji strcmp.

0

Zrobiłem tak:

for(i=0; i<N && change; i++)
    {
        change = 0;

        for(j=0; j<N-1-i; j++)
        {
            if(strcmp(imiona[j+1].imie, imiona[j].imie) < 0)
            {
                tmp = imiona[j];
                imiona[j] = imiona[j+1];
                imiona[j+1] = tmp;
                change = 1;
            }
        }
        printf("Element %d : %s\n", i, imiona[i].imie);

    } 

Nie wiem czemu nie działa. Zależy mi na tym, żeby to dzisiaj skończyć. Pomoże ktoś?? :)

0
  1. for(i = 1; i < N - 1; ++i)
  2. strcpy(temp, dane[i]);
  3. j = i
  4. While(j > 0 and strcmp(dane.imie[j - 1], dane.imie[j]) > 0)
    5. dane[j] = dane[j - 1]
    6. dane[j - 1] = temp
    7. j--
  5. strcpy(dane[j], temp);
0

MJay wielkie dzięki :) na razie mi to nie działa ale trochę przerobie i będzie ok :)

0

Wiem że przynudzam, ale muszę to dzisiaj zrobić. Niestety sortowanie mi nie działa. Kod programu:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
typedef struct
{
    char imie[15];
    char tnp[15];
}DANE;

DANE imiona[N], temp[N];

podaj();
wyswietl();
sortuj();

int i, j, change;
change = 1;

int main()
{

    podaj();
    wyswietl();
    printf("\n");
    printf("Elementy posortowane\n");
    sortuj();




    return 0;
}
podaj()
{
    for(i=0; i<N; i++)
    {
        printf("Podaj imie nr %d : ", i);
        scanf("%s", imiona[i].imie);
    }
}
wyswietl()
{
    for(i=0; i<N; i++)
    {
        printf("Imie nr %d : %s\n", i, imiona[i].imie);
    }
}
sortuj()
{
    char *wsk;
    wsk = &temp[i].tnp;
    for(i = 0; i < N - 1; ++i)
    {
        j = i;
        while(j > 0 && strcmp(imiona[i - 1].imie, imiona[i].imie) > 0)
        {
            temp[i] = imiona[i];
            imiona[i] = imiona[i - 1];
            imiona[i - 1] = temp[i];
            j--;
        }
    }
    for(i = 0; i < N; ++i)
    {
        printf("Imie nr %d : %s\n", i, imiona[i].imie);
    }
}
0

Pomoże ktoś? :)

0

Sorry pomylka. Tam ma byc i= 1. Poza tym ma byc wszedzie j zamiast i.

Co twoje funkcje zwracaja u Ciebie? Kazda funkcja musi cos zwracac
Poza tym nie tworz tablicy temp tylko w petli while stworz pojedynczy element DANE temp = imiona[j]

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