4.2. Конструкция if–else
Общая форма записи конструкции if–else:
if (условие) оператор1
else оператор2
Оператор if выбирает один из двух вариантов последовательности вычислений.
Если условие истинно или отлично от 0, выполняется оператор1, если ложно, то выполняется оператор2.
Каждое из утверждений может быть множественным. В таком случае применяются фигурные скобки:
if (выражение)
{
оператор1
оператор2
...
}
else
{
оператор3
оператор4
...
}
if (x > y)
a = x;
else
a = y;
В данном примере переменной a присваивается значение максимума из двух величин x и y.
4.3. Конструкция if–else if–else if–...–else
Форма записи конструкции if–else if–else if–...–else:
if (выражение1)оператор1
else if (выражение2)оператор2
else if (выражение3)оператор3
else оператор4
Приведенная конструкция используется для выбора возможных ситуаций, когда проверяются условия выражение1, выражение2, выражени3,... . Соответственно будут выполняться действия оператор1, оператор2, оператор3 и т.д. В случае, когда ни одно из условий не выполняется, выполняются действия, прописанные после оператора else.
В случае выполнения множественных действий применяются фигурные скобки для каждого из утверждений:
if (выражени1)
{
оператор1;
...
}
else
if (выражение2)
{
оператор2
...
}
else if (выражение3)
{
оператор3
...
}
...
else
{
оператор
...
}
Наприрмер:
if (x < 0)
printf("Отрицательная величина\n");
else if (x > 0)
printf("Положительная величина\n");
else
printf ("Ноль\n");
Замечание: Конструкция else всегда принадлежит ближайшему if.
4.5. Условный оператор ?
В отличие от других операторов языка С, которые могут быть унарными или бинарными, специфический оператор условия является тернарным оператором. Это означает, что у него может быть три операнда.
Общий формат записи оператора условия:
условие ? выражение_1 : выражение_2
Если в результате вычисления условия будет получено значение TRUE (истина, не нуль), то выполняется выражение_1, и результатом выполнения оператора условия будет значение, полученное при вычислении этого выражения. Если в результате вычисления условия будет получено значение FALSE (ложь, т.е. нуль), то выполняется выражение_2, и результатом выполнения оператора условия будет значение, полученное при вычислении выражение_2.
Оператор условия часто описывают как оператор ?. Тернарный оператор условия ? наиболее часто используется для присвоения переменной одного из двух значений в зависимости от некоторого условия.
Например:
x= a<b ? a : b
Переменной х будет присвоеное значение переменной а, если а меньше b и значение переменной b, если b меньше a.
Практическая часть
Пример 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.
Рис. 4.1. Результат решения квадратного уравнения
В программе последовательно проверяются условия с помощью операторов if. В последнем случае, когда коэффициент а = 0, квадратное уравнение вырождается и превращается в линейное уравнение. Решение в этом случае очевидно.
В программе применены функции scanf_s() вместо стандартной функции scanf() языка С. Это сделано для того, чтобы по этим функциям не было предупреждений (warning) в MS Visual Studio 2008.
Кроме того, в программу подключена библиотека math.h для действий с математическими функциями, например, sqrt().
В первом операторе if применено логическое условие И ( && ) для проверки того, что дискриминант не равен отрицательному значению и одновременно чтобы первый коэффициент квадратного уравнения не был равен нулю. Аналогичное условие прописано и для последнего оператора if.
Пример 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.
Рис. 4.2. Выполнение программы с двумя нулевыми коэффициентами
Пример 3. Напишите программу классификации введенного с терминала символа на основе конструкции if–else if–else [4.1].
Символы (одиночные) будем считать как строчные и прописные буквы латинского алфавита, цифры от 0 до 9, и специальные символы.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main(void)
{
char c;
// Ввод одиночного символа
printf("\n\t Enter a single character: ");
scanf_s("%c", &c);
if ( c >= 'a' && c <= 'z' ) printf("\n\t This is a small letter\n");
else if ( c >= 'A' && c <= 'Z') printf("\n\t This is a capital letter\n");
else if ( c >= '0' && c <= '9') printf("\n\t This figure (digit)\n");
else printf("\n\t This is a special character\n");
printf("\n Press any key: ");
_getch();
return 0;
}
Результат выполнения программы показан на рис. 4.3.
Рис. 4.3. Результат классификации символа
Пример 4. Напишите программу вычисления двух целых случайных чисел и определения наибольшего из них. Определение наибольшего числа произведите с помощью оператора условия ?
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h> // Для функций случайных чисел
#include <time.h>
int main (void)
{
int a, b, maxab;
unsigned int some;
long int L;
L = (long) time(NULL);
some = (unsigned) L/2;
srand(some);
a = rand();
b = rand();
printf("\n\t Random numbers: a = %d; b = %d\n", a, b);
// Оператор условия для определения максимального числа
maxab = (a > b) ? a : b;
printf("\n\t Maximum number: %d\n", maxab);
printf("\n Press any key: ");
_getch();
return 0;
}
В программе использованы функции генерации псевдослучайных чисел rand() и задания исходного псевдослучайного числа srand(). Указанные функции входят в стандартную библиотечную функцию stdlib.h. Функция time() входит в библиотечную функцию time.h, которая поддерживает функции, обращающиеся к системному времени.
Для переменных L и some выполнено приведение типов.
При каждом обращении к функции rand() возвращается целое в интервале между нулем и значением RAND_MAX, которое в любой реализации должно быть не меньше числа 32 767
Возможный результат выполнения программы показан на рис. 4.4.
Рис. 4.4. Результат определения максимального числа
