A
BBB
CCCCC
DDDDDDD
EEE
F
如上图所示,补充以下代码,输出这个图形。
#include<stdio.h>
#define N 7//图案共N行
#define L (80-N)/2//整个图案据屏幕左边L列,使其居中
int main()
{
char c='A';
int i,j,p;
for(i=1;i<=N;i++, )
{
if(i<=(N+1)/2)
{
p= ;
}
else
{
p= ;
}
for(j=1;j<=L+ ;j++)
{
printf(" ");
}
for(j=1;j<=2*p-1;j++)
{
printf("%c",c);
}
printf("\n");
}
return 0;
}
分析,首先直接看输出,明显第一个 for 循环中的两个 for 循环分别是输出空格和字符的,因此从输出字符的入手判断b的取值。
显然,第 i行输出空格完成后的字符个数为1,3,5,7,5,3,1;if--else语句说明了对前四行和后三行p的值是不同的,前面四个p的值要满足2p-1分别等于1,3,5,7(p的值为1,2,3,4),后面三个p的值要满足2p-1分别等于5,3,1(p的值为3,2,1),说明p的值要与i联系,即if语句中 p=i; else 语句中p=N-i;
接下来输出空格的 for 循环的 判断条件如何呢?第 i 行距离第L列的位置空格个数3,2,1,0,1,2,3;根据上面我们已经知道了p的值分别为1,2,3,4,3,2,1;与空格数的关系显然满足相加等于4的关系。说明 j<=L+(N+1)/2-p.
最后面,第一个for循环中少了什么呢?这里有点难想到,不妨运算一遍输出发现字符是不会变化的,全部为A,因此,这个空所填的应该为控制字符变化的c++.
最终代码应为:
#include<stdio.h>
#define N 7//图案共N行
#define L (80-N)/2//整个图案据屏幕左边L列,使其居中
int main()
{
char c='A';
int i,j,p;
for(i=1;i<=N;i++,c++)
{
if(i<=(N+1)/2)
{
p=i;
}
else
{
p=N-i;
}
for(j=1;j<=L+(N+1)/2-p;j++)
{
printf(" ");
}
for(j=1;j<=2*p-1;j++)
{
printf("%c",c);
}
printf("\n");
}
return 0;
}