C中的二次方程

时间:2013-09-24 22:25:21

标签: c

这是我正在尝试修复的程序。我输入了1,5,6并且应该有2个解决方案,它说只有1个解决方案存在。我也试图让它显示十进制值(我应该使用double?)。以下是我的代码,我做错了什么?

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

int main(void)
{
    int inputs[3], a, b, c, d, x, x1, x2, i, lastDigit;
    char *os, *noSol = "No solution\n", *cont = 'y';

    while (cont == 'Y' || cont == 'y')
    {
        printf("This program solves a quadratic equation\n");
        for (i = 1; i <= 3; i++)
        {

            lastDigit = i % 10;
            if (i >= 4 && i <= 20)
                os = "th";
            if (i == 1 || lastDigit == 1)
                os = "st";
            else if (i == 2 || lastDigit == 2)
                os = "nd";
            else if (i == 3 || lastDigit == 3)
                os = "rd";
            else
                os = "th";


            printf("Enter your %d%s number: ", i, os);
            scanf("%d", &inputs[i - 1]);
        }

        a = inputs[0];
        b = inputs[1];
        c = inputs[2];

        while (1)
        {
            if (a == 0)
            {
                if (b == 0)
                {
                    printf(noSol);
                    break;
                }
                else
                {
                    x = -c / b;
                    printf("The equation is not quadratic and the solution is %d\n", x);
                    break;
                }
            }
            else
            {
                d = pow(b, 2) - 4 * a * c;
                if (d < 0)
                {
                    printf(noSol);
                    break;
                }
                else if (d == 0)
                {
                    x1 = -b / 2 * a;
                    printf("One solution: %d\n", x1);
                    break;
                }
                else  if (d > 0)
                {
                    x1 = (-b + sqrt(d)) / 2 * a;
                    x2 = (-b - sqrt(d)) / 2 * a;
                    printf("Two solutions: %d and %d\n", x1, x2);
                    break;
                }
            }
        }

        printf("Run program second time? ( Y / N )\n");
        scanf("%s", &cont);
    }
    getch();
  }

1 个答案:

答案 0 :(得分:3)

很多问题

  1. 数学部分应使用double(或float)代替int

    double inputs[3], a, b, c, d, x, x1, x2;

  2. printf()&amp;对于double,格式说明符,scanf()需要从%d更改为%le(或类似内容)以匹配double

  3. 数学错误:在3个地方,/ 2 * a;应为/ (2 * a);

  4. char *cont = 'y'应为char cont[2] = "y"

  5. scanf("%s", &cont);应为scanf("%1s", cont);

  6. 错误处理:应该在

    中检查scanf()的返回值

    if (1 != scanf("%lf", &inputs[i - 1])) { ; /* Handle error */ }

  7. 次要数学:if (d == 0)案例导致“双根”,而不是单个解决方案。实际上,给定浮点数学四舍五入,人们并不总是知道d应该在数学上完全零,因此“单个”根实际上是2个非常接近的根。此外,对于选择值,如果sqrt(d)远小于b,则“两个解决方案”将具有相同的值。