使用圆点和'*'画一个领结

问题描述:

我是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// 
    ***.*** 
    **...** 
    *.....* 

所以我不知道有什么办法消除它,因为如果我尝试调整循环就不会是同样的形状了。还是有更高效的方式来完成这项任务?我已经呆了好几个小时了!谢谢!

+0

什么是'star'? – user4581301

+1

请尝试缩进您的代码。缩进对于编译器来说并不重要,但对于阅读代码的人来说很重要。 –

+0

此外,我建议你花些时间阅读Eric Lippert的[如何调试小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/),并学习如何使用调试器来逐行执行代码。 –

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

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

i是中间行的意思时i == n+1你有一个额外的明星,当你j == 1有中间行的最后一个星所以这个if语句将不显示最后一颗星星英寸你可以尝试任何输入它会工作。

+0

非常感谢!它确实解决了这个问题,不敢相信我甚至没有想过使用它来代替!我正在研究如何尽可能减少这个问题,因为上面的这个混乱是非常难看的。我希望我很快就能在C++中变得更好! –

+0

@PhạmSơn如果您认为我回答了问题,请[接受它](https://*.com/help/someone-answers)。 – Tyger

+0

完成! @泰格:D –