布尔 发表于 2020-8-1 18:46:50

一元二次方程运行结果的问题

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

int main()
{
        double a,b,c,disc,p,q,x1,x2;
        scanf("a=%lf b=%lf c=%lf",&a,&b,&c);
        disc=b*b-4*a*c;
        p=(-b)/(2.0*a);
        q=sqrt(disc)/(2.0*a);
        x1=p+q;
        x2=p-q;
        printf("x1=%f\nx2=%f",x1,x2);
}

这个代码不知道哪错了,得出来的X1,X2结果一样

baige 发表于 2020-8-2 08:04:37

本帖最后由 baige 于 2020-8-2 08:05 编辑

a=1 b=6 c=1这样输入scanf()是格式化输入,输入格式跟scanf()里面的内容要一致

baige 发表于 2020-8-2 08:06:37

baige 发表于 2020-8-2 08:04
a=1 b=6 c=1这样输入scanf()是格式化输入,输入格式跟scanf()里面的内容要一致


风过无痕1989 发表于 2020-8-4 12:48:46

本帖最后由 风过无痕1989 于 2020-8-4 12:56 编辑

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

int main()
{
      double a,b,c,disc,p,q,x1,x2;
      scanf("%lf,%lf,%lf",&a,&b,&c);
        disc=b*b-4*a*c;
      if (disc >= 0)
        {
             p=(-b)/(2.0*a);
             q=sqrt(disc)/(2.0*a);
             x1=p+q;
             x2=p-q;
             printf("x1=%f\nx2=%f\n",x1,x2);
        }
        else
        {
             printf("此方程无实数解\n");
        }
        return 0;
}


       键盘输入 scanf() 函数是严格按照你在引号内的格式从缓冲区读取字符。一般情况下引号之间只写格式化要求,格式化内容要和输入内容一致,数与数、字符与字符之间可以用空格隔开,也可以用逗号隔开,否则就会出错。除了格式化操作符以外,不加任何其他字符,连空格都不要加。

scan在你输入一个数后,它是不会立即显示的,要等再接收到一个非(空格、制表符、回车)的输入语scanf句才结束。而且,最后输入的那个非(空格、制表符、回车)的东西是不会被这个scanf读进来的,而是留在输入流里。

       scanf("%d,%d,%d",&a,&b,&c),在每个数字之间需要输入逗号,否则后面的变量就无法正常赋值。假如你先输入18,然后输入逗号以外的其他非数字字符, scanf()会认为第一个int型变量输入完成,将18赋值给变量a;然后就会一直等待你输入逗号,但是你迟迟没有输入,超时之后程序没有正常给变量bc赋值,你的程序运行结果肯定和你的预期不一样。

风过无痕1989 发表于 2020-8-5 16:38:24

你输入的数正好使得:b * b - 4 * a * c = 0 了,===> 使得 q = 0 ,这样的方程的两个根当然就相同了。

相信自己,你写的程序没有问题,过来给个 ” 最佳答案“吧

布尔 发表于 2020-8-5 20:33:52

baige 发表于 2020-8-2 08:06


谢谢了,已经解决,是我输入数据格式的问题
页: [1]
查看完整版本: 一元二次方程运行结果的问题