这是我在最后必须得到的标志:
*******************
** * **
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
* *** *
*******************
* *** *
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
** * **
*******************
我知道如何做完整的星星三角形,但当它的内部是空的,我不知道如何进行。谁能帮帮我?
我试过了,我只知道如何做完整的星星三角形和一个星形正方形/矩形里面是空的,这里是代码:
int main(void)
{
int i, j, length, width;
cout << "Length of rectangle? ";
cin >> length;
cout << endl;
cout << "Width of rectangle? ";
cin >> width;
cout << endl;
for ( i = 0; i < length; i++ )
cout << "*";
cout << endl;
for ( i = 1; i < width - 1; i++ )
{
cout << "*";
for ( j = 1; j < length - 1; j++ )
{
cout << " ";
}
cout << "*";
cout << endl;
}
for ( i = 0; i < length; i++)
cout << "*";
cout << endl;
return 0;
}
5条答案
按热度按时间ztyzrc3y1#
行
1
、10
和19
很简单,因为它们每个都只包含19*
。问题是
2
到9
和11
到19
这两行。但是,您是否注意到
2
到9
行中的模式?线
2
由一个*
组成0
空格*
7
空格*
7
空格*
0
空格然后是一个
*
线
3
由一个*
组成1
空格*
6
空格*
6
空格*
1
空格然后是一个
*
。线
4
由一个*
组成2
空格*
5
空格*
5
空格*
2
空格然后是一个
*
。线
5
由一个*
组成3
空格*
4
空格*
4
空格*
3
空格然后是一个
*
。线
6
由一个*
组成4
空格*
3
空格*
3
空格*
4
空格然后是一个
*
。线
7
由一个*
组成5
空格*
2
空格*
2
空格*
5
空格然后是一个
*
。线
8
由一个*
组成6
空格*
1
空格*
1
空格*
6
空格然后是一个
*
。线
9
由一个*
组成7
空格*
0
空格*
0
空格*
7
空格然后是一个
*
。模式如下:
假设
size
是三角形的总大小(在本例中为19
),则行
n
由一个*
组成n-2
空格*
(size/2) - n
空格*
(size/2) - n
空格*
n-2
空格然后是一个
*
。注意,在C中,
19 / 2
的结果是9
,因为除法的小数部分被丢弃。使用关于模式的这些信息,您应该能够创建一个循环,在每个循环迭代中,如上所述打印一行。通过这种方式,您应该能够解决打印
2
到9
行的问题。之后打印
11
到19
行应该很容易,因为这些行必须只按照2
到9
行的相反顺序打印。根据community guidelines for homework questions,我不会在这个时候提供完整的解决方案。如有需要,我稍后可提供进一步资料。
编辑:
由于其他用户已经发布了几个其他解决方案,我现在也将发布我的解决方案,它解决了上述问题:
然而,我认为使用2D数组(您声明不允许使用)更容易解决这个问题。将2D数组初始化为空格,然后绘制3条水平线、3条垂直线和2条对角线:
yxyvkwin2#
把十字架放在中间很容易:
诊断稍微有点棘手。
在嵌套循环中,输出
std::cout << (i+j) << '\t'
。你能从这些数字中看出什么规律来确定其中一条对角线吗?然后对
i-j
重复同样的操作。你看到另一条对角线的图案了吗?最后,你的嵌套循环看起来像这样:
zpgglvta3#
示例(基于我30多年前参加的2D计算机图形课程的知识)。使用一维向量(动态分配数组)作为内存缓冲区和Bresenham线算法
现场演示:https://onlinegdb.com/Kg9HAdxfZ
rekjcdws4#
而不是在循环中计算每一行。让一个函数返回在每个点绘制的内容。然后你可以应用一些基本的代数来决定是否有一个点要画。
上面的打印:
y53ybaqx5#