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

C语言向二维数组添加新值前校验前序元素大小的实现方法

问题背景
  • 需求:向N行M列的二维整型数组按行依次录入数值,要求每个新录入的数值必须严格大于上一个录入的元素值
  • 现有实现仅完成了同一行内相邻元素的大小校验,存在两个问题:
    • 未校验每行第一个元素是否大于上一行的末尾元素
    • 每行首列元素未执行赋值操作,会读取到未初始化的内存垃圾值
  • 诉求:不需要为每一行单独编写判断分支,用统一逻辑完成所有前置值校验

原有实现代码如下:

#include <stdio.h>

#define N 3
#define M 5

void get_numbers()
{
    int i, j, number;
    int TABLE[N][M];
    
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < M; j++)
        {
            printf("Position: [%d, %d]: ", i+1, j+1);
            scanf("%d", &number);
            
            if (j > 0)
            {
                while (number < TABLE[i][j-1])
                {
                    printf("The new number should be larger than the previous one %d \n", TABLE[i][j-1]);
                    printf("Please try again\n");
                    
                    printf("Position: [%d, %d]: ", i+1, j+1);
                    scanf("%d", &number);
                }
                
                TABLE[i][j] = number;

            }
        }
    }   
}


int main () {
    get_numbers();
}
实现思路

不需要为每一行单独写判断,按行优先遍历的规则,所有非首个元素的前置值都可以通过统一规则定位:

  1. 数组第一个元素(i=0,j=0):无前置值,直接录入即可
  2. 当前位置不是行首(j>0):前置值为同一行的前一个元素 TABLE[i][j-1]
  3. 当前位置是行首但不是第一行(j=0 && i>0):前置值为上一行的最后一个元素 TABLE[i-1][M-1]

只需要先根据当前坐标算出前置值,再统一做大小校验和重输入逻辑即可,不需要拆分多套分支。

修正后代码
#include <stdio.h>

#define N 3
#define M 5

void get_numbers()
{
    int i, j, number;
    int TABLE[N][M];
    
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < M; j++)
        {
            printf("Position: [%d, %d]: ", i+1, j+1);
            scanf("%d", &number);
            
            // 非数组第一个元素,统一走校验逻辑
            if (!(i == 0 && j == 0))
            {
                int prev_val;
                // 统一规则定位前一个元素
                if (j > 0) {
                    prev_val = TABLE[i][j-1];
                } else {
                    prev_val = TABLE[i-1][M-1];
                }
                // 循环校验直到输入符合要求
                while (number <= prev_val)
                {
                    printf("The new number should be larger than the previous one %d \n", prev_val);
                    printf("Please try again\n");
                    
                    printf("Position: [%d, %d]: ", i+1, j+1);
                    scanf("%d", &number);
                }
            }
            // 所有位置校验通过后统一赋值,修复原代码首列未赋值的问题
            TABLE[i][j] = number;
        }
    }   
}


int main () {
    get_numbers();
    return 0;
}

内容的提问来源于stack exchange,提问作者devblack.exe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.06 16:15:43