1.代码
#include<iostream>
using namespace std;
string line[3] = { " * "," * * ","* * *" };
int main()
{
int n = 0, i = 0, j = 0, k = 0;
cin >> n;
for (i = 1; i <= n; ++i)
{
for (j = 0; j < 3; ++j)
{
for (k = 0; k < (n - i) * 3; ++k)
cout << " ";
for (k = 0; k < i; ++k)
cout << line[j] << " ";
cout << endl;
}
}
for (i = 0; i < n; ++i)
{
for (j = 0; j < 2 + (n - 1) * 3; ++j)
cout << " ";
cout << "*" << endl;
}
return 0;
}
2.代码运行结果
3.实现原理
- 以圣诞树的高度(输入数)为2为例
- 先就树的顶部三角形区域来说,可以将该图案看成n层进行输出,则外循环只需循环n次,每次输出三行,即最外层循环的条件为i <= n。
- 由运行结果可以看出,树每三行可以用一个循环来实现,则接下来的第一个循环的条件为j < 3。
- 第一行左侧的空格数量为3n-1个,且逐行递减,并且下一个三行的第一行比上一个三行的第一行少3个空格,则可以用k < (n - i) * 3作为条件的循环实现左侧空格的填充。
- 由运行结果可以看出,每个小三角形的*号数量都是从一个递增到三个,再考虑上空格,则可以用一个字符串数组的三个元素空空星空空,空星空星空,星空星空星来进行输出。则输出每个小三角形可由一个循环实现,该循环的条件是k < i,由外层变量i的大小控制输出多少组小三角形。
- 最后就是树下部分的树干,因为树干的层数是n,则其外层循环的条件为i < n;每行左边的空格数量一致,都有2 + (n - 1) * 3个,则输出空格循环的条件为j < 2 + (n - 1) * 3;最后输出一个*号并换行。