Повторюємо вивчене, вивчаємо нові оператори, застосовуємо вкладені розгалуження до розв'язування задач
Почнемо з повторення. Дайте відповіді на питання тесту:
Для повторення розглянемо ще одну задачку:
Дано квадрат і круг. За введеними користувачем стороною квадрата і радіусом круга визначити, чи поміститься круг усередині даного квадрата, а якщо так, то обчислити площу тієї частини, яка міститься між ними
І знову трохи геометрії. Починаємо з математичної моделі цієї програми.
В даній задачі йде мова про два можливих випадки:
Потрібно визначити, який з випадків дійсний при даних вимірах сторони квадрата й радіуса круга і якщо круг може бути розміщений всередині квадрата, то обчислити площу жовтої частини (див. малюнок).
Очевидно, що найбільшим кругом, який можна розмістити всередині даного квадрата, є такий, діаметр якого дорівнює стороні квадрата:
Отже, щоб відповісти на перше питання, потрібно просто порівняти сторону квадрата 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 = 11924769 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 31 3 22 1 32 3 13 1 23 2 11 2 22 1 22 2 11 1 21 2 12 1 12 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.
Щоб легше було розібратися в розгалуженнях, складіть собі спочатку блок-схему алгоритму.