C语言谁能帮我写个for循环给二维数组赋值

用for循环把Scorecard[25][25]数组赋成图片中注释的样子,谢谢

如图


注释非常完整,代码请在网页端查看(哪有用手机看代码的,不好看)

#include<stdio.h>
#define N 25 //生成的矩阵的阶数(行、列数),注意!必须为奇数
void main()
{
int Scorecard[N][N];
if(N%2==1) //N必须为奇数
{
int num=8; //要赋值的数字 åˆå§‹ä¸ºçŸ©é˜µæ­£ä¸­å¿ƒçš„æ•°å­—(提问者设的是8)
int max=N/2,min=max; //大循环中 ä»Žä¸­å¿ƒå‘外一圈圈赋值的 æœ€å¤§(max)、最小(min)行数。
Scorecard[max][max]=num; //先赋值中心。提示:数组下标为(整形)25/2=12则为第13行(数组下标是从0开始数的)。
do{ //大循环:一圈圈赋值,扩大圈圈
int i; //用于小循环的临时变量
if(num>0)num--; //num逐圈减小,直到为0
max++; min--; //行列的最大最小值调整(扩大圈圈)
for(i=min ; i<=max ;i++) //小循环 ä¸¤è¡Œã€ä¸¤åˆ—同时赋值
{
Scorecard[min][i]=num; //第 min行 èµ‹å€¼
Scorecard[max][i]=num; //第 max行 èµ‹å€¼
Scorecard[i][min]=num; //第 min列 èµ‹å€¼
Scorecard[i][max]=num; //第 max列 èµ‹å€¼
} //圈圈的四个角会重复赋值两次,方便理解,当然可以改进到无重复赋值。
}while(min>0); //当min减少到0时,说明第一行和最后一行都赋值完毕了
}
//打印验证结果
{int i,j; //用于打印遍历的行i列j
for(i=0; i<N ; i++)
{
for(j=0; j<N ; j++) printf("%d ",Scorecard[i][j]); //打印数字
printf("\n"); //打印完一行要换行
}
}

}追问

谢谢

追答

楼上代码看似很简短,其实是TA没有注释,而且代码都尽量缩在一起了。
我的代码更加简单易懂,如果有不明白的请追问,甚至可以问楼上的代码是怎么理解的。

无重复赋值的改进版如下图,只要改小循环即可,效率更高。

for(i=min ; i<max ;) //小循环 两行、两列同时赋值
{ //圈圈的四个角无重复赋值!前面是从 min赋值到max-1
Scorecard[min][i]=num; //第 min行 向右 赋值
Scorecard[i][max]=num; //第 max列 向下 赋值
i++; //中间插入i++后 就变成了 min+1赋值到max了
Scorecard[i][min]=num; //第 min列 向下 赋值
Scorecard[max][i]=num; //第 max行 向右 赋值
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-02-20
直接写不就好了,别用循环了。
第2个回答  2018-02-20

#include<stdio.h>
int a[25][25];
int main()
{int i,j,k,k1;
 for(i=0;i<25;i++)
 {for(j=0;j<25;j++)
  {k=i<12?i:24-i;
   k1=j<12?j:24-j;
   if(k1<k)k=k1;
   k-=4;
   if(k<0)k=0;
   a[i][j]=k;
   printf("%-2d",a[i][j]);
  }
  printf("\n");
 }
 return 0;
}

相似回答