带有偶数c++的星号菱形

asterisk diamond with even number c++

本文关键字:c++      更新时间:2023-10-16

我正试图弄清楚如何使用偶数来制作这样的东西;

输入制作菱形图案所需的行数: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;
}

有什么提示吗?

将每一行设想为两个数字:x)空间数量和y)恒星数量。因此,对于你的例子,你会得到:

i  x y 
------
0: 2 1
1: 1 3
2: 0 5
2: 0 5
1: 1 3
0: 2 1

观察下半部分只是上半部分"倒置",这意味着倒计数。

现在,创建一个从i转换为xy的表达式。例如,x=2-i似乎可以工作(它可能更复杂,但现在让我们尝试一下)。对y执行类似的操作。现在使用以下psuedo代码编写代码。

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

或者,当表看起来像时,您可以对计算机xy使用if语句

i  x y 
------
0: 2 1
1: 1 3
2: 0 5
3: 0 5
4: 1 3
5: 2 1

例如:x2-i,当i<3和CCD_ 12。

由于您的输出是对称的,因此有助于划分算法,使其以对称的方式工作。

对于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;
}

更新

如果您不介意将if/else块替换为使用本地数组数据的代码,那么drawDots可以更加精简。

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)];
   }
}
相关文章:
  • 没有找到相关文章