[C] Sortowanie alfabetyczne tablicy wyrazów.

jimmyp
Użytkownik
Użytkownik
Posty: 49
Rejestracja: 25 paź 2011, o 21:47
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 16 razy

[C] Sortowanie alfabetyczne tablicy wyrazów.

Post autor: jimmyp »

Witam wszystkich.
Mam do napisania program sortujący alfabetycznie wyrazy w tablicy, ale niestety nie do końca mi to wychodzi. Jestem początkujący, na pewno piszę wiele głupot, ale proszę o nie wyśmiewanie, a pomoc w zrozumieniu i wyjaśnienie moich błędów . Oto co udało mi się wyklepać:

Kod: Zaznacz cały

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

#define ROZMIAR 5

char* nieposortowane[]={ {"bbb"}, {"aaa"}, {"ddd"}, {"eee"}, {"ccc"} };

int porownaj(int a, int b)
{
    int _a = *(int*)a;
    int _b = *(int*)b;
    if(_a < _b) return -1;
    else if(_a == _b) return 0;
    else return 1;
}

void wstawianie(int* tablica, int N)
{
    int i, j, tmp;
    for(i=1; i<N; i++)
    {

        tmp=tablica[i];

        j=i-1;
        while(j>=0 && porownaj(tablica[j],tmp))
        {
            tablica[j+1]=tablica[j];
            j--;
		}
        tablica[j+1]=tmp;
    }
}


void wypisz(char* tablica[], int N)
{
    int i=0;
    for(i=0;i<N;i++)
        printf("%s
", *(tablica+i));
}


void kopiuj(char* skad, char* dokad, int N)
{
    int i;
    for(i=0;i<N; i++)
        *(dokad++)=*(skad++);
}


int main()
{
    char tablica[ROZMIAR];

    printf("Przed sortowaniem: 
");
    wypisz(nieposortowane, ROZMIAR);

    kopiuj(nieposortowane, tablica, ROZMIAR);
    wstawianie(tablica, ROZMIAR);

    printf("Po sortowaniu przez wstawianie: 
");
    wypisz(tablica, ROZMIAR);

    return 0;
}
Kartezjusz
Użytkownik
Użytkownik
Posty: 7330
Rejestracja: 14 lut 2008, o 08:31
Płeć: Mężczyzna
Lokalizacja: Z Bielskia-Białej
Podziękował: 6 razy
Pomógł: 961 razy

[C] Sortowanie alfabetyczne tablicy wyrazów.

Post autor: Kartezjusz »

Co masz wejściowe ,a co wyjściowe. Czy ma sortować tylko te wyrażenia,co są w definicji?
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Sortowanie alfabetyczne tablicy wyrazów.

Post autor: Afish »

Poniżej moje komentarze do kodu:

Kod: Zaznacz cały

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

#define ROZMIAR 5

char* nieposortowane[]={ {"bbb"}, {"aaa"}, {"ddd"}, {"eee"}, {"ccc"} }; 

int porownaj(int a, int b) // Domyślam się, że ta funkcja miała porównywać stringi pod względem zawartości, zapoznaj się z funkcją strcmp z biblioteki standardowej.
{
    int _a = *(int*)a; // Cóż zrobi operacja *(int*)a? Najpierw zrzutuje inta na wskaźnik do inta, a potem wyłuska wartość, czyli ostatecznie nie zrobi nic
    int _b = *(int*)b;
    if(_a < _b) return -1;
    else if(_a == _b) return 0;
    else return 1;
}

void wstawianie(int* tablica, int N) // Dlaczego tablica intów? Poza tym nazwa funkcji jest troszkę niespójna z resztą
{
    int i, j, tmp; // Tutaj temp powinien być wskaźnikiem na char
    for(i=1; i<N; i++)
    {

        tmp=tablica[i];

        j=i-1;
        while(j>=0 && porownaj(tablica[j],tmp)) // Ten warunek nie zadziała, funkcja porównaj zwraca 3 rodzaje wartości: dodatnią, ujemną i zero. Powinieneś kręcić się tak długo, jak długo ta wartość jest dodatnia.
        {
            tablica[j+1]=tablica[j];
            j--;
      }
        tablica[j+1]=tmp;
    }
}


void wypisz(char* tablica[], int N) 
{
    int i=0;
    for(i=0;i<N;i++)
        printf("%s
", *(tablica+i)); // Dlaczego przy użyciu wskaźnika? Wprawdzie jest to tożsame, ale chyba czytelniej jest wypisać jako tablica[i]
}


void kopiuj(char* skad, char* dokad, int N) // Tutaj musisz mieć wskaźniki na c-stringi, czyli wskaźniki na wskaźniki
{
    int i;
    for(i=0;i<N; i++)
        *(dokad++)=*(skad++); // Analogicznie chyba lepiej jako dokad[i] oraz skad[i]
}


int main()
{
    char tablica[ROZMIAR]; // Tutaj masz tablicę charów, a powinieneś mieć tablicę wskaźników na chary (bo c-string jest tablicą znaków)

    printf("Przed sortowaniem: 
");
    wypisz(nieposortowane, ROZMIAR);

    kopiuj(nieposortowane, tablica, ROZMIAR);
    wstawianie(tablica, ROZMIAR);

    printf("Po sortowaniu przez wstawianie: 
");
    wypisz(tablica, ROZMIAR);

    return 0; 
}
A poniżej działający kod:
Ukryta treść:    
Dla czystości wypadałoby jeszcze pozmieniać wskaźniki na stałe wskaźniki (czy też wskaźniki do stałych), poprawić nazwę funkcji oraz zmienić wartość zwracają z maina, ale to szczegóły.
ODPOWIEDZ