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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:40:23