Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практикум по основам программирования. Скалярные типы. Управляющие операторы. Учебное пособие
.pdf
вид p = p * x + k, где k – коэффициент полинома, а p частично вычисленное (накапливаемое) значение полинома. Перед выполнением этого
действия k должна получить значение очередного коэффициента. Или
вид p = p * x + ai, здесь ai также обобщенная запись коэффициента полинома с номером i. Действия, многократное повторение которых позволяет вычислить результат, принято называть телом цикла (в данной
задаче это p = p * x + k и действие по заданию значения k).
Структура цикла
Кроме основных действий, называемых телом цикла, цикл содер-
жит дополнительные действия, обеспечивающие повторение тела цикла. Таким образом, в самом общем виде структурная схема цикла содержит три части:
– действия по подготовке цикла к первому исполнению;
– действия, являющиеся основным содержанием данного вычисли-
тельного процесса – тело цикла;
– действия, отслеживающие повторение тела цикла – проверка ус-
ловия продолжения повторений.
В соответствии с порядком действий в цикле с предусловием тело
цикла может не выполниться ни разу, если условие продолжения повторения будет сразу неверным. В цикле с постусловием тело цикла
всегда выполнится хотя бы раз, так как условие продолжения повторения проверяется уже после выполнения тела цикла. Условие продолжения повторения может отслеживать выполнение тела цикла известное число раз (цикл со счетчиком или цикл с известным заранее числом повторений) или отслеживать достижение некоторого соотношения между величинами (цикл с неизвестным заранее числом повторений). Подготовка цикла к первому исполнению необходима для задания начальных значений величинам цикла.
41

Цикл с предусловием
Цикл с постусловием
Выход из цикла
Выход из цикла
Продолжать
цикл ?
Подготовка цикла
Тело цикла
+
–
Продолжать
цикл ?
Подготовка цикла
Тело цикла
+
–
Структурные схемы циклов
для заданного значения x приведена на рис.1.
цесса используются следующие структуры управления вычислениями
(операторы): цикл с предусловием и цикл с постусловием:
Блок-схема алгоритма вычисления значения полинома n-й степени
Циклические управляющие конструкции
Для реализации на языке программирования C циклического про-
42

Рис.1
+
Начало
Конец
Ввод x, k, n
Вывод p
p = k, i = 1
i ⩽ n?
Ввод k
p = p * x + k,
i = i + 1
1) Оператор цикла с предусловием
while (В)
S;
Здесь B – выражение, определяющее условие продолжения выпол-
нения тела цикла; S – оператор (задает тело цикла). Таким образом, в
оператор while не включены действия по подготовке цикла к первому
исполнению, а также действия, связывающие условие В и S (для того,
чтобы на очередном шаге В стало ложным и цикл завершился). Эти
действия должен предусмотреть сам программист.
43

B ?
S
+
–
Структурная схема оператора цикла с предусловием
Пример цикла с предусловием
Вычислить значение выражения 1! + 2! + 3! + …+ n! =
1 + 1∙2 + 1∙2∙3 + … + 1∙2∙3∙… ∙n .
Используя схему Горнера, приведем выражение к виду:
1 + 1∙2 + 1∙2∙3 +…+ 1∙2∙3…∙n =
1 + 2 ∙ (1 + 3 ∙ (1 + 4 ∙ (1 + … + (n - 1) ∙ (1 + n) …)
p = 1;
k = n;
while (k >1)
{
p = p * k + 1;
k = k - 1;
}
2) Оператор пошагового цикла
for (e1; e2; e3)
S;
Здесь e1 – выражение, задающее начальные условия выполнения
цикла (подготовка цикла к первому исполнению); e2 – выражение, задающее условие продолжения цикла; e3 – выражение, связывающее
условие e2 и тело цикла (обеспечивает завершение цикла при ложно-
44

B ?
S
+
–
сти e2); S – оператор (задает тело цикла). Выполнение оператора цикла
for состоит из следующих действий:
e1;
while (e2)
{
S;
e3;
}
Таким образом, оператор for – это цикл с предусловием, включаю-
щий в себя наряду с телом цикла (S) и условием продолжения цикла
(e2), действия по инициализации (e1) и модификации (e3) цикла.
Пример оператора пошагового цикла
for (p = 1, k = n; k > 1; k--)
p *= k + 1;
3) Оператор цикла с постусловием
do
S;
while (B);
Здесь B – выражение, определяющее условие продолжения выпол-
нения цикла; S – оператор (тело цикла).
Структурная схема оператора цикла с постусловием:
45

