2014-02-24 37 views
0

好的,所以這個程序正在編譯和運行,除非它正在輸出一個區域爲零的答案。 (注意這個函數是調用它的主要部分)。我已經將最短的功能作爲例子。錯誤答案C中的梯形法則

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

#define pi 3.1415927; 

//Function to convert degrees to radians 
float TrapezoidRule(float); 
float SimpsonsRule(float); 
float GaussQuadrature(float); 

int main() { 

int userInput, N; 
float area, error; 

     printf("Choose which method to use to calculate the area of the function sin(x) from 0 to pi:\n"); 
     printf("Enter 1 to use the Trapezoid Rule, enter 2 to use Simpson's Rule, enter 3 to use Gauss' Quadrature.\n"); 
     scanf("%d", &userInput); 
     printf("\nEnter the number of intervals to use to calculate the area.\n"); 
     scanf("%d", &N); 

     if (userInput == 1) {    //Call Trapezoid rule function 
      printf("You are in this loop\n"); 
      TrapezoidRule(area); 
      } 
     if (userInput == 2) { 
      SimpsonsRule(area); 
      } 
     if (userInput == 3) { 
      GaussQuadrature(area); 
     } 

     error = ((fabs(area - 2.0))/2.0)* 100; 

     //Print the area calculated using the chosen method 
     printf("\narea using chosen method = %.7f. Actual area = 2.0\n", area); 
     printf("The percentage error for your chosen method = %.7f\n", error); 

return 0; 

} 

高斯正交函數如下所示:

#include <stdio.h> 
#include <math.h> 

double pi = 3.1415927; 

int main (void) { 

float area, a, b, h, k, error; 

a = 0.0; 
b = pi; 
h = (b - a)/2; 
k = a + h; 

area = h * (sin(k + (h/sqrt(3.0))) + sin(k + (h/sqrt(3.0)))); 


//error = fabs(((area-2.0)/2.0) * 100); 

printf("Area according to Gauss Quadrature = %.8f, True area = 2.0\n Error = %.8f percent\n", area, error); 


return 0; 
} 

使用printf語句,我可以看到該函數的調用是否正確,但該地區的心不是」正在函數計算正確。這可能與主函數的調用方式有關嗎?對不起,我是一個初學者編程,很困惑如何正確調用和使用函數。非常感謝您的幫助!

+1

什麼是第二個程序返回的值? 「TrapezoidRule」函數有問題嗎? *那個*函數是怎麼樣的? –

+2

這還不清楚 - 您的第二個片段是另一個程序還是您的功能?如果它的功能,它爲什麼重新定義主要? – asawyer

+1

另外,你應該閱讀關於通過參數*和參考*傳遞參數*以及它們的差異,因爲這很可能是您的問題。 –

回答

1

由於沒有定義函數float TrapezoidRule(float),所以很難確切知道,但我猜測該函數返回該區域。此外,N變量被讀取,但從未使用過 - 它是函數的輸入變量嗎?

如果是這樣的話,你需要將返回的結果存儲在該地區的變量:area = TrapezoidRule(N);

0
//A function like 
float TrapezoidRule(float); 

應該有一個return語句返回該地區。

在調用此函數 使用一個變量一樣,

float newarea = TrapezoidRule(area) ; 

現在「newarea」將存儲從功能trapezoidrule