输出图案类问题的思路

1、问题导入

编写一个程序,只用两条输出语句,生成一个像半个5*5正方形形状(直角三角形)的#符号图案:ide

#####函数

####hash

###it

##io

#for循环

 

2、问题分析

咱们能够采用消减法,先把它想象成一个5*5的矩形。table

第一行:##### 的实现代码(一个for循环便可)class

1 for(int hashNum = 1;hashNum <= 5;hashNum++)
2     {
3         printf("#");
4     }
5     printf("\n");

因此,要想打印出一个5*5的矩形,只需将上述代码循环5次便可,即:变量

1 for(int row = 1;row <= 5;row++)
2     {
3         for(int hashNum = 1;hashNum <= 5;hashNum++)
4         {
5         printf("#");
6         }
7         printf("\n");
8     }

到目前为止,咱们能够打印出一个5*5的矩形了,已经接近最终的解决方案了。循环

那么,接下来应该怎样修改代码,使它产生半正方形的图案呢?

若是咱们观察上面的程序清单并把它与本身所须要的半正方形的输出进行比较,能够发现问题在于条件表达式hashNum <= 5上。这个条件产生了5个相同的、由5个#符号所组成的行。因此咱们须要一种机制,调整每行所生成的符号数量,使第一行为5个符号,第二行为4个符号,以此类推。

接下来,咱们要进行另外一个消减程序的试验:写一段代码,功能:显示数字从5到1,每一个数字出如今单独的一行中

分析:咱们必须找到一种表达式,在第一行时其值为5,在第二行时其值为4,接下来以此类推。若是咱们须要一个当行号递增时其值递减的表达式,首先想到的多是在行号前面加个符号,至关于把它乘以-1.这种方法能够产生递减的数字,却不是咱们所须要的数字。咱们能够把对问题的分析经过一张表格来总结下

行号

所需的值

行号*-1

行号与所需值之差

1

5

-5

6

2

4

-4

6

3

3

-3

6

4

2

-2

6

5

1

-1

6

 差是一个固定值6。这意味着咱们所须要的表达式是 row*-1 + 6。简化为6 - row。

 因此“显示数字从5到1,每一个数字出如今单独的一行中”的代码为:

1     for(int row = 1;row <= 5;row++)
2     {
3         printf("%d\n",(6-row));
4     }

因此打印半个5*5正方形形状(直角三角形)的#符号图案的完整代码为

 1 #include<stdio.h>
 2 int main()
 3 {
 4     for(int row = 1;row <= 5;row++)
 5     {
 6         for(int hashNum = 1;hashNum <= 6-row;hashNum++)
 7         {
 8             printf("#");
 9         }
10         printf("\n");
11     }
12 } 

 

3、问题延伸

编写一个程序,只用两条输出语句产生一个相似侧三角形形状的#符号图案:

#

##

###

####

###

##

#

根据前一个问题的分析,咱们知道作法以下:

1,使用一个循环,显示一行特定长度的符号。

2,使用嵌套循环显示一系列的行。

3,使用代数表达式而不是固定值,为每一行建立不一样数量的符号。

4,经过试验和分析,发现正确的代数表达式。

解决各形状问题所须要的各个组成部分

#####                                   #####     5

####                                     #####     4

###            #####               #####     3

##                                         #####     2

#                                           #####     1

 

#                                            ####      1

##                                         ####      2

###                                       ####      3

####          ####                 ####      4

###                                      ####      3

##                                        ####      2

#                                          ####      1

 

解决“侧三角形”问题所须要的各个组成部分

1    7     3    3  #

2    6     2    2  ##

3    5     1    1  ###

4    4     0    0  ####

3    3    -1    1  ###

2    2    -2    2  ##

1    1    -3    3  #

(a) (b) (c)  (d) (e)

分析:在“半正方形”问题中,用一个较大的整数减去行号是可行的,因此咱们此次用8 - row(行号)获得(b)的结果,但这并非咱们想要的。在前一个问题中,咱们须要从大到小的数而不是从小到大的数,所以用一个较大的数减去循环变量就能够了。在这个问题中,咱们先是从小到大而后再从大到小。能够试着找到一个中间值,因此咱们把前面的8 - row 替换成4 - row,能够获得(c)的结果。这个结果也不正确,可是若是忽略最后3个数左边的负号,它就是咱们所须要的结果。若是咱们使用绝对值函数去掉这些负号会怎么样?表达式abs(4 - row)产生结果(d),就是咱们想要的结果了。

延伸分析:若是咱们是对空格而不是#号进行计数会怎么样呢?(d)列就是咱们对空格进行计数的正确的值序列。为了获得正确数量的#符号,能够把每行当作有4个格子,而后减去空格的数量。若是每行有4个格子,其中abs(4 - row)为空格的数量,则具备#符号的格子的数量就能够用4 - abs(4 - row)得到。

代码以下:(注意调用abs函数时要提早添加stdlib.h头文件)

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main()
 4 {
 5     for(int row = 1;row <= 7;row++)
 6     {
 7         for(int hashNum = 1;hashNum <= 4-abs(4 - row);hashNum++)
 8         {
 9             printf("#");
10         }
11         printf("\n");
12     }
13 } 
相关文章
相关标签/搜索