Таким образом, в оператор do while не включены действия по под-
готовке цикла к первому исполнению, а также действия, связывающие
условие В и S (для того, чтобы на очередном шаге В стало ложным и
цикл завершился). Эти действия должен предусмотреть сам программист.
Пример цикла с постусловием (n > 1):
p = 1;
k = n;
do
{
p = p * k + 1;
k = k - 1;
}
while (k > 1);
Итерационный цикл
Для итерационных методов характерны стереотипные вычисления,
связанные с переходом от одного приближения к следующему. Это позволяет записывать соответствующие этим методам алгоритмы в виде
циклических, причем число повторений этих стереотипных вычислений
(итераций) заранее, как правило, неизвестно и зависит от начального приближения и допустимой погрешности. Характерным условием окончания
цикла является некоторое отношение, связывающее разность последовательных приближений и допустимую погрешность.
Схемы итерационного цикла:
а) v = v0;
while (p(v))
{
S;
f(v);
}
46

1
( ), 0,
,,
( ) , ,
( ) , .
ii
ij
i
n
v f v i
v v i j
p v true i n
p v false i n
1
1
( ), 0,
,,
, 0,
( , ) , ,
( , ) , .
ii
ij
i i i
ii
nn
t f t i
t t i j
S S t i
p S t true i n
p S t false i n
Такая схема используется в задачах, в основе решения которых лежат рекуррентные соотношения. При этом если v принимает последовательно значения v0, v1, v2, ... , vn, то эти значения имеют следующие
свойства:
б) t = t0;
s = t;
while (p(s, t))
{
t = f(t);
s += t;
}
Такая схема используется в задачах, реализующих какой-либо процесс последовательных приближений, например вычисление суммы
ряда, заканчивающееся при условии, по которому можно судить о погрешности вычислений. При этом если t0, t1, t2, ... , tn – последовательность членов ряда, то
Реализуя приближенные вычисления, необходимо помнить, что в
памяти ЭВМ действительные числа представляются приближенно и
поэтому сравнение действительных значений необходимо произво-
47

дить, задавая уровень точности. Например, необходимо проверить, лежат ли три точки на одной прямой. Для этого в уравнение прямой,
проходящей через две точки, необходимо подставить координаты
третьей точки. Все точки лежат на одной прямой тогда и только тогда,
когда в результате получается нуль. Из-за неточности машинной
арифметики для действительных чисел нуль почти никогда не будет
получен. Поэтому условие приходится считать выполненным, если полученный при подстановке результат по модулю меньше некоторого
предусмотренного разработчиком малого числа, например 10-5, называемого точностью вычислений.
Пример итерационного цикла для приближенного вычисления
функции:
C точностью eps вычислить значение
y = cos x = 1 – x2 / 2! + x4 / 4! – … + (–1)n x2n / (2n)! + … .
Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps,– все последующие слагаемые не учи-
тывать.
n = 2;
y = 1;
b = -x * x;
a = b / n;
while (fabs(a) >= eps)
{
y += a;
n += 2;
a *= b / (n - 1) / n);
}
Примеры
1 Определить необходимые переменные и записать последователь-
ность операторов для решения задачи:
48

а) Используя оператор цикла, описать вычисление количества цифр
в десятичной записи целого неотрицательного числа n.
int n, k; k = 1;
scanf("%d ", &n);
while (n > 9)
{
k++;
n / = 10;
}
printf("%d\n", k);
б) Используя оператор цикла, вычислить разность между макси-
мальным и минимальным значениями из n (n ⩾ 2) вещественных
чисел.
int n, i = 1; float x, d;
scanf("%d %f ", &n, &x);
int max = x; min = x;
while (i < n)
{
scanf("%f ", &x);
i++;
if (x > max)
max=x;
else
if( x < min)
min = x;
}
d = max - min;
printf("%f \n", d);
49

в) Используя оператор цикла, определить порядковый номер наи-
меньшего из элементов непустой последовательности натуральных чисел, оканчивающейся нулем.
int n, x, d, min, i;
scanf("%d", &x);
min = x; n = 1;
scanf("%d ", &x);
i = 2;
while (x != 0)
{
if ( x < min)
{
min = x;
n = i;
};
scanf("%d ", &x);
i++;
}
printf("%d\n", n);
г) Используя оператор цикла, найти наибольшее среди отрицатель-
ных чисел в последовательности из n (n ⩾ 1) вещественных чисел (считать, что в последовательности есть хотя бы одно отрицательное число).
int n, i = 0;
float x;
scanf("%d ", &n);
do
{
scanf("%f ", &x);
i++;
}
while (x >= 0);
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
