Б С Бусигін - Прикладна інформатика - страница 35

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 

1                                2 З

const tens = le3; var

x , st : Longint; begin writeln('Vvedite X='); readln(x); repeat

st := sqr(x);

x := x +l until

not (((x>=-200) and (x<=200)) and (x<=tens))

end.

const tens = le3; var

x , st : Longint; begin writeln('Vvedite X='); readln(x); repeat

if not (odd(x)) then st := sqr(x); x := x +l until

((x<=-200) or (x>=200)) and (x>=tens))

end.

const tens = le3; var

x , st : Longint; begin

writeln('Vvedite X=');

readln(x);

repeat

if (odd(x)) then st := sqr(x); x := x +l until

not (((x>=-200) and (x<=200)) and (x<=tens))

end.

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

10 і

Припустимо, необхідно обчислити наступну суму ^a" . Вирішення задачі

n=1

буде складатися з наступних дій.

О Попередньо потрібно увести значення постійної величини a.

© Змоделювати зміну значення виразу на кожному новому кроці.

n

1

© Змоделювати обчислення функції однієї змінної an . Це, до речі, можна

k _ k -In a

зробити за допомогою тотожності (рос. - тождества) a e , яке у мові ТП реалізується за допомогою вбудованих функцій exp(x) та ln(x) у вигляді

k / 7  1   / \\ г> k -In a 1

a   = exp (k - In (a)) . У виразі e        значення k буде моделювати вираз —.

n

Значення елемента суми для кожного значення змінної n будемо привласнювати змінній elm.

© Далі потрібно організувати циклічний процес обчислювання вищенаведеної суми з вищеописаних компонентів.

10 —

Приведемо алгоритм і його реалізацію на мові ТП, що збирає суми ^ an

n=1

у трьох різних циклах у змінних з іменами SFOR, SWHILE, SREPEAT.

var

n  : integer;

a,   elm,   SFOR,   SWHILE,   SREPEAT,   k  : real; Begin

Writeln('Введемо a='); readln(a);

{Cycle FOR---------------------------------}

SFOR  := 0;

for n := 1 to 10 do begin

k  := 1/n;  elm := exp(k*ln(a)); SFOR  := SFOR + elm; end;

{Cycle WHILE---------------------------------}

n  := 1;   SWHILE  := 0; while    n<= 10 do begin

k  := 1/n;  elm := exp(k*ln(a));  n  := n + 1; SWHILE  := SWHILE + elm; end;

{Cycle REPEAT---------------------------------}

n  := 1;   SREPEAT   := 0;

repeat k  := 1/n;  elm := exp(k*ln(a));

SREPEAT   := SREPEAT + elm;  n  := n + 1

until n > 10  ;   {Можна так  : not(n<=10)} {-----------------------------------------------}

Writeln('3 Суми =',SFOR:10:3,SWHILE:10:3,SREPEAT:10:3); Сформулюємо вищенаведену задачу іншим чином. Припустимо, потрібно обчислити суму 2a   з точністю Є = 0.01

n=1

Тоді цикл з параметром (for ... to ... do) для цього випадку використовувати вже неможливо, оскільки заздалегідь невідомо скільки разів потрібно додавати елементи суми до загальної суми, щоб задовольнити поставлені умови. Не зайве нагадати, що вирішення цієї задачі неможливо напряму і у додатку MS Excel. Адже і у такому потужному програмному продукті потрібно буде написати спеціальну процедуру на мові Visual Basic for Application з використанням подібних циклічних операторів цієї мови.

Отже, на мові ТП рішення нової задачі можна записати з використанням одного з двох операторів циклу з умовами:

(while ... do)    або    (repeat ... until).

Для демонстрації їх можливостей використаємо їх обидва. Точність епсілон (є) обчислення значення суми у програмі моделюємо константою з іменем eps, початкове значення якої завдаємо на рівні 0.01. Зверніть увагу, що головною вимогою завершення циклів повинно бути виконання умови, щоб значення чергового елементу суми elm було менше значення є =0.01:

elm < eps,

Але, Ви пам'ятаєте, що умовою роботи циклу while ... do є значення TRUE умовного виразу його виконання. Зрозуміло, що значення першого елемента суми не менше eps. Тому ми можемо записати цю умову з використанням логічної операції інвертування (NOT) логічного значення.

Program Next_Cycles;

const eps = 0.01; var

n  : integer;

k, a, SWHILE, SREPEAT : real;

Begin

Writeln('vvedite a='); readln(a);

{Cycle WHILE---------------------------------}

n  := 1;   SWHILE  := 0;  elm  := 1; while    not   (elm < eps)   do begin

k  := 1/n;  elm := exp(k*ln(a));  n  := n + 1; SWHILE  := SWHILE + elm; end;

{Cycle REPEAT---------------------------------}

n  := 1;   SREPEAT   := 0;

repeat k  := 1/n;  elm := exp(k*ln(a));

