Організація розгалужень в програмах

При програмній реалізації розгалужень проблем практично не буде, якщо ви детально розібрались з матеріалом попереднього параграфу та запропонованими завданнями. Виникає питання, а що краще використовувати: команду розгалуження, чи команду вибору? Дати відповідь на це запитання рівнозначно вирішенню проблеми – що корисніше: мед чи овочі? Адже і те і інше потрібно для людини, причому в одних випадках перше, а в інших – друге. Більше того, існують такі ситуації коли не буде корисним ні перше, ні друге. Тому все повинно бути в міру, так само як і використання вище згадуваних команд. Для прикладу розглянемо ще одну задачу, яку розв’яжемо як з використанням команди розгалуження, так і з використанням команди вибору. На наш погляд розв’язки рівноцінні, але не найкращі, а який з них вам сподобається більше, то вже справа ваших уподобань.

Задача 59. 59. Задано ціле число (не більше 100). Використовуючи лише дію множення піднести дане число до заданого степеня (не більшого 4).

Розв’язання: Спочатку приведемо програмну реалізацію розв’язку даної задачі з використанням команди розгалуження:

program step1;

var n,m,res: longint;

begin

write(‘Введiть цiле числo (не бiльше 100): ’);

readln(n);

write(‘До якого цiлого степеня пiднести (1-4): ’);

readln(m);

if m = 1 then res:= n

else if m = 2 then res:= n*n

else if m =3 then res:= n*n*n

else if m = 4 then res:= n*n*n*n;

writeln(res);

readln;

end.

Приведемо повну реалізацію останньої поставленої задачі з використанням команди вибору.

program step2;

var n,m,res: longint;

begin

write(‘Введiть цiле число (не бiльше 100): ’);

readln(n);

write(‘До якого цiлого степеня пiднести (1-4): ’);

readln(m);

case m of

1: res:= n;

2: res:= n*n;

3: res:= n*n*n;

4: res:= n*n*n*n;

end {case};

writeln(res);

readln;

end.

Вправи та завдання

60.60. Скласти програму знаходження більшого серед: а) двох чисел; б) трьох чисел; в) чотирьох чисел.

61.61. На площині задано трикутник координатами своїх вершин. Знайти найменшу сторону трикутника.

62.62. Точку А задано на площині своїми координатами (X,Y). Знайти номер координатної чверті, якій належить дана точка.

63.63. Дві точки на площині А (X1,Y1)і В(X2,Y2)задано своїми координатами. Перевірити, чи лежать ці точки в одній координатній чверті.

64.64. Дано дійсні додатні числа X, Y, Z. Чи існує трикутник з довжинами сторін X, Y, Z.

65.65. Три точки на площині задано своїми координатами (X 1, Y 1),(X 2, Y 2),(X 3, Y 3). Знайти радіус найменшого кола (з центром в початку координат), якому належать данні точки.

66.66. Дано коло радіусом Rі прямокутник зі сторонами A, B. Визначити, чи поміститься коло в прямокутнику.

67.67. Дано натуральне число N(N < 100), що визначає вік людини в роках. Після цього числа потрібно дописати одне з слів: "рік", "роки" або "років". Наприклад: 1 рік, 23 роки, 97 років.

68.68. Три точки на площині задано координатами A(X 1, Y 1),B(X 2,Y 2),C(X 3, Y 3). Чи належить початок координат трикутнику ABC.

69.69. Заданорозміри прямокутних дверей А, Bта розміри шафи, що має форму прямокутного паралелепіпеда X, Y, Z. Перевірити, чи можна шафу пронести через двері. а) Проносити шафу через двері дозволяється лише так, щоб кожне з її ребер було паралельно або перпендикулярно кожній з сторін дверей. б) Проносити шафу крізь двері можна під кутом.

70.70. На площині в прямокутній системі координат задано три точки Вважаючи, що вони є вершинами деякого прямокутника, знайти координати четвертої вершини.

71.71. На координатній площині задано два прямокутника, сторони яких паралельні координатним вісям. (X 1, Y 1),(X 2, Y 2) координати діагоналей першого, а(X 3, Y 3),(X 4, Y 4) другого прямокутника. У випадку, якщо прямокутники мають спільну частину, визначити її площу або вивести повідомлення про те, що прямокутники не перетинаються.

72.72. Чотири точки S, A, B, Cна площині, довільні три з яких не лежать на одній прямій, задані своїми координатами (X 1, Y 1), (X 2, Y 2), (X 3, Y 3), (X 4, Y 4). Розглядаючи фігуру SABC як зображення трикутної піраміди на площині, визначити, які з точок потрібно з’єднати пунктирною лінією.

Організація циклів

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

Нас будуть цікавити цикли, які використовуються в програмуванні, їх організація, правила використання і способи застосування. В мові Pascal використовують три види циклів:1

n цикл з параметром;

n цикл з передумовою;

n цикл з післяумовою.

Взагалі, якщо висловлюватись науково, то перші два цикли можна було б об’єднати в один – цикл з передумовою, що і зроблено в деяких книгах по програмуванню. Ми не робимо це по тій причині, що вважаємо, що ці цикли є все–таки різними і постараємось вам це довести. Крім того, запропонований вам поділ прийнятий серед більшості програмістів і дає розуміння процесу «машинного мислення».

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

