Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
R4_КП_12.doc
Скачиваний:
8
Добавлен:
23.11.2018
Размер:
605.18 Кб
Скачать

Оператори циклу.

Оператори циклу дозволяють описати повторюваний процес. Дії, які повторюються, прийнято називати тілом циклу. Кількість повторень тіла циклу має бути яким-небудь способом задана; інакше цикл буде нескінченним.

Для завершення повторень необхідно пов'язати повернення на початок тіла циклу з деякою умовою, яку можна задати у вигляді явного лічильника або іншим способом. У житті це звичайна і часто повторювана ситуація, наприклад, людина робить щось або певну кількість разів, або виконує дії "до тих пір" або "поки" (двічі стукає, читає до темряви або поки видно і т.п.).

Розрізняють арифметичні та ітеративні цикли. В арифметичних циклах число повторень може бути визначене на основі закону зміни параметра циклу; в ітеративних циклах - цикл повторюється до тих пір, поки не буде виконана умова виходу із циклу.

Оператор арифметичного циклу. Служить для кодування арифметичних циклів, тобто циклів, число повторень яких відомо заздалегідь.

Основним способом організації циклу є використання спеціальної змінної – лічильника (параметра) циклу. Для організації циклу слід передбачити задання початкового значення лічильника циклу, яке буде змінюватися під час повторення циклу, його кінцевого значення та кроку зміни цієї змінної перед кожним новим повторенням.

Блок-схема, що відповідає циклу з параметром, представлена на рис. 1.

Рис.1 Блок-схема арифметичного циклу

Тут i - параметр циклу, i0 - початкове значення параметра, iT - кінцеве значення параметра, iS - крок приросту параметра (в разі мови Pascal +1 або -1). Циклічна гілка блок-схеми виконується для всіх i, починаючи з i0 і закінчуючи iT  з кроком iS  (тобто для i0 , i0+iS , i0+2iS , i0+3iS , ...). Як тільки i вийде за межі інтервалу [i0 ,iT], повторення перериваються і програма виходить з циклу.

При цьому для більшості мов програмування прийнято наступну угоду: початкове і кінцеве значення параметра циклу не можна перевизначати в тілі циклу і після завершення циклу це значення є не визначеним, тобто використовувати його для подальших обчислень не можна.

В разі мови Pascal для організації арифметичних циклів служить оператор FOR, характерною особливістю якого є використання тільки двох можливих кроків зміни лічильника (параметра) циклу: +1 або -1. Тому в Pascal оператор FOR може мати два формати:

for лічильник циклу> : = початкове значення to кінцеве значення do

оператор;

for лічильник циклу : = початкове значення downto кінцеве значення do

оператор.

Тут for (для), to (збільшуючись до), downto (зменшуючись до) і do (виконувати) є службовими словами. Слово to задає збільшення значення лічильника циклу на 1 (крок +1), downto - зменшення на 1 (крок -1).

Механізм реалізації: тіло циклу (<оператор>) повторно виконується для кожного значення лічильника циклу при його послідовній (із кроком +1 або -1) зміні від свого початкового значення до кінцевого.

Формалізація оператора for в термінах РБНФ:

оператор арифметичного циклу::= for лічильник:=початкове значення (to | downto)

кінцеве значення do оператор;

лічильник::= змінна 

початкове значення ::= константа | змінна | вираз

кінцеве значення ::= константа | змінна | вираз

Наприклад,

for i:=1 to 20 do

Write(i:3);

x:=3;

for i:=x+2 downto 0 do

Write(i:3).

У мові С оператор арифметичного циклу має формат:

for ( вираз_1; вираз_2; вираз_3 )

оператор;

де вираз_1 - ініціалізація параметра циклу;

вираз_2 - умова повторення циклу;

вираз_3 - крок зміни параметра циклу.

Особливості реалізації у мові С:

  • допускає задання кроку для зміни параметра циклу

for (int i=1; i<=n; i+=2) { … };

  • у заголовку циклу допускається оголошення типу параметра циклу

for (int i =1; i<=n; i+= 2) { … };

  • можливе використання декількох параметрів циклу

for (n = 0,k = 5; n<k; n++,k--) { … };

