求代码的解析 和 设计思路框图

求下面的代码的步骤解析 越详细越好 还要设计框图 要写实验报告 谢谢~

#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数组即可。