2016-10-19 8 views
-1

私はC++を学んでおり、アステリックスを使ってiscosceles三角形を描画しようとしています。C++でアステリックの等角三角形を描く

int main(){ 
for(int i=1;i<11;i++){ 
    for(int j=0;j<i;j++) 
    { 
     cout << "*"; 
    } 
    cout << endl; 
} 
return 0; 
} 

上半分は、したがって、出てくるが、どのように私は下半分を得るように、jは== 10に到達した直後にデクリメントを開始することができます私のコードは次のようになります。手伝ってください。

答えて

0

は、ここであなたがそれを行うことができます方法は次のとおりです。

#include <iostream> 
using namespace std; 

int main(){ 
    for(int i=1;i<20;i++){ 
     int k; 
     if (i<=10) 
     { 
      k = i; 
     } 
     else 
     { 
      k = 20-i; 
     } 
     for(int j=0;j<k;j++) 
     { 
      cout << "*"; 
     } 
     cout << endl; 
    } 
    return 0; 
} 

出力:

* 
** 
*** 
**** 
***** 
****** 
******* 
******** 
********* 
********** 
********* 
******** 
******* 
****** 
***** 
**** 
*** 
** 
* 

基本的な考え方は、三角形の前半にiいるアスタリスクの最大数からのマッピングを切り替えることです(最大10行目)をマッピングの20-iに置き換えます。

+0

することは、あなたのニーズを満たしている場合には、答えをupvoteし、受け入れることを忘れないでください:) –

+0

説明が少し必要ですが、説明変数名で簡単に解決できます。 – user4581301

1

@space_voyagerの代わりに、このコードは動的サイズをサポートしていますので、サイズで定義できる大きさにすることができます。

アルゴリズムは、ここでは現在のインデックスまたは反復が(この場合、11はプログラム10である)の中間にある場合

  1. チェックです。
  2. trueの場合、0から現在のIのインデックスを反復します。
  3. falseの場合(つまり、現在のインデックスが中央よりも大きいことを意味します)、jをサイズの小さい順に反復します。

どのようにサイズ - 私は動作しますか?

最初の反復では(I> 10、したがってI = 11の場合)サイズ - I = 21-11となります。あなたは10になるので、出力は10回印刷されます。二度目はI = 12になります。行くにつれて結果は減少します。


int main(){ 
    int size = 21; 

    for(int i=1;i<size;i++){ 
     if(i <=size/2) 
     { 
      for(int j=0;j<i;j++) 
      { 
       cout << "*"; 
      } 
      cout << endl; 
     } 
     else if (i > size/2) 
     { 
      for(int j=size-i; j>0;j--) 
      { 
       cout << "*"; 
      } 
      cout << endl; 
     } 
    } 

    return 0; 
} 

出力

* 
** 
*** 
**** 
***** 
****** 
******* 
******** 
********* 
********** 
********** 
********* 
******** 
******* 
****** 
***** 
**** 
*** 
** 
* 

編集

space_voyagerを1としてコピー貼り付けコードを持つことがベストプラクティスではありません、と述べました。 @Twistaがここに更新されたコードは(彼に似て、私は唯一の動的な部分を追加しました。サイズの値を変更し、あなたはすべてを変える)です

int main(){ 
    int size = 20; 

    for(int i=1;i<size;i++){ 
     int k; 

     if(i <=size/2) 
     { 
      k = i; 
     } 
     else if (i > size/2) 
     { 
      k = size-i; 
     } 

     for(int j=0; j<k; j++) 
     { 
      cout << "*"; 
     } 
     cout << endl; 
    } 

    return 0; 
} 
+0

良いものですが、アスタリスクを印刷するforループと同じように、コードのコピー貼り付け部分を持つことは一般に良くありません。 –

+0

ええ、それを実現しました。私はこの質問を見たときに私の心に答えを持っていました。コンパイラをロードするのに時間がかかり、あなたは答えました。まだあなたのコードははるかにエレガントです:) –