Вчимося розв’язувати задачі. Лінійні програми

Про матеріал

Цей матеріал стане в нагоді на уроках інформатики при вивченні мови програмування та при підготовці учнів до олімпіади з інформатики. Це перший документ з низки "Вчимося розв'язувати задачі", який стане в нагоді вчителю та учням.

Перегляд файлу

Вчимося розв’язувати задачі

Задача 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. Умова задачі.  Визначити, чи є серед цифр заданого тризначного числа однакові цифри.

Ідея розв’язування.

  1. виділити кожну цифру тризначного числа;
  2. логічній змінній дати можливість перевірити чи будуть в цьому числі однакові цифри.

Алгоритм розв’язування:

  1. вводимо тризначне число ;
  2. виділимо першу цифру, як результат цілочисельного ділення на 100;
  3. виділимо останню цифру, як залишок від ділення на 10;
  4. відкидаємо останню цифру за допомогою цілочисельного ділення на 10, маємо двозначне число, що складається з першої і другої цифри даного числа;
  5. виділимо з цього числа останню цифру, як залишок  від ділення на 10;
  6. тепер ми маємо три цифри; будуємо логічний вираз перевірки на існування однакових цифр;
  7. виводимо  значення  логічної змінної.

Програма, що розв’язує дану задачу, має вигляд:

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. Умова задачі. Визначити, чи є дане чотиризначне число паліндромом (симетричним).

     Ідея розв’язування:

  1. виділити кожну цифру числа;
  2. присвоїти логічній змінній вираз, який перевіряє чи буде число симетричним.

Алгоритм розв’язування:

  1. вводимо чотиризначне число ;
  2. виділимо останню цифру, як залишок від ділення на 10;
  3. відкидаємо останню цифру за допомогою цілочисельного ділення на  10. Маємо тризначне число, яке складається з першої, другої і третьої  цифри даного числа;
  4. виділимо з цього числа останню цифру як залишок від ділення на 10;
  5. відкидаємо останню цифру за допомогою цілочисельного ділення на  10. Вже маємо двозначне число, яке складається з першої та другої  цифри даного числа;
  6. виділимо з нього останню цифру  як залишок від ділення на 10;
  7. відкидаємо останню цифру, залишається тільки перша цифра;
  8. ми маємо чотири цифри, складемо логічний вираз перевірки на існування однакових цифр;
  9. виводимо значення  логічної змінної.

Програма, що розв’язує дану задачу, має вигляд:

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. Умова задачі. Обчислити площу даного трикутника по формулі Герона. (вважаємо, що трикутник існує)

     Ідея розв’язування.

  1. Ввести значення трьох сторін трикутника;
  2. Обчислити полупериметр трикутника;
  3. Обчислити площу трикутника.

Алгоритм розв’язування:

  1. вводимо три числа, відповідні сторонам трикутника ;
  2. обчислюємо полупериметр по формулі р=(a+b+c)/2;
  3. обчислюємо площу трикутника по формулі Герона

    S =

  1. виводимо результат на екран.

Програма, що розв’язує дану задачу, має вигляд:

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. Умова задачі. Задана довжина окружності. Знайти площу кола, обмеженого цією окружністю.

Ідея розв’язування.

  1. Обчислити радіус окружності, знаючи її довжину;
  2. Обчислити площу круга.

Алгоритм розв’язування:

  1. вводимо число, відповідне  довжині окружності ;
  2. обчислюємо  радіус по формулі r=c/(2*);
  3. обчислюємо площу  по формулі    S = R2;
  4. виводимо результат на екран.

Програма, що розв’язує дану задачу, має вигляд:

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.

ІІ спосіб.   

 Ідея розв’язування:

Якщо присвоїти одній із змінних їх суму, тоді почергове віднімання допоможе нам обійтися без допоміжної змінної.

     Алгоритм розв’язування:

  1. присвоюємо змінній Х суму Х+У;
  2. присвоюємо змінній Y різницю Х-Y, тоді цій змінній вже буде належати значення яке дорівнює первісному значенню Х;
  3. присвоюємо змінній Х різницю Х(це ще сума) і Y(яке вже дорівнює Х), тоді результат буде дорівнювати первісному  значенню змінної У.

Програма, що розв’язує дану задачу, має вигляд:

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).

Алгоритм розв’язування:

  1. ввести Х та Y (наприклад, двійковий код Х дорівнює 1101, а У – 1010);
  2. присвоюємо змінній Х  вираз Х xor Y (після виконання операції XOR значення Х буде мати вигляд 0111);
  3. присвоюємо змінній Y вираз  Х xor Y, тоді Y буде мати значення 1101(0111 xor 1010=1101), а це початкове значення Х;
  4. присвоюємо змінній Х знов X xor Y (0111 xor 1101=1010), а це початкове значення Y.

Програма, що розв’язує дану задачу, має вигляд:

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 . Написати програму, яка виводить на екран по одному в рядок числа, що отримані в результаті «бітової арифметики»:

  • виводить на екран значення «0» або «1» в залежності від значення восьмого біта числа;
  • виводить на екран число, яке отримується із заданого шляхом встановлення його восьмого біта в одиницю;
  • виводить на екран число, яке отримується із заданого шляхом інвертування його восьмого біта;
  • виводить на екран число, яке містить вісім останніх біт числа.

Ідея розв’язання. Для розв’язання даної задачі потрібно три цілочисельних змінних: змінна, що зберігає дане число 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.

 

Середня оцінка розробки
Структурованість
5.0
Оригінальність викладу
5.0
Відповідність темі
5.0
Загальна:
5.0
Всього відгуків: 2
Оцінки та відгуки
  1. Шпітко Вікторія Володимирівна
    Загальна:
    5.0
    Структурованість
    5.0
    Оригінальність викладу
    5.0
    Відповідність темі
    5.0
  2. Табанець Ірина Валеріївна
    Загальна:
    5.0
    Структурованість
    5.0
    Оригінальність викладу
    5.0
    Відповідність темі
    5.0
doc
Додано
7 лютого 2018
Переглядів
2242
Оцінка розробки
5.0 (2 відгука)
Безкоштовний сертифікат
про публікацію авторської розробки
Щоб отримати, додайте розробку

Додати розробку