C++冒泡排序程序输出内存地址异常及均值中位数实现问题
C++家庭规模统计程序问题修复
核心错误原因
- 直接输出数组名得到内存地址:C++中cout输出数组名时,数组会退化为首元素指针,打印的结果就是数组的内存首地址,需要遍历数组逐个输出元素才能得到正确内容。
- 排序长度错误:当前代码用
sizeof(householdSizes)/sizeof(householdSizes[0])得到的是数组总容量300,而非实际输入的有效数据条数,未输入的位置都是垃圾值,会导致排序结果完全错误,应该使用输入循环结束后记录的有效条数x作为排序长度。 - 缺少sum累加逻辑:输入环节没有累加每个家庭规模到sum变量,无法后续计算均值。
- 缺少均值、中位数的计算与输出逻辑。
修复后完整代码
// HouseholdSize.cpp - 本程序通过冒泡排序对最多300条家庭规模数据升序排列,输出均值和中位数 // 输入:交互式输入家庭规模,输入999结束 // 输出:家庭规模的均值和中位数 #include <iostream> using namespace std; void swapping(int &a, int &b) { int temp = a; a = b; b = temp; } void bubbleSort(int householdSizes[], int size) { for(int i = 0; i < size; i++) { bool swaps = false; for(int j = 0; j < size - i - 1; j++) { if(householdSizes[j] > householdSizes[j+1]) { swapping(householdSizes[j], householdSizes[j+1]); swaps = true; } } if(!swaps) break; } } int main() { const int SIZE = 300; int householdSizes[SIZE]; int x = 0; int householdSize = 0; double sum = 0; double mean = 0; double median = 0; cout << "请输入家庭规模,输入999退出: "; cin >> householdSize; while(x < SIZE && householdSize != 999) { householdSizes[x] = householdSize; sum += householdSize; // 累加总和用于计算均值 x++; cout << "请输入家庭规模,输入999退出: "; cin >> householdSize; } if(x == 0) { cout << "未输入任何有效数据" << endl; return 0; } // 排序,仅传入有效数据长度x bubbleSort(householdSizes, x); // 输出排序后的数组 cout << "排序后的家庭规模:"; for(int i = 0; i < x; i++) { cout << householdSizes[i] << " "; } cout << endl; // 计算均值 mean = sum / x; cout << "均值:" << mean << endl; // 计算中位数 if(x % 2 == 1) { median = householdSizes[x/2]; } else { median = (householdSizes[x/2 -1] + householdSizes[x/2]) / 2.0; } cout << "中位数:" << median << endl; return 0; }
额外优化说明
- 移除了原代码中未使用的头文件,减少编译开销
- 增加了空输入的校验,避免除以0的错误
- 修正了swaps变量的类型为bool,和实际使用逻辑匹配
内容的提问来源于stack exchange,提问作者Ryan Waldman
相关产品推荐
相关产品推荐

