Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и программирование на языке С++. Ч.1. Учебник
.pdf
6. Инструкции выбора
if ( x<y )
if ( x<z )
Min = x;
else
Min = z;
else
if ( y<z )
Min = y;
else
Min = z;
cout << x << " " << y << " " << z"<< endl;
//
cout << "Min= " << Min << endl;
// Обход
int x,y,z; int Min;
x=1; y=-3; z=2;
Min = x;
if (y < Min) Min = y;
if (z < Min) Min = z;
71
cout << x << " " << y << " " << z << endl;
cout << "Min= " << Min << endl;
Результат приведен на рис. 6.8.
Рис. 6.8. Максимум из трех целых чисел

72
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
Следующий пример содержит программу для решения
2
квадратного уравнения ax
ние имеет решение, если дискриминант d = b
+ bx + c = 0. Квадратное уравне-
2
– 4ac не явля-
ется отрицательным, т.е. после ввода коэффициентов a, b и c
нужно вычислить d и проверить условие d < 0. Если это условие выполняется, то нужно вывести сообщение «Уравнение не имеет решения». Если условие не выполняется (d ≥ 0),
нужно вычислить и напечатать корни (возможность совпадения корней игнорируется).
// x^2+2x-3=0
oat a, b, c; oat x1, x2, d;
a = 1; b = 2; c = -3;
d = b * b – 4 * a * c;
if (d < 0 )
cout << "Уравнение не имеет решений" << endl;
else
{
x1 = (-b + sqrt(d)) / (2 * a);
x2 = (-b – sqrt(d)) / (2 * a);
cout << "Корни уравнения " << x1 << " и " << x2 << endl;
}
Результат решения уравнения, не имеющего корней, приведен на рис. 6.9, а решения уравнения с разными корнями –
на рис. 6.10.
Теперь покажем, как решить задачу определения принадлежности точки заданному отрезку на горизонтальной оси
(рис. 6.11).
Рис. 6.9. Решение квадратного уравнения, не имеющего
действительных корней

6. Инструкции выбора
Рис. 6.10. Решение квадратного уравнения, имеющего
73
2 различных корня
NO
а б
Рис. 6.11. Попадание точки в заданный интервал
YES
NO
В программе задаются числа a и b, определяющие границы отрезка. Затем будут последовательно вводиться n чисел
(координаты точек). Результатом работы программ будет число k – количество точек, которые оказались внутри отрезка
(рис. 6.12).
Рис. 6.12. Попадание точек в интервал
int k, n = 3; double a, b, x;
k = 0; a = –1.0; b = 3.0;

74
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
for (int i = 1; i <= n; i = i + 1)
{ cout << "Input x" << endl;
cin >> x;
if ((x >= a) && (x <= b))
{ cout << " YES" << endl; k = k + 1; }
else
cout << " NO " << endl;
}
cout << "Попало " << k << " точек из " << n << endl;
cout << (double)k/ double(n) << endl;
А теперь решим задачу определения попадания точки
в один из двух отрезков на горизонтальной оси (рис. 6.13).
Попадание в каждый из них определяется двумя условиями,
соединенными логической операцией И. А поскольку попадание в любой из интервалов удовлетворяет условию задачи,
то используется логическая операция ИЛИ.
Рис. 6.13. Попадание точки в один из двух интервалов
int k, n = 4; double a, b, c, d, x;
k = 0; a = –1.0; b = 1.0; c=4.0; d=6.0;
for (int i = 1; i <= n; i = i + 1)
{ cout << "Input x" << endl;
cin >> x;
if ( ((x >= a) && (x <= b)) || ((x >= c) && (x <= d)) )
{ cout << " YES" << endl; k = k + 1; }
else
cout << " NO " << endl;
}
cout << "Попало " << k << " точек из " << n << endl;
cout << (double)k/ double(n) << endl;

6. Инструкции выбора
Результат приведен на рис. 6.14.
Рис. 6.14. Результат решения задачи о попадании точки
в один из двух интервалов
75

Для создания программ с повторяющимся набором действий в программировании используются инструкции цикла. В них выделяют тело цикла и управляющую конструкцию.
Цикл применяется при необходимости выполнить какие-либо действия несколько раз до выполнения некоторого
условия. Тело цикла – та последовательность действий, которая выполняется многократно (в цикле). Начальные при-
сваивания – задание начальных значений тем переменным,
которые используются в теле цикла. Особенность цикла
в том, что эта структура может реализоваться в двух вариантах. В первом случае цикл всегда выполняется хотя бы один
раз, так как первая проверка условия выхода из цикла происходит после того, как тело цикла выполнено (рис. 7.1, а).
Во втором случае проверка условия выхода из цикла производится до выполнения тела цикла, и если при первой проверке условие выполняется, то тело цикла не выполняется
ни разу (рис. 7.1, б).
а б
Рис. 7.1. Типовая структура «Цикл»: а – цикл
с постусловием; б – цикл с предусловием

