先分析题目,要求打印如下内容
* * * *
* * *
* *
*
- 可以看到一共有四行内容,所以我们首先要在脑子里构建一个循环,循环次数为4
次,这里用 for 循环最为合适。 - 再分析横向,我们可以看到第一行打印了 4 个"*",之后每行依次递减,同样的,也在脑子里构建一个循环,循环次数为4。
然而作为初学者,可能尚未建立编程思维,所以我们先从最简单的开始。
打印 4 行"*"
int main(int argc, char *argv[]) {
for (int i = 0; i < 4; i++) { // 1️⃣
for (int j = 0; j < 4; j++) { // 2️⃣
printf("*");
}
printf("\n");
}
return 0;
}
这里定义了两个循环,每个循环都是 4 次,代码中我用1️⃣和2️⃣做了标注。
下面来分析一下循环流程:
- 1️⃣
i = 0
-
- 2️⃣
j = 0
- 2️⃣
-
- 2️⃣
j = 1
- 2️⃣
-
- 2️⃣
j = 2
- 2️⃣
-
- 2️⃣
j = 3
- 2️⃣
- 1️⃣
i = 1
-
- 2️⃣
j = 0
- 2️⃣
-
- 2️⃣
j = 1
- 2️⃣
-
- 2️⃣
j = 2
- 2️⃣
-
- 2️⃣
j = 3
- 2️⃣
- 1️⃣
i = 2
-
- 2️⃣
j = 0
- 2️⃣
-
- 2️⃣
j = 1
- 2️⃣
-
- 2️⃣
j = 2
- 2️⃣
-
- 2️⃣
j = 3
- 2️⃣
- 1️⃣
i = 3
-
- 2️⃣
j = 0
- 2️⃣
-
- 2️⃣
j = 1
- 2️⃣
-
- 2️⃣
j = 2
- 2️⃣
-
- 2️⃣
j = 3
不难发现,循环套循环,就是这样的执行逻辑,直到达到循环条件。
- 2️⃣
接下来我们尝试每行减少一个"*"
int main(int argc, char *argv[]) {
for (int i = 4; i > 0; i--) { // 1️⃣
for (int j = i; j > 0; j--) { // 2️⃣
printf("*");
}
printf("\n");
}
return 0;
}
可以看到我修改了第二个循环,从for (int j = 0; j < 4; j++)
修改为了for (int j = i; j > 0; j--)
。
同时循环条件i
的初始值定义为了4
,循环条件j
的初始值定义为了i
。
这样修改后,外循环1️⃣每次循环都会自减 1 ,而内循环2️⃣每次循环都会根据新的i
来定义循环次数。
相应的循环流程也变为了:
- 1️⃣
i = 4
-
- 2️⃣
j = 0
- 2️⃣
-
- 2️⃣
j = 1
- 2️⃣
-
- 2️⃣
j = 2
- 2️⃣
-
- 2️⃣
j = 3
- 2️⃣
- 1️⃣
i = 3
-
- 2️⃣
j = 0
- 2️⃣
-
- 2️⃣
j = 1
- 2️⃣
-
- 2️⃣
j = 2
- 2️⃣
- 1️⃣
i = 2
-
- 2️⃣
j = 0
- 2️⃣
-
- 2️⃣
j = 1
- 2️⃣
- 1️⃣
i = 1
-
- 2️⃣
j = 0
其实到这一步,我们的目的基本已经达到了,但是我们仍需稍做修改,让最终结果完全符合题目要求。
- 2️⃣
最终完善
题目中要求我们要打印一个倒三角形的图案,那么我们是不是需要打印出空格来填补空缺呢?
没错!通过分析题目我们可以得到,第一行打印出了 0 个空格,第二行 1 个空格,第三行... ...
所以,我们只需要在上一节代码的基础上增加打印空格的代码就大功告成了。
int main(int argc, char *argv[]) {
for (int i = 4; i > 0; i--) { // 1️⃣
for (int j = 4 - i; j > 0; j--) { // 3️⃣
printf(" ");
}
for (int j = i; j > 0; j--) { // 2️⃣
printf("*");
}
printf("\n");
}
return 0;
}
是不是不理解for (int j = 4 - i; j > 0; j--)
,即我们新增加的3️⃣循环?
别着急,接下来我结合循环逻辑来解释。
- 1️⃣
i = 4
第一次总循环 -
- 3️⃣
j = 4 - 4 -> j = 0
打印一次空格
- 3️⃣
-
- 2️⃣
j = 0
打印一次”*“
- 2️⃣
-
- 2️⃣
j = 1
打印一次”*“
- 2️⃣
-
- 2️⃣
j = 2
打印一次”*“
- 2️⃣
-
- 2️⃣
j = 3
打印一次”*“
- 2️⃣
- 1️⃣
i = 3
第二次总循环 -
- 3️⃣
j = 4 - 3 -> j = 1
打印一次空格
- 3️⃣
-
- 3️⃣
j = 3 - 3 -> j = 0
打印一次空格
- 3️⃣
-
- 2️⃣
j = 0
打印一次”*“
- 2️⃣
-
- 2️⃣
j = 1
打印一次”*“
- 2️⃣
-
- 2️⃣
j = 2
打印一次”*“
- 2️⃣
- 1️⃣
i = 2
第三次总循环 -
- 3️⃣
j = 4 - 2 -> j = 2
打印一次空格
- 3️⃣
-
- 3️⃣
j = 3 - 2 -> j = 1
打印一次空格
- 3️⃣
-
- 3️⃣
j = 2 - 2 -> j = 0
打印一次空格
- 3️⃣
-
- 2️⃣
j = 0
打印一次”*“
- 2️⃣
-
- 2️⃣
j = 1
打印一次”*“
- 2️⃣
- 1️⃣
i = 1
第四次总循环 -
- 3️⃣
j = 4 - 1 -> j = 3
打印一次空格
- 3️⃣
-
- 3️⃣
j = 4 - 1 -> j = 2
打印一次空格
- 3️⃣
-
- 3️⃣
j = 3 - 1 -> j = 1
打印一次空格
- 3️⃣
-
- 3️⃣
j = 2 - 1 -> j = 0
打印一次空格
- 3️⃣
-
- 2️⃣
j = 0
打印一次”*“
- 2️⃣
总结
通过最后的代码,我们可以得到如下输出:
是不是看起来和题目给出的结果还有细微差距?
最后的完善任务,就交给你聪明的脑瓜去自己完成吧!