题目是这样的:打印一个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
刚开始我一以为又得使用到递归函数,后面写的时候发现不用。首先通过观察得出层数的关系是
if( N % 2 == 0 ) deep = N / 2 - 1;
if( N % 2 == 1 ) deep = N / 2 ;
setArray()函数从deep == 0 开始打印各层的内容。公式可以从程序中看到。
值得一说的是M[i][j], M 是char**型的。通过输入N来确定i和j的大小,但不能直接申明M[N][N](编译出错)。而应该通过new给M分配空间。
另外就是 int 转为 char 有一个关键的数是 48.
int i = 1;
char a = i + 48;
那么a = ‘1’;
同样 char 也可以通过-48来转为int。
当然还有itoa()函数和atoi()函数,不过itoa()函数使用起来不太方便,需要三个函数,而且有的编译器不支持。
下面是代码:
#include < iostream >
void setArray( char ** M ,int N ,int deep )
{
for( int k = 0 ; k <= deep ; k ++ )
{
if ( k == 0 )
{
for( int i = k; i < N - k ; i++ )
for( int j = k ; j < N - k; j++ )
{
if( i == k || i == N - k -1|| j == k || j == N - k -1)
M[i][j] = 'X';
}
}
if( k == 1 )
{
for( int i = k; i < N - k ;i++ )
for( int j = k ; j < N - k ; j++ )
{
if( i == k || i == N - k - 1 || j == k || j == N - k - 1 )
M[i][j] = 'Y';
}
}
if ( k > 1 )
{
for( int i = k; i < N - k ; i++ )
for( int j = k ; j < N - k ; j++ )
{
if( i == k || i == N - k - 1 || j == k || j == N - k - 1 )
M[i][j] = k - 2 + 48;
}
}
}
}
void print( char ** M , int N )
{
for( int i = 0 ; i < N ; i++ )
for( int j = 0 ; j < N ; j++ )
{
std::cout << M[i][j] << " ";
if( j == N - 1 )
std::cout << std::endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int N ;
std::cout << " 输入N: " << std:: endl;
while( std::cin >> N )
{
char **M;
if (( M = new char*[N]) == NULL) {
std:: cerr << "new failure." << std:: endl;
return 1;
}
for (int i = 0; i < N; i++)
if (( M[i] = new char[N]) == NULL) {
delete M;
std:: cerr << "new failure." << std::endl;
return 2;
}
for( int i = 0 ; i < N - 1; i ++ )
for( int j = 0 ; j < N -1 ; j++ )
M[i][j] = 'K';
if( N %2 == 0 )
setArray( M , N ,N / 2 -1 );
else setArray( M , N , N / 2 );
print( M , N );
}
system("pause");
return 0;
}