У меня есть почти полный код, мне нужно Qsort некоторые вещи, сначала у меня есть массив целых чисел, массив с плавающей точкой, а затем у меня есть структура с char и двойной комбинированный массив.Нужно как-то qsort их, но я застрял.
Вот мой код, у меня нет проблем с сортировкой целых чисел и чисел, но я не могу завершить сортировку структуры.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 20
typedef struct product
{
double price;
char name[LEN];
} product;
int ComparFuncInt(const void *x, const void *y);
int ConparFuncFloat(const void *x, const void *y);
int ComparFuncStructName(const void *x, const void *y);
int ComparFuncStructPrice(const void *x, const void *y);
/* void PrintIntegerArray(int *numbers, int len);
void PrintFloatArray(float *numbers, int len);
void PrintStructArray(product *items, int len);
*/
int main(void)
{
unsigned option;
/* initialized variables to be used with functions */
int numArr1[] = {15, 25, 3, 19, 22, 17, -54, 0, 9};
float numArr2[] = {76.40f, 11.2f, 235.4f, 76.50f, 341.6f};
product prices[] = {{0.75f, "Milk"}, {0.99f, "Yogurt"}, {3.19f, "Cucumber"},
{1.09f, "Orange"}, {0.80f, "Bread"}, {0.99f, "Juice"}};
int numCount = sizeof(numArr1) / sizeof(int);
float floatCount = sizeof(numArr2) / sizeof(float);
double doubleCount = sizeof(struct product) / sizeof(double);
char charCount = sizeof(struct product) / sizeof(char);
while (1)
{
printf("\n\nSelect your action!\n\n");
printf("1. Sort integers (numArr1)\n");
printf("2. Sort decimals (numArr2)\n");
printf("3. Sort structures by price\n");
printf("4. Sort structures by name\n");
printf("0. Exit\n");
scanf("%u", &option);
switch (option)
{
case 1:
qsort(numArr1, (size_t)numCount, sizeof(int), ComparFuncInt);
for (int i = 0; i < numCount; printf("%3d", numArr1[i]), i++);
break;
case 2:
qsort(numArr2, (size_t)floatCount, sizeof(float), ConparFuncFloat);
for (int j = 0; j < floatCount; printf("%.2f ", numArr2[j]), j++);
break;
case 3:
qsort(prices, (size_t)doubleCount, sizeof(double), ComparFuncStructPrice);
for (int k = 0; k < doubleCount; printf("%.2f ", prices[k].price), k++);
break;
case 4:
qsort(prices, (size_t)charCount, sizeof(char), ComparFuncStructName);
for (int l = 0; l < charCount; printf("%s", prices[l].name), l++);
break;
case 0:
exit(1);
break;
default:
printf("Only selections from 1 to 4 and 0 are accepted\n");
}
}
return EXIT_SUCCESS;
}
int ComparFuncInt(const void *x, const void *y){
if(* (int*)x > *(int*)y) return 1;
else if(* (int*)x < *(int*)y) return -1;
else return 0;
}
int ConparFuncFloat(const void *x, const void *y){
if(* (float *)x > *(float *)y) return 1;
else if(* (float *)x < *(float *)y) return -1;
else return 0;
}
int ComparFuncStructName(const void *x, const void *y){
const char *pa = *(const char**)x;
const char *pb = *(const char**)y;
return strcmp(pa,pb);
}
int ComparFuncStructPrice(const void *x, const void *y){
if(* (float *)x > *(float *)y) return 1;
else if(* (float *)x < *(float *)y) return -1;
else return 0;
}
Я хочу сделать это, так как когда пользователь выбирает 3, он идет и сортирует массив ЦЕН по категориям товаров, а если пользователь выбирает 4, он должен сортировать по именам, в обоих случаях он должен выводить как цену, так и имя, только разница вчто это было отсортировано.