1

float 型の 2 つの 1-D 配列のスカラー積を返す C 関数 sprod (n,x,y) を記述します。この関数は、入力変数として配列のサイズ n (型 int 変数) と、各配列の最初のメンバーへのポインター x と y を取り、float の結果を返します。main() コード ブロックは、sprod を呼び出して行列積 a*b を計算する必要があります。ここで、float 行列 a 型と float ベクトル b 型は、b=[1 1 1] と a=[1 2 3 4 5 6 7 8 で指定されます。 9] (a は 3x3 行列)。

b を af(;;) ループで初期化し、a を double for(;;) ループで初期化できます (または、多くの割り当てステートメントを使用します)。行列積は、関数 sprod の呼び出しを使用して計算し、a の各行とベクトル b のスカラー積を形成する必要があります。これらの行へのポインターは、a[1]、a[2]、および a[3] によって与えられます。最後に、結果のスカラー積を合計する for(;;) ループと、結果を画面に出力する printf() 関数も使用する必要があります。

結果は、行列 a のすべての要素の合計になります。行列 a とベクトル b のコピーも印刷する必要があります。Numerical Recipes C 関数の matrix() と vector() を free_matrix() と free_vector() と共に使用して、動的に定義された配列として a と b を作成します。

私はプログラミングに関しては初心者で、本当に苦手であることがわかりました。これは私がこれまでに持っていたもので、コンパイルすると狂ったように爆発します (いくつかのものが省略されていることは知っています)。gdb を使用してデバッグしようとしましたが、それも機能しませんでした。どんな助けでも大歓迎です。

# include <stdio.h>
# include "nrutil.h"
# include "nrutil.c"

void transp(float **a,int n);
float sprod(int n, float *x, float *y);
int main()
{
  int i,j;
  float var=0.0, sum=0.0, pro=0.0;
  float*b, **a;
  int n=3;
  float index;
  b=vector(0,n-1);
  a=matrix(0,n-1,0,n-1);

  printf("\nVector b\n");
  for(j=0;j<n;j++)
  {
    b[j]=1;
    printf("%.2f\n",b[j]);
  }
  for(i=0;i<n;i++)
  {
    for(j=0;j<n;j++);
    {
      var=var+1;
      a[i][j]=var;
    }
  }
  printf("\n Matrix a\n");
  for(i=0;i<n;i++);
  {
    for(j=0;j<n;j++);
    {
      printf("%.2lf",a[i][j]);
    }
    printf("\n");
  }
  printf("\nProduct of Matrix a and Vector b\n");

  for(i=0;i<n;i++);
  {
    pro=sprod(n,a[i],b);
    printf("%.2f\n",pro);
    sum+=pro;
  }
  printf("\n Sum of Product array\n");
  printf("%.2f\n\n", sum);
  free_ivector(index,0,n-1);
  free_matrix(a,0,n-1,0,n-1);

  return 0;
}

float sprod(int n, float *x, float *y)
{
  float scalar=0.0;
  int j=0;
  int sum=0;

  for(j=0;j<n;j++);
  {
    scalar+=x[j]*y[j];
  }
  return scalar;
 }

これを最初に投稿してから、コードを改良しました。今ではほとんど動作しますが、コードの free_ivector ビットの 50 行目で問題が発生しています。ターミナルは、「free_ivector」の引数 1 の型に互換性がないことを通知します。それが何を意味するのかよくわかりません。このコードは、以下の最初の回答で David Duncan が提案したものの全体的な書式設定を採用しています。

4

2 に答える 2

0

これは、ポインターと配列参照の受け渡しを伴うため、プログラミングや C だけに慣れていない人にとっては少し難しい問題です。ただし、必要な特定の各項目の例を調べるのに十分な知識があると思います。したがって、最初の目標は、おそらくご存知のように、物事をサブ問題に分割し、個別に (必要に応じて繰り返し) 取り組むことです。 . あなたの現在のコードはレイアウトに少し役立つ可能性があるので、問題ステートメントを少しずつ取り組むことができるものに適合させました。それぞれの "TODO" コメントをそれを行うコードに置き換えれば、完了だと思います。

