
§ 5. Цикли
Цикл це процес виконання певного набору команд деяку кількість разів. Цикл реалізують або за допомогою конструкції if-goto, або, що значно ефективніше, за допомогою команд циклу. Є три види команд циклів: з параметром, з передумовою та з післяумовою.
1. Команда циклу з параметром (for). Є два різновиди команди for. Розглянемо перший:
for <параметр> := <вираз 1> to <вираз 2> do <команда 1>; |
Тут параметр це змінна цілого, символьного, логічного або перерахованого типу, а вирази 1 і 2 задають початкове та кінцеве значення параметра.
Дія команди. Параметрові циклу присвоюється значення виразу 1. Якщо це значення менше-рівне, ніж значення виразу 2, то виконується команда 1. Після виконання команди 1 значення параметра автоматично збільшується на 1 і знову порівнюється зі значенням виразу 2 і т.д. Коли значення параметра стане більшим, ніж значення виразу 2, то виконується наступна після циклу команда.
Приклад. Нехай s=0. Після виконання команди циклу
for i:=4 to 6 do begin s:=s+i; z:=2*i end;
змінна s набуде значення 0+4+5+6=15, а змінна z 12.
Розглянемо другий різновид команди циклу for:
for <параметр> := <вираз 1> downto <вираз 2> do <команда 1>; |
Ця команда діє як попередня, але крок зміни параметра є -1
Приклад. Нехай s=0. Після виконання команди циклу
for i:=6 downto 4 do begin s:=s+i; z:=2*i end;
змінна s набуде значення 0+6+5+4=15, а змінна z 8.
Зауваження. Значення параметра в середині циклу змінювати не можна.
Задача 1. Побудувати таблицю відповідності між унціями та грамами, якщо 1 унція = 28,353495 г. Початкове значення кількості унцій (uncia), крок зміни (krok) цього значення та кількість рядків (kil) у таблиці задати самостійно у режимі діалогу.
program Міrа;
uses Crt;
const line='_ _ _ _ _ _ _ _ _ _ _ _ _ _ ';
var uncia, gramy, krok: real; i, kil: integer;
begin
clrscr;
write('Введіть початкове значення, крок зміни та ');
writeln(' кількість рядків у таблиці');
readln(uncia, krok, kil);
writeln; {Формуємо порожній рядок}
writeln(line); {Формуємо заголовок таблиці}
writeln('Унції Грами');
writeln(line);
for i:=1 to kil do {Виводимо таблицю на екран}
begin
gramy:=28.353495*uncia;
writeln(uncia:5:2, ' ', gramy:10:6);
uncia:=uncia+krok;
end;
writeln(line); readln
end.
Завдання 1. Розв’язати задачу №5 свого варіанта.
Задача 2. Обчислити значення виразу, що містить суму і добуток
program SumaDobutok;
uses Crt;
var i:integer;
suma, dob, y:real;
fact: longint;
begin {Спочатку сума дорівнює нулю, а добуток одиниці}
clrscr;
suma:=0; dob:=1; fact:=1;
for i:=1 to 25 do
begin
fact:=fact*i; {Обчислюємо i!=1*2*3*…i}
suma:=suma+5*sqr(i)/fact; {Обчислюємо суму та }
dob:=dob*i*i; {добуток}
end;
y:=suma+dob;
writeln('y=', y:7:2);
readln
end.
Завдання 2. Розв’язати задачу №6 свого варіанта двома способами: 1) за допомогою команди for-to; 2) за допомогою команди for-downto. Довідка: у курсі вищої математики обґрунтовується, що обчислення скінченної суми другим способам дає точніший результат, що пов’язано з проблемою заокруглення чисел. Порівняйте отримані значення.
2. Команда циклу з передумовою (while) має вигляд
while <логічний вираз> do <команда 1>; |
Дія команди. Доки значення логічного виразу істинне, виконується команда 1. Істинний логічний вираз описує умову продовження процесу виконання команди циклу.
Приклад. Нехай змінні х, s мають значення х=4, s=0. Після виконання команди
while x<=8 do begin s:=s+x; x:=x+1 end;
вони набудуть значень s=4+5+6+7+8=30, x=9.
Приклад. Вивести таблицю чисел від 20 до 30, їхні квадрати та куби за допомогою команди while можна так:
і:=20;
while і<=30 do
begin
writeln(i:4, i*i:6, i*i*i:8);
і:=і+1
end;
Приклад. Визначити дійсне додатне число а, для якого виконується співвідношення а/2 = 0 в комп’ютерній арифметиці дійсних чисел. Таке число характеризує нижню додатну межу типу даних real.
program MinRealNumber;
uses Crt;
var a:real;
begin
clrscr;
a:=1;
while а/2>0 do a:=a/2;
writeln('a=', a) ; {Відповідь: а = 2.9E-39}
readln
end.
Задача 3. Протабулювати функцію у = sinx на проміжку [0; 3,1], з кроком h = 0,1 і обчислити середнє арифметичне (s1) значень функції більших, ніж 0,1 і менших, ніж 0,6.
program FindSerednie;
uses Crt;
var x, y, s, s1, h, xk: real; n: integer;
begin
clrscr;
x:=0; xk:=3.1; h:=0.1;
s:=0; n:=0;
while x<=xk+h/2 do
begin
у:=sin(x) ;
writeln(x:3:1. y:6:2);
if (y>0.1) and (y<0.6) then
begin s:=s+y; n:=n+1 end;
x:=x+h;
end;
if n>0 then
begin s1:=s/n; writeln ('Середнє =', s1) end;
else writeln('Таких значень немає n=0');
readln
end.
Задача 4. Нехай x деяке число, а e=0.001. Обчислити суму елементів нескінченно спадної знакозмінної послідовності {аn}, де an=(-1)n(2x)n/n! такі, що задовольняють умову |an|>e, п=1,2,...,. Визначити кількість доданків. Вивести на екран результати обчислень.
program Suma1;
uses Crt;
const e=0.001;
var suma, x, a: real; fact, n, z: integer;
begin
clrscr;
writeln('Введіть деяке число x:'); readln(x);
suma:=0; n:=1; fact:=1; a:=-2*x; z:=-1;
while abs(a)>e do
begin
suma:=suma+a;
n:=n+1; {Обчислимо an+1}
z:=-z; {Обчислюємо (-1)n+1}
fact:=fact*n; {Обчислимо факторіал}
a:=z*exp(n*ln(2*x))/fact {Див. зауваження}
end;
writeln('Cyмa =', suma:5:2);
writeln('Кількість доданків =', n-1);
readln
end.
Зауваження. Є більш економний спосіб обчислення значення змінної а (саме даної послідовності), використовуючи її попереднє значення і команду присвоєння вигляду а:=а*М, де для даного прикладу М=-х/(n+1). Реалізуйте цей спосіб самостійно.
Завдання 3. Розв’яжіть задачу .№7 свого варіанта трьома способами: 1) використовуючи програму-зразок Suma1; 2) модифікувавши програму, враховуючи зауваження (це буде програма Suma2); 3) модифікувавши програму-зразок за допомогою такої конструкції для обчислення знакозмінної суми: if odd(n) then suma:=suma-a else suma:=suma+a (це буде програма Suma3). Порівняйте результати. Збережіть файли програм, оскільки вони будуть потрібні для виконання завдання №5 з §8.