2012-11-25 54 views
1

編寫一個C函數sprod(n,x,y),返回2的標量乘積浮點類型的一維數組。該函數將數組的大小爲n(類型爲int的變量)和指向每個數組的第一個成員的指針x和y作爲輸入變量,並返回浮點結果。 main()代碼塊需要調用sprod來計算矩陣乘積a * b,其中類型float matrix a和float float vector b由b = [1 1 1]和a = [1 2 3 4 5 6 7 8 9](其中a是3x3矩陣)。我們可以在f(;;)循環中初始化b,在(;;)循環中使用double(或使用大量的賦值語句)來初始化b。矩陣乘積應通過使用函數sprod的調用來計算,以形成矢量b的每行a的標量乘積;指向這些行的指針由[1],a [2]和a [3]給出。最後,還應該使用一個for(;;)循環來彙總結果標量產品和printf()函數以將結果輸出到屏幕。編寫一個C函數sprod(n,x,y),返回float類型的2個一維數組的標量乘積

結果應該是矩陣a的所有元素的總和。矩陣a和矢量b的副本也應該被打印出來。我們將使用帶有free_matrix()和free_vector()的Numerical Recipes C函數matrix()和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; 
} 

自從最初發布此代碼以來,我對代碼進行了改進。現在它幾乎工作我只是在第50行的free_ivector位代碼的問題。終端告訴我:'free_ivector'參數1的不兼容類型。我不確定這意味着什麼。代碼採用了David Duncan在下面第一個答案中提出的整體格式。

+0

1.如果是你的原型? 2.你在代碼行11中有一個大括號,並且你沒有用任何東西填充'a 3,3'。 3.對於沒有任何爭論的lops?試着幫助我們理解你的代碼,使其更加完善! :) –

+1

這個編譯? – paddy

+0

@AlbertoBonsanto:不要使用作業標籤。 –

回答

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和或。出默認)
  • break <line number>設置斷點
  • run啓動程序
  • n下一個發言
  • quit退出

此外,也有一對夫婦的事情原來的問題陳述,我認爲有點混亂,如果它是由老師提供(如果它只是你的解釋的東西,我挑剔):

  • for(;;)會導致無限循環,除非在其中使用goto語句(非常規)或break語句(有些非典型),這兩者在此都不適用。所以,只是說「for循環」會更有意義。要清楚,C具有從零開始的索引,這意味着除非matrix()明確定義它,否則你的行將是[0],a [1]和a [2](不是[1 ],a [2]和a [3])。
+0

謝謝你。這使得理解需要做什麼變得容易很多。 – Sprock

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; 
} 

輸出:

Output

+0

- 這段代碼幹什麼?這是一個如何使用標量產品的例子嗎?另外printinv是做什麼的? – Sprock

相關問題