开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map :经典案例打印空心金字塔】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9580
经典案例打印空心金字塔
内容介绍
一、打印金字塔案例
二、实现案例的编程思路及代码
三、总结
这节课将讲解多重循环控制案例中的打印金字塔金典案例,需要使用 for 循环完成,通过 for 循环还可以融入编程思想进去。这里打印金字塔会使用前面讲过的两个编程技巧,化繁为简(由易到难)和先死后活的思想。
一、打印金字塔案例
打印金字塔经典案例:
使用 for 循环完成下面案例
请编写一个程序,可以接收一个整数表示层,打印出金字塔
二、实现案例的编程思路及代码
编程思路
1、打印一个矩形,矩形如下:
***
***
***
代码为:
package main
import
“
fmt
”
func main(){
for i := 1;i <=
3
; i++{
//外层for循环的i用来控制打印层数
for j :=1; j<=
3
; j++{
//j
代表打印
*
号个数
fmt.Print(
“
*
”
)
}
fmt.Println()
}
}
运行结果:
D:\goproject\src\go_code\chapter05\forexec03>go run main .go
***
***
***
矩形打印成功。
2、打印半个金字塔
在矩形打印的基础上打印半个金字塔,打印图形如下:
*1个*
**2个*
*** 3个*
(1)分析
通过上面需要打印的金字塔图形可以发现,在原有的代码基础上打印层数i不发生改变,而j为每层打印个数需要改变,j的变化规律为与每层*号个数相同,所以只需要把 j<=3改为 j<=i 即可,因为 for 外循环第一次循环 i=1,判断 i=1小于3,然后进入内循环判断 j=1是否小于 i ,而i现在等于1,所以只会打印一个*,然后执行 Println 语句,再次回到 for 外循环进行 i++,此时 i=2,进行判断 i 是否小于等于3,判断为 i=2还是小于3,所以又进入 for 内循环,j=1小于等于 i=2,则会打印**。
代码为:
for i := 1;i <=
3
; i++{
//外层for循环的i用来控制打印层数
for j :=1; j<=
i
; j++{
//j
代表打印
*
号个数
fmt.Print(
“
*
”
)
}
fmt.Println()
}
运行结果:
D:\goproject\src\go_code\chapter05\forexec03>go run main .go
*
**
***
(2)下面再通过流程图对代码进行进一步讲解:
流程分析如图:
首先假设一个内存和终端(控制台)
①外层 for 第1次循环:
第一步内存会创建一个值 i=1,做完后进行判断是否小于等于3,i 小于等于3的话就进入 for 循环,在内存中创建 j=1,然后就执行 j<=i,此时 i ,j 都为1,所以表达式成立,然后执行 Print 语句,终端控制台输出*,输出后执行 j++,此时内存中j=2,而2不小于等于 i(i=1),所以退出 for 循环执行 fmt.Println,相当于换行。
②外层 for 第2次循环:
换行后就会执行 i++,此时内存中 i=2,然后又执行判断i是否小于等于3,2<3所以进入内部 for 循环,内存中 j 又变成1,因为 j 重新赋值被覆盖了,然后进行判断 j是否小于等于 i,判断为1<2,所以执行 Print 语句,终端控制台输出*,紧接着执行 j++,此时内存中 j=2,进行判断 j=2=i=2,再次执行 Print 语句,终端控制台又输出*,紧接着执行 j++,此时内存中 j=3,进行判断 j=3不再小于等于 i=2,循环条件不成立则执行 Println ,进行换行。
③外层 for 第3次循环:
然后执行 i++,内存中 i=3,进行判断 i 是否小于等于3,满足条件,进入内循环for,再次判断 j=1小于 i=3,输出*,再 j++,j=2,判断 j=2小于 i=3,输出*,再j++,j=3,判断 j=3等于 i=3,输出*,再 j++,j=4,此时判断 j=4大于 i=3,退出内循环 for ,执行 Println 换行,然后 i++,此时 i=4,进行判断 i=4大于3,所以程序退出。
3、打印整个金字塔
打印图形如下:
*
***
*****
根据图像观察规律如下:
1层1个*,规律:2*层数-1 空格2 规律:总层数-当前层数
2层3个*,规律:2*层数-1 空格1 规律:总层数-当前层数
3层5个*,规律:2*层数-1 空格0 规律:总层数-当前层数
代码为:for i := 1;i <=
3
; i++{
//i
表示层数
//在打印*前先打印空格
for
k
:=1;k<=3-i;k++{
/
/
初始化k
=1
,打印空格个数为总的层数减去当前层数,为3
-
i。
fmt
.Print(“ ”)
/
/
打印空格
}
for j :=1; j<=
i
; j++{
//j
代表打印
*
号个数
fmt.Print(
“
*
”
)
}
fmt.Println()
}
运行结果:
D:\goproject\src\go_code\chapter05\forexec03>go run main .go
*
***
*****
结果如上说明程序实现成功。
4、将层数做成一个变量
要想将程序变得灵活则要将层数做成一个变量。
代码为:
var totalLevel int = 9
//
定义层数变量totalLevel,赋值为9,然后将程序中对应层数值替换为totalLevel。
for i := 1;i <=totalLevel; i++{
for k :=1;k<=totalLevel-i;k++{
fmt.Print (
“ ”
)
}
for j :=1; j<=2*i-1; j++{
fmt.Print(
“
*
”
)
}
fmt.Println()
}
运行结果:
D:\goproject\src\go_code\chapter05\forexec03>go run main .go
*
***
*****
……
最终运行结果如上输出金字塔为9层。
5、打印空心金字塔
图形如下:
*
* *
*****
分析:意味着在给每一行打印*时,需要考虑打印*还是空格,观察图形分析的结果是,每一层第一个和最后一个是打印*,其他就应该是空的,即输出空格,解决方法是在控制打印*号个数的 for 中再进行 if 判断。此外还分析到一个例外情况,就是最后一行(底层)是全部打* 。
代码为:
var totalLevel int = 9
for i := 1;i <=totalLevel-i; i++{
/
/
在打印*前先打印空格
for k :=1;k<=totalLevel-i;k++{
fmt.Print (
“ ”
)
}
for j :=1; j<=2*i-1; j++{
if j == 1 || j == 2*i-1 || i==totalLevel {
//
如果j
=1
即为打印第一个,或者j
=
2*i-1即为最后一个,又或者层数i等于最后一层tatal
L
evel
fmt.Print(
“
*
”
)
//
则打印*
}else{
fmt.Print(
“
”
)
//
否则打印空格
}
}
fmt.Println()
}
运行结果:
D:\goproject\src\go_code\chapter05\forexec03>go run main .go
*
* *
* *
……
*******************
如上程序成功输出9层的空心金字塔,说明案例代码实现成功。
三、总结
1、总结:
以上从无到有成功实现了空心金字塔,如果能根据这个思路从简单到复杂的完成这个案例那说明编程思想在逐渐的建立,通过这个案例重点是要说明如何一步一步分析出这个案例的步骤,如上先做了一个简单的矩形,然后打印半个金字塔,然后打印整个金字塔,再将层数做成一个变量,这里就体现出先死后活的思想,最后进行加强,而这就是把一个复杂的问题分为5层同时融入先死后活的编程思想。编程就要有拆分能力和总结能力,把分析的语言文字形成代码。
2、课后题:
打印出空心菱形