[ЗМІСТ] [Далі] [Назад] [Початок
розділу]
3.5. Програмування
циклів за
умовою
У мові
Паскаль
цикл з умовою
повторення (Lw) записується
так
while Pas(F) do begin
Pas(Р)
end,
а
цикл з умовою
закінчення (Lu) -
repeat
Pas(Р)
until Pas(F).
Якщо
інструкція Р
є
розгалуженням,
або циклом,
або не ланцюгом
інструкцій,
то операторні
дужки "begin-end" дозволяється
опускати.
Вони
обов'язкові,
коли Р -
ланцюг інструкцій.
Розглянемо
приклади.
Приклад
4P. Для
довільного
а>1 знайти
номер n такий,
що n!>аn
(задача
3.13).
program FactPower;
var N: word;
А, X, Y: real;
begin
write(' А=? '); readln(А);
N:= 0; X:= 1; Y:= 1;
while X>=Y do begin
N:= N+1; X:= X*А; Y:= Y*N
end;
writeln(' N = ', N,'
Степінь = ', X,'
Факторіал = ', Y)
end.
Зверніть
увагу на типи
змінних. Якщо
змінній Y
приписати
тип word, а іншого способу
зобразити
натуральний
тип ми поки
що не знаємо,
то її
найбільшим
значенням було
б 65535, тобто вже
9!=362880 виявилося
б недопустимим.
Тому для Y і X
вибрано
дійсний тип.
Приклад
5P. Обчислити 1/х за
допомогою
границі
(задача 3.15).
program Limit;
var А, С, X, Eps: real;
K: word;
begin
repeat
write('х, eps=? '); readln(X, Eps)
until (0<Х) and (X<2) and
(Eps>0);
K:= 0; А:= 1; С:= 1-X;
while abs(С)>=Eps*Х do
begin
K:= K+1; А:=
А*(1+С); С:= С*С
end;
writeln(' 1/Х = ', 1/Х,'
А = ', А,' K = ', K)
end.
Приклад
6P. Сума десяткових
цифр числа
(задача 3.17).
program Digit_Sum;
var N, Р, А, S: integer;
begin
repeat
write('n=? '); readln(N)
until N>0;
Р:= N; S:= 0;
repeat
А:= Р mod 10; write(':',
А);
S:= S+А; Р:= Р div
10
until Р=0;
writeln; writeln('
Сума = ', S)
end.
Приклад
7P. Розв’язок
рівняння
методом хорд
(задача 3.18).
program Span;
var А, В, X, XX, Y, YB, Eps:
real;
begin
repeat
write('eps=? '); readln(Eps)
until Eps>0;
А:= 0; B:= 2; X:= А;
YB:= ((B+4)*B+1)*В-6;
repeat
XX:= X; Y:= ((X+4)*X+1)*X-6;
X:= X-Y*(B-X)/(YB-Y)
until abs(X-XX)<Eps;
writeln(' х = ', X,' xx = ', XX)
end.
Циклу
з виходом у мові
Паскаль немає.
Взагалі,
ситуація,
коли алгоритм
використовує
структури
керування і
інші інструкції,
не передбачені
мовою
програмування,
типова.
Відповідна задача -
реалізація
або кодування
тієї або інший
алгоритмічної
конструкції
в мові
програмування
- одна з центральних
в програмуванні.
Відносно
циклу з
виходом, то
він
кодується з
допомогою
циклу while Паскаля з
тотожно-істинною
умовою
продовження
та
інструкції
виходу з
циклу break.
Код
циклу (Le)
прийме вигляд
while True do begin
Pas(Р);
if Pas(F) then break;
Pas(Q)
end;
Приклад
8P. Сума і
добуток
(задача 3.19).
program Sum_Prod;
var a, S, Р: real;
begin
S:= 0; Р:= 1;
while True do begin
write(' а=? '); readln(a);
if а=0.0 then break;
S:= S+a; Р:= Р*а
end;
writeln(' Сума=
', S,' Добуток= ', Р)
end.
У мові Сі
цикл з умовою
повторення (Lw) записується
так
while (C(F))
{
C(Р)
},
а
цикл з умовою
закінчення (Lu) -
do
{
C(Р)
}
while (¬C(F));.
Якщо
інструкція Р
є
розгалуженням,
або циклом, або
не ланцюгом
інструкцій,
то операторні
дужки "{-}" дозволяється
опускати.
Вони
обов'язкові,
коли Р -
ланцюг інструкцій.
Зверніть
увагу на те,
що при кодуванні
циклу (Lu)
замість
умови F
використовується
її
заперечення.
Розглянемо
приклади.
Приклад
4C. Для
довільного
а>1 знайти
номер n такий,
що n!>аn (задача 3.13).
#include <stdio.h>
/* FactPower */
main()
{
unsigned n;
double a, x, y;
printf(“ А=? ”); scanf(“%lf”, &a);
n = 0; x = 1; y = 1;
while (x>=y)
{
n++; x *= a; y *= n;
}
printf(“ N = %u Степінь = %lf Факторіал = %lf”,n ,x, y);
}
Приклад
5C.
Обчислити 1/х за
допомогою
границі
(задача 3.15).
#include <stdio.h>
#include <math.h>
/* Limit */
main()
{
double a, c, x, eps;
unsigned k;
do
{
printf(“х, eps=?”); scanf(“%lf %lf”, &x, &eps);
}
while (0>=x || x>=2 || eps<=0);
k = 0; a = 1; c = 1-x;
while (fabs(c)>=eps*x)
{
k++; a *= (1+c); c *= c;
}
printf(“ 1/Х = %lf А = %lf K = %u”, 1/x, a, k);
}
У
останньому
прикладі для
обчислення
модуля
дійсного
числа
використовується
функція fabs(c) з
бібліотеки math.h, яка
підключається
за допомогою #include <math.h>.
Приклад
6C. Сума десяткових
цифр числа
(задача 3.17).
#include <stdio.h>
/* Digit_Sum */
main()
{
int n, p, a, s;
do
{
printf(“n=? ”); scanf(“%d”, &n);
}
while (n<=0);
p = n; s = 0;
do
{
a = p % 10; printf(“:%d”, a);
s += a; p /= 10;
}
while (p!=0);
printf(“\n
Сума = %d”, s);
}
Приклад
7C. Розв’язок
рівняння
методом хорд
(задача 3.18).
#include <stdio.h>
#include <math.h>
/* Span */
main()
{
double a, b, x, xx, y, yb, eps;
do
{
printf(“eps=? ”); scanf(“%lf”, &eps);
}
while (eps<=0);
a = 0; b = 2; x = a;
yb = ((b+4)*b+1)*b-6;
do
{
xx = x; y = ((x+4)*x+1)*x-6;
x = x-y*(b-x)/(yb-y);
}
while (fabs(x-xx)>=eps);
printf(“ х = %lf xx = %lf”, x, xx);
}
Циклу
з виходом у мові Сі,
як і у
Паскалі, немає.Цикл
з виходом у
Сі кодується
з допомогою
циклу while з
тотожно-істинною
умовою
продовження,
наприклад (1),
та
інструкції
виходу з
циклу break.
Код
циклу (Le)
прийме вигляд
while (1)
{
C(Р);
if (C(F)) break;
C(Q)
}
Приклад
8С. Сума і
добуток
(задача 3.19).
#include <stdio.h>
/* Sum_Prod */
main()
{
double a, s, p;
s = 0; p = 1;
while (1)
{
printf(“ а=? ”); scanf(“%lf”,&a);
if (а==0.0) break;
s += a; p *= а;
}
printf(“ Сума= %lf Добуток= %lf”, s, p);
}
[ЗМІСТ] [Далі] [Назад] [Початок
розділу]