#include <stdio.h>
#include "nrutil.h"

float sprod(int n, float *x, float *y)
{
    float result = 0.0;
    // TODO: Calculate result (hint: for loop repeating n times,
    // and each iteration you'll update result)

    return result;
}

int main()
{
    // TODO: Create and initialize matrix A
    // TODO: Create and initialize matrix B
    // TODO: Print A and B
    // TODO: For each row of A, call sprod() with that row of A
    // and B as inputs, and save each sprod() result
    // TODO: Sum the results
    // TODO: Print the sum

    return 0; // (0 indicates success; if you were to have
              //  failure cases, you could return other values)
}

上記のアプローチを使用すると、コンパイルが容易になります (その結果、デバッガーを使用できるようになります)。GDB を使用するための最低限の要件は次のとおりです。

  • GCC -g スイッチを使用してコンパイルします。つまり、gcc -g myprog.c
  • gdb <program name>(プログラム名は通常、デフォルトで a.exe または a.out になります)
  • break <line number>ブレークポイントを設定するには
  • runプログラムを開始するには
  • n次の声明のために
  • quitやめること

また、元の問題ステートメントには、教師によって提供された場合に少し混乱すると思われる点がいくつかあります (それが単にあなたの言い訳である場合、私はつまらないものを選んでいます)。

  • for(;;) は、その中で goto ステートメント (非常に非典型的) または break ステートメント (やや非典型的) を使用しない限り、無限ループになりますが、どちらもここでは適切ではありません。したがって、単に「for ループ」と言う方が、もう少し理にかなっているでしょう。
  • 明確にするために、C にはゼロベースのインデックスがあります。つまり、matrix() で明示的にそのように定義しない限り、行は a[0]、a[1]、および a[2] (a[1]、a ではありません) になります。 [2]、および a[3])。
于 2012-11-25T23:18:50.680 に答える
0

アイデアを与えるには:

#include <stdio.h>
#include <math.h>
#define ROW 3
#define MAT 9

float printinv( int n, float * a, float * b );

int main ( void ){
    int i, k;
    float a[ ROW ] = { 1, 2, 3 };
    float b[ MAT ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    float *c;
    c = &b[0];


    printf( "A = " );
    for( i = 0; i < ROW; i++ ){
        if( i == 0 )
            printf( "[" );
        if ( i != ROW - 1 )
            printf( "  %5.2f", a[ i ] );
        else {
            printf( "  %5.2f", a[ i ] );
            printf( "  ]" );
        }
    }

    printf( "    B = " );
    for( i = k = 0; k < MAT; k++ ){
        if( i == 0 && k == 0) 
            printf("[");
        else if( i == 0 && k > 0 )
            printf( "                                     [");
        if( i != ROW - 1 ){
            printf( "  %5.2f", b[ k ] );
            i++;
        }
        else{
            printf( "  %5.2f", b[ k ] );
            printf( "  ]\n" );
            i = 0;
        }
    }

    printf( "C = " );
    for( i = 0; i < ROW; i++ ){
        if( i == 0 ) 
            printf("[");
        if( i != ROW - 1 )
            printf( "  %5.2f", printinv( MAT, ( c + i ), a ) );
        else{
            printf( "  %5.2f", printinv( MAT, ( c + i ), a ) );
            printf( "  ]\n" );
        }
    }
    getchar();

}

float printinv( int n, float * b, float * a )
{
    int i, k;
    float result;
    float x, y;

    for( result = i = 0; i < ROW; i++ ){
        k = i * ROW;
        result += b[ k ] * a[ i ];
        x = b[ k ]; 
        y = a[ i ];
    }
    return result;
}

出力:

出力

于 2012-11-26T01:05:45.387 に答える