梅亚查  
我的地盘,写我的! 我的座右铭:认真对待每一件事,积极对待每一个人,用乐观的精神入世。 我的爱好:编程,足球,吉他,war3.
2007-11-16 09:21:00 
 打印文字 

   题目是这样的:打印一个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;
}

标签: 
作者 kinhong 评论() | 人气()  | 引用() | 推荐 | 保存日志 | 问题日志 | 收藏到网摘 | 返回首页
 
友情链接