SREPEAT   := SREPEAT + elm;  n  := n + 1

until    elm < eps ; {-----------------------------------------------}

Writeln('2 Summy=',SWHILE:10:3,SREPEAT:10:3);

Так як оператор циклу repeat ... until виконує роль операторних дужок begin ... end, після останнього оператора тіла циклу перед службовим словом until розподільний знак       ставити не треба.

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

Вправи

1. Чим відрізняються цикли з умовами від циклу з параметром?

2. Що собою уявляє умова у цих обох циклах?

3. Яке значення повинна мати умова у цикл while, щоб він виконувався?

4. Яке значення повинна мати умова у цикл repeat, щоб він виконувався?

5. Чим взагалі відрізняється цикл while від циклу repeat?

6. З використанням оператора циклу з передумовою while напишіть і виконайте програму табулювання функцій y з дійсним аргументом х:

.         sin Зп - x a) у =-її , ;

x+

Зп 2

+x

x + ctg (x + І)

b) У =     К-;

sin (x + І)

c) у = І0

log

a

x + —

4

d) У

sin 2 x2 + cos 2 x

22

І+

x sin   b x + І

x

Границі зміни значень аргументу x узяти на відрізку [-І, І].

7. Виконайте попередні вправи з використанням циклу repeat.

8. Знайдіть суму за формулою: S = ^

n

n

І0

1

І

8.18. Засоби дослідження виконання дій програми за допомогою дебаггера24

Якщо алгоритм програми занадто складний і Ви отримуєте незрозумілий результат або деякі операції у програмі зупиняють роботу комп'ютера (наприклад: ділення на нуль, переповнення розрядної сітки ПК і т.д.), то Ви повинні провести дослідження програми засобами ICP ТП. Для цього у Турбо Паскалі є дуже розвинуті засоби перевірки стану змінних, результатів операцій з цими змінними і так далі за допомогою вбудованого дебаггера. Але пам'ятайте: дебаггер допоможе Вам тільки тоді, якщо у кожному рядку програми буде знаходитись тільки один оператор ТП І

Для побудови простої дослідницької програми виконаємо у ICP ТП команду File/New, яка відкриє чисте вікно редактора з назвою NONAMEOO.PAS. У цей чистий лист введемо текст наступної програми для її дослідження під назвою (іменем) MyFirst:

program MyFirst; var

A,B: Integer; Ratio: Real;

Begin repeat

Write('Vvedite dva chisla A,  B  : ');

Readln(A,B);

Ratio := A/B;

Writeln('Rezultat Ratio = ',Ratio:8:2); Write('Najmite <Enter>...'); Readln; until B = O; End.

Для збереження тексту Вашої програми, тобто запису її на диск з відповідним ім'ям, увійдіть у меню Fiie, виберіть Save As і наберіть у стрічці з назвою Save fiie as відповідного меню ім'я Вашого файлу MyFirst, а потім натисніть Enter. Розширення імені файлу .PAS додається при запису тексту програми на диск автоматично (рис. S.35).

Компілюйте і запускайте свою програму, використовуючи Ctri-F9. Турбо Паскаль автоматично відкомпілює Вашу дослідницьку програму перед запуском і виконає її.

Оскільки Ваші оператори були укладені в цикл <repeat ... until>, це призведе до того, що усі оператори поміж repeat і until будуть виконуватися доти, поки умовний вираз, що впливає на кількість виконання циклів, не стане мати значення True (істина). Цей умовний вираз перевіряє,

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

2бЗдорівнює значення В нулю чи ні. Якщо змінна В має значення 0, цикл повинен завершитися.

Рис. S.35. Вигляд програми MyFirst у синьому вікні редактора ТП

Взагалі, ця програма повинна працювати без зупинки, бо умовою виходу з циклу є фактично помилкове значення змінної B = 0 , що зупиняє програму та викликає діагностику:

Error 200:  Division by zero (ошибка 200:  деление на 0)

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

Щоб почати сеанс дослідження, виберіть команду Run/Trace Into (чи натисніть F7). Якщо Ваша програма має потребу в перекомпіляції, Турбо Паскаль зробить це. Перший оператор у розділі операторів Вашої програми (у даному випадку - begin) буде висвітлено спеціальною смугою; з цього моменту ми будемо називати цю висвітлену смугу - смугою запуску (рис. S.36). Наступні натиснення клавіші F7, пересувають курсор по стрічках Вашої програми, послідовно виконуючи їх.

Другим етапом дослідження, є Ваша вказівка дебаггеру про імена змінних, зміни значення яких Ви бажаєте побачити у цьому сеансі роботи програми, що досліджується. Для подання визначених програмістом вказівок у ІСР ТП використовується спеціальне діалогове вікно Add Watch (тобто додавання контрольних точок для стеження (рос. - наблюдения)).

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 


Похожие статьи

Б С Бусигін - Прикладна інформатика