[C] funkcja qsort operujaca na tablicy struktur

0

Mam napisac taki program (tresc w komentarzu), wszystko jest ok, tylko kompletnie nie wiem jak zrobic funkcje compare do quicksorta, ktora ma porownywac elementy (moduly) z kazdej struktury tworzacych tablice. Majac to compare poradze sobie z dalsza trescia zadania ;)

Ma ktos jakis pomysl na to compare?

z gory dzieki za pomoc

#include <stdio.h>
#include <time.h>
#include <math.h>
/*Skonstruuj strukturę, która ma 2 pola: zmienną zespoloną (struktura) oraz moduł liczby zespolonej. Zaalokuj pamięć dla jednowymiarowej tablicy struktur o rozmiarze podanym przez użytkownika, wypełnij ją liczbami losowymi podobnie jak w zadaniu poprzednim. Napisz funkcję typu void, która wypełni pole moduł pojedynczego elementu tablicy struktur. Wypisz tablicę na ekran w postaci:

|(5.000000+8.000000*i)|=9.433981
|(4.000000+8.000000*i)|=8.944272
|(3.000000+11.000000*i)|=11.401754
|(6.000000+9.000000*i)|=10.816654
|(5.000000+10.000000*i)|=11.180340
|(7.000000+12.000000*i)|=13.892444

Korzystając z funkcji bibliotecznej qsort posortuj tablicę struktur niemalejąco względem modułów. Wypisz wynik na ekran. Zademonstruj działanie funkcji bsearch na posortowanej tablicy. W przypadku nie znalezienia poszukiwanej wartości wypisz komunikat o błędzie. Jeżeli została znaleziona wartość o szukanym module wypisz jej indeks. */


typedef struct zesp
{
	float x;
	float y;
}zesp;

typedef struct zm
{
	float modul;
	zesp zesp;
}zm;
void fun(zm* a);

float compare (const void * a, const void * b)
{
	 float* arg1 = (float*) a;
     float* arg2 = (float*) b;
     if( *arg1 < *arg2 ) return -1;
     else if( *arg1 == *arg2 ) return 0;
     else return 1;
}


int main()
{
	srand(time(0));
	int n;
	scanf("%d", &n);
	
	zm *tab=(zm*)malloc(n * sizeof(zm));

	int i;
	for (i=0; i<n; ++i)
	{
		tab[i].zesp.x=6+rand()%(10-6+1);
		tab[i].zesp.y=5+rand()%(12-5+1);
	}

	for (i=0; i<n; ++i)
		fun(&tab[i]);

	for (i=0; i<n; ++i)
	        printf("|(%f + %fi)|=%f\n", tab[i].zesp.x, tab[i].zesp.y, tab[i].modul);
	
	
        printf("\n\n\n");
	qsort(tab, n, sizeof(float) ,compare);

	for (i=0; i<n; ++i)
	        printf("|(%f + %fi)|=%f\n", tab[i].zesp.x, tab[i].zesp.y, tab[i].modul);
	

	return 0;
}
void fun(zm* a)
{
	a->modul=sqrt((a->zesp.x*a->zesp.x)+(a->zesp.y*a->zesp.y));
}
0

http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/

Nagłówek qsorta:

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

Nagłówek Twojego komparatora:

float ( * comparator ) ( const void *, const void * )

Zmień typ zwracany z float (skąd Ci się to wzięło?) na int, i będzie działać.

I jeszcze:

typedef struct zesp
{
        float x;
        float y;
}zesp;

typedef struct zm
{
        float modul;
        zesp zesp; // <-- w tym miejscu kompilator krzyczal o niescislosci
}zm;

Proponowałbym nazwę struktury na pisaną wielką literą, w każdym razie jakkolwiek inaczej od nazwy pola w strukturze zm.

0

Inna konwencja nazewnictwa: dodaj do nazwy typu struktury przyrostek _t. Czyli nazywasz typ nie zesp, tylko zesp_t.

Czy compare na pewno jest OK? Mnie się zdaje, że nie. Argumenty a i b rzutuj nie na floaty, tylko na wskaźniki do struktury zm. I porównuj składowe tych struktur (masz tam składowe modul i zesp).

W końcu porównujesz elementy tablicy zawierającej zm. To, co masz teraz, może zadziałać, bo struktura zaczyna się od liczby float. IMO jednak to szemrana sprawa i taki zapis wprowadza w błąd. Lepiej żeby było wyraźnie widać, że funkcja porównuje dwa elementy typu zm.

Wywołanie qsort też nie jest OK. Jako rozmiar elementu podajesz sizeof(float), tymczasem elementy to struktury zm o_O. Zresztą przy mallocu napisałeś już zm.

0

ok, dzieki, taka postac compare dziala ok

int compare (const void * a, const void * b)
{
	 zm* arg1 = (zm*) a;
     zm* arg2 = (zm*) b;
     if( arg1->modul < arg2->modul ) return -1;
     else if( arg1->modul == arg2->modul ) return 0;
     else return 1;
}

0

Czyli problem rozwiązany -- świetnie. O taki zapis compare mi chodziło. Teraz widać co jest porównywane (no i nie bez znaczenia jest to, że zaczęło działać ;) ).

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