Код, определяющий корни квадратного уравнения. Также определите следующее на основе дискриминанта 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 ответа
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]));
}
Да, очень хороший момент (извините за каламбур).
— Тоби Спейт