Розглянемо всі три види циклів на прикладі однієї простої, класичної задачі.

Задача 73. 73. Знайти суму перших 100 натуральних чисел.

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

Program summa0; { варіант програми без операторів циклу }

label mmm;{введемо мітку з іменем вже неіснуючої відомої компанії}

var i, sum: integer; { i – число, що додається, sum – шукана сума }

begin

i:= 1; { перше число, яке нам потрібно додати }

sum:= 0; { поки не почали додавати, сума дорівнює нулеві }

mmm: sum:= sum + i; { до суми додаємо чергове число }

i:= i+1; { збільшуємо доданок на одиницю }

if i <= 100 then goto mmm; { якщо доданок <=100 то повертаємось на мітку і продовжуємо додавати }

write ('S = ',sum); { друкуємо результат }

readln;

end.

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

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

Як працює дана програма? Оскільки нам потрібно додати всі числа від 1 до 100, то першим числом, яке потрібно додати є 1, тому ми і першому значенню доданку присвоїли 1. До початку додавання шукана сума становить 0. А далі ставимо мітку перед початком додавання і до суми додаємо черговий доданок. Після чого доданок збільшується на 1 і перевіряється умова, чи новий доданок відповідає поставленій умові задачі. Якщо відповідає, то повертаємось на додавання (власне для цього і вводилась мітка), якщо ні – друкуємо результат.

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

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

Цикл з параметром

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

Program summa1; { варіант програми з використанням циклу з параметром}

var i, sum: integer; { i – число, що додається, sum – шукана сума }

begin

sum:= 0; { поки не почали додавати, сума дорівнює нулеві }

for i:= 1 to 100 do { цикл з параметром! }

sum:= sum + i; { до суми додаємо чергове число }

write ('S = ',sum); { друкуємо результат }

readln;

end.

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

Отже, як працює дана програма. Але перед тим як це показати, пояснимо, що новий для нас рядок

for i:= 1 to 100 do

перекладається так:

для і від 1 до 100 виконувати

Це і є спосіб організації циклу з параметром. У загальному випадку цикл з параметром записується так:

forзмінна := початкове значенняtoкінцеве значенняdo

На алгоритмічній мові цикл з параметром організовуються таким чином:

для і від а поч 1 до а кін

пц

... (тут записуються команди, що виконуються в циклі)

кц

У машинному розумінні цикл розшифровуються так: для змінної починаючи від початкового значення і закінчуючи кінцевим значенням виконувати наступні інструкції. В умовах поставленої нами задачі в приведеній вище програмі розуміється наступне: для змінної і від 1 до 100 виконувати операцію додавання до змінної Sum значення змінної і.

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

Даний цикл самостійно виконуються рівно 100 разів (100 - 1 + 1, тобто для знаходження кількості ітерацій – необхідно від кінцевого значення відняти початкове і додати одиницю). Рекомендуємо виділене твердження запам’ятати.

А як бути у тому випадку, коли нам необхідно, щоб параметр не збільшувався, а зменшувався? Для цього служить такий спосіб організації даного циклу:

for i:= 100 downto 1 do

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

А тепер пояснимо логіку «машинного мислення» у реалізації поставленої задачі. До початку організації циклу ми присвоюємо значення 0 шуканій сумі. Цикл починається з значення параметру рівного 1, ПЕОМ перевіряє, чи 1>100, отримує результат “ні”, виконує операцію циклу Sum:= Sum +1, в результаті якої значення Sum = 1, автоматично збільшує значення параметраі на 1, і стає рівним 2. Знову перевіряється умова 2>100, отримується результат “ні”, виконується операція циклу Sum:= Sum +1, в результаті якої значення Sum = 3 і автоматично збільшується значення параметра і на 1, і стає рівним 3 і т.д. На 99 кроці значення Sum було 4950 і параметр і став 100, перевіряється чи 100>100, отримується результат “ні”, виконується операція циклу Sum:= Sum +100, в результаті якої значення Sum = 5050, автоматично збільшується значення параметра і на 1, і стає рівним 101. Перевіряється чи 101>100, отримується результат “так” і цикл на цьому закінчується. Наступною виконується операція, що йде за циклом: надрукувати результат. Весь хід приведених “машинних роздумів” зручно привести в такій таблиці.

і і > 100 дія S
       
  ні +1  
  ні +2  
  ні +3  
  ні +4  
... ... ... ...
       
  ні +99  
  ні +100  
  так  

У розглядуваному нами прикладі в циклі виконувалась лише одна операція: до значення суми додавалось значення параметру. А як бути в тому випадку, коли нам потрібно виконати в циклі декілька дій. В цьому випадку всі оператори, що входять до циклу перуться в операторні дужки, нашу нерозлучну солодку парочку Begin... End. Ми в принципі і в нашому варіанті розв’язку могли написати так:

...

for i:= 1 to 100 do

Begin

sum:= sum + i;

End;

...

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

Підведемо деякі підсумки. Отже, для циклів з параметрами необхідно запам’ятати, що:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: