效果如下:
我是怎么想的:
总共需要打印6行字母,那么就需要一个循环来控制打印第几行,大概代码如下:
for(int i=0;i<6;i++)
{
}
每行都会打印字母,而且循环越往后,需要打印的字母越多,那么每行打印字母也需要一个循环,比如打印F到A这需要一个循环,其它也是同样的道理。每行打印完都需要输出一个换行,所以代码变成下面这样
for(int i=0;i<6;i++)
{
for(char j='F';XXXXX;j--)
{
}
printf("%c",j);
}
因为每行都是从F开始打印的,所以j的初始值肯定是F,有因为每次是从F往A这个方向打印的,那么肯定有j--这个操作,上面的代码不难理解。
真正难的是j=‘F’后面这个进入循环的条件,这个怎么想。
用列举法推出来的。
当i=0的时候,需要打印第一行字母,此时j='F',那么我们给j一个什么样的关系表达式,才能够让j只能取到'F'这一个值呢?
是不是j>'F'-1
char j='F',j>'F'-1;j-- j的定义域只能取到‘F’
当i=1的时候,需要打印第二行字母,也就是需要里面的循环执行两次,那么给j一个什么样的表达式,才能够让j的值渠道'F'和‘E’呢? 是不是j>'F'-2;
我们不能直接把'F'-1和'F'-2这两个表达式直接写进去,不然输出的是固定值,我们想要这两个值和i发生一定的关系
当i=0时候,我们希望j>'F'-1='F'-(0+1)
当i=1时候,我们希望j>'F'-2='F'-(1+1)
当i=3时候,我们希望j>'F'-4='F'-(3+1)
所以通项公式就是j>'F'-(i+1)
最后代码如下:
int main(void) { for (int i = 0; i < 6; i++) { for (char j = 'F'; j > 'F'-(i+1); j--) { printf("%c",j); } printf("\n"); } return 1; }
update:2018.10.2
这次思考过程和上次完全不一样。
首先需要一个外层循环来控制打印的行,共需要打印6行,每循环一次打印一行数据。还需要一个内层循环控制要打印的字符
由于,内存循环每次都是从F开始打印的,所以内存循环每次都要初始化变量为F,每次打印一个字符后就让字符减去1,这样就可以打印比F小的那个字符了,那要打印多少个字符呢?我们需要用一个变量来记录,然后每进行一次外层循环这个变量的值都要+1,因为第二行要比第一行多打印一个字符。
int main(void) { char ch ;//当前要打印的字符 int row_count=1;//每行需要打印额字符个数,从第一行开始 int count;//打印了几个字符了 for (int i = 0; i < 6; i++,row_count++) { for (ch='F',count = 0; count < row_count; count++,ch--) { printf("%c",ch); } printf("\n"); } return 1; }