Алгоритмічні мови програмування, зокрема, Pascal і С, накладають певні обмеження на використання лічильника (параметра) циклу:

- він може бути тільки порядкового типу;

- забороняється явна зміна його значення у тілі циклу (наприклад, оператором присвоювання).

Слід зазначити, що параметр циклу може і не використовуватися в тілі циклу, оскільки основне його призначення – це управління числом повторень циклу. Наприклад, значення y = xn, де n  0 – ціле, можна обчислити по наступному алгоритму: попередньо покласти y = 1, а потім рівно n раз домножити це значення на x:

y:=1;

for i:=1 to n do

y:=y*x.

Як видно, тут параметр циклу і служить лише для того, щоб забезпечити виконання оператора y:=y*x потрібне число раз.

Приклад програми на мові Pascal. Обчислити суму парних чисел від 0 до 100.

program Sum_For;

uses crt;

const Nn = 0; {початкове значення лічильника циклу}

Nk = 100 ; {кінцеве значення лічильника циклу}

var i : byte ; {лічильник циклу}

s : word ; {сума}

begin

ClrScr;

s:=0;

for i:= Nn to Nk do

if і mod 2 = 0 then s:=s+і;

WriteLn('Сума парних чисел :',s);

ReadLn;

end.

 Якщо не обнулити змінну s на початку програми, то при першому виконанні циклу в операції додавання буде брати участь довільне значення.

Приклад програми на мові С. Визначити суму N введених дійсних чисел.

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

main ()

{ float s=0, // сума

num; // число

int i, // лічильник циклу

n; // кількість введених чисел

cout <<“Input amount of numbers:”;

cin >> n;

for (i=1; i<=n; i++)

{ printf(“Input number:”);

scanf(“%f”, &num);

s+= num;

}

printf(“\nSum=%5.2f”,s);

getch();

}

Оператор циклу з передумовою. Використовується для задання ітераційних циклічних процесів, коли число повторень циклу заздалегідь невідоме, а визначається в процесі роботи програми. Специфічною особливістю даного оператора циклу є попередня перевірка умови його працездатності і лише потім (за необхідності) виконання тіла циклу. Тому при деяких значеннях вихідних даних передбаченні у циклі дії взагалі можуть не виконуватися.

У випадку мови Pascal оператором циклу з передумовою є оператор while. Його формат:

while умова працездатності do

оператор .

Тут while (пока) і do (виконувати) є службовими словами.

Механізм реалізації: перед кожною ітерацією перевіряється задана в заголовку циклу умова і доти, поки вона істина, тіло циклу виконується; коли ж умова стає хибною, цикл припиняє свою роботу.

Особливості реалізації циклу з передумовою:

- цикл може не виконуватися жодного разу;

- тіло циклу виконується поки <умова> істинна (true);

- у тілі циклу повинен бути оператор, що впливає на умову.

Формалізація оператора while в термінах РБНФ:

оператор циклу з передумовою::= while умова do оператор

умова ::= логічний вираз.

Наприклад,

n := 1; s := 0;

while (n < 11) do

begin

s := s + n;

n := n + 2

end ;

У випадку мови С оператором циклу з передумовою є оператор while наступного формату:

while (умова працездатності)

оператор;

Оператор циклу з передумовою зручний у випадках, коли за певних умов тіло циклу не повинне виконуватися жодного разу.

Також його рекомендується використовувати для задання ітераційних циклів, коли зручніше сформулювати умову, при виконанні якої циклічний процес буде продовжувати виконуватися.

Приклад програми на мові Pascal. Нехай заданий нескінчений ряд виду . Знайти суму даного ряду із точністю ε = 0.01.

Щоб знайти суму даного ряду із заданою точністю треба продовжувати процес підсумовування елементів ряду до тих пір, поки | Sk+1 - S k | < ε, тобто модуль різниці між сумами для k-го і (k+1)-го кроку не стане меншим за ε.

program Sum_r;

uses Crt;

const eps=0.01; {точність обчислень}

var s : real; {проміжкова сума, обчислена на поточній ітерації}

s1 : real; {проміжкова сума, обчислена на попередній ітерації}

k : integer; {номер елемента ряду}

begin

ClrScr;

s:=1; s1:=0; k:=1;

