Принятие решений. Условные операторы в языке С
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.