题目:输入一个正整数n作为行数,要求输出n行字符构成的图形。例如,输入4,输出如下图形:
A
BBB
CCCCC
DDDDDDD
下面我们简单梳理一下编写程序的思路:
1)输入空格,且空格数随行数增多而递减1;
2)输入字母,输入字母数随行数增多而递增2,字母ASCII码值随之递增1;
3)换行
而且分析得知1)、2)、3)步骤应该是多次循环,且循环次数已知,故用for语句进行编写:
#include <stdio.h>
int main()
{
int n,i,i1,j,row;//n行数,i输入空格数,j输入字母数
int ASCII=65;
scanf("%d",&n);
i=n;
for (row=1;row<=n;row++,i--,ASCII++){
for(i1=1;i1<=i;i1++){ //1*
printf(" ");
}
for(j=1;j<=2*row-1;j+=1){ //2*
printf("%c",ASCII);
}
printf("\n");
}
return 0;
}
易错:这里要说明一个很容易错的地方。可以看到//1*、//2*语句中分别在for的语句1中加入了i1=1和j=1,这里不可以仅在初始的时候分别赋值i、j等于1,因为随着循环进行,i1++和j++的过程中,i1的值和j的值已经发生改变不在为1,所以在进行for循环体语句之前要重新赋值i1、j等于1。
此外,我的一个室友(大家可以叫他“小帅”)还分享给我一道类似的题目:
因为我是先做过上面的题目,所以在他分享给我这道题是我的思路还是很清晰的:
1)空格输入:字母前的空格从39个递减,字母中间的空格从1开始以2为公差递增;
2)字母输入:前部空格+字母+中部空格+字母,字母改变规律同上;
3)换行
1.但这里需要注意的是我们输入的是字母而不再是数字,所以要先用char定义来储存输入值
2.第一行和最后一行是特殊的,要么用if语句进行编写,要么在循环前后分别输出(此处为了编写“美观”,就用if语句编写了)
我的作答如下:
#include <stdio.h>
int main()
{
int n,i=39,i1,j,row,ASCII=65;//n:行数,i(字母前)空格数,j(中间空格数)
char word;
scanf("%c",&word);
n=word-64;
for (row=1;row<=n;row++,i--,ASCII++) {
for (i1=1;i1<=i;i1++) {
printf(" ");
}
if (row==1) { //第一行
printf("%c\n",ASCII);
} else if (row==n) { //最后一行
for (n=n*2-1;n>0;n--) {
printf("%c",ASCII);
}
} else { //中间行
printf("%c",ASCII);
for (j=1;j<=2*(row-1)-1;j++) {
printf(" ");
}
printf("%c\n",ASCII);
}
}
return 0;
}
可以看到,我是先把第一行和最后一行的情况说明,中间则用else代替。分情况编写就使这道题变得很简单了~