控制台程序比较字符串数组时无响应,求冒泡排序实现姓氏排序
解决二维账户数组的冒泡排序问题(按姓氏字母序)
嘿,我看你在给从文件读取的账户数据做冒泡排序时卡壳了——尤其是调用sortInput函数时出了问题,还没搞定按姓氏字母排序的逻辑。咱们一步步拆解问题,再给你调整后的可运行代码参考。
首先,先补全并修正你没写完的sortInput函数代码,这里假设你的姓氏存储在每个账户数组的第1列(你可以根据实际存储位置修改lastNameColumn的值):
void sortInput(string theAccounts[5][7]) { bool swapped; // 把变量名从swap改成swapped,避免和标准库函数冲突 string temp; const int numAccounts = 5; // 明确账户数量,方便后续修改 const int lastNameColumn = 1; // 重点:改成你实际存储姓氏的列索引! do { swapped = false; // 冒泡排序内层循环:遍历到倒数第二个元素,防止越界 for (int r = 0; r < numAccounts - 1; ++r) { // 比较当前行和下一行的姓氏,按字母序判断是否需要交换 if (theAccounts[r][lastNameColumn] > theAccounts[r+1][lastNameColumn]) { // 交换整行的所有账户数据,避免姓氏和其他字段错位 for (int c = 0; c < 7; ++c) { temp = theAccounts[r][c]; theAccounts[r][c] = theAccounts[r+1][c]; theAccounts[r+1][c] = temp; } swapped = true; // 标记发生了交换,需要继续循环 } } } while (swapped); // 当没有交换发生时,说明数组已经有序 }
几个关键的注意事项(你之前可能踩坑的地方):
- 确认姓氏的列索引:这是最容易出错的点!你必须明确从文件读取的账户数据里,姓氏存在二维数组的哪一列(比如如果第一列是用户ID,第二列是姓氏,那索引就是1),如果这个值错了,排序逻辑完全不对。
- 交换整行而不是单个字段:如果只交换姓氏字段,会导致姓氏和账户的其他信息(比如名字、账号)不匹配,所以要循环交换整行的7个字段。
- 避免变量名冲突:原代码里用了
swap作为变量名,但std::swap是C++标准库的函数,容易引发编译错误,改成swapped更安全。 - 循环边界正确:内层循环要到
numAccounts - 1,因为每次要比较r和r+1,如果循环到numAccounts,r+1就会超出数组范围,导致越界错误。
额外测试建议:
- 在调用
sortInput前后,分别打印整个二维数组的内容,对比排序前后的变化,确认姓氏是否按字母序排列。 - 检查文件读取逻辑:确保从文件读取的每一行数据都正确存入了二维数组的对应列,有没有出现行错位、字段遗漏的情况——如果读取本身就错了,排序肯定也不对。
内容的提问来源于stack exchange,提问作者bbrand0n
相关产品推荐
相关产品推荐

