我想使用带参数的函数在C中绘制一个ASCII艺术圣诞树 .
这是我到目前为止所获得的,但大多数情况下,当绘制树的实际主体(叶子)时,它似乎多次重复它 .
这种效果似乎随着树的高度的增加而增加 . 因此,例如,如果为树输入高度为4,则将绘制正文2次 . 如果高度为5,则绘制3次 . 6是4次,依此类推 .
有帮助吗?
#include <iostream>
using namespace std;
const char BLANK = ' ';
const char LEAF = '#';
const char WOOD = '|';
void drawAXmasTree();
void drawFoliage(int);
void drawTrunk(int);
void getValidHeight(int&);
void drawALineOfFoliage(int, int);
int main()
{
cout << "Due on 11 December 2018 \n\n";
drawAXmasTree();
}
void drawAXmasTree()
{
int treeHeight = 0;
getValidHeight(treeHeight); //read in a valid value for the tree height
drawFoliage(treeHeight); //draw tree foliage
drawTrunk(treeHeight); //draw tree trunk
}
void drawFoliage(int trHgt) //draw the foliage
{
int branchLine = 1;
int treeHeight = trHgt;
while (branchLine <= (trHgt - 2))
{
drawALineOfFoliage(treeHeight, branchLine);
branchLine += 1;
}
}
void drawTrunk(int trHgt) //draw the trunk
{
int trunkLine = 1;
int spaces;
while (trunkLine <= 2) // for each line in the truck
{
spaces = 1;
while (spaces <= (trHgt - 2)) //draw the spaces on the left
{
cout << BLANK;
spaces += 1;
}
cout << WOOD; //draw the truck
cout << endl; //go to next line
trunkLine += 1;
}
}
void getValidHeight(int& trHgt)
{
do
{
cout << "Enter the size of the tree(4 - 20): ";
cin >> trHgt;
if (trHgt < 4 || trHgt > 20)
{
cout << "ERROR: Invalid height! ";
}
}
while (trHgt < 4 || trHgt > 20);
}
void drawALineOfFoliage(int trHgt, int brLine)
{
int treeHeight = trHgt;
int branchLine = brLine;
int spaces = trHgt - 2;
for (int i = 0; i < (treeHeight - 2); i++) {
for (int j = spaces; j > 0; j--)
{
cout << BLANK;
}
for (int foliage = 0; foliage <= i * 2; foliage++)
{
cout << LEAF;
}
spaces--;
cout << endl;
}
}
3 回答
看一下这个:
代码中的问题如下:
在函数
drawFoliage
中,您打算循环并为每一行调用drawALineOfFoliage
. 但是每次调用drawALineOfFoliage
时,你实际上都会画出整棵树 .为了修复你的代码,只需在
drawAXMasTree
函数中替换drawALineOfFoliage
为drawALineOfFoliage
,如下所示:Notice you don't need the second argument in drawALineOfFoliage since you don't actually use it.
至于
drawFoliage
,你可以删除它 .感谢您的帮助,我设法解决了这个问题,因为就像人们说它正在绘制整棵树而不仅仅是一条线 . 我所要做的就是将drawALineOfFoliage函数更改为以下内容;