2017-10-09 25 views
0

我是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/),並學習如何使用調試器來逐行執行代碼。 –

回答

1

我相信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://stackoverflow.com/help/someone-answers)。 – Tyger

+0

完成! @泰格:D –