Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157778
  • 博文数量: 42
  • 博客积分: 996
  • 博客等级: 准尉
  • 技术积分: 705
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-09 19:41
文章分类
文章存档

2012年(42)

我的朋友

分类: C/C++

2012-04-26 13:24:38

菱形打印
打印菱形在控制台的思路是,把菱形上下拆分,分两段很接近的代码来打印, 其实这样代码很不好看,并且不好阅读 我们知道,要打印的图案是这种:
  *
 ***
*****
 ***
  *
满足上下对称,左右对称,那么,你能不能也弄一个二重循环,同样是对称的? 很简单,首先我们要抛开习惯性思维,for循环不一定要在0开始或者0结束 我们可以让循环从 -c 到 c ,这样不就轻松产生一个对称的吗?(只要取个绝对值) 我们把菱形的中心看成是坐标0,0,那么,会输出星号的坐标,是 |x| + |y| <= c 的点。
#include
#define
IABS(x) ( (x) >= 0 ? (x) : -(x) ) //定义一个计算绝对值的宏
void print(int size) // size是这个菱形的半径,直径会是size * 2 + 1
 
{
     int x, y;
     for
(y = -size; y <= size; y++) 
        {  for (x = -size; x <= size; x++)
              {  if ( IABS(x) + IABS(y) <= size ) //x和y各自的绝对值的和,即 |x| + |y| <= size
                   
putchar('*');
                  else putchar(' ');
              }
              putchar('\n');
        }
  }
int
main()
 {  print(5); //输出一个半径为5的菱形   return 0;
 }
如果我需要得到空心菱形呢?非常非常简单,因为菱形边界上的点,满足的是|x| + |y| == c 所以,我们只要把那个if里的小于等于号,改成双等于号 == 就可以了。
再类似地,如果我不要*号,我要最外层是字母A,然后里一层是B这样呢?
即:
     A
    ABA
   ABCBA
    ABA
     A

那么,我们只要在putchar那里做一个字符计算:
 void print(int size) // size是这个菱形的半径,直径会是size * 2 + 1
 
{   int x, y;
      for (y = -size; y <= size; y++)
         { for (x = -size; x <= size; x++)
              { if ( IABS(x) + IABS(y) <= size ) //x和y各自的绝对值的和,即 |x| + |y| <= size
                 
putchar( 'A' + (size - IABS(x) - IABS(y)) ); //留意这里的计算方法
               else
putchar(' ');
              } putchar('\n');
         }
   } 
类似地,如果我们要打印的是X形:
*   *
 * *
  * 
 * *
*   *

 同样可以利用这个思路完成。

阅读(1572) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~