0

ここに私が修正しようとしているプログラムがあります。1,5,6 と入力すると、2 つの解が存在するはずですが、1 つの解しか存在しないと表示されました。また、10 進数値を表示するようにしようとしています (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();
  }
4

1 に答える 1

3

多くの問題

  1. 数学部分では、 の代わりにdouble(または) を使用する必要があります。floatint

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

  2. printf()& scanf()double の場合、フォーマット指定子を%dto %le(など) から matchに変更する必要があります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)ケースは、単一のソリューションではなく、「二重ルート」になります。実際には、浮動小数点演算の丸めを考えると、数学的に正確にd0 である必要があるとは限らないため、「単一の」根は実際には 2 つの非常に近い根です。さらに、値を選択すると、「2 つのソリューション」は同じ値になり、 よりもはるかに小さくなります。sqrt(d)b

于 2013-09-24T22:47:43.983 に答える