Программирование 1
.pdf
4 Алгоритмы и программы ветвящейся структуры. Условный оператор if. Переключатель switch
4.1 Алгоритмы и программы ветвящейся структуры
Очень часто при выполнении программы необходимо выполнять те или иные операторы, в зависимости от анализа каких-либо данных. Алгоритмы, позволяющие производить анализ данных и выполнять нужные, в сложившихся условиях операторы называются ветвящимися или алгоритмами принятия решения.
Для графического изображения ветвления используется блоки, приведённые на рис. 4.1.
|
|
|
условие |
|
да |
условие |
|
да |
||||||
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
||||
Оператор 2 |
|
|
Оператор 1 |
|
|
|
Оператор |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
б)
a)
Рисунок 4.1 – Блок схемы алгоритма принятия решения
В ромбе, как правило, записывается условие, на основе которого производится выбор ветви, в которой будет выполняться оператор. В качестве условия могут использоваться операции сравнения, логические операции, арифметические операции, переменные скалярных типов, указатели. Выражение может иметь арифметический тип. Если оно не равно 0 (для указателя null), то условие считается истинным. Если равно 0 (для указателя null), то условие считается ложным.
При истинности условия выполняется оператор в ветви с надписью «да». «Оператор 2» будет выполнен, если условие примет ложное значение. На рис. 4.1 (б) при ложности условия не будет выполнен ни один оператор, такой блок часто называют «обход».
4.1.1 Условный оператор if
Для записи на языке программирования СИ/СИ++ ветвящихся вычислительных процессов используется условный оператор:
if (выражение) оператор1; else оператор2;
где if, else – служебные слова; <выражение > – логическое, арифметическое выражение или указатель.
31
Эта форма условного оператора приемлема для алгоритма изображённого на рис. 4.1 (а). При истинности условия, выполняется <оператор_1>, в противном случае – <оператор_2>, следующий за служебным словом else.
Допускается использовать сокращённую форму записи условного оператора: if (выражение) <оператор>;
Данная форма приемлема для алгоритма изображённого на рис. 4.1 (б). Оператор будет выполнен при истинном выражении, в противном случае управление передаётся на следующий по порядку оператор.
Допускается использование вложенных условных операторов. При этом в качестве операторов записывается очередной условный оператор. Степень вложенности неограниченна.
При необходимости выполнить более одного оператора при истинности или ложности выражения необходимо использовать составной оператор. Составной оператор начинается и заканчивается, как и тело функции, фигурными скобками, между ними записываются операторы, которые необходимо выполнить. Количество операторов, объединяемых составным оператором неограниченно.
{
<Оператор_1>; <Оператор_2>; <Оператор_3>;
…
<Оператор_N>;
}
Если в составном операторе присутствует описание переменной, то его называют блоком.
4.1.2 Логические операции
Как уже было отмечено выше, в качестве выражения могут использоваться логические операции. Помимо операций отношений в СИ существует три вида логических операций.
Значения логического выражения при использовании бинарной логической операции конъюнкции (&&) приведены в таблице 6.
Таблица 6 – Логическая операция конъюнкция
Значение операндов |
Результат операции |
|
A |
B |
A &&B |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
32
Значения логического выражения при использовании бинарной логической операции дизъюнкции (||) приведены в таблице 7.
Таблица 7 – Логическая операция дизъюнкция
Значение операндов |
Результат операции |
|
A |
B |
A or B |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
Унарная логическая операция отрицания (!) инвертирующая (изменяющая на противоположное) значение операнда приведена в таблице 8.
Таблица 8 – Логическая операция отрицания
Значение |
Результат |
операндов |
операции |
A |
! A |
1 |
0 |
0 |
1 |
Например:
(A<=B)&&(B>C)|| (A!=D). При значении переменных A=10, B=15, C=20, D=25 значение всего выражения равно 1. (A<=B) – истинно, (B>C) – ложно,
(A<=B)&&(B>C) – ложно, (A!=D) – истинно.
! (A<=B)||(B>C). При значении переменных A=10, B=15, C=20 значение всего выражения равно 0.
(A<=B) || !(B>C). При значении переменных A=10, B=15, C=20 значение всего выражения равно 1.
4.2 Примеры составления алгоритмов и программ с использованием условного оператора If
33
Пример 4.1. Определить большее из двух целых чисел A и B. Блок-схема алгоритма решения задачи:
Начало
Ввод A, B
да
A>=B
Max=B |
|
|
Max=A |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вывод
Max
Конец
#include<iostream.h> void main()
{
int Max,A,B;
cout<<”\nВведите значения A и B \n”; cin>>A>>B;
if(A>=B) Max=A; else Max=B;
cout<<”\nЗначение Max= ”<<Max;
}
Пример 4.2. Определить принадлежит ли вводимое с клавиатуры значение A интервалу [0..5].
Блок-схема алгоритма решения этой задачи аналогична примеру 4.1.
#include<iostream.h> void main()
{
int Max; float A;
cout<<”\nВведите значения A и B \n”; cin>>A;;
if((A>=0)&&(A<=5))
cout>>”\nЗначение ”<<A<<”принадлежит отрезку [0..5]”; else
cout>>”\nЗначение ”<<A<<”не принадлежит отрезку [0..5]”;
34
}
Пример 4.3. Значения переменных X, Y, Z вводятся с клавиатуры. Если X Y Z, то все значения возвести в квадрат, при X >Y >Z каждое из них разделить на 2, в противном случае изменить знаки чисел. Изменённые значения переменных вывести на экран.
Обратите внимание, что при решении данной задачи в каждой ветви условного оператора необходимо использовать составной оператор.
Блок-схема алгоритма решения задачи:
|
|
|
|
|
|
|
|
Начало |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ввод X,Y,Z |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
да |
||
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
(X Y Z) |
|||||
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(X>Y>Z) |
да |
|
X=X2 |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X= –X |
|
|
|
X=X/2 |
|
|
Y=Y2 |
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Y= –Y |
|
|
|
|
Y=Y/2 |
|
|
Z=Z2 |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Z= – Z |
|
|
|
|
Z=Z/2 |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вывод X,Y,Z
Конец
#include<iostream.h> void main()
{
int X,Y,Z;
cout<<”\nВведите значения X, Y и Z \n”; cin>>X>>Y>>Z;
if((X<=Y)&&(Y<=Z)){ X*=X;Y*=Y;Z*=Z;} else if ((X>Y)&&(Y>Z)) {X/=2; Y/=2; Z/=2;}
else {X=-X;Y=-Y;Z=-Z;}
cout<<”\nX= ”<<X<<”\tY=”<<Y<<”\tZ=”<<Z<<endl;
}
35
4.3 Переключатель switch
Переключатель switch очень удобен при программировании, особенно когда возможно большое количество вариантов решения задачи.
switch (выражение ) оператор
Оператор в этом случае представляет собой тело переключателя, практически всегда является составным и имеет такой вид:
{ case константа-1 : операторы case константа-2 : операторы
............................
default : операторы
}
Выполнение переключателя состоит в вычислении управляющего выражения и переходе к группе операторов, помеченных case-меткой, равной управляющему выражению, если такой case-метки нет, выполняются операторы по метке default. Пункт default может отсутствовать и тогда, если управляющему выражению не соответствуют ни одна case-метка, весь переключатель эквивалентен пустому оператору. Следует учитывать, что при выполнении переключателя происходит переход на оператор с выбранной case-меткой и дальше операторы выполняются в естественном порядке. Например, в переключателе
switch (count)
{ case 1 : x=1; case 2 : x=2; case 3 : x=3; default : x=4;
}
если значение count равно 1, то после перехода на case 1 будут выполнены все операторы, в результате x станет равным 4. Чтобы разделить ветви переключателя, в конце каждой ветви нужно записать оператор break, не имеющий операндов. По этому оператору происходит выход из переключателя к следующему оператору программы:
switch (count)
{ case 1 : x = 1; break; case 2 : x = 2; break; case 3 : x = 3; break; default : x = 4;
36
}
Теперь в зависимости от значения count будет выполняться только одна ветвь переключателя и x будет принимать одно из четырех предусмотренных значений.
Блок-схема алгоритма для представленного фрагмента выглядит так:
|
|
count |
– |
|
|
|
|
1 |
2 |
3 |
|
x=1 |
x=2 |
x=3 |
x=4 |
37
5 Алгоритмы и программы циклической структуры
5.1 Понятие цикла. Разновидности циклов
Очень часто при разработке программ необходимо, чтобы один или более операторов выполнялись два или более раз. Такие алгоритмы называют циклическими, а повторяющиеся операторы – телом цикла. Количество повторений тела цикла может быть известно или нет. В случае, если неизвестно количество повторений тела цикла, завершение его работы происходит по достижению определённого условия. Таким образом, циклы делятся на циклы с параметром и условные.
В цикле с параметром задаётся переменная, выполняющая роль параметра цикла, её начальное и конечное значения, приращение (шаг изменения значения параметра цикла).
Блок-схема алгоритма цикла с параметром представлена на рисунке 5.1.
i=n;k;h
Тело цикла
Рисунок 5.1 – Блок-схема алгоритма цикла с параметром
Условные циклы предназначены для организации итерационных вычислительных процессов. Они подразделяются на циклы с предусловием и циклы с постусловием. В цикле с предусловием перед выполнением тела цикла осуществляется проверка значения логического выражения или переменной логического типа, если значение этих величин удовлетворяют условию работы цикла, то выполняется тело цикла, в противном случае, выполняется следующий за циклом оператор. Таким образом, операторы тела цикла с предусловием могут быть не выполнены ни одного раза. На рисунке 5.2 представлена блок-схема алгоритма цикла с предусловием.
Цикл с постусловием предназначен для организации циклических алгоритмов, в которых проверка условия работы цикла выполняется после исполнения операторов тела цикла. По этой причине, операторы тела цикла всегда будут выполнены хотя бы один раз. На рисунке 5.3 представлена блок-схема алгоритма цикла с постусловием.
38
a>b |
да |
Тело цикла |
Рисунок 5.3 – Блок-схема алгоритма цикла с предусловием
Тело цикла
да
a>b
Рисунок 5.4 – Блок-схема алгоритма цикла с постусловием
5.2 Цикл с параметром в СИ/СИ++
Оператор for - это наиболее общий способ организации цикла, при помощи которого организуется цикл с параметром. Он имеет следующий формат:
for ( выражение 1 ; выражение 2 ; выражение 3 ) тело;
Выражение 1 обычно используется для установления начального значения переменных, управляющих циклом. Выражение 2 - это выражение, определяющее условие, при котором тело цикла будет выполняться. Выражение 3 определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла.
Схема выполнения оператора for: 1. Вычисляется выражение 1.
39
2.Вычисляется выражение 2.
3.Если значения выражения 2 отлично от нуля (истина), выполняется тело цикла, вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for.
Существенно то, что проверка условия всегда выполняется в начале цикла. Это значит, что тело цикла может ни разу не выполниться, если условие выполнения сразу будет ложным.
int main()
{int i,b;
for (i=1; i<10; i++) b=i*i;
return 0;
}
Вэтом примере вычисляются квадраты чисел от 1 до 9.
Вцикле for все инициализирующие выражения вычисляются один раз при входе в цикл. Они разделяются ",". Условия может и не быть, но ";" всегда ставится. При этом полагается, что его значение всегда истина. Выражения из списка выражений вычисляются при каждой итерации цикла после выполнения операторов тела цикла. Тело цикла может быть отдельным, составным или пустым оператором.
Например, просуммируем квадраты первых К членов натурального ряда. for ( int i=1,s=0;i<=k;i++) s+=i*i;
for ( int i=0,s=0;i<=k;s+=++i*i); for ( int i=0,s=0;i<=k;)s+=++i*i; for ( i=0,s=0;i<=k;)
{ int j;j=++i;s+=j*j;
}
Другим вариантом использования оператора for является бесконечный цикл. Для организации такого цикла можно использовать пустое условное выражение, а для выхода из цикла обычно используют дополнительное условие и оператор break.
Пример: for (;;) { ...
... break;
...
}
5.3 Оператор while
Оператор цикла while называется циклом с предусловием и имеет следующий формат:
while (выражение) тело ;
40
