Повторюємо вивчене, вивчаємо нові оператори, застосовуємо вкладені розгалуження до розв'язування задач
Почнемо з повторення. Дайте відповіді на питання тесту:
Для повторення розглянемо ще одну задачку:
Дано квадрат і круг. За введеними користувачем стороною квадрата і радіусом круга визначити, чи поміститься круг усередині даного квадрата, а якщо так, то обчислити площу тієї частини, яка міститься між ними
І знову трохи геометрії. Починаємо з математичної моделі цієї програми.
В даній задачі йде мова про два можливих випадки:
Потрібно визначити, який з випадків дійсний при даних вимірах сторони квадрата й радіуса круга і якщо круг може бути розміщений всередині квадрата, то обчислити площу жовтої частини (див. малюнок).
Очевидно, що найбільшим кругом, який можна розмістити всередині даного квадрата, є такий, діаметр якого дорівнює стороні квадрата:
Отже, щоб відповісти на перше питання, потрібно просто порівняти сторону квадрата a
і діаметр круга 2R
. Щоб круг помістився у квадраті потрібно, щоб його діаметр був меншим або рівним стороні квадрата.
От шляхом таких нескладних міркувань ми й отримали умову для нашого наступного розгалуження: if 2*r<=a then...
Ну й, оскільки випадків у нас тільки два, то це розгалуження буде повним, тобто типу if...then...else...
Усі наступні дії уже не становлять труднощів. Якщо умова виконується тоді виконуємо відповідні обчислення: формула площі квадрата S=a²
, формула площі круга S=пr²
. Віднімаємо від площі квадрата площу круга й отримуємо відповідь. Якщо умова не виконується, тоді виводимо повідомлення, що круг усередині квадрата розмістити не вдасться.
Працюємо самостійно
program krug_kvadrat;
var a,r,skr,skv,s:real;
{a - сторона квадрата, r - радіус круга, skr - площа круга,
skv - площа квадрата, s - площа між квадратом і кругом}
begin
write('Введіть сторону квадрата: ');
readln(a);
write('Введіть радіус круга: ');
readln(r);
if 2*r<=a then
begin //Потрібно буде виконати багато дій! Операторні дужки обов'язкові!
skr:=pi*sqr(r); //Площа круга
skv:=sqr(a); //Площа квадрата
s:=skv-skr; //Різниця між площами
writeln(s:2:2) //Відповідь з двома знаками після коми
end //далі йде else, крапку з комою не ставимо!
else writeln('Круг не поміститься всередині квадрата')
end.
Перейдемо тепер до розв'язування складніших задач з застосуванням розгалужень.
Розглянемо таку задачу:
З клавіатури вводиться деяке ціле число. Визначити, парне воно, чи ні.
Як для уроку математики, то така задачка зовсім проста: ми усі добре знаємо, що парними називаються ті числа, які закінчуються на 0,2,4,6,8. Тому, коли ми розв'язуватимемо таку задачу на уроці математики, то просто подивимося на останню цифру й зробимо висновок.
Як для програмування, то виникає питання про те, а ЯК примусити комп'ютер "подивитися" на останню цифру числа? Комп'ютер, на жаль, (а може й на щастя!) не жива істота! Йому не накажеш: сюди дивись, а туди не дивись!
Допоможуть нам у цьому ще два арифметичних оператори, які ми ще не вивчали. Це спеціальні оператори ділення div
і mod
.
Якщо оператор /
ділить одне число на друге, що називається, "до упору", до сотих, тисячних, мільйонних і т.д., то оператор div
- тільки до коми і залишає неповну частку. Наприклад, результатом операції 5 div 2
буде не 2,5, а тільки 2, уся дробова частина частки буде просто відкинута.
Оператор mod
залишає нам остачу від ділення. Наприклад, результатом операції 5 mod 2
буде число 1, оскільки 5:2=2(ост.1)
.
4769 div 4 = 1192
4769 mod 4 = 1
От і відповідь на питання, як визначити парність чи непарність числа. Якщо деяке число число a
парне, то воно без остачі ділиться на 2. Таким чином, залишається тільки перевірити результат операції a mod 2
. Якщо цей результат дорівнює 0, значить, число парне, якщо ні - значить непарне. Готова програма матиме такий вигляд:
program parne_neparne;
var a:integer;
begin
write('Введіть число: ');
readln(a);
if a mod 2 = 0 then writeln('Число парне')
else writeln('Число непарне')
end.
Тепер, враховуючи попередню програму, вам легко буде розв'язати...
Скласти програму для визначення того, чи є ціле число, введене з клавіатури круглим
Відомо, що "круглими" називають числа, що закінчуються нулем. Отже...
program krugle_nekrugle;
var a:integer;
begin
write('Введіть число: ');
readln(a);
if a mod 10 = 0 then writeln('Число кругле')
else writeln('Число не є круглим')
end.
Комбінуючи mod
і div
можна будь-яке число "розщепити" на окремі цифри
З клавіатури вводиться трицифрове число. Вивести число, записане тими ж цифрами але розміщеними в порядку зростання.
Суть завдання у тому, що коли, наприклад, буде задане число 342, то у результаті роботи програми отримаємо число 234 - число, записане тими ж цифрами але в порядку від меншої цифри до більшої.
Як його "розібрати" на окремі цифри?
Очевидно, що найпростіше отримати розряд одиниць. Треба просто знайти остачу від ділення даного числа на 10:
342 mod 10 = 2
Так само нескладно отримати й розряд сотень. Тільки тепер треба застосувати не mod
, а div
:
342 div 100 = 3
Як "витягнути" середнє число? Одним зі способів може бути, наприклад. такий:
342-2=340
;340-3*100=40
;40 div 10 = 4
.Отже, якщо a
- введене число, od
- цифра одиниць, des
- цифра десятків і sot
- цифра сотень, то маємо таку послідовність команд:
od:=a mod 10;
sot:=a div 100;
des:=(a-od-sot*100) div 10;
Усе. Обов'язковий мінімум для всіх завершено. Те, що написано далі - для тих, хто хоче навчитися писати дійсно, складні програми.
Тепер числа можна починати порівнювати.
Для вибору найменшого з трьох чисел можна скористатися таким алгоритмом:
Як бачимо на блок-схемі, в цьому випадку доведеться мати справу з вкладеними розгалуженнями, причому їх вкладено аж два: у першому розгалуженні вкладено ще два - і після then
, і після else
. Однак, за допомогою цього алгоритму можна визначити найменше число і в тому випадку, якщо усі три числа різні, і якщо два з них однакові, і якщо усі три числа однакові.
Спробуйте перевірити, яким вийде результат на наборах яких-небудь чисел, наприклад:
Усі числа різні
По два рівних
Усі рівні
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
1 2 2
2 1 2
2 2 1
1 1 2
1 2 1
2 1 1
2 2 2
Після того, як найменше з трьох чисел визначено, знайти найменше з тих двох, що залишилися уже простіше простого:
if a<b then min:=a else min:=b;
"Фішка" в тому, що навіть якщо числа, які порівнюються, в умові будуть рівні, то в цьому разу умова не виконається, значить буде виконане те, що після else
, але ж для нас не має жодного значення, яке з двох однакових чисел поставити на перше місце, вони ж ОДНАКОВІ!
Отже, уся програма в цілому матиме такий вигляд:
program mensh_do_biljsh;
{Програма отримує трицифрове число і виводить число, створене з тих самих
цифр але виведених у порядку зростання}
var a,od,des,sot,min1,min2,min3:integer;
{a - дане число, od - цифра одиниць, des - цифра десятків, sot - цифра сотень,
min1 - найменша з цифр, min2 - друга по величині, min3 - найбільша з цифр}
begin
write('Введіть число: ');
readln(a);
od:=a mod 10;
sot:=a div 100;
des:=(a-od-sot*100) div 10;
if od<des then
if od<sot then
begin
min1:=od;
if des<sot then
begin
min2:=des;
min3:=sot;
end
else
begin
min2:=sot;
min3:=des;
end;
end
else
begin
min1:=sot;
if od<des then
begin
min2:=od;
min3:=des;
end
else
begin
min2:=des;
min3:=od;
end;
end
else
if des<sot then
begin
min1:=des;
if od<sot then
begin
min2:=od;
min3:=sot;
end
else
begin
min2:=sot;
min3:=od;
end;
end
else
begin
min1:=sot;
if od<des then
begin
min2:=od;
min3:=des;
end
else
begin
min2:=des;
min3:=od;
end;
end;
write(min1);
write(min2);
write(min3)
end.
Нижче можна поекспериментувати з числами й побачити, як ця програма працює.
З цього уроку ви дізналися про те, що:
div
виконує неповне ділення двох чисел і виводить лише цілу частину частки;mod
виводить остачу від ділення двох чисел;mod
можна легко визначити, чи поділяється число a
на число b
, якщо застосувати розгалуження вигляду if a mod b = 0 then...
div
і mod
можна "розібрати" число на цифри.Ну а найбільш наполегливі з вас ще й дізналися за яким алгоритмом можна визначити менше з трьох чисел
І рівень (на "6"):
Дано трицифрове число. Вивести число, яке складається з тих самих цифр але розміщених в зворотному порядку.
Наприклад, введене число 456, виведене число 654
Підказка
Дане трицифрове число спочатку треба "розібрати" на цифри. Як це зробити - написано в матеріалі уроку. А далі, зверніть увагу, отримані цифри слід усього лише вивести в правильному порядку. В якому? Що поставити на перше місце: одиниці, десятки, сотні? Про те, як вивести результат в один рядок (три цифри послідовно), підгляньте в код останньої на цій сторінці (складної) програми. Три останніх її рядки, сподіваюсь, наштовхнуть вас на правильну ідею.
ІІ рівень (на "11"):
Користувач вводить число року. Визначити, чи є цей рік високосним
Підказка
Високосним вважається рік, число якого поділяється (ділиться без остачі) на 4, за винятком тих років, які поділяються на 100 і не поділяються на 400 (наприклад, 1900 рік не був високосним, бо 1900 mod 4 = 0
і 1900 mod 100 = 0
але 1900 mod 400 <> 0
.
Щоб легше було розібратися в розгалуженнях, складіть собі спочатку блок-схему алгоритму.