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

Алгоритмизация и программирование на языке С++. Ч.1. Учебник

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
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.
Наличие фигурных скобок не является обязательным, если тело цикла содержит один оператор, в котором нет объ­явления переменных. Однако рекомендуется фигурные скоб­ки использовать всегда, что делает структуру программы бо­лее наглядной.
Приведем примеры кода для трех циклов С++, где в теле только одна инструкция. Они не реализуют сложной задачи
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]