7. Циклы
77
В С++ есть три вида циклов:
for
(цикл с параметром);
•
while
•
•
Цикл
(цикл с предусловием);
do
(цикл с постусловием).
for
имеет такую форму записи:
for ([ инициализация]; [условие продолжения цикла];[приращение])
{
инструкция (блок инструкций)
}
Вторая циклическая конструкция записывается так:
while (условие)
{
инструкция (блок инструкций)
}
Такая инструкция называется цикл с предусловием. Суть
ее поясним позднее, так же как и цикла с постусловием, который имеет такую форму:
do
{
инструкция (блок инструкций)
} while (условие);
Обе конструкции
while
и
do-while
выполняются до тех пор,
пока условие имеет значение Истина. Если условие получает значение Ложь, то выполняется инструкция, следующая
за телом цикла.
int main()
{
Рассмотрим пример. Пусть требуется вычислить сумму
чисел от 1 до 10:
S = 1 + 2 + 3 + … + 10.
На каждом шаге к сумме добавляется одно (очередное)
слагаемое:
S = S + i при i = 1, 2, 3, …, 10,

78
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
что приводит к следующей последовательности действий, записанной на языке C++:
setlocale(LC_ALL,"Russian");
int S = 0,i = 1;
L1:
S = S+i;
i = i+1;
if (i<=10) goto L1;
cout << "1+2+ . . . +10 = " << S << endl;
На экране появится следующее
1+2+ . . . +10 = 55
.
В приведенном фрагменте использована инструкция без-
goto
условного перехода
программы с указанной меткой (в примере
. Она передает управление к строке
Ll
). Сегодня такой оператор не рекомендован к применению. Но в данном
фрагменте его применение оправдано хорошей структурированностью трех элементов обобщенной циклической структуры.
Теперь запишем этот алгоритм, используя циклы С++.
for
Сначала
.
int i, S = 0;
for (i = 1; i <= 10; i = i + 1)
S = S + i;
cout << "1+2+ . . . +10 = " << S << endl;
Результаты работы такого фрагмента будут такими же.
Можно еще и так записать фрагмент программы, решаю-
щий такую задачу.
// переменная цикла инициализирована вне for, тело цикла пусто
int i = 1, S = 0;
for (; i <= 10; S = S + i, i = i + 1);
cout << "1+2+ . . . +10 = " << S << endl;
Здесь в цикле не описано действие, определяющее ини-
циализацию управляющей переменной – оно расположено
for
непосредственно перед
. Но на третьем месте в этой инструкции записаны два действия: изменение переменной
цикла (слагаемой) и вычисления очередного значения суммы. Таким образом, в теле цикла нет действий.

7. Циклы
79
Формально допустим и такой способ организации цикла
для решения этой задачи:
int i=1, S = 0;
for (; i <= 10;)
S = S + i, i = i + 1;
cout << "1+2+ . . . +10 = " << S << endl;
Как было сказано ранее, в С++ есть еще два формы записи инструкции цикла. Покажем, как с их использованием
решить рассмотренную задачу нахождения суммы членов
натурального ряда.
while
Начнем с
– цикла с предусловием.
int S, i, S=0;
// while
S=0; i=1;
while ( i<= 10)
{ S=S+i;
i++; }
cout << "1+2+ . . . +10 = " << S << endl;
Аналогично можно использовать цикл с постусловием
do-while
(
).
int S = 0, i = 1;
do
{
S = S + i; i++;
} while (i <= 10);
cout << "1+2+ . . . +10 = " << S << endl;
Разница в действиях
while
и
do-while
заключается в следующем. В первом из них повторяющиеся инструкции (тело
цикла) выполняются до проверки условия, а при исполнении
цикла
do-while
сле проверки условия. Поэтому для цикла
такие инструкции (тело цикла) сработают по-
while
может сложиться ситуация, при которой цикл не выполнится ни разу.
А для
do-while
такая ситуация невозможна. В нем сначала реа-

80
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
лизуются действия, составляющие тело цикла, а затем проверяется условие. Если оно не верно, цикл прекращается, иначе
выполняется снова. Таим образом, инструкции, включенные
в цикл, выполняются хотя бы один раз.
Проиллюстрируем это примером. В нем также будем вы-
числять сумму членов натурального ряда. Но количество
n
слагаемых (переменная
) будем вводить с клавиатуры. Если
ей придать значение 0, операторы в цикле не должны выполняться ни разу.
int i, S, n;
// while
cout << "while Введите 0 " << endl;
cin >> n;
S=0; i=1;
while ( i<= n)
{ S=S+i; cout << i << " S = " << S << endl;
i++; }
cout << "S(0) = " << S << endl;
cout << "i = " << i << " – NO" << endl;
cout << endl << "do-while Введите 0 " << endl;
cin >> n;
S=0; i=1;
do
{ S=S+i; i++;
} while ( i<= n) ;
cout << "S(0) = " << S << endl;
cout << "i = " << i << " – YES" << endl;
Результат приведен на рис. 7.2.
Наличие фигурных скобок не является обязательным,
если тело цикла содержит один оператор, в котором нет объявления переменных. Однако рекомендуется фигурные скобки использовать всегда, что делает структуру программы более наглядной.
Приведем примеры кода для трех циклов С++, где в теле
только одна инструкция. Они не реализуют сложной задачи
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
