C++学习笔记:图形输出练习

题目:输出以下图形

           *
         * * *
       * * * * *
     * * * * * * *
       * * * * *
         * * *
           *

分析: 图形分为上下两部份,上面是4行,分别打印出1,3,5,7个*号;后面三行,分别打印出5,3,1个*号。总共是7行,其中,第4行的*号最多,是7个。同时要考虑每一行*号的对齐。

假设要输出一个N行的图形,那么中间一行是N个*号,这里N为奇数。程序如下:

 

/*  outpic.cpp : Defines the entry point for the console application.
xmxoxo 2006-10-30 at XiaMen 
题目:输出以下图形

           *
         * * *
       * * * * *
     * * * * * * *
       * * * * *
         * * *
           *

*/  

#include 
" stdafx.h "
#include 
" stdio.h "

int  main( int  argc,  char *  argv[])
{
 
int  intvalue = 7 ;   // 图形最大的*号个数
  const   int  Blank = 5 // 图形左边离屏幕的距离
  int  i,j;
 
for  (i = 1 ;i < intvalue;i += 2 )
 {
  
// 计算*的个数
  
// k=(2*i-1)-(i>(intvalue+1)/2) * (i-(intvalue+1)/2)*4;
  
// 先打印前面的空格;
   for  (j = 1 ;j < (intvalue - i + Blank);j ++ )
  {
   printf(
"   " );
  }
  
// 然后打印k个*号字符
   for  (j = 1 ;j <= i;j ++ )
  {
   printf(
" %2s " , " * " );
  }
  
// 打完一行后换行
  printf( " " );
 }

 
// 打印下半部份
  for  (i = intvalue;i > 0 ;i -= 2 )
 {
  
// 先打印前面的空格;
   for  (j = 1 ;j < (intvalue - i + Blank);j ++ )
  {
   printf(
"   " );
  }
  
// 然后打印i个*号字符
   for  (j = 1 ;j <= i;j ++ )
  {
   printf(
" %2s " , " * " );
  }
  
// 打完一行后换行
  printf( " " );
 }
 
return   0 ;
}

 

思考:上面的方法是分两次来输出这个图,能不能一次呢? 来研究一下输出的*号个数序列:
N=7时:
1,3,5,7,5,3,1
N=9时:
1,3,5,7,9,7,5,3,1
看前半部份,很容易知道前半部份就是一个递增数列,而后半部份则是递减数列
如果按前半部份递增的方式,N=7时应该是这样的数列:
1,3,5,7,9,11,13

看一下图:

查看更多精彩图片

在超过数值7后,值开始递减,
1,3,5,7,5,3,1
1,3,5,7,9,11,13

每次递减的值是 4,8,12...即:(X-(N+1)/2)*4,

由此可以给出这个数列的公式(表达式)为:
k=(2*i-1) - (i>(N+1)/2) * (i-(N+1)/2)*4;
其中:(i>(N+1)/2) 是个逻辑表达式,在前半部份,这个表达式为0,所以不改变值,
后半部份表达式值为1,则减去相应的值。

修改后的程序如下:

/*  outpic1.cpp : Defines the entry point for the console application.
xmxoxo 2006-10-30 at XiaMen 
题目:输出以下图形

           *
         * * *
       * * * * *
     * * * * * * *
       * * * * *
         * * *
           *

*/  

#include 
" stdafx.h "
#include 
" stdio.h "

int  main( int  argc,  char *  argv[])
{
 
int  intvalue = 7 ;   // 图形最大的*号个数
  const   int  Blank = 5 // 图形左边离屏幕的距离
  int  i,j;
 
int  k;
 
for  (i = 1 ;i <= intvalue;i ++ )
 {
  
// 计算*的个数
  k = ( 2 * i - 1 -  (i > (intvalue + 1 ) / 2 *  (i - (intvalue + 1 ) / 2 ) * 4 ;
  
// 先打印前面的空格;
   for  (j = 1 ;j < (intvalue - k + Blank);j ++ )
  {
   printf(
"   " );
  }
  
// 然后打印k个*号字符
   for  (j = 1 ;j <= k;j ++ )
  {
   printf(
" %2s " , " * " );
  }
  
// 打完一行后换行
  printf( " " );
 }
 
return   0 ;
 
}

以上程序在VC6中编译通过。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值