while abs(s-s1)>= eps do

begin

s1:=s;

k:=k+1;

s:=s+1/k;

end;

WriteLn ('Сума ряду -', s);

ReadLn

end.

Приклад програми на мові С. Дано числа a, b (a > 1, b > a). Одержати всі члени послідовності а, а2, а3, …, що менші числа b.

#include <iostream.h>

#include <conio.h>

main ()

{ float a,b, // вхідні дані

c; // елементи послідовності

cout <<“Input a,b:”;

cin >> a >> b;

c = a;

while (c < b)

{ cout << c << “ “;

c*= a;

}

getch();

}

Оператор циклу з постумовою. Також є оператором, що використовується для задання ітераційних циклічних процесів. Але, на відміну від попереднього оператора, оператор циклу з постумовою передбачає спочатку виконання тіла циклу, а лише потім перевірку умови його працездатності. Тому передбаченні у такому циклі дії виконуються як мінімум один раз.

У випадку мови Pascal оператором циклу з постумовою є оператор repeat. Його формат:

repeat

оператор_1;

. . .

оператор_n;

until умова закінчення.

Тут repeat (повторювати) і until (до) є службовими словами.

Механізм реалізації: після кожної ітерації перевіряється умова завершення роботи циклу і доти, поки вона хибна, цикл продовжує свою роботу; коли ж умова стає істинною, виконання циклу завершується.

Формалізація оператора repeat в термінах РБНФ:

оператор циклу з постумовою::= repeat оператор {; оператор} until умова

умова ::= логічний вираз

Наприклад,

n := 1; s := 0;

repeat

s := s + n;

n := n + 2

until (n >= 10);

Особливості реалізації циклу з постумовою:

- цикл виконується хоча б один раз;

- тіло циклу виконується поки умова є хибною (false);

- у тілі циклу повинен бути оператор, що змінює умову.

У випадку мови С оператором циклу з постумовою є оператор do-while. Його формат:

do

оператор

while (умова працездатності);

Особливості:

  • тіло циклу виконується поки умова є істинною (true).

У мові Pascal даний оператор рекомендується використовувати для задання ітераційних циклів, коли число повторень циклу заздалегідь невідоме, але зручно сформулювати умову закінчення виконання циклу.

Приклад програми на мові Pascal. Розглянемо ітераційний метод Ньютона знаходження квадратного кореня заданого числа, тобто обчислення із заданою точністю ε>0.

Цей метод полягає у наступному. Вибирається деяке початкове наближення , а потім знаходяться наступні наближення по рекурентній формулі

, де n = 1, 2, … .

Цю формулу можна представити у вигляді , де є поправкою до попереднього наближення. Відомо, що цей процес сходиться при будь-якому початковому наближенні . При цьому практично можна вважати, що потрібна точність досягнута, коли наступна врахована поправка по абсолютній величині стає меншою за ε.

program Metod_N;

uses Crt;

var x : real; {введене число}

y : real; {наближене значення квадратного кореня введеного числа}

v : real; {поправка наближення}

eps : real; {точність обчислення кореня}

begin

ClrScr;

Write ('Введіть X :'); ReadLn (x);

Write ('Введіть E :'); ReadLn (eps);

y:=1;

repeat

v:=(x /y - y) / 2;

y:=y + v;

until abs(v) < eps;

WriteLn ('Y=', y);

ReadLn

end.

Оператор циклу з постумовою, зазвичай, можна звести до оператора циклу з передумовою, відповідним чином змінивши логічний вираз, що визначає умову роботи циклу. Наприклад, розглянуту вище задачу знаходження квадратного кореня із заданою точністю можна вирішити і по алгоритму з використанням циклу з передумовою:

y:=1; v:=1;

while abs(v) >= eps do

begin

v:=(x /y - y) / 2;

y:=y + v;

end;

Приклад програми на мові С. Знайти суму i кiлькiсть введених чисел.

#include <stdio.h>

#include <conio.h>

main ()

{ int number, // введене число

total = 0, // сума введених чисел

count = 1; // кiлькiсть введених чисел

do

{ printf ("number \n");

scanf ("%d", &number);

total += number;

count++;

}

while (number != 0);

count--;

printf("total=%d count=%d \n", total, count);

getch ();

}

