问题
很多人在初学编程时都会遇到一个小题,就打印金字塔、打印空心金字塔等。今天我们就打印空心金字塔这个问题,来分析一下。不仅是学习解决这个问题,更重要的是学习分析问题和解决问题的方法。很多同学在学习时遇到困难就想退缩,这是不对的!还有,不要连想都不想就下手写代码,不如先把整个问题分析清楚,在草纸上完成解决方案,再照着方案写代码,这样往往更快错误更少。
要打印的空心金字塔往往是这样子的形状:
*
* *
* *
* *
*********
分析
上面是一个五层的金字塔,大家来观察一下,第一层只有中间一个星号,最后一层全是星号。为了观察更清楚,我们通过一个表格来显示。
0 1 2 3 4 5 6 7 8
0 *
1 * *
2 * *
3 * *
4 * * * * * * * * *
假设金字塔的层数为
那么每行字符总数(包括空格和星号)为
由于在大部分编程语言中,下标都是从0开始,所以上图中左侧的行号是从0到4,上边的列号是从0到9。
注:可能初学者在刚开始接触“数组下标从0开始”时经常会有这种困扰,平常的第一个到了编程里成了第0个,脑袋转不过来弯,希望初学者一定克服这一点。
设
(1)
(2)
(3)其他情况下,每一行都可以分成五部分:<1>
注:上述中(叙述中斜体部分)右侧的空格可以不需要打印,不影响显示效果。
这样,这个问题就算是完整的分析完了,可以照 着上边的分析写代码了。
代码实现
$n = 10; //金字塔的层数
$num = $n * 2 - 1; //每层金字塔的字符数量
echo "金字塔的层数为:".$n."\n";
for ($i = 0; $i < $n; $i++) {
if ($i == 0) {// 打印第0层
for($j = 0; $j < $n-1; $j++) {
echo " ";
}
echo "*";
} else if ($i == $n - 1) {// 打印第n-1层,最后一层
for ($j = 0; $j < $num; $j++) {
echo "*";
}
} else { //其他层
//先打印左侧空格
for ($j = 0; $j < $n-1-$i; $j++) {
echo " ";
}
//打印左侧的*
echo "*";
//打印中间的空格
for ($j = 0; $j < $i * 2 - 1; $j++) {
echo " ";
}
//打印右侧的*
echo "*";
}
echo "\n";//如果显示在网页里,则输出<br/>
}
分别看一下打印5层和10层的金字塔的结果: