C语言随机数生成与冒泡排序函数化后输出全0问题求助
问题解决:排序函数输出全0的原因及修复方案
问题根源
randomNum函数里的int num[SIZE]是局部数组,函数执行完后,这块内存会被系统回收,生成的随机数根本留不下来。sort函数又重新定义了一个初始全为0的局部数组,相当于排序的是一堆0,自然输出全0。- 原代码还没实现需求里的菜单选择逻辑,也没做“必须先选功能1才能选功能2”的限制。
修复方案
下面提供两种实用的修复方式,同时补上菜单和功能依赖的逻辑:
方案1:用全局数组共享数据
把数组定义在所有函数外面,让randomNum和sort都能访问同一组数据:
#include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 100 #define N 10 #define INVALID 0 #define VALID 1 // 全局数组,所有函数共享 int num[SIZE] = {0}; // 标记是否已生成随机数 int is_generated = INVALID; void randomNum() { int i = 0; srand(time(NULL)); for(i = 0; i < SIZE; i++) { num[i] = rand() % 901; } // 按10行10列输出 for(i = 0; i < SIZE; i++) { printf("%4d", num[i]); if(i % 10 == 9) printf("\n"); } is_generated = VALID; } void sort() { if(is_generated == INVALID) { printf("请先生成随机数序列!\n"); return; } int i, j, temp; // 优化后的冒泡排序:每轮减少不必要的比较 for (i = 0 ; i < SIZE - 1; i++) { for (j = 0; j < SIZE - 1 - i; j++) { if (num[j] > num[j+1]) { temp = num[j]; num[j] = num[j+1]; num[j+1] = temp; } } } // 输出排序结果 for(i = 0; i < SIZE; i++) { printf("%4d", num[i]); if(i % 10 == 9) printf("\n"); } } void showMenu() { printf("\n===== 功能菜单 =====\n"); printf("1. 生成随机数序列并输出\n"); printf("2. 排序序列并输出\n"); printf("3. 退出程序\n"); printf("请输入选择:"); } int main() { int choice; do { showMenu(); scanf("%d", &choice); switch(choice) { case 1: randomNum(); break; case 2: sort(); break; case 3: printf("程序已退出\n"); break; default: printf("输入无效,请重新选择!\n"); } } while(choice != 3); return 0; }
方案2:通过指针传递数组(避免全局变量)
把数组定义在main函数里,通过指针传递给两个功能函数,更符合模块化编程的习惯:
#include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 100 #define N 10 #define INVALID 0 #define VALID 1 void randomNum(int num[]) { int i = 0; srand(time(NULL)); for(i = 0; i < SIZE; i++) { num[i] = rand() % 901; } for(i = 0; i < SIZE; i++) { printf("%4d", num[i]); if(i % 10 == 9) printf("\n"); } } void sort(int num[]) { int i, j, temp; for (i = 0 ; i < SIZE - 1; i++) { for (j = 0; j < SIZE - 1 - i; j++) { if (num[j] > num[j+1]) { temp = num[j]; num[j] = num[j+1]; num[j+1] = temp; } } } for(i = 0; i < SIZE; i++) { printf("%4d", num[i]); if(i % 10 == 9) printf("\n"); } } void showMenu() { printf("\n===== 功能菜单 =====\n"); printf("1. 生成随机数序列并输出\n"); printf("2. 排序序列并输出\n"); printf("3. 退出程序\n"); printf("请输入选择:"); } int main() { int num[SIZE] = {0}; int choice; int is_generated = INVALID; do { showMenu(); scanf("%d", &choice); switch(choice) { case 1: randomNum(num); is_generated = VALID; break; case 2: if(is_generated == INVALID) { printf("请先生成随机数序列!\n"); break; } sort(num); break; case 3: printf("程序已退出\n"); break; default: printf("输入无效,请重新选择!\n"); } } while(choice != 3); return 0; }
额外说明
- 优化了冒泡排序的循环次数:每轮排序后,末尾的
i个元素已经有序,不需要重复比较。 - 增加了
is_generated标记,严格执行“必须先选功能1才能选功能2”的需求。 - 实现了菜单循环选择,直到用户主动退出。
内容的提问来源于stack exchange,提问作者arsenalmartinelli
相关产品推荐
相关产品推荐

