Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практикум по основам программирования. Скалярные типы. Управляющие операторы. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
– +
S1
S2
B ?
ГЛАВА 2 ВЕТВЯЩИЕСЯ ВЫЧИСЛИТЕЛЬНЫЕ ПРОЦЕССЫ
Понятие ветвящегося вычислительного процесса
Ветвящийся вычислительный процесс предполагает несколько
возможных направлений вычисления при решении задачи, но только одно из них должно выполняться при реализации алгоритма. Поэтому ветвление включает проверку одного или нескольких условий, в зави­симости от которой и будет выбираться направление (ветвь) вычисле­ния.
Таким образом, алгоритм ветвления состоит из проверки условия
(условий) и всех возможных ветвей вычисления, при этом желательно, чтобы действия, общие для всех ветвей, описывались один раз (до или после ветвления).
Управляющие структуры выбора
При реализации на языке программирования ветвящегося процесса
используются следующие структуры управления вычислениями: по­следовательность (см. предыдущий раздел 1) и ветвления.
1) Структурная схема полного ветвления – выбор одного из двух
возможных действий (альтернатива):
На языке программирования эта структура реализуется условным
оператором (условный полный оператор):
21
– +
S1
B ?
if (B) S1;
else S2;
Здесь Bвыражение, принимающее логическое значение, S1 – оператор, исполняемый, если B истинно, S2 – оператор, исполняемый, если B ложно. В контексте условного оператора равное нулю значение выражения интерпре­тируется как ЛОЖЬ, а отличное от нуля значение как ИСТИНА.
Пример полного условного оператора:
if (x > 0) y = x * x; else y = -x;
2) Структурная схема сокращенной альтернативы – выполне-
ние или невыполнение действия:
На языке программирования эта структура реализуется условным
неполным оператором (условный сокращенный оператор):
if (B) S;
22
Здесь S – оператор, исполняемый, если B истинно, в противном
случае выполняется следующий по порядку оператор.
Пример сокращенного условного оператора:
if (x > y) y = x;
Оператор S1 (а также оператор S2 и оператор S) может быть состав­ным, если выбираемое в зависимости от условия B действие включает несколько отдельных действий.
Пример условного оператора с внутренним составным оператором :
if (x > y)
{
a = x;
x = y;
y = a;
}
3) Многозначное ветвление
Если в качестве оператора S1 (или оператора S2 или оператора S) использовать условный оператор (в полной или сокращенной форме), то можно описать выбор одного из более чем двух действий – много­значное ветвление:
Выбор одного из 4-х действий:
if (B1)
if (B2)
S1;
else
S2;
else
if (B3)
S3;
23
else
S4;
Выполняется S1, если B1 и B2 истинны. Если B1 истинно и ложно B2, выполняется S B3 ложны, выполняется S4 .
Если B1 ложно и истинно B3, выполняется S3. Если B1 и
2.
Выбор одного из 3-х действий:
а) if (B1)
if (B2) S1; else S2; else S3;
Выполняется S1, если B1 и B2 истинны. Если истинно B1 и ложно B2 выполняется S2.Если ложно B1, выполняется S3 .
б) if (B1)
S1; else if (B2) S2; else S3;
Выполняется S1, если B1 истинно. Если ложно B1 и истинно B2, вы­полняется S
Если B1 и B2 ложны, выполняется S3.
2.
Выбор одного из 2-х действий:
if (B1)
{
if (B2)
S1;
}
else
24
S2;
Выполняется S1, если B1 и B2 истинны. Если B1 ложно, выполняется S2. Условный сокращенный оператор if заключен в фигурные скобки
(составной оператор) для того, чтобы явно задать необходимый поря­док действий.
Пример многозначного ветвления с помощью вложенности услов­ных операторов:
а) if (x > 0)
if (x < 1)
y = x * x; else y = 1;
б) if (x > 0)
{ if (x < 1) y = x * x; }
else y = 1;
в) if (x < 0)
if (x > y) z = x; else
z = y; else if (x < y)
z = x; else z = y;
25
Еще одним вариантом многозначного ветвления является управ­ляющая структура переключатель.
На языке программирования C эта структура реализуется операто­ром выбора switch:
switch (I)
{
case L1: S1; break;
case L2: S2; break;
. . .
case Ln: Sn; break;
default: S
n+1
;
}
Здесь I – выражение дискретного типа, L1, L2, ... , Ln – константы то­го же типа, что и I, S
, ... , Sn – операторы, из которых выполняется
1, S2
тот, с константой которого совпало значение I. Ветка default (оператор S
) выполняется, если ни одно из вышестоящих выражений не удов-
n+1
летворено.
Пример записи оператора выбора:
a) switch (k % 3)
{ case 0: printf("\n k кратно 3"); break; case 1: printf("\n k не кратно 3"); break; case 2: printf("\n k не кратно 3"); break; }
б) switch (k % 3)
{ case 0: printf("\n k кратно 3"); break; default: printf("\n k не кратно 3"); }
26
2
2
cos , (0,2),
1 sin , (0, 2).
xx
xx
 

