问题:要测量储罐中的液体量,可以使用深度计(量尺)。将其插入顶部的开口中,量规上的液位可用于确定储罐中的液量。
储罐的宽度为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;
}
在这里和那里有一些错误。首先,让我们对储罐的尺寸使用全局变量,以便函数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()中完成,而不是在梯形_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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句