You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动