You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问结构体中的患者记录并实现冒泡排序重排?

患者记录结构体数组排序解决方案

你的核心问题是不需要单独交换单个字段,直接交换整个records结构体实例即可,因为结构体是值类型,赋值操作会自动拷贝所有关联的患者信息(ID、性别、姓名等)。以下是具体修改方案:

关键修改点

  • 把结构体定义移到main()函数外部,方便后续逻辑访问类型。
  • 替换不完善的排序逻辑:基于冒泡排序(适配你代码的雏形),根据选择的分类比较对应字段,交换整个结构体。
  • 优化输出代码,用循环替代硬编码的10个元素,提升可读性和维护性。

修改后的完整代码

#include <iostream>
#include <cstring>
#include <iomanip>
#include <fstream>

using namespace std; 
const int NUM_PATIENTS = 10;
const int MAX_NAME_LENGTH = 10;
const int SIZE = 10;
const int SIZE2 = 10;

// 结构体定义移到main外部,便于全局访问
struct records
{
    string firstName;
    string lastName;
    string sex;
    int age;
    int id;
};

int main()
{
    int x;
    string category;
    do{
        cout << "Please select a sorting category" << endl;
        cin >> category;
        if (category == "Age")
        {
            cout << "Case 1, sorting by age" << endl;
            x = 1;
        }
        else if (category == "ID")
        {
            cout << "Case 2, sorting by ID" << endl;
            x = 2;
        }
        else if (category == "Sex")
        {
            cout << "Case 3, sorting by sex" << endl;
            x = 3;
        }
        else if (category == "Last")
        {
            cout << "Case 4, sorting by last name" << endl;
            x = 4;
        }
        else if (category == "First")
        {
            cout << "Case 5, sorting by first name" << endl;
            x = 5;
        }
        else 
        {
            cout << "invalid input" << endl;
            x = 6;
        }
    } while (x == 6);

    records record[SIZE];

    ifstream in ("patientInfo.txt");
    if (!in)
    {
        cout << "ERROR OPENING FILE" << endl;
        return 1; // 打开失败直接退出程序
    }
    else 
    {
        for (int i = 0; i < SIZE; i++)
        {
            in >> record[i].age >> record[i].id >> record[i].firstName >> record[i].lastName >> record[i].sex;
        }

        // 冒泡排序实现
        for (int i = 0; i < SIZE - 1; i++)
        {
            for (int j = 0; j < SIZE - i - 1; j++)
            {
                bool needSwap = false;
                // 根据选择的分类判断是否需要交换
                switch(x)
                {
                    case 1: needSwap = (record[j].age > record[j+1].age); break;
                    case 2: needSwap = (record[j].id > record[j+1].id); break;
                    case 3: needSwap = (record[j].sex > record[j+1].sex); break;
                    case 4: needSwap = (record[j].lastName > record[j+1].lastName); break;
                    case 5: needSwap = (record[j].firstName > record[j+1].firstName); break;
                }
                // 交换整个结构体实例,自动拷贝所有字段
                if (needSwap)
                {
                    records temp = record[j];
                    record[j] = record[j+1];
                    record[j+1] = temp;
                    // 也可以用std::swap(record[j], record[j+1]); 需要额外#include <algorithm>
                }
            }
        }
    }

    // 优化输出:用循环遍历所有患者,添加表头增强可读性
    cout << "\nSorted Records:" << endl;
    cout << setw(10) << "Age" << setw(10) << "ID" << setw(15) << "First Name" << setw(15) << "Last Name" << setw(10) << "Sex" << endl;
    cout << "------------------------------------------------------------------------" << endl;
    for (int i = 0; i < SIZE; i++)
    {
        cout << setw(10) << record[i].age 
             << setw(10) << record[i].id 
             << setw(15) << record[i].firstName 
             << setw(15) << record[i].lastName 
             << setw(10) << record[i].sex 
             << endl;
    }

    return 0;
}

核心逻辑说明

  1. 结构体交换:当需要调整患者顺序时,直接交换整个records变量,这样该患者的所有关联信息(年龄、ID、姓名等)会被完整交换,无需单独处理每个字段。
  2. 排序逻辑:使用冒泡排序,通过switch语句根据用户选择的分类,判断相邻两个结构体是否需要交换,逻辑清晰且易于扩展。
  3. 输出优化:用循环遍历输出所有患者信息,添加表头后结果更直观,避免了硬编码带来的冗余和维护问题。

内容的提问来源于stack exchange,提问作者leialeia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:08:12