座谈会考试的例子

时间:2015-11-26 10:45:42

标签: c task

Check the image 这是我的第一篇文章,所以在阅读我的问题时请记住这一点。 我参加了一次座谈会的考试,但我的代码没有提供正确的结果。 所以,如果有人能帮助我那将是伟大的。 :) 这些是考试中提供的信息: 函数 y = f(x)= ax ^ 2 + bx + c 我们必须找到图表下方的表面,但请记住dx(Delta X)= B-A,高度如下:A,A + dx,A + 2dx,....,B-dx。 随着dx值变低,表面将更准确。 你必须编写程序,使表面精度为0.001 这是我的代码,所以C好的人可以检查一下。 谢谢。

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

int main()
{
    int a,b,c;
    double A,B,dx,p,D,q,x,y,nv,nv1,nv2,sv;
    do{
        printf("Insert a & b: "),scanf("%lf %lf",&A,&B);
    } while(A<1 || B<1);
    nv=dx=B-A;
    do{
        printf("enter odds: "),scanf("%d %d %d",&a,&b,&c);
        p=(-b)/2;
        D=sqrt(pow(b,2)-4*a*c);
        q= -D/4*a;
    } while( a<0 || p<0 || q<0);
    do{
        sv=nv;
        dx/=2;
        nv=0;
        for(x=A;x<p;x+=dx)
        for(dx=B-A;dx<q;dx/=2)
            nv1+=x*dx;
        for(y=p;y<=B;y+=dx)
        for(dx=q;dx<B;dx/=2)
            nv2+=y*dx;
        nv=nv1+nv2;
    }while(fabs(nv-sv)>0.001);
    printf("The surface is %lf",nv);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您想要找到二次函数的定积分的近似值。您的代码存在以下几个问题:

  • A≥1B≥1的限制是什么?在整个横坐标上定义抛物线。如果有的话,你应该强制输入是数字并且给出了两个值。

  • 您不需要找到抛物线的顶点。您的任务是根据图像显示的每个间隔的左 x 值创建小矩形。因此,您不需要 p q 。并且您不应该强制执行顶点在输入的第一个象限中而没有指示。

  • 为什么抛物线整数的系数?让他们double保持一致。

  • 因为您不需要知道顶点,所以您不需要将循环分成两部分。在您的代码中,您甚至不会检查 p 是否位于 A B 之间,这是cour代码的要求。< / p>

  • 内循环是什么?你应该在这里计算当前矩形的面积。更糟糕的是:您重复使用变量dx作为迭代变量,这意味着您将其作为当前间隔大小的指标而丢失。

  • 当间隔数量很大时,dx的重复递增可能会导致累积的浮点错误。避免这种情况的常用技术是使用整数变量进行循环控制,并通过乘法确定实际的浮点变量。

  • 作为收敛标准的绝对值可能导致小数和大数的问题。对于小值,迭代结束得太早,并且它可能永远不会达到大数的标准,其中0.001的差异无法解决。

这是您的代码版本,将所有这些付诸实践:

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

int main()
{
    double a, b, c;
    double A, B;

    printf("Lower and upper limit A, B: ");
    scanf("%lf %lf", &A, &B);

    printf("enter coefficients a, b, c: ");
    scanf("%lf %lf %lf", &a, &b, &c);

    double nv = 0;
    double sv;
    int n = 1;

    do {
        int i;
        double dx;

        sv = nv;

        n *= 2;
        dx = (B - A) / n;
        nv = 0;

        for (i = 0; i < n; i++) {
            double x = A + i * (B - A) / n;
            double y = a*x*x + b*x + c;

            nv += dx * y;
        }
    } while(fabs(nv - sv) > 0.0005 * fabs(nv + sv));

    printf("Surface: %lf\n", nv);

    return 0;
}

代码表现良好的空间隔(其中 A = B )或反向间隔(其中 A &gt; )。 inpt仍然快速而肮脏。应该确实输入的值是有效数字。但是,没有必要任意限制输入。