C语言,我想输出一个趣味二维数组如下,有代码以及数组,为什么会输出随机数?求网友们指点?

#include<stdio.h>
#include<stdlib.h>
int main()
{
int **a,i,j,n;
printf("input n:");
scanf("%d",&n);
a=(int**)malloc(n*sizeof(int*));
for(i=1;i<=n;i++)
a[i]=(int*)malloc(n*sizeof(int));
for(i=1;i<=(n+1)/2;i++)
{
for(j=i;j<=n+1-i;j++)
{
a[i][j]=i;
a[n+1-i][j]=i;
}
for(j=i+1;j>=n-i;j--)
{
a[j][n+1-i]=i;
a[j][i]=i;
}
}
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");}
}
1 1 1 1 1
1 2 2 2 1
1 2 0 2 1
1 2 2 2 1
1 1 1 1 1

第1个回答  2015-01-17
我输入了5,出现的结果如下:
input n:5
1 1 1 1 1
-842150451 2 3 2 -33686019
-842150451 2 3 2 -33686019
-842150451 2 3 2 -33686019
1 1 1 1 1
分析后认为是正常的,它并不是随机数,而是乱码。

出现乱码的原因是:前面你定义了一个二维5*5数组,后面一系列的赋值语句:
or(i=1;i<=(n+1)/2;i++)
{
for(j=i;j<=n+1-i;j++)
{
a[i][j]=i;
a[n+1-i][j]=i;
}
for(j=i+1;j>=n-i;j--)
{
a[j][n+1-i]=i;
a[j][i]=i;
}
虽然看起来让人眼花缭乱,但仅仅对a[1][1]-a[1][5],a[2][2]-a[2][4],a[3][2]-a[3][4],a[4][2]-a[4][4],a[5][1]-a[5][5]赋了值(其中还有几处是重复赋值的),所以打印出来的那些类似于-842150451之类的乱码,是你没有赋值而致。并不是产生的随机数。
第2个回答  2015-01-17
#include<stdio.h>
#include<stdlib.h>
int a[50][50];
int main()
{
   int i,j,n;
   printf("input n:");
   scanf("%d",&n);
   for(i=1;i<=(n+1)/2;i++)
   {
 for(j=i;j<=n+1-i;j++)
 {
 a[i][j]=i;
 a[n+1-i][j]=i;
 }
 for(j=i+1;j>=n-i;j--)
 {
 a[j][n+1-i]=i;
 a[j][i]=i;
 }
   }
     for(i=1;i<=n;i++)
{  for(j=1;j<=n;j++)
  printf("%d ",a[i][j]);
printf("\n");}
}

因为你没有初始化数组,如果像我这样定义数组的话,最终会输出

input n:5
1 1 1 1 1
0 2 3 2 0
0 2 3 2 0
0 2 3 2 0
1 1 1 1 1

第3个回答  推荐于2017-09-16
看看这样行不行:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int **a,i,j,n;
printf("input n:");
scanf("%d",&n);
a=(int**)malloc(n*sizeof(int*));
for(i=0;i<n;i++)
a[i]=(int*)malloc(n*sizeof(int));
for(i=0;i<=n/2;i++)
{
for(j=i;j<n-i;j++)
{
a[i][j]=i+1;
a[n-i-1][j]=i+1;
}
for(j=i;j<n-i;j++)
{
a[j][n-i-1]=i+1;
a[j][i]=i+1;
}
}
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
printf("%4d ",a[i][j]);
printf("\n");}
}本回答被提问者采纳