2017-11-05 4 views
1

私はパスカルの三角形をユーザー入力レベルまで表示するプログラムを作成しようとしています。階乗法は使用できません。我々は唯一の私は、両方の次元でサイズ28の配列を使用しています理由である、28のレベルまで行くことができることになっているCの奇妙な出力のパスカルの三角形

#include <stdio.h> 

void trianglePrint(const int numLevels); 

int main() { 
    int numLevels; 

    printf("Please enter how many levels of Pascal's Triangle you would 
    like to see: "); 
    scanf("%d", &numLevels); 

    trianglePrint(numLevels); 


    return 0; 
} 

void trianglePrint(const int numLevels) { 
    int pascalTriangle[28][28]; 
    int i, j; 

    for (i = 0; i < numLevels; ++i) { 
    for (j = 0; j <= i; ++j) { 
     if (i == 0 || i == 1 || j == 0 || j == numLevels) { 
     pascalTriangle[i][j] = 1; 
     printf("%d ", pascalTriangle[i][j]); 
     } 
     else { 
     pascalTriangle[i][j] = pascalTriangle[i - 1][j - 1] + 
     pascalTriangle[i - 1][j]; 
     printf("%d ", pascalTriangle[i][j]); 
     } 
    } 
    printf("\n"); 
    } 

} 

:私の現在のコードはこれです。
これは三角形の約6レベルでうまく動作しますが、大きなレベルの場合は本当に大きな整数が得られます。私はそれが初期化されていない配列のためだと思ったが、わからない。誰がエラーがどこにあるか知っていますか?

+2

を試してみてくださいそれは実際に出力しているもの対期待される出力を表示するために役立つかもしれません。 – Carcigenicate

+0

'int pascalTriangle [28] [28] = {{0}};' – BLUEPIXY

+0

'j == numLevels'は常にfalseです。 'pascalTriangle [i - 1] [j]'は初期化されていない変数から読み込みます。 – melpomene

答えて

1

あなたは

if (i == 0 || i == 1 || j == 0 || j == i) 

(メルポメネのおかげで)に

if (i == 0 || i == 1 || j == 0 || j == numLevels) 

を変更する場合、すべてはあなたの配列がすでにintiailisedメンバーに終わるにアクセスします。

それは奇妙な数字を解決します。

出力:

Please enter how many levels of Pascal's Triangle you would like to see: 6 
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 

Process returned 0 (0x0) execution time : 2.264 s 
Press any key to continue. 

注:
また、配列を初期化することは賢明な予防策です。エラーを隠すのではなく、エラーを見つけるのに役立つ値で初期化することができます。 42.

+0

@BLUEPIXY修正したエラーを発見してくれてありがとう。受け入れられた回答を編集用に削除できませんでした.... – Yunnosch

+0

Upvoted、しかし私は配列の初期化についてのあなたのコメントに同意しません。配列を初期化すると、valgrindのようなツールが手助けすることができなくなります。どのような場合でも初期化されていない値は1マイルを目立たせますので参考になります。 –

0

else節のpascalTriangle[i][j]を計算する前にpascalTriangle[i - 1][j]を設定していないという問題があります。

0

はコード

void Pascal(int n) 
    { 
     int arr[n][n]; 


     for (int i = 0; i < n; i++) 
     { 

     for (int j = 0; j <= i; j++) 
     { 
      // First and last values in every row are 1 
      if (i == j || j == 0) 
       arr[i][j] = 1; 
      else // Other values are sum of values just above and left of above 
       arr[i][j] = arr[i-1][j-1] + arr[i-1][j]; 
      printf("%d ", arr[i][j]); 
     } 
     printf("\n"); 
     } 
    } 
+0

あなたは早く良い(私の最初の試みよりも良いとは言えない)答えのためにupvoteに値するでしょう。しかし、コードのみの回答はあきらかになることはまずありません。コードに問題がない理由、つまりその解決方法を説明してください。 – Yunnosch