2017-11-19 3 views
0

私は2つのルーチンを持っています。私はメインの配列xから始めます。 1つのルーチンは、配列x内の対応する要素ごとに三角の数を生成し、新しい配列を出力するルーチンです。もう1つのルーチンは、それが今の階乗的な数を除いて同じことをします。1D配列が2つの関数に渡されると、1つの関数だけが正しい結果を出力します。どうして?

私は各ルーチンに対してmain関数で2回の呼び出しを行いました。しかし、最初に呼び出されたものだけが正しい結果を生成します。だから私は自分のコードが両方のルーチンに正しいことを知っている。しかし、私は何が間違っているのか分からない。ここで

#include <stdio.h> 
 
#define maxRow 3 
 
#define maxCol 4 
 

 
void factorial(int matrix[maxRow][maxCol]) { 
 
\t int row, column, i, product; 
 
\t for (row = 0;row < maxRow;++row) { 
 
\t \t for (column = 0;column < maxCol;++column) { 
 
\t \t \t product = 1; 
 
\t \t \t for (i = 1; i <= matrix[row][column];++i) { 
 
\t \t \t \t product = product*i; 
 
\t \t \t }//innermost loop ends 
 
\t \t \t matrix[row][column] = product; 
 
\t \t }//inner loop ends 
 
\t }//big for ends 
 

 
\t printf("Factorial number matrix:\n"); 
 

 
\t for (row = 0;row < maxRow;++row) { 
 
\t \t for (column = 0;column < maxCol;++column) { 
 
\t \t \t printf("%i\t\t", matrix[row][column]); 
 
\t \t }//inner loop ends 
 
\t \t printf("\n"); 
 
\t }//big for ends 
 
} 
 

 
int main() { 
 
\t void triangular(int matrix[maxRow][maxCol]); 
 
\t int x[maxRow][maxCol] = { 
 
\t \t { 1,2,3,4 }, 
 
\t \t { 5,6,7,8 }, 
 
\t \t { 9,10,11,12 } 
 
\t };//array ends 
 
\t 
 
\t factorial(x); 
 
\t triangular(x); 
 
} 
 

 

 
void triangular(int matrix[maxRow][maxCol]) { 
 
\t int row, column, i, sum; 
 
\t for (row = 0;row < maxRow;++row) { 
 
\t \t for (column = 0;column < maxCol;++column) { 
 
\t \t \t sum = 0; 
 
\t \t \t for (i = 1; i <= matrix[row][column];++i) { 
 
\t \t \t \t sum += i; 
 
\t \t \t }//innermost loop ends 
 
\t \t \t matrix[row][column] = sum; 
 
\t \t }//inner loop ends 
 
\t }//big for ends 
 
\t printf("Triangular number matrix:\n"); 
 
\t for (row = 0;row < maxRow;++row) { 
 
\t \t for (column = 0;column < maxCol;++column) { 
 
\t \t \t printf("%i\t", matrix[row][column]); 
 
\t \t }//inner loop ends 
 
\t \t printf("\n"); 
 
\t }//big for ends 
 
\t printf("\n"); 
 
}

は、コンソール出力です: enter image description here

+0

'main'の前に' void triangle(int matrix [maxRow] [maxCol]);を置く方がよいでしょう。コンパイラは実際の定義との不一致があるかどうかを警告します –

答えて

2

初めて呼ばれたときあなたはxに変更を加えています。 2回目にtriangular()に渡すと、それは元のxではありません - 変更された配列xfactorial()の結果)です。

アレイをコピーすると問題が解決します。 (一時的なコピーを作成し、結果を印刷して、xに行った変更をロールバックします)。場合

void factorial(int matrix[maxRow][maxCol]) { 
    int copy[maxCol][maxCol]; 
    int row, column, i, product; 
    for (row = 0;row < maxRow;++row) { 
     for (column = 0;column < maxCol;++column) { 
      product = 1; 
      copy[row][column]=matrix[row][column]; 
      for (i = 1; i <= matrix[row][column];++i) { 
       product = product*i; 
      }//innermost loop ends 
      matrix[row][column] = product; 
     }//inner loop ends 
    }//big for ends 

    printf("Factorial number matrix:\n"); 

    for (row = 0;row < maxRow;++row) { 
     for (column = 0;column < maxCol;++column) { 

      printf("%i\t\t", matrix[row][column]); 
      matrix[row][column]=copy[row][column]; 
     }//inner loop ends 
     printf("\n"); 
    }//big for ends 
} 

数は階乗値がint変数に保持していないであろうが増加します。より良い範囲を取得し、大きな階乗値を保持するにはlongを試してください。

注:アレイへのポインタが渡されています。ポインタが指す配列を変更すると、元の配列が変更されます。

+0

私は三角形が呼び出されたときを知っています。受け取る行列は階乗で生成された新しい行列です。しかし、問題は三角形のルーチンにあり、新しい値が各スロットに割り当てられます。古い階乗積を各要素の新しい三角和に単純に置き換えてはいけませんか? – user132522

+0

@ user132522: 'triangular'関数に渡した' matrix'は元のものではなく、再び 'triangle'関数で' main() 'の' x'を渡していることがわかります。この関数では、 'matrix'の値と合計を計算する要素を使用します。変更された要素です。あなたはprintステートメントを置くことができます - あなたは知っているでしょう。古い階乗積は本当に置き換えられますが、結果を計算するために使用される値は階階階数積の値です。結果として、元の初期の 'x'を使用した場合に得られる値は – coderredoc

+0

ですので、配列xを配列行列として三角関数に渡しているとき、配列行列には単にxへのポインタが含まれています。配列変数に既存の配列へのポインタや新しい配列へのポインタが含まれていることをどのように知っていますか? – user132522

関連する問題