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

Практикум по основам программирования. Скалярные типы. Управляющие операторы. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
вид 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 + 12 + 123 + + 123∙… 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]