搜尋某個價位之間的產品
先依品牌名稱排序
同一品牌再依照評價從高到低排序
評價相同再依照價位由低價到高價排序
提示:
1. 自己寫一個字串比對的函數,只比對品牌名稱,也就是兩個字串從開頭一直比到到第一個空白出現為止。如果都完全一樣就傳回 0 ,否則就依照字元 ASCII 大小傳回 正值或負值。
2. 呼叫 qsort 進行排序,主要任務是把 qsort 需要的 compare 函數寫出來
3. 都用指標陣列,讓排序的動作只會改變指標,而不需要真的搬動 data item。
範例程式:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// #define ONLINE_JUDGE
/*
struct for product items
*/
typedef struct _Product {
char name[51];
float price;
float review;
int num_reviews;
} Product;
int compare(const void *a, const void *b)
{
Product *ia, *ib;
ia = *(Product **)a;
ib = *(Product **)b;
/* your code here */
}
int my_strcmp(char *s1, char *s2)
{
/* your code here */
}
int compare_name(const void *a, const void *b)
{
/* your code here */
}
void show_product(Product *item)
{
printf("%s, ", item->name);
printf("$%.2f, ", item->price);
printf("%.1f\n", item->review);
}
int main(void)
{
Product **items;
int i, j;
int ndata, nqueries;
Product **filtered;
float lower, upper;
int num;
#ifndef ONLINE_JUDGE
freopen("testcase2", "r", stdin);
//freopen("out1", "w", stdout);
#endif
scanf("%d", &ndata);
while (getchar() !='\n');
items = (Product**) malloc(sizeof(Product*) * ndata);
for (i=0; i<ndata; i++) {
items[i] = (Product*) malloc(sizeof(Product));
fgets(items[i]->name, 31, stdin);
items[i]->name[strlen(items[i]->name)-1] = '\0';
scanf("%f", &items[i]->price);
scanf("%f", &items[i]->review);
scanf("%d", &items[i]->num_reviews);
while (getchar() !='\n');
}
scanf("%d", &nqueries);
while (getchar() !='\n');
qsort(items, ndata, sizeof(Product *), compare);
filtered = (Product**) malloc(sizeof(Product*) * ndata);
for (i=0; i<nqueries; i++) {
scanf("%f%f", &lower, &upper);
printf("%.2f<=price<=%.2f\n", lower, upper);
/* your code here */
}
for (i=0; i<ndata; i++) {
free(items[i]);
}
free(items);
free(filtered);
return 0;
}
第一行的數字代表有幾個產品
接著每四行代表一個產品的資訊:
產品名稱
產品價格
產品評價
產品評價數
再來是一個數字,代表有幾筆 query
之後的每一行代表一筆 query
每筆 query 由兩個數字組成,代表價格區間
根據每筆 query 輸出:
價格下限<=price<=價格上限
產品名稱1, 產品價格1, 產品評價1
...
產品名稱N, 產品價格N, 產品評價N
每一個價格區間下面可能會接好幾個產品
請依照題目要求將這些產品排序好