一个c程序难题程序期待高手优化(程序我已写好)
望高手在看完小弟的程序后能优化,使程序更精炼!!题目:打印一个 N*N的方阵,N为每边字符的个数(3<N<20),要求最外层为“X”,第二层为“Y”,从第三层起每次依次打印数字0,1,2,3……
例如:当N=5时
X X X X X
X Y Y Y X
X Y 0 Y X
X Y Y Y X
X X X X X
程序:
#include <stdio.h>
#include <memory.h>
#define N 5//本程序构造并打印的方阵的边长为5
void small_partition(char a[N][N]);
void Print_Array(char a[N][N]);
void Copy(char a[N][N]);
/****************************************
*函数:int main(int argc,char *argv[])
*功能:构造方阵并打印
*****************************************/
int main(int argc,char *argv[])
{
char a[N][N];//N*N方阵
memset(a,0,N*N);
small_partition(a);
Copy(a);
Print_Array(a);
return 0;
}
/****************************************
*函数:void small_partition(char a[N][N])
*功能:构造方阵的八分之一
*说明:构造出的八分之一位于左上角
*****************************************/
void small_partition(char a[N][N])
{
int i = 0;//行
int j = 0;//列
if(N%2 == 0)//偶数
{
for(j=0; j<N/2; j++)
{
a[0][j] = 'X';
}
for(j=1; j<N/2; j++)
{
a[1][j] = 'Y';
}
if(N>4)
{
char number = '0';
for(i=2; i<N/2; i++)
{
for(j=i; j<N/2; j++)
{
a[i][j] = number;
}
number++;
}
}
}
else//奇数
{
for(j=0; j<N/2+1; j++)
{
a[0][j] = 'X';
}
for(j=1; j<N/2+1; j++)
{
a[1][j] = 'Y';
}
if(N>4)
{
char number = '0';
for(i=2; i<N/2+1; i++)
{
for(j=i; j<N/2+1; j++)
{
a[i][j] = number;
}
number++;
}
}
}
}
/************************************************************
*函数:void Copy(char a[N][N])
*功能:根据已经构造出的八分之一,用复制的方法填满整个方阵。
因为方阵是一个完全对称的图形。
*说明:填满整个方阵分为三步:
第一步:根据已构造出的八分之一,填满左上角(四分之一)
第二步:根据已有的四分之一,填满方阵的上半部分(二分之一)
第三步:根据已有的二分之一,填满整个方阵
*************************************************************/
void Copy(char a[N][N])
{
int i = 0;
int j = 0;
if(N%2 == 0)//偶数
{
for(i=1; i<N/2; i++)
for(j=0; j<=i; j++)
{
a[i][j] = a[j][i];
}
for(i=0; i<N; i++)
for(j=N/2; j<N; j++)
{
a[i][j] = a[i][N-1-j];
}
for(i=N/2; i<N; i++)
for(j=0; j<N; j++)
{
a[i][j] = a[N-1-i][j];
}
}
else //奇数
{
for(i=1; i<N/2+1; i++)
for(j=0; j<=i; j++)
{
a[i][j] = a[j][i];
}
for(i=0; i<N; i++)
for(j=N/2; j<N; j++)
{
a[i][j] = a[i][N-1-j];
}
for(i=N/2; i<N; i++)
for(j=0; j<N; j++)
{
a[i][j] = a[N-1-i][j];
}
}
}
/****************************************
*函数:void Print_Array(char a[N][N])
*功能:打印方阵
*****************************************/
void Print_Array(char a[N][N])
{
int i=0;
int j=0;
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
printf("%c ",a[i][j]);
}
printf("\n");
}
}