Принятие решений. Условные операторы в языке С
4.8. Оператор goto
Сейчас во многих языках программирования оператор безусловного перехода типа goto не используется. Однако в языке программирования С он имеет место. Применение оператора goto не является хорошим стилем программирования. Но в некоторых случаях его применение бывает уместно. Иногда, при умелом использовании, оператор goto может оказаться весьма полезным, например, если нужно покинуть глубоко вложенные циклы [4.2].
Для оператора goto всегда необходима метка. Метка – это идентификатор с последующим двоеточием. Метка должна находиться в той же функции, что и оператор goto, переход в другую функцию невозможен.
Общий формат записи оператора goto:
goto метка; . . . метка: заданные действия.
Метка может находиться как до, так и после оператора goto. С помощью оператора goto можно не только выходить из цикла, но и организовать цикл.
Логические операторы отношения приведены в табл. 4.1.
Ниже приведены операции отношений в убывающей последовательности приоритетов [4.2]:
Наивысший !
> >= < <=
== !=
&&
Низший ||Как и в арифметических выражениях, для изменения порядка выполнения операций сравнения и логических операций можно использовать круглые скобки.
Результат любой операции сравнения или логической операции есть 0 (нуль) или 1.
Практическая часть
Пример 1. Напишите программу решения квадратного уравнения с проверкой на наличие вещественных (не комплексных) корней на основе только операторов if. Вид квадратного уравнения:

Как известно, квадратное уравнение будет иметь вещественные корни, если его дискриминант будет неотрицательным, т.е. когда

Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void) {
float a, b, c;
float D, x1, x2, x;
printf("\n\t Equation a*x^2 + b*x + c = 0\n");
printf("\n\t Enter the coefficient a: ");
scanf_s("%f", &a);
printf("\t Enter the coefficient b: ");
scanf_s("%f", &b);
printf("\t Enter the coefficient c: ");
scanf_s("%f", &c);
D = b*b - 4*a*c;
if (D >= 0 && a != 0) {
x1 = -b/(2*a) + (float)sqrt(D)/(2*a);
x2 = -b/(2*a) - (float)sqrt(D)/(2*a);
printf("\n\t The roots of the equation:\n\t x1 = %1.4f, x2 = %1.4f\n", x1, x2);
}
if (D < 0)
printf("\n\t The roots of complex\n");
if (a == 0 && b != 0) {
x = -c/b;
printf("\n\t As a = %1.0f,\n\t the solution of the equation is: %1.4f\n", a, x); }
printf("\n Press any key: ");
_getch();
return 0;
}Возможный результат выполнения программы показан на рис. 4.1.
В программе последовательно проверяются условия с помощью операторов if. В последнем случае, когда коэффициент а = 0, квадратное уравнение вырождается и превращается в линейное уравнение. Решение в этом случае очевидно.
В программе применены функции scanf_s() вместо стандартной функции scanf() языка С. Это сделано для того, чтобы по этим функциям не было предупреждений (warning) в MS Visual Studio 2008.
Кроме того, в программу подключена библиотека math.h для действий с математическими функциями, например, sqrt().
В первом операторе if применено логическое условие И ( && ) для проверки того, что дискриминант не равен отрицательному значению и одновременно чтобы первый коэффициент квадратного уравнения не был равен нулю. Аналогичное условие прописано и для последнего оператора if.
Задание 1
- Объясните включение float перед функцией sqrt().
- В программу введите изменения для вычисления комплексных корней квадратного уравнения без подключения дополнительных библиотек.
- В программе предусмотрите ситуацию, когда все коэффициенты квадратного уравнения равны нулю.
- В программе предусмотрите подстановки найденных корней в заданное квадратное уравнение с выводом возможной невязки. Предусмотрите также меры по уменьшению невязки.
- Предусмотрите циклический ввод коэффициентов квадратного уравнения и вывода решения троекратно.
- Предусмотрите проверку всех возможных условий задания коэффициентов квадратного уравнения.
Пример 2. Напишите программу решения квадратного уравнения с проверкой на наличие вещественных корней на основе конструкции if–else. Вид квадратного уравнения:

Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void)
{
float a, b, c;
float D, x1, x2, x;
printf("\n\t Equation a*x^2 + b*x + c = 0\n");
printf("\n\t Enter the coefficient a: ");
scanf_s("%f", &a);
printf("\t Enter the coefficient b: ");
scanf_s("%f", &b);
printf("\t Enter the coefficient c: ");
scanf_s("%f", &c);
D = b*b - 4*a*c;
if (D >= 0 && a != 0 && b != 0) {
x1 = -b/(2*a) + (float)sqrt(D)/(2*a);
x2 = -b/(2*a) - (float)sqrt(D)/(2*a);
printf("\n\t The roots of the equation:\n\t x1 = %1.4f, x2 = %1.4f\n", x1, x2);
}
else {
if (a == 0 && b != 0) {
x = -c/b;
if (c != 0)
printf("\n\t As a = %1.0f,\n\t the solution of the equation is: %1.4f\n", a, x);
else
printf("\n\t As a = %1.0f and c = %1.0f,\n\t the solution of the equation is: %1.0f\n", a, -x);
}
if (D < 0)
printf("\n\t The roots of complex\n");
}
printf("\n Press any key: ");
_getch();
return 0;
}В программе использованы вложенные операторы if.
Результат выполнения программы при исключительной ситуации показан на рис. 4.2.

