题目:输出以下图形
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
分析: 图形分为上下两部份,上面是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 ;
}
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 ;
}
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中编译通过。