用点和'*'画一个领结

时间:2017-10-09 04:41:39

标签: c++

我是C ++的新手并且有一个赋值,它告诉我们输入一个整数并使用'*'和'。'制作一个2 * n + 1大小的蝴蝶结形状,例如:

输入:3

输出:

  *.....*
  **...**
  ***.***
  *******
  ***.***
  **...**
  *.....*

所以我想出了这个:

  #include <iostream>

  using namespace std;
  int main()
  {
   int n;
   cin>>n;
   for(int i=1;i<=n+1;i++)
   {
      for (int p=i;p>=1;p--)
      cout<<"* ";
      for (int j=n;j>(i-1);j--)
      cout<<". ";
      for (int j=n;j>i;j--)
      cout<<". ";
      for (int j=i;j>=1;j--)
      cout<<"* ";
      cout<<endl;
   }

   for(int i=n;i>=1;i--)
   {
      for (int j=i;j>=1;j--)
      cout<<"* ";
      for (int j=n;j>(i-1);j--)
      cout<<". ";
      for (int j=n;j>i;j--)
      cout<<". ";
      for (int j=i;j>=1;j--)
      cout<<"* ";
      cout<<endl;
   }
  }

但我的输出如下:

输入:3

输出:

  *.....*
  **...**
  ***.***
  ******** //<--1 redundant * at this row// 
  ***.***
  **...**
  *.....*

所以我想知道是否有任何方法可以删除它,因为如果我尝试调整循环它将不再是相同的形状。或者有更有效的方法来完成这项任务?我已经好几个小时了!谢谢!

1 个答案:

答案 0 :(得分:1)

我相信if语句可以解决问题。 如果语句在第一个循环的第4个内部for循环中。

  for (int j=i;j>=1;j--){
       if(i != n+1 || j != 1){ 
           cout<<"* ";
       }
   }
  cout << endl;

i位于中间行时,意味着i == n+1时你有一个额外的星号,而当j == 1你在那个中间行有最后一个星星时所以这个if语句不会显示最后一颗星。您可以尝试使用它可以工作的任何输入。