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ć:
#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;
}
#include <stdio.h>
#include <string.h>
#define ROZMIAR 5
char* nieposortowane[]={ "bbb", "aaa", "xxddd", "eee", "ccadsdasc" };
int porownaj(char* a, char* b) // Tę funkcję zostawiam jedynie po to, żebyś wiedział, jak ją zamienić.
{
return strcmp(a, b);
}
void wstawianie(char** tablica, int N)
{
int i, j;
char* tmp;
for(i=1; i<N; i++)
{
tmp=tablica[i];
j=i-1;
while(j>=0 && porownaj(tablica[j],tmp) > 0)
{
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[i] = skad[i];
}
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;
}
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.