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

二维数组右对角线元素无法完整显示问题求助

问题分析与代码修正

原代码的核心问题

  1. 内层循环条件错误:查找对角线的内层循环写了for (j = 0; i < m; j++),这里循环条件依赖i的值,但i在内层循环中不会被修改——如果初始i < m,循环会无限执行导致程序假死;如果i >= m,循环直接跳过,完全找不到元素。
  2. 提前终止程序:if分支内的return 0会在找到第一个符合条件的元素后直接退出整个程序,自然只能输出第一个元素。
  3. 对角线判断逻辑错误:i+j ==n不符合右对角线(副对角线)的数学逻辑,且用两层循环遍历所有元素效率极低。
  4. 冗余头文件:代码引入了<cmath>(C++头文件,C语言不适用)和未用到的<math.h>、<ctype.h>,属于无效依赖。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main () {
    double a[100][100];
    int n, m;
    int i, j;
    srand(time(NULL));
    
    scanf("%d", &n);
    scanf("%d", &m);
    
    // 随机填充二维数组
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            a[i][j] = 0.09 * (rand() % 1000) - 0.5;
        }
    }
    
    // 打印整个数组
    printf("Array A[N][M]:\n");
    for (i = 0; i < n; i++) {
        printf("\n");
        for (j = 0; j < m; j++) {
            printf("%6.0f", a[i][j]);
        }
    }
    
    // 打印右对角线(从右上角到左下角的斜线)元素
    printf("\n\nElements of the right diagonal are:\n");
    // 直接通过行索引计算对应列索引,避免无效遍历
    for (i = 0; i < n; i++) {
        j = (m - 1) - i;
        // 确保列索引在合法范围内,避免数组越界
        if (j >= 0 && j < m) {
            printf("%6.0f\t", a[i][j]);
        }
    }
    
    return 0;
}

修正说明

  • 循环逻辑优化:去掉了冗余的内层循环,直接通过j = (m-1)-i计算右对角线的列索引,既高效又避免了循环条件错误。
  • 移除提前终止:删除了if内的return 0,保证程序能输出所有符合条件的对角线元素。
  • 越界保护:添加j >=0 && j <m的判断,确保只访问数组内的有效元素,避免非法内存访问。
  • 清理冗余依赖:删除了未使用的头文件和变量,让代码更简洁规范。

内容的提问来源于stack exchange,提问作者Lvrnnk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:35:27