Всі оператори циклів допускають вкладеність інших операторів, у тому числі і інших циклів.

Приклад на мові Pascal. Для а = 1, 2, 3 знайти значення функції y (x) = x2 + а при х = 2, 5, 8, 11.

program Prim_For_While;

uses Crt;

var x : byte; { значення аргумента функції }

a : byte;

y : word; { значення функції }

begin

for a := 1 to 3 do

begin

x := 2;

while x < 12 do

begin

ClrScr;

y := Sqr(x) + 7;

Write (‘При х =‘, х, ‘ y =‘, y);

x := x + 3;

end;

end;

ReadLn

end.

Рекомендації з вибору циклів:

  • якщо число повторень циклу відомо заздалегідь - for;

  • якщо число повторень циклу заздалегідь невідомо, але існують умови, при яких цикл може не виконуватися жодного разу - while;

  • якщо число повторень циклу заздалегідь невідомо, але цикл повинний виконатися хоча б один раз - do–while.

При організації роботи циклу можуть бути корисні два простих оператора:

  • BREAK - дострокове закінчення циклу;

  • CONTINUE - дострокове закінчення ітерації циклу.

Правила пунктуації при написанні програм на Pascal:

  1. ";" не ставиться в розділах описів після зарезервованих слів Type, Var, Const і ставиться після завершення кожного опису;

  2. ";" не ставиться після begin і перед end, тому що ці слова є операторными дужками, а не операторами;

  3. ";" є роздільником операторів, її відсутність викликає помилку компіляції (наявність між операторами декількох ";" не є помилкою, тому що компілятор сприймає їхній як ознаку наявності порожніх операторів);

  4. Якщо при використанні вкладених структур виникає ситуація :

end

end;

то ";" ставиться тільки після останнього end. Якщо ж така конструкція зустрічається наприкінці програми :

end

End.

то ";" узагалі не ставиться.

  1. В операторах циклу ";" не ставиться після while, repeat, do і перед until.

  2. В умовних операторах ";" не ставиться після then і перед else.

Таблиця 1 - Операції мови С++

Опе-рація

Найменування

Приклад

Особливості

Операції з покажчиками

*

Вміст за вказаною адресою

*ptr

значення змінної, на яку посилається покажчик ptr

&

Отримання адреси oб’єкта

&a

&a - адреса , a - вміст адреси

ptr - адреса, *ptr- вміст адреси

Тернерна операція

?:

Умовна операція

<операнд1>? <операнд2>: <операнд3>

Якщо значення <операнд1> істине, то обчислюється <операнд2>, інакше – <операнд3>

І константи, і змінні належать певному типу даних, що визначає:

  • на логічному рівні – множину допустимих значень, а також операцій, що можуть застосовуватися до них;

  • на фізичному рівні – обсяг оперативної пам’яті, необхідної для розміщення відповідних значень, а також формат їх внутрішнього представлення.

Кожна змінна повинна бути описана (оголошена) шляхом присвоєння їй відповідного типу даних. Тип константи визначається по її зовнішньому представленню.

У будь-якому випадку запис тексту програми представляє собою строго лінійну послідовність символів. Не допускається використання у тексті програми верхніх і нижніх регістрів, дробів, тощо.

Для полегшення розуміння тексту програми і спрощення транслятора, мова програмування вимагає виконання певних правил запису тексту програми, які не знаходять свого відображення в синтаксисі мови.

При їх формулюванні використовується поняття «роздільник тексту», під яким розуміється пробіл, кінець рядка (управляючий символ) і коментар.

Правила запису тексту програми:

  1. Між двома послідовними конструкціями мови обов’язково повинен знаходитися хоча б один роздільник тексту.

  2. Роздільники тексту не повинні зустрічатися всередені ідентифікаторів, чисел, службових слів.

  3. Окрім випадків, зазначених у попередньому пункті, між двома послідовними основними символами може зустрічатися будь-яка кількість роздільників.

Незалежно від вибору мови програмування існують загальні правила оформлення програмних текстів, які сформувалися поколіннями програмістів у процесі роботи.

Так обов’язково перед програмним модулем треба писати не тільки його назву, а й коротку характеристику, зміст, необхідні пояснення.

