Определите корни квадратного уравнения

Код, определяющий корни квадратного уравнения. Также определите следующее на основе дискриминанта b² — 4ac:

Если b² — 4ac является положительный, отобразится: «ДВА РЕАЛЬНЫХ РЕШЕНИЯ».

Если b² — 4ac является нуль, отобразится: «ЕСТЬ ТОЛЬКО ОДИН РЕАЛЬНОЕ РЕШЕНИЕ».

Если b² — 4ac является отрицательный, отобразится: «ДВА КОМПЛЕКСНЫХ РЕШЕНИЯ».

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

int main(){

    int a, b, c, d;
    double root1_real, root2_real, root1_complex, root1_i, root2_complex, root2_i, root_zero;

    printf("Enter a, b and c where a*x*x + b*x + c = 0n");
    scanf("%d %d %d", &a, &b, &c);

    d = b * b - 4 * a * c;
    
     if(d > 0){ // Positive
        root1_real = (-b + sqrt(d)) / (2*a);
        root2_real = (-b - sqrt(d)) / (2*a);
        printf("First Root : %.2lfn", root1_real);
        printf("Second Root : %.2lfn", root2_real);
        printf("There are TWO REAL SOLUTIONSn");
     }else if(d < 0){ // Negative
        root1_complex = -b / (2 * a); root1_i = sqrt(-d) / (2 * a);
        root2_complex = -b / (2 * a); root2_i = sqrt(-d) / (2 * a);
        printf("First root : %.2lf + i%.2lfn", root1_complex, root1_i);
        printf("Second root : %.2lf + i%.2lfn", root2_complex, root2_i);
        printf("There are TWO COMPLEX SOLUTIONSn");
     }else{ // Zero
        root_zero = (-b + sqrt(d)) / (2*a);
        printf("Root : %.2lfn", root_zero);
        printf("There is ONLY ONE REAL SOLUTIONn");
     }
     
     return 0;
    
}

2 ответа
2

int main(void) предпочтительнее, так как это ясно по количеству аргументов.

Я не понимаю, почему коэффициенты должны быть целыми числами — ведь квадратное уравнение может иметь любые действительные коэффициенты?

Мы не проверяем, scanf() фактически преобразовал все три входа. Если нам дано что-то, что не является целым числом (возможно, другое число, возможно, просто вводимый мусор), тогда программа продолжит работу с неверными данными и выдаст вывод, который может быть правдоподобным, вместо разумного сообщения об ошибке. Нам нужно что-то еще вроде:

double a, b, c;
if (scanf("%lf %lf %lf", &a, &b, &c) != 3) {
   fputs("Invalid inputn", stderr);
   return 1;
}

Есть еще один случай недопустимого ввода, который не проверяется — если a равно нулю, мы не хотим на него делить.

Кажется, вы запутались, какая часть здесь настоящая, а какая воображаемая:

    root1_complex = -b / (2 * a); root1_i = sqrt(-d) / (2 * a);
    root2_complex = -b / (2 * a); root2_i = sqrt(-d) / (2 * a);

Если мы используем лучшие имена переменных и немного уменьшим их область видимости, мы сможем сделать это проще:

    double real = -b / (2 * a);
    double imag = sqrt(-d) / (2 * a);

И мы можем выполнить всю печать за один вызов printf:

    printf("First root : %.2f + i%.2lfn"
           "Second root : %.2lf + i%.2lfn"
           "There are TWO COMPLEX SOLUTIONSn",
           real, -imag,   real, imag);

Когда мы знаем d равен нулю, нет смысла вычислять его квадратный корень:

 } else { // Zero
    root_zero = -b / (2*a);

Как предлагается в комментарии, возможно, стоит вычислить эту общую часть трех выражений за пределами if/else:

const double real =  -b / a / 2;
if (d > 0) { // Positive
    double root = sqrt(d) / a / 2;
    ⋮
} else if (d < 0) { // Negative
    double imag = sqrt(-d) / a / 2;
    ⋮
} else { // Zero
    ⋮
}

Вот слегка измененная версия с учетом моих предложений:

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

int main(void)
{
    printf("Enter a, b and c where ax² + bx + c = 0n");
    double a, b, c;
    if (scanf("%lf%lf%lf", &a, &b, &c) != 3) {
        fputs("Invalid inputn", stderr);
        return 1;
    }
    if (!a) {
        fputs("Quadratic term must not be zeron", stderr);
        return 1;
    }

    const double d = b * b - 4 * a * c;

    printf("Finding the roots of %gx² + %gb + %g = 0n", a, b, c);

    const double real =  -b / a / 2;
    if (d > 0) {
        double root = sqrt(d) / a / 2;
        printf("First Root: %.4gn"
               "Second Root: %.4gn"
               "There are TWO REAL SOLUTIONSn",
               real - root,   real + root);
    } else if (d < 0) {
        double imag = sqrt(-d) / a / 2;
        printf("First root: %.4g + %.4gin"
               "Second root: %.4g + %.4gin"
               "There are TWO COMPLEX SOLUTIONSn",
               real, -imag,   real, imag);
    } else { // d == 0
        printf("Root: %.4gn"
               "There is ONLY ONE REAL SOLUTIONn",
               real);
    }
}

  • Да, очень хороший момент (извините за каламбур).

    — Тоби Спейт

Вот некоторые вещи, которые могут помочь вам улучшить вашу программу. Поскольку другой обзор затрагивает большинство важных частей, я упомяну лишь несколько вещей.

Используйте стандартные библиотечные функции

Начиная с C99, у нас были <complex.h> который содержит ряд удобных комплексное число функции и особенности. Их использование значительно упрощает программу:

// calculate the determinant
double d = b * b - 4 * a * c;
// calculate the roots of the equation
double complex root[2] = { 
    (-b + csqrt(d))/2/a, 
    (-b - csqrt(d))/2/a
};

Упростите операторы printf

Используя приведенные выше вычисления, операторы printf становятся намного проще:

if (d > 0) {
    printf("First root : %.2lfnSecond Root : %.2lfn"
        "There are TWO REAL SOLUTIONSn", 
        creal(root[0]), creal(root[1]));
} else if (d < 0) {
    printf("First root : %.2lf + i%.2lfn"
           "Second Root : %.2lf + i%.2lfn"
           "There are TWO COMPLEX SOLUTIONSn", 
           creal(root[0]), cimag(root[0]), 
           creal(root[1]), cimag(root[1]));
} else {
    printf("Root : %.2lfnThere is ONLY ONE REAL SOLUTIONn", 
        creal(root[0]));
}

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *