weixin_46147489 2021-01-31 11:28 采纳率: 100%
浏览 230
已结题

在C语言中用二维数组输出直角杨辉三角形,数组的初始化与否为何会影响数组的输出结果?

大神们好!!

问题如题所示。

  • 首先,可以正确输出数组结果的代码如下:
  • #include<stdio.h>
    int main(void)
    {
            int m,n;
            int a[20][20];                          //数组初始化
            for(m=0;m<20;m++){
                    for(n=0;n<20;n++){
                            a[m][n]=0;
                    }
            }
            
            int row;
            printf("please input row number:");
            scanf("%d",&row);                       //通过输入指定输出的三角形行数
    
            int i,j;                                //声明行、列下表变量
            for(i=0;i<row;i++){                     //外循环,控制行
                    for(j=0;j<=i;j++){              //内循环,控制列,循环条件为元素的列下标小于等于元素的行下标
                            if(j==0||i==j){         //垂直边和斜边为1的条件
                                    a[i][j]=1;
                            }else{
                                    a[i][j]=a[i-1][j-1]+a[i-1][j];//除了垂直边和斜边的元素
                            }
                    printf("%4d",a[i][j]);          //输出
                    }
            printf("\n");
            }
    
            return 0;
    }
    
  • 正确的输出结果
  •  

  • 然后我把数组初始化的这一部分代码删掉,只定义二维数组:
  • #include<stdio.h>
    int main(void)
    {
    
            int row;
            printf("please input row number:");
            scanf("%d",&row);                       //通过输入指定输出的三角形行数
    
            int i,j;                                //声明行、列下表变量
            int a[i][j];                            //定义二维数组
            for(i=0;i<row;i++){                     //外循环,控制行
                    for(j=0;j<=i;j++){              //内循环,控制列,循环条件为元素的列下标小于等于元素的行下标
                            if(j==0||i==j){         //垂直边和斜边为1的条件
                                    a[i][j]=1;
                            }else{
                                    a[i][j]=a[i-1][j-1]+a[i-1][j];//除了垂直边和斜边的元素
                            }
                    printf("%4d",a[i][j]);          //输出
                    }
            printf("\n");
            }
    
            return 0;
    }
    
  • 然后问题来了! TT:

      为何从第4行开始,每行的第3个元素到斜边之间元素都是a[i][j]=a[i+1][j-1]+a[i+1][j]?(正确的应该是a[i][j]=a[i-1][j-1]+a[i][j-1])

本人初学小白,望大神们指点,感激不尽! TT

  • 写回答

8条回答 默认 最新

  • 八云黧 2021-01-31 12:13
    关注

    这不是数组初始化的问题,而是声明的问题,因为你的int i,j是未初始化的变量,值是系统自动分配的,而你声明a的时候使用了变量i,j,导致你的数组的长和宽变成了随机的数值,运行结果也就和这种随机有关,我试验了一下,当i被分配到一个大数字的时候,j被分配到0的时候就会出现你这样的错误;而在我的电脑上跑的时候分配到0,j分配到了一个大数字,结果是根本运行不来,会产生段错误。

    int a[20][20]是一个数组声明,而下面的循环才是数组初始化,事实上你的想法是对的,不经过初始化的也是可以使用的,但你的声明却用到了未初始化的整型变量,如果你直接使用a[20][20]结果就正确了。

    事实上直接使用20是一种预先分配的思想,但是不足以应对变化,你可以通过输入的行数精确计算出需要的数组长宽然后再进行声明,这样就不会出现当数组某一维度超过20而能产生的越界异常。当然,你也可以预先定义成100000这样一个较大的数字,一般情况也足以满足使用。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含
  • ¥15 麒麟V10桌面版SP1如何配置bonding