Примеры
1 Определить необходимые переменные и записать указанное дейст-
вие в виде одного условного оператора:
а) y =
float x, y; if (0 < x && x < 2) y = cos (x) * cos (x); else y = 1 – sin (x) * sin (x);
б) перераспределить значения переменных x и y так, чтобы в x
оказалось большее из этих значений, а в y – меньшее;
float x, y, z; if (x < y) { z = y; y = x; x = z; };
в) известно, что из четырех чисел a1, a2, a3, a4 одно отлично от
трех других, равных между собой; присвоить номер этого числа переменной n;
float a1, a2, a3, a4; int n; if (a1 == a2) if (a1==a3) n = 4; else n = 3; else
27
if (a1== a3) n = 2; else n = 1;
2 Определить необходимые переменные и записать последователь-
ность операторов для решения задачи:
а) Даны три различных целых числа. Найти два таких числа
среди них, чтобы модуль разности между ними был макси­мален;
int a, b, c, d1, d2, d3, m, n; scanf("%d %d %d", &a, &b, &c); d1 = abs (a - b); d2 = abs (b - c); d3 = abs (a - c); if (d1 > d2) if (d1 > d3) { m = a; n = b; } else { m = a; n = c; } else if (d2 > d3) { m = b; n = c; } else {
28
m = a; n = c; } printf("\nm = %d n= %d", m, n);
б) Даны три произвольных числа. Можно ли построить равно-
бедренный треугольник с такими длинами сторон? Если нельзя, то напечатать 0, иначе напечатать 1;
float a, b, c; scanf("%f %f %f", &a, &b, &c); if (a < 0  b< 0  c< 0  a > b + c  b > a + c c > a + b) printf("\n 0"); else if (a == b  a == c  b == c) printf("\n1"); else printf("\n0");
в) Даны координаты трех попарно различных точек плоскости.
Найти ту из них, которая расположена ближе других к нача­лу координат;
float x1, y1, x2, y2, x3, y3, d1, d2, d3, x, y; scanf("%f %f %f %f %f %f ", &x1, &y1, &x2, &y2, &x3, &y3); d1 = x1 * x1 + y1 * y1; d2 = x2 * x2 + y2 * y2; d3 = x3 * x3 + y3 * y3; if (d1 < d2) if (d1 < d3) { x = x1; y = y1;
29
} else { x = x3; y = y3; } else if (d2 < d3) { x = x2; y = y2; } else { x = x3; y = y3; } printf("\nx = %f y= %f", x, y);
г) Даны целочисленные координаты трѐх вершин прямоуголь-
ника, стороны которого параллельны координатным осям. Найти координаты его четвѐртой вершины;
int x1, y1, x2, y2, x3, y3, x4, y4; scanf("%f %f %f %f %f %f ", &x1, &y1, &x2, &y2, &x3, &y3); if (x1 == x2) { x4 = x3; if (y1 == y3) y4 = y2; else y4 = y1; } else if (x1 == x3)
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]