1

2 つのベクトルの内積を繰り返し求めようとしていますが、ゼロしか受け取っていないようです。助けてくれてありがとう。パラメーターとして 1 が代入され、r と c を 1 と 2 として指定し、r2 と c2 を 1 と 2 として指定すると、5 を受け取るはずです。2 つのベクトルの内積は a1 * b1 + a2 * b2 + a3 です。 * b3 ...

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

int inner(int A[], int B[], int n){
  int product = 0;
  int i;

  for(i = 0; i < n; i++){
    product = product + A[i] * B[i];
  }

  return product;
}

int main( int argc, char *argv[] ) {

  int n = atoi(argv[1]);
  int *A, *B;
  int r, c, i, j, r2, c2, product;

  printf("Enter values for r and c for vector A: ");
  scanf("%d %d", &r, &c);
  A = (int *)malloc(n * sizeof(int) * r * c);

  for(i = 0; i < r; i++)
    for(j = 0; j < c; j++)
      A[i*c+j] = i + j;

  printf("\nEnter values for r2 and c2 for vector B: ");
  scanf("%d %d", &r2, &c2);
  B = (int *)malloc(n * sizeof(int) * r2 * c2);

  for(i = 0; i < r2; i++)
    for(j = 0; j < c2; j++)
      A[i*c2+j] = i + j;

  product = inner(A, B, n);

  printf("\nThe inner product of the two vectors is %d\n\n", product);

  return 0 ;

}
4

3 に答える 3

1

このようなプログラムをデバッグする際の最初のルールは、キー データを出力することです。ここで、最も重要なデータ項目はおそらく の値ですn。プログラムを呼び出す方法を示していませんが、引数を取得したことを確認せずnに引数リスト ( ) から読み取ります。int n = atoi(argv[1]);表示されている動作は と一致していn == 0ます。したがって、次のように書くことで自分を助けることができます。

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

int inner(int A[], int B[], int n)
{
    int product = 0;
    int i;

    printf("n = %d\n", n);
    for (i = 0; i < n; i++)
    {
        printf("P = %2d, A[%d] = %d, B[%d] = %d\n", product, i, A[i], i, B[i]);
        product = product + A[i] * B[i];
    }

    return product;
}

int main( int argc, char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s number\n", argv[0]);
        return 1;
    }
    int n = atoi(argv[1]);
    int *A, *B;
    int r1, c1, i, j, r2, c2, product;

    printf("Enter values for r1 and c1 for vector A: ");
    scanf("%d %d", &r1, &c1);
    printf("r1 = %d, c1 = %d\n", r1, c1);
    A = (int *)malloc(n * sizeof(int) * r1 * c1);

    for (i = 0; i < r1; i++)
        for (j = 0; j < c1; j++)
            A[i*c1+j] = i + j;

    printf("\nEnter values for r2 and c2 for vector B: ");
    scanf("%d %d", &r2, &c2);
    printf("r2 = %d, c2 = %d\n", r2, c2);
    B = (int *)malloc(n * sizeof(int) * r2 * c2);

    for (i = 0; i < r2; i++)
        for (j = 0; j < c2; j++)
            B[i*c2+j] = i + j;      // Not A again!

    printf("n = %d\n", n);
    product = inner(A, B, n);

    printf("\nThe inner product of the two vectors is %d\n\n", product);

    return 0;
}

を使用するbashと (プログラムからプロンプトが表示されたときに数字を入力し続ける必要がなくなります)、次のようなサンプル出力を取得できます。

$ for i in $(seq 6 9); do echo; ./cp $i <<< "3 4 5 5"; done

Enter values for r1 and c1 for vector A: r1 = 3, c1 = 4

Enter values for r2 and c2 for vector B: r2 = 5, c2 = 5
n = 6
n = 6
P =  0, A[0] = 0, B[0] = 0
P =  0, A[1] = 1, B[1] = 1
P =  1, A[2] = 2, B[2] = 2
P =  5, A[3] = 3, B[3] = 3
P = 14, A[4] = 1, B[4] = 4
P = 18, A[5] = 2, B[5] = 1

The inner product of the two vectors is 20


Enter values for r1 and c1 for vector A: r1 = 3, c1 = 4

Enter values for r2 and c2 for vector B: r2 = 5, c2 = 5
n = 7
n = 7
P =  0, A[0] = 0, B[0] = 0
P =  0, A[1] = 1, B[1] = 1
P =  1, A[2] = 2, B[2] = 2
P =  5, A[3] = 3, B[3] = 3
P = 14, A[4] = 1, B[4] = 4
P = 18, A[5] = 2, B[5] = 1
P = 20, A[6] = 3, B[6] = 2

The inner product of the two vectors is 26


Enter values for r1 and c1 for vector A: r1 = 3, c1 = 4

Enter values for r2 and c2 for vector B: r2 = 5, c2 = 5
n = 8
n = 8
P =  0, A[0] = 0, B[0] = 0
P =  0, A[1] = 1, B[1] = 1
P =  1, A[2] = 2, B[2] = 2
P =  5, A[3] = 3, B[3] = 3
P = 14, A[4] = 1, B[4] = 4
P = 18, A[5] = 2, B[5] = 1
P = 20, A[6] = 3, B[6] = 2
P = 26, A[7] = 4, B[7] = 3

The inner product of the two vectors is 38


Enter values for r1 and c1 for vector A: r1 = 3, c1 = 4

Enter values for r2 and c2 for vector B: r2 = 5, c2 = 5
n = 9
n = 9
P =  0, A[0] = 0, B[0] = 0
P =  0, A[1] = 1, B[1] = 1
P =  1, A[2] = 2, B[2] = 2
P =  5, A[3] = 3, B[3] = 3
P = 14, A[4] = 1, B[4] = 4
P = 18, A[5] = 2, B[5] = 1
P = 20, A[6] = 3, B[6] = 2
P = 26, A[7] = 4, B[7] = 3
P = 38, A[8] = 2, B[8] = 4

The inner product of the two vectors is 46

$

入力と中間結果のエコーは、プログラムをデバッグするための基本的ですが強力な手法です。

于 2013-09-27T03:55:10.893 に答える