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(); }
实现思路
不需要为每一行单独写判断,按行优先遍历的规则,所有非首个元素的前置值都可以通过统一规则定位:
- 数组第一个元素(
i=0,j=0):无前置值,直接录入即可 - 当前位置不是行首(
j>0):前置值为同一行的前一个元素TABLE[i][j-1] - 当前位置是行首但不是第一行(
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
相关产品推荐
相关产品推荐

