Цей матеріал стане в нагоді на уроках інформатики при вивченні мови програмування та при підготовці учнів до олімпіади з інформатики. Це перший документ з низки "Вчимося розв'язувати задачі", який стане в нагоді вчителю та учням.
Задача 1. Умова задачі. Васєчкін прочекав у черзі на щеплення minute хвилин. Визначити, скільки годин і хвилин він чекав.
Ідея розв’язання. Дана задача містить всього одну змінну minute, яка очевидно повинна бути цілою невід’ємною. Взагалі немає різниці, який з типів буде взято для збереження цього значення, але краще брати більший, щоб була можливість перевірити рішення на більшому діапазоні значень.
Щоб визначити, скільки годин буде чекати учень, потрібно знайти частку від цілочисельного ділення даної змінної на 60. Дійсно, якщо буде задано значення 200 хвилин, то 200 div 60=3. Залишок від ділення на 60 буде визначати кількість хвилин, що залишилась понад цілої кількості годин. Для значення 200 це буде 20: 200 mod 60 = 20.
Програма, що розв’язує дану задачу, має вигляд:
program Task1;
{$APPTYPE CONSOLE}
uses SysUtils;
var Minute : longword;
begin
{Уведення кількості хвилин
з відповідним повідомленням на екрані}
write('Enter minute ');
readln(Minute);
{Виведення кількості годин}
writeln('hour=', Minute div 60);
{Виведення кількості хвилин}
writeln('minute=', Minute mod 60);
readln; {Затримка зображення на екрані}
end.
Задача 2. Умова задачі. Визначити, чи є серед цифр заданого тризначного числа однакові цифри.
Ідея розв’язування.
Алгоритм розв’язування:
Програма, що розв’язує дану задачу, має вигляд:
program Task1;
{$APPTYPE CONSOLE}
uses SysUtils;
var n : longint; {дане число}
a,b,c : 0..9; {змінні для збереження цифр}
z : boolean; {логічна змінна}
begin writeln(‘ Введить тризначне число’);
readln(n);
a:= n div 100; {перша цифра}
c:=n mod 10; {остання цифра}
n:=n div 10; {відкидаємо останню, залишається перша і друга}
b:= n mod 10; {а ось і друга цифра}
z:= (a=b) or (b=c) or (a=c); {чи рівні ці цифри? }
writeln( z); {відповідь - true або false }
end.
Задача 3. Умова задачі. Визначити, чи є дане чотиризначне число паліндромом (симетричним).
Ідея розв’язування:
Алгоритм розв’язування:
Програма, що розв’язує дану задачу, має вигляд:
program Task3;
{$APPTYPE CONSOLE}
uses SysUtils;
var n,m : longint; {дане число і його копія}
a,b,c,у : 0..9; {змінні для зберігання цифр}
z: boolean; {логічна змінна}
begin write(‘Введить чотиризначне число’); readln(n);
m:=n;{копіюємо дане число}
a:=n mod 10; {остання цифра-четверта}
n:=n div 10; {відкидаємо четверту, залишаються перша, друга і третя}
b:= n mod 10; { третя цифра}
n:=n div 10; { відкидаємо знову останню (третю)}
c:= n mod 10; {маємо другу цифру}
у:= n div 10; {а ось і перша!}
z:= (a=у) and (b=c) ; {чи симетрично число? }
writeln( ‘Чи є число ‘, m, ‘симетричним?-‘, z); {відповідь - true або false }
end.
Задача 4. Умова задачі. Обчислити площу даного трикутника по формулі Герона. (вважаємо, що трикутник існує)
Ідея розв’язування.
Алгоритм розв’язування:
S =
Програма, що розв’язує дану задачу, має вигляд:
program Task4;
{$APPTYPE CONSOLE}
uses SysUtils;
var a, b, c, p, s : real;
begin
write(‘ Введіть першу сторону трикутника а=’); readln(a);
write(‘Введіть другу сторону трикутника b=’);
readln(b);
write(‘Введіть третю сторону трикутника c=’); readln(c);
p:= (a+b+c)/2;
s:=sqrt(p*(p-a)*(p-b)*(p-c));
writeln(‘площа трикутника дорівнює ’,s,’ кв.од.’);
end.
Задача 5. Умова задачі. Задана довжина окружності. Знайти площу кола, обмеженого цією окружністю.
Ідея розв’язування.
Алгоритм розв’язування:
Програма, що розв’язує дану задачу, має вигляд:
program Task5;
{$APPTYPE CONSOLE}
uses SysUtils;
const Pi=3.1415;
var c, r , s : real;
begin
write(‘Введіть довжину окружності c=’); readln(c);
r:= c/(2*Pi);
s:=Pi*r*r;
writeln(‘ площа круга дорівнює ’,s,’ кв.од.’);
end.
Задача 6. Умова задачі. Поміняти місцями значення змінних Х і У, не використовуючи допоміжної змінної.
І спосіб.
Ідея розв’язування:
Візьмемо додаткову змінну Z. Спочатку перенесемо значення з першої змінної в додаткову(Z:=X), тепер сміливо можемо перенести значення другої змінної у першу(X:=Y) та останній крок Y:=Z.
Програма, що розв’язує дану задачу, має вигляд:
program Task6_1;
{$APPTYPE CONSOLE}
uses SysUtils;
var x,y,z:real;
begin
write(‘Введіть два числа’); readln(x,y);
z:=x;
x:=y;
y:=z;
writeln(‘x=’,x,’ y=’,y);
end.
ІІ спосіб.
Ідея розв’язування:
Якщо присвоїти одній із змінних їх суму, тоді почергове віднімання допоможе нам обійтися без допоміжної змінної.
Алгоритм розв’язування:
Програма, що розв’язує дану задачу, має вигляд:
program Task6_2;
{$APPTYPE CONSOLE}
uses SysUtils;
var x,y : real;
begin
write(‘Введіть два числа’); readln(x,y);
writeln(‘x=’,x,’ y=’,y);
x:= x+y;
y:=x-y;
x:=x-y;
writeln(‘x=’,x,’ y=’,y);
end.
Дослідити :
ІІІ спосіб. Для розв’язування цієї задачі нам допоможе операція «виключне або» (XOR).
Алгоритм розв’язування:
Програма, що розв’язує дану задачу, має вигляд:
program Task6_3;
{$APPTYPE CONSOLE}
uses SysUtils;
var x,y : real;
begin
write(‘Введіть два числа’); readln(x,y);
writeln(‘x=’,x,’ y=’,y);
x:= x xor y;
y:=x xor y;
x:=x xor y;
writeln(‘x=’,x,’ y=’,y);
end.
Задача 7. Умова задачі. Дано число N . Написати програму, яка виводить на екран по одному в рядок числа, що отримані в результаті «бітової арифметики»:
Ідея розв’язання. Для розв’язання даної задачі потрібно три цілочисельних змінних: змінна, що зберігає дане число Num, змінна для збереження маски Maska та змінна для збереження отриманого результату Res. Згідно умови задачі всі три змінні повинні бути двобайтного беззнакового цілого типу word (діапазон заданого числа не перевищує 65535).
Як було зазначено раніше, надання значення змінній можна зробити командою присвоєння або уведенням з вхідного потоку (клавіатури). Раціональніше це робити оператором уведення, оскільки це дасть можливість перевірити програму на різних вхідних даних без зміни тексту програми. А тому починається програма з уведення числа Num.
Три перших завдання виконуються з одним тим самим бітом (восьмим), а тому маска для усіх цих завдань буде однакова: з одиницею на дев’ятій позиції двійкового числа – . Це значення можна безпосередньо присвоїти змінній Maska, або отримати шляхом зсуву числа 1 на вісім розрядів вліво, тобто використати один з операторів присвоєння:
Maska:=256;
Maska:=1 shl 8;
Для виділення біта використовуємо операцію логічного множення на маску. Результат у випадку нульового біта буде нульовим, що не заперечує умові задачі. А ось при одиничному біті результат не буде дорівнювати числу «1», оскільки біт восьмий за рахунком. Щоб побачити на екрані число 1, потрібно зсунути результат на вісім розрядів вправо. Описані дії можна виконати двома операторами присвоєння:
Res:=Num and Maska;
Res:=Res shr 8;
Для встановлення восьмого біта в одиницю потрібно виконати операцію логічного додавання (or) з маскою, а для інвертування цього самого біта потрібно виконати операцію «виключне або» (xor) з маскою.
Res:=Num or Maska;
Res:=Num xor Maska;
Щоб вивести вісім останніх біт числа, потрібно змінити маску. Тепер вона повинна містити вісім останніх одиниць і вісім нулів по2переду. Щоб отримати таку маску, потрібно від попередньої маски відняти одиницю. Покажемо це на прикладі, для чого виконаємо віднімання числа 1 від маски в двійковому вигляді:
В десятковому еквіваленті це буде виглядати як 256-1=255.
Тепер виконаємо операцію логічного множення заданого числа з отриманою маскою. Оскільки перші вісім бітів маски дорівнюють «0», побітне логічне множення зробить у результаті ці біти нульовими. Останні вісім бітів маски дорівнюють «1» і логічне множення з ними залежить від бітів заданого числа, тобто ми отримаємо у результаті число, вісім останніх бітів якого будуть співпадати з бітами заданого числа. Потрібні оператори присвоєння наступні.
Maska:=Maska-1;
Res:=Num and Maska;
Кожен з отриманих результатів будемо виводити на екран по мірі їх обчислення.
Програма, що виконує поставлену задачу, виглядатиме так:
program Task7;
{$APPTYPE CONSOLE}
uses SysUtils;
var Num, Maska, Res : word;
begin
{Уведення числа з відповідним повідомленням на екрані}
write('Enter number (<65536) ');
readln(Num);
Maska:=256; {Формування маски}
Res:=Num and Maska; {Виділення біта}
Res:=Res shr 8; {Зсув біта вправо}
writeln('Answer'); {Виведення слова Answer на екран}
writeln(Res); {Виведення першого результату}
Res:=Num or Maska; {Встановлення біта в одиницю}
writeln(Res); {Виведення другого результату}
Res:=Num xor Maska; {Інвертування біта}
writeln(Res); {Виведення третього результату}
Maska:=Maska-1; {Формування нової маски}
Res:=Num and Maska; {Виділення в числі останніх бітів}
writeln(Res); {Виведення останнього результату}
readln; {Затримка зображення на екрані}
end.