Більшість мов програмування допускають довільне розміщення тексту програми «на бланку». Але рекомендується обрати якесь однакове розміщення програмних об’єктів, оскільки таку програму легше писати та читати. Зокрема,

  1. кожен оператор мови розміщується з нового рядка;

  2. кожну внутрішню структуру оператора розміщують з однаковим послідовним зсувом;

  3. якщо оператор не вміщується в один рядок, то продовження оператора у наступних рядках зсувають на одну й ту саму величину відносно початку оператора;

  4. найкраще коментувати кожен змістовний оператор, текст коментаря повинен бути зрозумілим не тільки автору, складеним без скорочень, щоб було ясно, як працює модуль;

  5. коментарі розміщують поряд із оператором за знаком початку коментаря, найкраще з однієї і тієї самої позиції;

  6. якщо коментар не вміщується в одному рядку, то на рядку продовження коментаря не слід розміщувати наступний оператор, кожне продовження коментаря має свої позначки початку та кінця коментаря;

  7. коли вибирають ім’я змінної або програми, бажано, щоб воно не тільки відповідало синтаксису мови, але й якось відображало відповідний зміст;

  8. між окремими блоками (змістовними частинами) програми бажано залишати пусті рядки (для наочності).

Якщо задача складається з декількох модулів, то один із них є головною процедурою, яка викликає інші модулі для виконання. Треба зазначити, що в різних мовах програмування є свої правила щодо програмної організації модулів. В деяких мовах (наприклад, PL/1) текст процедур може розміщуватись в тексті головної процедури, в будь-якому зручному місці, бо виконується він тільки після звернення до нього і (якщо необхідно) передачі параметрів. В інших мовах (наприклад, PASCAL) всі допоміжні процедурні модулі розміщуються у спеціальному розділі перед текстом головної процедури. В деяких мовах (наприклад, С) тексти функцій розміщуються за текстом головної функції.

Доцільно, щоб алгоритм модуля розташовувався на одній сторінці, а програма модуля складалася з 5 – 50 операторів (у середньому — з 20). Краще мати довшу, але простішу програму, аніж коротку та карколомну, «на кмітливість», бо вона принесе задоволення тільки автору в процесі створення, а не користувачеві в процесі експлуатації та супроводження.

Присвоєння типу даних (типізація) надає значення набору бітів. Як правило, типи надаються або значенням в пам'яті, або об'єктам, таким, як змінні. Оскільки будь-яке значення в ком'ютері складається із множини бітів, апаратне забезпечення не розрізняє, навіть, адреса, коди операцій, символьні дані, цілі числа. Типи вказують програмам та програмістам на те, як слід обробляти дані.

Системи типізації виконують наступні функції:

  • Безпечність — застосування типів даних дозволяє компілятору знаходити безсмістовний або невірний код. Наприклад, можна визначити вираз "Привіт!" + 3 як невірний, оскільки додавання (в загальному розумінні) рядка до цілого числа не має сенсу. Як зазначено нижче, сильна типізація безпечніше, однак, вона не обов'язково гарантує повну безпеку (докладніше, дивіться безпечна типізація).

  • Оптимізація — статична перевірка типів може повідомити додаткову інформацію компілятору. Наприклад, якщо тип даних вказує на те, що значення повинні вирівнюватись на границі кратні 4, компілятор зможе використати ефективніші машинні інструкції.

  • Документування — у виразнішіх системах типізації, типи даних можуть служити як вид документації, оскільки вони можуть описувати наміри розробника. Наприклад, довжина може бути підтипом цілих чисел, але, якщо розробник об'являє повертаємий функцією тип даних як довжину, а не просто ціле число, це може частково описувати значення функції.

  • Абстрагування (або модульність) — типи даних дозволяють розробнику розмірковувати про програми на вищому рівні, не звертаючи увагу на деталі реалізації на нижчому рівні. Наприклад, розробник може вважати рядок значенням, замість простого масиву байт. Або, типи можуть дозволити розробникам виражати інтерфейс між двома підсистемами. Це локалізує необхідні для взаємодії двох підсистем визначення та запобігає появі несумісностей під час взаємодії цих підсистем.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]