Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практикум по основам программирования. Скалярные типы. Управляющие операторы. Учебное пособие
.pdf
– +
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
