如何访问结构体中的患者记录并实现冒泡排序重排?
患者记录结构体数组排序解决方案
你的核心问题是不需要单独交换单个字段,直接交换整个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; }
核心逻辑说明
- 结构体交换:当需要调整患者顺序时,直接交换整个
records变量,这样该患者的所有关联信息(年龄、ID、姓名等)会被完整交换,无需单独处理每个字段。 - 排序逻辑:使用冒泡排序,通过
switch语句根据用户选择的分类,判断相邻两个结构体是否需要交换,逻辑清晰且易于扩展。 - 输出优化:用循环遍历输出所有患者信息,添加表头后结果更直观,避免了硬编码带来的冗余和维护问题。
内容的提问来源于stack exchange,提问作者leialeia
相关产品推荐
相关产品推荐

