在C程序中进行校准

用户名

问题:要测量储罐中的液体量,可以使用深度计(量尺)。将其插入顶部的开口中,量规上的液位可用于确定储罐中的液量。

储罐的宽度为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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C#程序中进行键调用方法

来自分类Dev

将参数传递给C ++程序以在VSCode中进行调试

来自分类Dev

系统调用可以在C程序中进行吗?

来自分类Dev

如何在C#程序中进行键调用方法

来自分类Dev

使用Windows Forms应用程序在C中进行编译

来自分类Dev

使用Shell脚本在C程序中进行更改

来自分类Dev

在OSX上的C ++ / Objective-C应用程序中进行拖动操作时崩溃

来自分类Dev

如何通过 gml c++ 相机校准工具箱进行 Kinect RGB 和深度相机校准

来自分类Dev

在C中进行除法转换

来自分类Dev

无法在sed程序中进行替换

来自分类Dev

使用phantomjs驱动程序C#在Selenium中进行代理

来自分类Dev

使用应用程序在密集内存中进行C#垃圾回收

来自分类Dev

使用Win32 Api在C程序中进行串行连接

来自分类Dev

使用C#在Windows Phone 8应用程序中进行简单的Web服务登录

来自分类Dev

使用phantomjs驱动程序C#在Selenium中进行代理

来自分类Dev

用fork()编写程序并在C中进行信号处理

来自分类Dev

“校准” NSTimer进行UI更新

来自分类Dev

在Ubuntu上进行颜色校准

来自分类Dev

DES在C / C ++与Java中进行加密

来自分类Dev

如何仅包含文件一次/防止在C ++程序的旧C API中进行函数重定义

来自分类Dev

在C中进行ASM呼叫/退出

来自分类Dev

在C ++中进行多继承转换

来自分类Dev

如何在C ++中进行惰性构造?

来自分类Dev

使用 在C ++中进行声明时

来自分类Dev

Stackoverflow在C#中进行拳击

来自分类Dev

在C#中进行委托组合

来自分类Dev

在C ++中进行比较和交换

来自分类Dev

在C#中进行T测试

来自分类Dev

Cassandra允许在C#中进行过滤

Related 相关文章

热门标签

归档