求下面的代码的步骤解析 越详细越好 还要设计框图 要写实验报告 谢谢~
#include
int main()
{
int a[20][20],n,c=1,flag=1;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
if(flag==1)
{
for(int k=0;k<=i;k++)
{
a[k][i-k]=c++;
}
}
else
{
for(int j=0;j<=i;j++)
{
a[i-j][j]=c++;
}
}
flag=-flag;
}
flag=-1;
if(n%2==1)
{
for(int i=n-1;i>=1;i--)
{
if(flag==-1)
{
for(int j=0;j<i;j++)
{
a[n-1-j][n-i+j]=c++;
}
}
else
{
for(int k=0;k<i;k++)
{
a[n-i+k][n-1-k]=c++;
}
}
flag=-flag;
}
}
else
{
for(int i=n-1;i>=1;i--)
{
if(flag==-1)
{
for(int k=0;k<i;k++)
{
a[n-i+k][n-1-k]=c++;
}
}
else
{
for(int j=0;j<i;j++)
{
a[n-1-j][n-i+j]=c++;
}
}
flag=-flag;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
设计思路框图:
1.开始
2.声明变量(数组a、n、c、flag)
3.输入n
4.循环n次,当flag为1时,从(0,0)开始向右上方赋值,当flag为-1时,从(i,0)开始向左下方赋值,每次循环结束将flag置为-flag。
5.当n为奇数时,从(n-1,0)开始向右下方填充,从下一行开始,当flag为-1时,从(n-1,i)开始向左上方赋值,当flag为1时,从(n-i-1,n-1)开始向右下方赋值,每次循环结束将flag置为-flag。
6.当n为偶数时,从(n-1,0)开始向左下方填充,从下一行开始,当flag为-1时,从(n-i-1,n-1)开始向上右方赋值,当flag为1时,从(n-1,i)开始向右下方赋值,每次循环结束将flag置为-flag。
7.输出矩阵a
8.结束
代码步骤解析:
1.首先定义了一个二维整形数组a[20][20],还有n,c,flag三个整形变量。
2.用scanf函数输入n。
3.进入循环,循环n次,当flag为1的时候,从0到i列,从i的行数开始向左下赋值,即a[k][i-k]的位置等于c,c每次自增1,完成后flag取值为-1;当flag为-1的时候,从0到i行,从i的列数开始向左下赋值,即a[i-j][j]的位置等于c,c每次自增1,完成后flag取值为1。
4.循环结束后,当n为奇数的时候,从(n-1,0)开始向右下赋值,每次向右下边界扩散,当flag为-1的时候,从(n-1,i)到(n-i-1,n-1)的位置向上右方赋值,即a[n-i+k][n-1-k]的位置等于c,c每次自增1,每次循环结束flag取反,当flag为1的时候,从(n-i-1,n-1)到(n-1,i)的位置向右下赋值,即a[n-1-j][n-i+j]的位置等于c,c每次自增1,每次循环结束flag取反。
5.当n为偶数的时候同理,只是从(n-1,0)开始向左下赋值,每次向左边界扩散,当flag为-1的时候,从(n-i-1,n-1)到(n-1,i)的位置向上右方赋值,即a[n-i+k][n-1-k]的位置等于c,c每次自增1,每次循环结束flag取反,当flag为1的时候,从(n-1,i)到(n-i-1,n-1)的位置向右下赋值,即a[n-1-j][n-i+j]的位置等于c,c每次自增1,每次循环结束flag取反。
6.循环结束后输出a数组即可。