[C] Sortowanie liter funkcją qsort

Awatar użytkownika
Assassin-Girl
Użytkownik
Użytkownik
Posty: 76
Rejestracja: 22 lut 2013, o 18:32
Płeć: Kobieta
Lokalizacja: Maczu-Pikczu
Podziękował: 33 razy

[C] Sortowanie liter funkcją qsort

Post autor: Assassin-Girl »

Cześć.

Mam do napisania program, który po wylosowaniu liter (dużych i małych) ma je posortować funkcją qsort w każdym wierszu w tablicy w taki sposób:

PRZED: bBaA
PO: AaBb

Oto mój kod:

Kod: Zaznacz cały

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

char losuj();
int cmp();

int main()
{
	int i,j;
	int ilosc_lancuchow, dlugosc_napisu;
	char **tab;

	ilosc_lancuchow=1;
	dlugosc_napisu=5;

	//char **tab=(char**)malloc(100*15*sizeof(char*));

	tab=(char**)malloc(ilosc_lancuchow*dlugosc_napisu*sizeof(char*));

	for(i=0;i<ilosc_lancuchow;i++)
	{
		tab[i]=(char*)malloc(dlugosc_napisu*sizeof(char)); // tab[i] !!! !!! !!! !!!
	}

	for(i=0;i<ilosc_lancuchow;i++)
	{
		for(j=0;j<dlugosc_napisu;j++)
		{
			tab[i][j]=losuj();
			printf("%c",tab[i][j]);
		}
		
		printf("
");
		
	}

	for(i=0;i<ilosc_lancuchow;i++)
		qsort(tab[i],dlugosc_napisu,sizeof(char),cmp);
		
	printf("
");
		
	for(i=0;i<ilosc_lancuchow;i++)
	{
		for(j=0;j<dlugosc_napisu;j++)
		{
			printf("%c",tab[i][j]);
		}

		printf("
");
	}

	for(i=0;i<ilosc_lancuchow;i++)
	{
		free(tab[i]);
	}

		free(tab);
}

char losuj()
{
	int j;
	static int i=1;
	char znak;

	if(i)
	{
		srand(time(0));
		i=0;
	}

	znak=rand()%25+65;
	j=rand()%2;

	if(j)
	{
		znak+=(97-65);
	}

	return znak;
}

int cmp(const void *a, const void *b)
{
	char c,d;
	c=*(char*)a;
	d=*(char*)b;
	
	if(c>=65 && c<=90)
	{
		if(d>=65 && d<=90)
		{
			if(c>d)
				return 1;
			else if(c<d)
				return -1;
			else
				return 0;
		}
		else
		{
			if(d-c==32)
				return -1;
		}
	}
	else
	{
		if(d>=65 && d<=90)
		{
			if(c-d==32)
				return 1;
		}
		else
		{
			if(c>d)
				return 1;
			else if(c<d)
				return -1;
			else
				return 0;
		}
	}
}
Jestem niemalże pewna, że problem tkwi w funkcji cmp. Prowadzący stwierdził, że jest wg niego napisana dobrze, więc powinno wszystko działać, a nie działa.

Za wskazówki będę niezmiernie wdzięczna.
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 liter funkcją qsort

Post autor: Afish »

Z pewnością jest napisana źle, gdyż dla 65 <= c <= 90 i d > 90 i d - c != 32 funkcja zwraca nieokreśloną wartość.
1. Stosowanie stałych liczbowych to zło, nie lepiej zamiast 65 użyć 'A' ? Pomijam fakt, że są różne kodowania i 65 wcale nie musi oznaczać literki 'A'.
2. Skoro nie masz pewności, czy funkcja jest poprawna, to ją przetestuj. Napisz mały program sprawdzający wszystkie przypadki przy użyciu tej funkcji i zweryfikuj, czy działa poprawnie.
3. Masz cztery przypadki: wielka z wielką, wielka z małą, mała z wielką i mała z małą. Napisz cztery funkcje dla każdego przypadku.
ODPOWIEDZ