C/C++

Программирование на C. Помогите бездарю

Здраствуйте, пытался написать код на С для решения выражения ax^2+bx+c<0. Работает некорректно, дальше вывода"х принадлежит пустому множеству" будто вообще не видит. Что не так-то? Код; #include<stdio.h>
#include<conio.h>
#include<locale.h>

int main()
{
setlocale(LC_ALL, "");
float a, b, c, D;
printf("Выражение: ax^2+bx+c<0\n Введите значение a=\n");
scanf_s("%f", &a);
printf("Введите значение b=\n");
scanf_s("%f", &b);
printf("Введите значение c=\n");
scanf_s("%f", &c);
D = (b * b - 4 * a * c);
if (D < 0)
printf("x принадлежит пустому множеству");
float x1 = (-b - sqrt(D)) / (2 * a);
float x2 = (-b + sqrt(D)) / (2 * a);
if (a > 0 && x1 > x2)
printf("%f,%f", x2, "< x <", x1);
if (a > 0 && x1 < x2)
printf("%f,%f", x1, "< x <", x2);
if (a < 0 && x1 > x2)
printf("%f,%f", "x принадлежит от минус бесконечности до", x2, "и от плюс бесконечности до",x1);
if (a < 0 && x1 < x2)
printf("%f,%f", "x принадлежит от минус бесконечности до", x2, "и от плюс бесконечности до",x1);

}
Прежде всего математические ошибки (и зачем программистам математика?).

Первое. Согласно определению функция sqrt возвращает арифметический квадратный корень, который всегда неотрицательный, то есть всегда выполняется x1 <= x2 при a > 0 или x2 <= x1 при a < 0. Таким образом, все проверки x1 > x2 и x1 < x2 просто не нужны.

Второе. Никак не проверяется случай D = 0, при котором x1 = x2.

Третье. Что такое «от плюс бесконечности до",x1»?

Программная ошибка только одна: тотальное игнорирование ветки else оператора if. То есть, проверяя условие D < 0, надо код, относящийся к случаю невыполнения условия, поместить в ветку else:
 if (D < 0) 
printf("x принадлежит пустому множеству");
else
{
float x1 = (-b - sqrt(D)) / (2 * a);
float x2 = (-b + sqrt(D)) / (2 * a);
// дальнейший код
}
ММ
Максим Михайлов
12 091
Лучший ответ
Всего существует 9 комбинаций, определяемых знаками A и D, и 6 вариантов ответа. Тогда как твой код предлагает всего 3 варианта, не учитывая несколько случаев.
 double a, b, c, D;
int sgn_a, sgn_d;
scanf("%lf", &a);
scanf("%lf", &b);
scanf("%lf", &c);
D = b * b - 4.0 * a * c;
sgn_a = (a > 0.0) - (a < 0.0);
sgn_d = (D > 0.0) - (D < 0.0);
switch (sgn_a * 3 + sgn_d) {
case -1: // a == 0, d < 0
case 0: // a == 0, d == 0
case 1: // a == 0, d > 0
print("Это не квадратное уравнение");
break;
case -4: // a < 0, d < 0
print("x - любое число");
break;
case -3: // a < 0, d == 0
print("x != %lf", -b / (2 * a));
break;
case -2: // a < 0, d > 0
print("x < %lf или x > %lf", (-b + sqrt(D)) / (2 * a), (-b - sqrt(D)) / (2 * a));
break;
case 2: // a > 0, d < 0
case 3: // a > 0, d == 0
print("Ответа не существует");
break;
case 4: // a > 0, d > 0
print("%lf < x < %lf", (-b - sqrt(D)) / (2 * a), (-b + sqrt(D)) / (2 * a));
break;
}
Если требуется рассмотреть случай A == 0, то появляется ещё 2 варианта ответа, отличных от уже перечисленных.
Бахтияр Омаров Вот тут знаки + и – перепутаны:
 case -2: // a < 0, d > 0 
print("x < %lf или x > %lf", (-b + sqrt(D)) / (2 * a), (-b - sqrt(D)) / (2 * a));