Завдання № 45. Перевірити, чи є послідовність строго монотонної » Pascal - основи програмування

Основи програмування на мові Pascal

 

Спонсори

Завдання № 45. Перевірити, чи є послідовність строго монотонної

Завдання № 45. Перевірити, чи є послідовність строго монотонної

Формулювання. Дана послідовність натуральних чисел, обмежена введенням нуля. Перевірити, чи є ця послідовність строго монотонною.
Рішення. Це завдання - спрощений варіант завдання 32. Взагалі, ці два завдання логічно б-ло б у даному збірнику поміняти місцями, проте вона виявилася на цій позиції через темати-чеського розподілу завдань.
Єдина відмінність від завдання 32 полягає в тому, що в нашому випадку члени послідовності вводяться з клавіатури за допомогою оператора read () - їх не потрібно добувати як цифри деякого числа.
Скористаємося формулою (II) з завдання 32:


p = delta1 * deltai


Нагадаємо, що якщо твір p негативно або дорівнює нулю, то послідовність не строго монотонна, так як знайшлися два delta різних знаків. Ми будемо рухатися по послідовно-ності в порядку введення, зліва направо, досліджуючи при цьому знаки всіх творів p. Так як delta1 присутній у формулі як константи, його значення необхідно обчислити заздалегідь:

read (a, b);
delta: = a - b;

У циклі ми будемо на кожному кроці зчитувати один черговий член, тому необхідно «зрушувати послідовність» і зчитувати його в звільнилася змінну. Так як в пере-менной a зберігається лівий член кожної пари, а у змінній b - правий член, то чергове число ми будемо зчитувати в змінну b. Так як обмежувач послідовності - нуль, то і цикл триватиме до введення в b нуля:
while b <> 0 do begin
  if delta * (a - b) <= 0 then break;
  a: = b;
  read (b)
end;

Тут у першому операторі тіла циклу відбувається перевірка твори кожних двох delta по вже згаданій формулі (II) з завдання 32. Далі йде «зсув» правого члена поточної пари і введення нового елемента замість нього. Простіше кажучи, якщо, наприклад, у нас в a знаходився 1-й член послідовності, а в b - 2-й, то даним способом ми переносимо 2-й член в змінну a і зчитуємо 3-й член в змінну b, після чого можна проводити таке порівняння.
Якщо введений елемент - НЕ нуль, то цикл триває, і досліджується знак твори delta1 і наступного обчисленого delta. Якщо умова монотонності порушується на якому-небудь кроці, то подальша перевірка безглузда, і можна переходити до висновку результату.
Яким же буде розвиток подій після виходу з циклу?
1) Якщо вихід був здійснений через break, тобто за умовою порушення суворої моно-тонності, то можна вивести на екран значення виразу delta * (a - b)> 0, що дасть від-вет false;
2) Якщо цикл завершився з введення нуля, то послідовність строго монотонна, і потрібно, відповідно, виводити відповідь true. Однак тут ми стикаємося з проблемою із за-дачі 45, пов'язаної з тим, що вводиться нуль не обробляється в основному циклі, тому що не входить в послідовність, проте він вводиться в оброблювану змінну b, щоб можна було вийти з циклу. Однак через це за допомогою оператора writeln (delta * (a - b)> 0) ми можемо отримати неправильну відповідь, так як в послідовно-ність обробляється з вводиться нулем включно.
Наприклад, послідовність 1 2 3 0 суворо монотонна, хоча програма видасть відповідь false, тому що по виході з циклу delta буде містити число -1, a - число 3, b - чис-ло 0, і вираз -1 * (3 - 0 )> 0 - невірно.
На цей раз ми впораємося з проблемою по-іншому. Легко зрозуміти, що якщо після виходу з циклу b = 0, то послідовність строго монотонна, так як перевірка пройшла по всіх delta аж до введення обмежувача. Якщо ж після виходу b відмінно від 0, то був здійснений вихід за break в тілі циклу і послідовність не є строго монотонною. Тому логічно оформити висновок відповіді так:
writeln (b = 0);
До речі, в такій формі можна здійснити виведення і в завданнях 32, 43 і 44, з деяким, однако, зміною ініціалізації вхідних значень змінних.
Наостанок необхідно подбати про правильній обробці вироджених випадків. Бу-дем вважати послідовність з єдиного нуля не строго монотонної, на відміну від послідовності з одного члена. Вона, до речі, отже вже буде оброблятися коректно: в a вводиться певна кількість, а в b вводиться 0. При цьому не здійснюється вхід в основний цикл, і програма переходить до висновку вираження b = 0, яке вірно.
Зробимо коректної обробку порожній послідовності. По-перше, необхідно дати можливість введення такої, так як в нашому начерку потрібне введення мінімум двох чисел. Для цього ми будемо зчитувати спочатку a, і якщо воно відмінно від нуля, то зчитувати b:
read (a);
if a <> 0 then read (b) else b: = 0;

При цьому якщо a = 0, то ми обов'язково присвоюємо значення 0 змінної b, щоб вона була визначена, і гарантовано не було входу в цикл. Однак у цьому випадку висновок висловлю-ня b = 0 спричинить висновок true. Щоб уникнути цього, потрібна ще одна перевірка: якщо a = 0, то привласнити b натуральне число, відмінне від 0 (наприклад, 1), що спричинить висновок false:

if a = 0 then b: = 1;

Код:


  1. program MonotonicSequence;
  2. var
  3. a, b: word;
  4. delta: integer;
  5. begin
  6. read(a);
  7. if a <> 0 then read(b) else b := 0;
  8. delta := a - b;
  9. while b <> 0 do begin
  10. if delta * (a - b) <= 0 then break;
  11. a := b;
  12. read(b)
  13. end;
  14. if a = 0 then b := 1;
  15. writeln(b = 0)
  16. end.

0045.-MonotonicSequence.rar [710 b] (cкачувань: 2)

скачать dle 10.4фильмы бесплатно Наступна сторінка » Завдання № 46. Вивести на екран n-ну кіл... Попередня сторінка » Завдання № 44. Перевірити, чи є послідо...