Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Цикли. Організація циклів та їх реалізація у мові програмування Паскаль.
Цикли. Організація циклів та їх реалізація у мові програмування Паскаль.
Організація циклів
Циклом у програмуванні називається повторення одних і тих самих дій. Цикл повинен закінчуватись за якої-небуль умови. Перевіряти цю умову можна на початку кожного повторення, і в цьому разі цикл називається «доки». При перевірці умови в кінці кожного повторення цикл називається «до».
Схеми цих двох типів циклів наведені на рис. 1.
У циклі «доки» спочатку перевіряється умова і якщо вона виконується, тобто логічний вираз істинний, то виконується оператор і знову перевіряється умова. Записана в циклі «доки» умова є умовою продовження циклу. Як тільки вона перестане виконуватись, цикл завершиться. На рис. 1 вихід із ромба « + » (або «так») означає виконання умови повторення циклу, « » (або «ні») невиконання. Цикл «ДОКИ» не виконається жодного разу, якщо умова при вході в структуру відразу виявиться хибною. Таким чином, цикл ДОКИ містить умову продовження повторення, а цикл ДО умову закінчення повторення. Обидві структури мають один вхід і один вихід. Однак цикл «до» завжди виконується хоча б один раз, тому що умова перевіряється після виконання операторів, що входять до циклу. Це ускладнює перевірку правильності програми, тому краще використовувати цикл«доки». Оператор у циклі може бути простим або складеним, тобто являти собою групу операторів, обмежених операторними дужками begin…end. Його називають тілом циклу. Цикли можна організовувати, використовуючи різні засоби мови Паскаль.
Рис. 1. Циклічні структури
Оператор безумовного переходу.
Цей оператор дозволяє перейти без перевірки умови або на один з попередніх операторів, або на один із наступних, тобто змінити порядок виконання команд. Перед оператором, на який здійснюється безумовний перехід, потрібно поставити мітку ціле число, що складається не більше ніж із чотирьох цифр. Від оператора мітка відділяється двокрапкою.
Перехід до поміченого оператора здійснюється за допомогою оператора безумовного переходу, який має вигляд: goto n; де n мітка. Мітка повинна бути визначена в описовій частині програми в розділі label.
Організація циклів за допомогою операторів умовного і безумовного переходів
Нехай потрібно знайти найбільший спільний дільник двох натуральних чисел А і В. Скористаємось алгоритмом Евкліда: будемо зменшувати кожний раз більше з чисел на величину меншого доти, доки обидва значення не стануть рівними.
Програма матиме вигляд:
program NSD0;
label 1,2;
var a,b: integer;
begin
write(введіть два натуральних числа);
readln(a,b);
1:if а = b then
goto 2;
if a > b then
a := a b
else
b := b a;
goto 1;
2:writeln (НСД =, a);
end.
Оператор циклу «доки»
Як видно з попереднього прикладу, циклічний процес можна організувати без використання спеціальних операторів. Однак при складанні досить серйозних програм використовувати оператор безумовного переходу не рекомендується, оскільки можна швидко заплутатись при перевірці програми. Крім того, дуже велика кількість міток може просто заплутати вас у програмному коді.
Оператор циклу «доки» має вигляд:
while умова do оператор;
і виконується таким чином: оператор (тіло циклу) повторюється доти, доки виконується умова (істинний логічний вираз). Оператор може бути простим або складеним, вміщеним в операторні дужки begin…end.
Для алгоритму Евкліда програма набуде вигляду:
program NSD1;
var a,b:integer;
begin
write(введіть два натуральних числа);
readln(a,b);
while a<>b do
if a>b then
a := a-b
else
b := b-a;
writeln (НСД=, a);
end.
Оператор циклу «до». Перевірка умови в циклі «до» здійснюється після виконання оператора. Якщо умова в циклі «доки» є умовою продовження повторень, то умова в циклі «до» умовою виходу з циклу, його завершенням. Тому для тієї самої задачі ці умови протилежні. Загальний вигляд оператора: repeat оператор until умова;
Між словами repeat (повторити) і until (до того часу, поки) можна записати будь-яку кількість операторів без використання операторних дужок. Перед словом until не ставиться крапка з комою.
Програма знаходження найбільшого спільного дільника набуде такого вигляду:
program NSD2;
var a,b:integer;
begin
write(введіть два натуральних числа);
readln(a,b);
repeat
if а > b then
a := a b;
if b > a then
b := b a;
until
a = b;
writeln(HCД=, a);
end.
Оператори циклів «перелік»
При виконанні програм знаходження найбільшого спільного дільника кількість повторень неоднакова для різних даних. Коли відоме число повторень, зручно використовувати цикл «перелік». У Паскалі є два оператори для організації циклів прямий і зворотний «перелік». Прямий перелік іде від відомого меншого числа до відомого більшого, на кожному кроці додається одиниця (наприклад, від 120 до 140: 121, 122, 123, …, 139, 140).
Оператор прямого переліку: for i:=n1 to n2 do оператор;
читається як «для і починаючи з n1 до n2 виконати оператор».
Змінна і називається змінною циклу, яка при прямому переліку завжди змінюється від меншого значення до більшого. Треба звернути увагу, що для виконання оператора n1 повинно бути не більше ніж n2 (n1<=n2). При і= n1 цикл виконується перший раз. Потім до значення змінної додається одиниця і здійснюється перевірка, чи не стало отримане значення більшим ніж n2. Якщо і+1<=n2, то оператор виконується, а якщо і+1>n2 , то відбувається вихід із циклу і виконується оператор програми, який слідує за оператором циклу. Оскільки оператор циклу for сам змінює значення змінної циклу, то її не можна змінювати іншим способом, наприклад присвоюванням їй якого-небудь значення в тілі циклу (вона не повинна зявитися зліва від знака : = ).
Оператор у циклі може бути простим або складеним, взятим в операторні дужки.
Розглянемо приклади використання операторів циклу.
1. Обчислення добутку аn. Відомо, що для того щоб отримати цілий степінь n числа а, потрібно помножити його самого на себе n разів. Цей добуток при виконанні програми буде зберігатися в ділянці памяті з іменем р. Щоразу, при черговому циклі, з цієї ділянки буде зчитуватись попередній результат, помножуватись на основу степеня а і знову записуватись у ділянку р. Основний оператор у тілі циклу повторюється n разів і має вигляд: р := р*а;
При першому виконанні циклу в ділянці р повинно знаходитись число, що не впливає на множення, тобто перед циклом у цю ділянку треба записати одиницю.
Програма має вигляд:
program For1;
var а,р: real; i,n: integer;
begin
write(введіть a основу степеня, a = );
readln (a);
writeln введіть ціле п показник степеня, n = );
readln(n);
p:=1;
for i:=1 to n do
p := p * a;
writeln(p = , p);
end.
2. Обчислення р = n! (л факторіал).
За визначенням n! = 1*2*3*…*n. Використовуючи попередню програму, обчислимо р як добуток чисел від 1 до n, тобто р кожний раз множиться не на одне й те саме число, а на значення змінної циклу.
Програма матиме такий вигляд:
program For2;
var p,i,n: integer;
begin
write(введіть ціле n=);
readln(n);
P := 1;
for і := 1 to n do
p := p * i;
writeln(n, p);
end.
3. Складання таблиці значень функції y=sin х. Нехай треба скласти таблицю значень функції y=sin х на відрізку [0; 3.14] з кроком 0.1. Щоб не визначати кількість повторень обчислень, можна скористатися циклом «доки». Використовуючи виведення дійсних чисел із фіксованою крапкою, визначимо, що кількість цифр після крапки в дробовій частині значення функції дорівнюватиме пяти. Тоді подання всього числа, враховуючи область значень синуса, займе сім позицій (числа додатні, тому додається позиція для десяткової точки і цілої частини числа).
Програма матиме вигляд:
program Doky;
var х,у: real;
begin
х:=0;
writeln(x:10,sin х:10);
while х <=3.14 do
begin
y:=sin(x);
writeln(x:10, , y:7:5);
x:=x+0.1;
end;
end;
При кожному виконанні циклу спочатку перевіряється умова х< = 3.14, потім обчислюється значення функції, друкується аргумент х (для нього відведено десять позицій, із них одна для цифри дробової частини) і, через три пропуски значення функції, і нарешті, для наступного кроку циклу обчислюється нове значення аргументу (х збільшиться на 0.1). Цикл «доки» дозволяє змінювати змінну циклу як завгодно, збільшуючи її або зменшуючи на будь-яке значення.
4. Додавання чисел.
При додаванні кількох чисел необхідно накопичувати результат у певній ділянці памяті, щоразу зчитуючи з цієї ділянки попереднє значення суми і додаючи до нього наступний доданок. Нехай відомо, що будуть додаватися n чисел. У такому випадку треба n разів виконати дію
де а наступне число, що вводиться з клавіатури. Для першого виконання цього оператора присвоювання потрібно з ділянки з іменем s взяти таке число, яке не впливало б на результат додавання. Отже, перед початком циклу слід присвоїти змінній s значення нуль.
Програма має вигляд:
program Suma;
var a,s: real; i,n: integer;
begin
write (введіть кількість доданків n=);
readln(n);
for i:= 1 to n do
begin
write(i,- e число =);
readln(a);
s := s + a;
end;
writeln( s =, s);
end.
Оператор циклу зворотного переліку працює аналогічно оператору циклу прямого переліку, але змінна циклу не збільшується на одиницю з кожним кроком, а зменшується. Цей оператор має вигляд:
for і := n2 downto n1 do оператор;
Для цього оператора повинна також виконуватись умова n2>n1.
При використанні в програмі операторів циклу необхідно дотримувати таких правил: