2016-07-04 6 views
0

パスカル三角形を表示するためのプログラミングに関する質問を解決しました。コードでは、すべての行の最後の要素をゼロに設定しました。それでも、6行目は最後の要素の出力を50とします。私はこれの理由を理解することができません。親切に助けてください。コードが添付されています。動的な2D配列の特定の行で予期しない出力が発生しました

int ** generate(int A, int *number_of_rows) { 

    *number_of_rows = A; 
    int i,j,nc=0; 
    int **result = (int**)malloc(A * sizeof(int *)); 


    for(i=0;i<A;i++) 
    { 
     nc=i+1; 
     result[i]=(int)malloc(nc*sizeof(int)); 
     result[i][0]=nc; 
     result[i][1] = 1; 
     for(j=2;j<nc;j++) 
     { 

      result[i][j]=result[i-1][j]+result[i-1][j-1]; 
     } 
    } 
    return result; 
} 

編集:すべての行の

最初の要素は、その行の列数を表示します。

+0

'nc'を決してリセットしません。これは意図されていますか? –

+4

'i 'が0のとき' result [i-1] 'は動作しません。最初の要素を' 1'に設定し、 'i = 1'から反復します。 –

+0

内側のjループはj = 2から始まります。つまり、外側のループのmalloc文のためにi> 0の場合のみです。 –

答えて

1
#include <stdio.h> 
#include <stdlib.h> 

int ** generate(int A, int *number_of_cols) { 
    int **result = malloc(A * sizeof(int *)); 
    int nc;//number of columns 

    for(int i = 0; i < A; ++i){ 
     number_of_cols[i] = nc = i + 1; 
     result[i] = malloc(nc * sizeof(int)); 
     result[i][0] = result[i][nc-1] = 1; 
     if(i > 1) 
      for(int j = 1; j < nc -1; ++j){ 
       result[i][j] = result[i-1][j-1] + result[i-1][j]; 
      } 
    } 
    return result; 
} 
int main(void){ 
    int n; 
    scanf("%d", &n); 

    int *number_of_cols = malloc(n * sizeof(int)); 
    int **pascal_triangle = generate(n, number_of_cols); 

    for(int i = 0; i < n; ++i){ 
     printf("%*s", 2 * (n-i-1), ""); 
     for(int j = 0; j < number_of_cols[i]; ++j){ 
      printf("%4d", pascal_triangle[i][j]); 
     } 
     puts(""); 
     free(pascal_triangle[i]); 
    } 
    free(pascal_triangle); 
    free(number_of_cols); 

    return 0; 
} 
+0

[DEMO](http://ideone.com/gvJZMx) – BLUEPIXY

1

は、私はちょうどそれを他のパラメータのアドレスを割り当てる* number_of_rowを渡すの目的を理解することはできません。しかし、私はあなたのメインのループに分割して、2: のループを割り当てて、すべてのメモリを割り当て、別のメモリを割り当てます。

for(i=0;i<A;i++) 
    result[i]=(int)malloc((i+1)*sizeof(int)); 

result[0][0]=1; //in your code, result[i-1] was accessed with i=0 
for(i=1;i<A;i++) { 
    result[i][0] = i+1; 
    result[i][1] = 1; 
    for(j=2;j<i;j++) 
    result[i][j] = result[i-1][j] + result[i-1][j-1]; //when j reaches the last value, 
         //[i-1][j] won't work! So put j<i instead. 
    result[i][j] = 1; 
} 

残りのコードはOKで、これがあなたが望むものかどうかを確認してください。結果の三角形は次のようになります。

1 
2 1 
3 1 1 
4 1 2 1 
5 1 3 3 1 
6 1 4 6 4 1 etc. 
関連する問題