C++结构体实现汽车信息按价格升序排序作业求助
汽车按价格升序排序的实现方案
你已经搞定了从文件提取汽车信息到结构体的部分,接下来要实现按价格从低到高排序的功能对吧?我给你两种实用的实现思路,以C语言为例(如果是其他编程语言,核心逻辑是相通的):
方案一:用标准库qsort快速搞定(推荐)
C标准库的qsort函数是成熟的快速排序实现,只需要写一个比较两个汽车价格的回调函数就行,省心又高效:
首先假设你的结构体定义是这样的(如果字段名不一样,调整即可):
typedef struct { int year; char make[50]; char model[50]; double price_per_day; bool available; } Car;
然后写比较函数,用来告诉qsort怎么判断两个汽车的价格顺序:
// 按价格从低到高排序的比较函数 int compareCarsByPrice(const void *a, const void *b) { const Car *carA = (const Car *)a; const Car *carB = (const Car *)b; // 浮点数不能直接相减返回int,得用判断逻辑 if (carA->price_per_day < carB->price_per_day) { return -1; // carA排在carB前面 } else if (carA->price_per_day > carB->price_per_day) { return 1; // carA排在carB后面 } else { return 0; // 价格相同,保持原顺序 } }
最后在主逻辑里调用qsort排序,再输出结果:
int main() { // 假设你已经从文件读取并填充了这个汽车数组 Car cars[] = { {2014, "Toyota", "Tacoma", 45.25, false}, {2015, "Ford", "Fusion", 71.27, true}, // 其他汽车数据... }; int carCount = sizeof(cars) / sizeof(cars[0]); // 执行排序 qsort(cars, carCount, sizeof(Car), compareCarsByPrice); // 输出排序后的结果(和你给出的片段格式一致) for (int i = 0; i < carCount; i++) { printf("%d %s %s, $%.2f per day, Available: %s\n", cars[i].year, cars[i].make, cars[i].model, cars[i].price_per_day, cars[i].available ? "True" : "False"); } return 0; }
方案二:手动实现冒泡排序(适合理解底层逻辑)
如果想自己写排序逻辑,冒泡排序是最容易理解的,适合学习阶段:
// 手动实现按价格升序的冒泡排序 void sortCarsByPrice(Car cars[], int count) { for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count - i - 1; j++) { // 如果前一个车价格比后一个高,就交换位置 if (cars[j].price_per_day > cars[j+1].price_per_day) { Car temp = cars[j]; cars[j] = cars[j+1]; cars[j+1] = temp; } } } } // 使用的时候直接调用:sortCarsByPrice(cars, carCount); 再输出即可
几个要注意的细节
- 价格类型转换:如果从文件读取的价格是带
$的字符串(比如"$45.25"),一定要先转换成double类型再比较,不然字符串比较会出错(比如"$100"会被认为比"$99"小)。 - 浮点数比较精度:如果需要判断价格是否相等,尽量不要直接用
==,可以用fabs(carA->price_per_day - carB->price_per_day) < 0.0001这种方式,避免浮点数精度问题导致的错误。 - 你的输出验证:从你给出的片段来看,价格更低的Toyota Tacoma已经排在前面了,说明排序逻辑是正确的,只要把所有汽车数据都放进数组里排序,就能得到完整的升序列表。
内容的提问来源于stack exchange,提问作者chrisHG




