
Int main() {
double a, b, c, discriminant, x1, x2;
setlocale(LC_ALL, "rus");
setlocale(LC_NUMERIC, "eng");
#if DEBUG
a = 1.0;
b = -5.0;
c = 6.0;
#else
printf("Решение квадратного уравнения ax^2 + bx + c = 0\n"
"Введите коэффициенты\n"
"a = ");
scanf("%lf", &a);
printf("b = ");
scanf("%lf", &b);
printf("c = ");
scanf("%lf", &c);
#endif
printf("\nКвадратное уравнение %fx^2 + %fx + %f=0\n",
a, b, c);
discriminant = b * b - 4.0 * a * c;
#if DEBUG
printf("discriminant = %f\n", discriminant);
#endif
if (discriminant < 0.0) {
printf("Корней нет.\n");
return 1;
}
x1 = (-b - sqrt(discriminant)) / (2.0 * a);
x2 = (-b + sqrt(discriminant)) / (2.0 * a);
printf("x1 = %f\nx2 = %f\n", x1, x2);
return 0;
}
Теперь при DEBUG1 вы можете не заботиться о вводе коэффициентов. После отладки программы на тестовом примере вы заменяете 1 (ИСТИНА) на 0 (ЛОЖЬ). Тогда в текст программы включаются операторы ввода-вывода и исчезает вывод дискриминанта.
9. Отладка
Рекомендуется следующая последовательность действий.
Поставить курсор на строку программы, после которой программа будет выполняться по шагам. Для нашего примера поставим курсор на строку с вычислением дискриминанта
Нажимаем Ctrl+F10 (выполнить до указанной позиции).
Производим ввод значений коэффициентов. Выполнение программы приостанавливается.
Откроем окно вывода контрольных значений.
Debug →Windows→Watch→Watch1
Окно состоит из двух колонок: имя и значение
Введём последовательно: a, b, c, discriminant.
Для дискриминанта отображается мусор, т.к. эта переменная ещё не вычислялась по формуле.
Начинаем выполнение по шагам.
F10 (обход функций)
F11 (с заходом в функции)
В нашем примере надо нажимать F10.
Для остановки отладки Debug → Stop Debugging
10. Сравнение double и float
Чтобы перейти к float, изменим следующие строки:
float a, b, c, discriminant, x1, x2; // double заменили на float
scanf("%f", &a); // %lf заменили на %f
scanf("%f", &b);
scanf("%f", &c);
И ещё: #define DEBUG 0
Получаем три предупреждения о возможной потере данных при преобразовании double во float. Самоуверенно не обращаем на них внимания!
Результат:
Решение квадратного уравнения ax^2 + bx + c = 0
Введите коэффициенты
a = 1
b = -100000
c = 1
Квадратное уравнение 1.000000x^2 + -100000.000000x + 1.000000 = 0
x1 = 0.000000
x2 = 100000.000000
Результат приниципиально неверен! Нулевой корень при ненулевом свободном члене. Верните назад double и спецификаторы формата в scanf.
Решение квадратного уравнения ax^2 + bx + c = 0
Введите коэффициенты
a = 1
b = -100000
c = 1
Квадратное уравнение 1.000000x^2 + -100000.000000x + 1.000000 = 0
x1 = 0.000010
x2 = 99999.999990