问题:为了测量水箱中的液体体积,可以使用深度计(测量棒)。它被插入顶部的开口中,仪表上的液位可用于确定水箱中的液体量。
坦克的宽度为w,高度为h,长度为len(以m为单位)。在下面显示的示例输出中,我们采用w = 8,h = 4和len = 7。您的程序应该适用于w,h和len的任何值,而不仅仅是这些特定的值。
我们考虑插入已经以10厘米为单位校准的测量棒。该测量仪可以插入水箱顶部的开口处,用于测量水箱中液体的深度。
您的任务是编写一个C程序,生成一个值表,显示仪表上每个点的液体体积。
程序的输出(如上例所示)应如下所示:
深度10厘米:体积1.188814立方米
深度20厘米:体积3.336448立方米
深度30厘米:体积5.992683立方米 。 。
深度380厘米:体积172.547399立方米
深度390厘米:体积174.657114立方米
深度400厘米:体积175.743037立方米
方法 如果罐具有宽度W和高度H(以厘米为单位),则横截面的焦点半径为A = W / 2且B = H / 2。那么椭圆的方程是: X ^ 2 / A ^ 2 + Y ^ 2 / B ^ 2 = 1
要在给定深度处找到体积,您应使用数值积分计算每个给定深度的储罐横截面积 算法,如梯形法。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
double WIDTH;
double HEIGHT;
double LENGTH;
//Function: y in terms of x
typedef double (*DFD) (double);
double f (double x)
{
double a = HEIGHT / 2.0;
double b = WIDTH / 2.0;
double y = (b / a) * sqrt (a * a - x * x);
return y;
}
//Integrating the function -> Area
double trapezoidal_int (DFD f ,double a, double b, int n){
double x, dx, sum=0.0;
int i=0;
dx = (b-a)/ n;
sum = (f(a) + f(b))/2;
for (i=1, x = a + dx; i < n; i++, x += dx)
sum += f(x);
return 2.0 * sum * dx;
}
int main ()
{
int h_cm;
printf ("Enter Width of the tank (in m):\n");
scanf ("%lf",&WIDTH);
printf ("Enter Height of the tank (in m):\n");
scanf ("%lf",&HEIGHT);
printf ("Enter Length of the tank(in m):\n");
scanf ("%lf",&LENGTH);
for (h_cm = 0; h_cm <= HEIGHT * 100; h_cm += 10) {
double h = h_cm / 100.0;
double area = trapezoidal_int (&f, HEIGHT / 2 - h, HEIGHT / 2, 100);
double volume = area * LENGTH;
printf ("Depth %d cm: Volume %.6lf cubic metres\n",
h_cm, volume);
}
return 0;
}
答案 0 :(得分:1)
这里和那里都有一些错误。首先,让我们使用全局变量作为坦克的维度,以便函数f()可以使用它们:
double WIDTH;
double HEIGHT;
double LENGTH;
你的函数f()的高度和宽度是反转的:
double f (double x)
{
double a = HEIGHT / 2.0;
double b = WIDTH / 2.0;
double y = (b / a) * sqrt (a * a - x * x);
return y;
}
测量长轴两侧所需的积分值的加倍应该在main()而不是trapezoidal_int()中完成。如果有一个函数没有顾名思义,那就不好了。
整合的界限也是错误的:
int main ()
{
int h_cm;
WIDTH = 8.0;
HEIGHT = 4.0;
LENGTH = 7.0;
for (h_cm = 0; h_cm <= HEIGHT * 100; h_cm += 10) {
double h = h_cm / 100.0;
double area = 2.0 * trapezoidal_int (&f, HEIGHT / 2 - h,
HEIGHT / 2, 100);
double volume = area * LENGTH;
printf ("Depth %d cm: Volume %.6lf cubic metres\n",
h_cm, volume);
}
return 0;
}