我试图找出如何使用偶数来制作这样的东西;
输入制作菱形图案所需的行数:6
*
***
*****
*****
***
*
我继续增加一行。
*
***
*****
*******
*****
***
*
以下是代码:
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int NUM = 6;
int i=0, j=0;
//NUM=NUM-1;
for(i=-NUM; i<=NUM-1; i++)
{
//cout<<i<<"part1";
for(j=-NUM; j<=NUM-1; j++)
{
//cout<<j<<"part2";
if(abs(i)+abs(j)<=((NUM-1)/2+1))
{
cout<<"*";}
else
{
cout<<" ";}
}
cout<<endl;
}
system("PAUSE");
return 0;
}
任何提示?
答案 0 :(得分:0)
将每行设想为两个数字:x
)空格数和y
)星数。所以对于你的例子,你得到:
i x y
------
0: 2 1
1: 1 3
2: 0 5
2: 0 5
1: 1 3
0: 2 1
观察到下半部分只是“颠倒”的上半部分,这意味着倒数。
现在,创建一个从i
转换为x
和y
的表达式。例如x=2-i
似乎有效(可能更复杂,但现在让我们试试)。与y
做类似的事情。现在使用以下伪代码编写代码。
for i=0..2
for x (which is some expression involving i)
write a space
for y (which is some expression involving i)
write a star
write a newline
for i=2..0
(repeat above, better yet, write a function to do it call it twice
或者,当表格如下所示时,您可以对计算机x
和y
使用if语句:
i x y
------
0: 2 1
1: 1 3
2: 0 5
3: 0 5
4: 1 3
5: 2 1
例如:x
为2-i
,当i <3时,i-3
为<{p}}。
答案 1 :(得分:0)
由于您的输出是对称的,因此有助于对算法进行划分,使其以对称方式工作。
对于N = 6
,您需要6
行和5
列。
您可以让外部循环中的索引上升0, 1, 2
,然后降低2, 1, 0
。
你可以让内循环的索引变为-2, -1, 0, 1, 2
。
然后,给定i
(外部循环的索引)和j
(内部循环的索引),如果出现以下情况,则该地点为空白区域:
(i+j) < 0 || (i+j) > i*2
现在程序可以是:
int isWhite(int i, int j, int NUM)
{
return ((i+j) < 0 || (i+j) > i*2);
}
void drawDots(int i, int NUM)
{
// j = -2, -1, 0, 1, 2
int j = 0;
for( j = -(NUM-1)/2; j < NUM/2; ++j)
{
if( isWhite(i, j, NUM) )
{
cout<<" ";
}
else
{
cout<<"*";
}
}
}
int main()
{
int NUM = 6;
int i=0;
// i = 0, 1, 2
for ( i = 0; i < NUM/2; ++i )
{
drawDots(i, NUM);
cout<<endl;
}
// i = 2, 1, 0
for ( i = NUM/2-1; i >= 0; --i )
{
drawDots(i, NUM);
cout<<endl;
}
return 0;
}
<强>更新强>
如果您不介意使用使用本地数据中的数据的代码替换drawDots
块,那么 if/else
可以更加简化。
void drawDots(int i, int NUM)
{
char s[] = "* ";
// j = -2, -1, 0, 1, 2
int j = 0;
for( j = -(NUM-1)/2; j < NUM/2; ++j)
{
cout << s[isWhite(i, j, NUM)];
}
}