Опубликован: 14.12.2010 | Уровень: для всех | Доступ: свободно
Лекция 5:

Принятие решений. Условные операторы в языке С

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >

4.8. Оператор goto

Сейчас во многих языках программирования оператор безусловного перехода типа goto не используется. Однако в языке программирования С он имеет место. Применение оператора goto не является хорошим стилем программирования. Но в некоторых случаях его применение бывает уместно. Иногда, при умелом использовании, оператор goto может оказаться весьма полезным, например, если нужно покинуть глубоко вложенные циклы [4.2].

Для оператора goto всегда необходима метка. Метка – это идентификатор с последующим двоеточием. Метка должна находиться в той же функции, что и оператор goto, переход в другую функцию невозможен.

Общий формат записи оператора goto:

goto метка;
.
.
.
метка: заданные действия.

Метка может находиться как до, так и после оператора goto. С помощью оператора goto можно не только выходить из цикла, но и организовать цикл.

Логические операторы отношения приведены в табл. 4.1.

Таблица 4.1.
широкая ячейка
№ п/п Оператор Операция
1) && И
2) || ИЛИ
3) ! НЕ, отрицание

Ниже приведены операции отношений в убывающей последовательности приоритетов [4.2]:

Наивысший        !
                >  >=  <  <=
                ==  !=
                &&
Низший        ||

Как и в арифметических выражениях, для изменения порядка выполнения операций сравнения и логических операций можно использовать круглые скобки.

Результат любой операции сравнения или логической операции есть 0 (нуль) или 1.

Практическая часть

Пример 1. Напишите программу решения квадратного уравнения с проверкой на наличие вещественных (не комплексных) корней на основе только операторов if. Вид квадратного уравнения:

ax^2+bx+c=0.

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

D=b^2-4ac\geqslant0.

Программный код решения примера:

#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.

Результат решения квадратного уравнения

Рис. 4.1. Результат решения квадратного уравнения

В программе последовательно проверяются условия с помощью операторов if. В последнем случае, когда коэффициент а = 0, квадратное уравнение вырождается и превращается в линейное уравнение. Решение в этом случае очевидно.

В программе применены функции scanf_s() вместо стандартной функции scanf() языка С. Это сделано для того, чтобы по этим функциям не было предупреждений (warning) в MS Visual Studio 2008.

Кроме того, в программу подключена библиотека math.h для действий с математическими функциями, например, sqrt().

В первом операторе if применено логическое условие И ( && ) для проверки того, что дискриминант не равен отрицательному значению и одновременно чтобы первый коэффициент квадратного уравнения не был равен нулю. Аналогичное условие прописано и для последнего оператора if.

Задание 1

  1. Объясните включение float перед функцией sqrt().
  2. В программу введите изменения для вычисления комплексных корней квадратного уравнения без подключения дополнительных библиотек.
  3. В программе предусмотрите ситуацию, когда все коэффициенты квадратного уравнения равны нулю.
  4. В программе предусмотрите подстановки найденных корней в заданное квадратное уравнение с выводом возможной невязки. Предусмотрите также меры по уменьшению невязки.
  5. Предусмотрите циклический ввод коэффициентов квадратного уравнения и вывода решения троекратно.
  6. Предусмотрите проверку всех возможных условий задания коэффициентов квадратного уравнения.

Пример 2. Напишите программу решения квадратного уравнения с проверкой на наличие вещественных корней на основе конструкции if–else. Вид квадратного уравнения:

ax^2+bx+c=0.

Программный код решения примера:

#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.

Выполнение программы с двумя нулевыми коэффициентами

Рис. 4.2. Выполнение программы с двумя нулевыми коэффициентами
< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов