Сторінка 1

Показ дописів із міткою Python. Показати всі дописи
Показ дописів із міткою Python. Показати всі дописи

субота, 17 березня 2018 р.

Складання і виконання алгоритму пошуку значень у таблиці

Увага! Під час роботи з комп'ютером дотримуйтеся правил безпеки і санітарно-гігієнічних норм.
Види навчальної діяльності
Виконуємо самостійно
  • Завдання 1. У магазині утворилася черга з 5-ти покупців. Час обслуговування кожного покупця в черзі подано в таблиці.
    Таблиця часу обслуговування покупця в черзі
    У вибраному середовищі програмування створіть проект Черга, у якому можна отримати: а) номер покупця, якого обслуговували найкоротший час; б) час найтривалішого обслуговування у черзі; в) лінійну таблицю або список із сумарним часом очікування свого обслуговування кожним покупцем. 
  • Створення проекту з використанням мови Object Pascal
  1. Відкрийте середовище Lazarus, створіть новий проект, розмістіть на екранній формі об'єкти, як показано на скріншоті, надайте значення їхнім властивостям самостійно.
    Проект Черга
  2. Опишіть глобальний масив duration_of_service[1..5], який зберігатиме значення часу обслуговування для кожного покупця.
  3. var
      Form1: TForm1;
      duration_of_service: array[1..5] of integer = (140, 215, 75, 130, 85);
    implementation
  4. Створіть процедуру опрацювання події OnCreate для форми. Проаналізуйте програмний код і використайте його у процедурі. 
  5. procedure TForm1.FormCreate(Sender: TObject);
    var i: Integer;
    begin
       StringGrid1.Cells[0,0] := 'Покупці';
       StringGrid1.Cells[0,1] := 'Тривалість, с';
       StringGrid2.Cells[0,0] := 'Покупці';
       StringGrid2.Cells[0,1] := 'Тривалість, с';
       For i := 1 to 5 do
           begin
                StringGrid1.Cells[i,0] := IntToStr(i) + ' покупець';
                StringGrid2.Cells[i,0] := IntToStr(i) + ' покупець';
                // виведення елементів масиву у таблицю
                StringGrid1.Cells[i,1] := IntToStr(duration_of_service[i]);
           end;
    end;
  6. Створіть процедуру опрацювання події OnClick для кнопки Визначити. 
  7. procedure TForm1.Button1Click(Sender: TObject);
    var i, nmin, tmax, min, s: integer;
    begin
       // пошук номера найменшого
       nmin := 1;
       min := duration_of_service[1];
       for i := 2 to 5 do
           if duration_of_service[i] < min then
               begin
                    nmin := i;
                    min := duration_of_service[i];
               end;
       Edit1.Text := IntToStr(nmin);
    
       // пошук найбільшого елемента
       tmax := duration_of_service[1];
       for i := 2 to 5 do
           if duration_of_service[i] > tmax then tmax := duration_of_service[i];
       Edit2.Text := IntToStr(tmax);
    
       // створення та виведення нової таблиці із часом очікування
       s := 0;
       for i := 1 to 5 do
           begin
                s := s + duration_of_service[i];
                StringGrid2.Cells[i,1] := IntToStr(s);
           end;
       StringGrid2.Visible := True;
    end;
  8. Виконайте проект і проаналізуйте результати. Якщо є помилки, виправте їх і збережіть зміни.
    Проект Черга
    Зверніть увагу, для компонента StringGrid2 змінюється значення його властивості Visible, що дозволяє приховувати компонент після створення форми і показувати його на формі після натискання кнопки Визначити.
  • Створення проекту з використанням мови Python
  1. Відкрийте середовище програмування мовою Python, створіть новий файл і збережіть його під іменем Обслуговування черги.
  2. У вікні редактора коду запишіть команди для реалізації проекту. Проаналізуйте кожен рядок програмного коду.
  3. # список із значеннями часу обслуговування 5-ти покупців
    service_time = [140, 215, 75, 130, 85]
    # номер покупця, якого обслуговували найшвидше
    min_n = service_time.index(min(service_time))
    # максимальне значення списку - час найтривалішого обслуговування у черзі
    max_element = max(service_time)
    # новий список - міститиме значення часу очікування у черзі для кожного покупця
    waiting_time = []
    # t - час очікування
    t = 0
    
    print('Час обслуговування: ')
    for i in range(len(service_time)):
        print('{0}-й покупець: {1} сек.'.format(i + 1, service_time[i]))
        t += service_time[i]
        waiting_time.append(t)
        
    print('\nНомер покупця, якого обслуговували найшвидше:', min_n + 1)
    print('\nЧас найтривалішого обслуговування у черзі:', max_element, 'ceк.')
    
    print('\nТривалість очікування: ')
    for i in range(len(waiting_time)):
        print('{0}-й покупець: {1} сек.'.format(i + 1, waiting_time[i]))
  4. Запустіть проект на виконання. Якщо є помилки - виправте їх. Збережіть зміни.
  • Завдання 2. Створіть проект Табель, у якому реалізовано електронний табель. У проекті передбачте, що в лінійній таблиці задають назви предметів, які вивчає учень. Елементи управління екранної форми передбачають можливість: а) за номером предмета дізнатись оцінку з відповідного предмета; б) отримати дані про максимальну оцінку з предметів, що вивчаються; в) отримати кількість предметів, які мають найвищу та найнижчу оцінки; г) середній бал успішності.
  • Створення проекту з використанням мови Object Pascal
  1. Відкрийте середовище Lazarus і створіть новий проект, розмістіть на екранній формі об'єкти, як на скріншоті, самостійно надайте значення їхнім властивостям.
    Проект Табель
  2. Створіть процедуру опрацювання події OnClick для кнопки Обчислити. Використовуючи поданий програмний код, проаналізуйте і застосуйте його. 
  3. procedure TForm1.Button1Click(Sender: TObject);
    var   i, n, oz, max, kmax, kmin, min: integer;
          s: real;
          a: array[1..7] of  integer;
    begin
       // введення елементів масиву
       for i := 1 to 7 do
           a[i] := StrToInt(StringGrid1.cells[i,1]);
    
       // виведення елемента масиву за номером
       n := StrToInt(Edit1.Text);
       oz := a[n];
       Edit2.Text := IntToStr(oz);
    
       // знаходження найбільшого та найменшого елемента масиву, суми  елементів
       max := a[1];
       min := a[1];
       s := a[1];
       for i := 2 to 7 do
           begin
                s := s + a[i];
                if a[i] < min then min := a[i];
                if a[i] > max then max := a[i];
           end;
       // виведення найбільшого та середнього значення елеменів масиву
       s := s / 7;
       Edit3.Text := IntTostr(max);
       Edit6.Text := FloatToStr(s);
    
       // знаходження кількості найбільших та найменших елементів масиву
       kmin := 0;
       kmax := 0;
       for i := 1 to 7 do
           begin
                if a[i] = max then kmax := kmax + 1;
                if a[i] = min then kmin := kmin + 1;
           end;
       Edit4.Text := IntToStr(kmin);
       Edit5.Text := IntToStr(kmax);
    end;
  4. Запустіть проект на виконання і проаналізуйте результати виконання. 
    Проект Табель
    У разі появи помилок, виправте їх і збережіть зміни.
  • Завдання 3. Створіть проект Шаховий турнір за поданою таблицею результатів шкільного шахового турніру, у якому брало участь 5 команд. Визначте команду-переможницю і призерів турніру.
  • Створення проекту з використанням мови Object Pascal
  1. Відкрийте середовище Lazarus і створіть новий проект, розмістіть на екранній формі об'єкти, як на скріншоті, самостійно надайте значення їхнім властивостям.
    Проект Шаховий турнір
    Компонент StringGrid призначено для виведення турнірної таблиці (таблиця заповнюється через контекстне меню, пункт Змінити StringGrid...); компонент Memo  - для виведення масиву рейтингу; компонент ListBox - для виведення списку призерів.
  2. Опишіть глобальний масив Tur: array[1..5, 1..6] of Integer; для збереження турнірної таблиці.
  3. var
      Form1: TForm1;
      Tur: array[1..5, 1..6] of Integer;
    implementation
  4. У процедурі обробки події OnCreate для форми запишіть оператори для виведення заголовків рядків і стовпців таблиці StringGrid1. Заголовку шостого стовпця надайте значення Сума.
  5. procedure TForm1.FormCreate(Sender: TObject);
    var i, j: Integer;
    begin
      For i := 1 to 5 do StringGrid1.Cells[0, i] := IntToStr(i);
      For j := 1 to 5 do StringGrid1.Cells[j, 0] := IntToStr(j);
      StringGrid1.Cells[6, 0] := 'Сума';
    end;
  6. У процедурі обробки події OnClick для кнопки Занести бали до масиву запишіть програмний код, що реалізує читання значень із таблиці StringGrid1 і присвоєння цих значень елементам масиву Tur.
  7. procedure TForm1.Button1Click(Sender: TObject);
    var i, j: Integer;
    begin
      For i := 1 to 5 do
      For j := 1 to 5 do
      If Length(StringGrid1.Cells[j,i]) <> 0
         then Tur[i,j] := StrToInt(StringGrid1.Cells[j,i])
         else Tur[i,j] := 0;
    end;
  8. Обчисліть суму балів кожної команди-учасниці. Для цього в процедурі обробки події OnClick для кнопки Знайти суму балів команд запишіть оператори для заповнення шостого стовпця таблиці.
  9. procedure TForm1.Button2Click(Sender: TObject);
    var sum, i, j: Integer;
    begin
      For i := 1 to 5 do
          begin
            sum := 0;
            For j := 1 to 5 do Sum := sum + Tur[i,j];
            Tur[i,6] := sum;
            StringGrid1.Cells[6,i] := IntToStr(Tur[i,6]);
          end;
    end;
  10. Визначте рейтинг команд і розташуйте їхні номери за зменшенням суми балів. Найбільша сума балів, яку може отримати кожна команда в ході турніру, дорівнює 8 (чотири перемоги).
    Турнірна таблиця
    Тому для кнопки Визначити рейтинг процедура додавання до масиву Memo1.Lines[k] номерів команд за зменшенням суми балів може бути наступною:
  11. procedure TForm1.Button3Click(Sender: TObject);
    var i, N, k: Integer;
    begin
      k := 0;
      For N := 8 downto 0 do
          For i := 1 to 5 do
              If Tur[i, 6] = N Then
                 begin
                       Memo1.Lines[k] := IntToStr(i);
                       k := k + 1;
                 end;
    end;
  12. У процедурі обробки події OnClick для кнопки Визначити переможців запишіть програмний код для виведення трьох перших елементів масиву Memo1.Lines[k] як номерів команд-призерок турніру.
  13. procedure TForm1.Button4Click(Sender: TObject);
    begin
       ListBox1.Items.Add('І місце - ' + Memo1.Lines[0] + ' команда.');
       ListBox1.Items.Add('ІІ місце - ' + Memo1.Lines[1] + ' команда.');
       ListBox1.Items.Add('ІІІ місце - ' + Memo1.Lines[2] + ' команда.');
    end;
  14. Перевірте правильність роботи програми, заповнивши турнірну таблицю, як на зразку. Числа в таблиці означають: 2 - виграш, 1 - нічия, 0 - програш. 
    Проект Шаховий турнір
  15. Запустіть проект на виконання для різних варіантів заповнення турнірної таблиці.
  16. Збережіть проект. Зробіть висновок: як застосувати алгоритми пошуку значень у масиві до розв'язування задач.
Домашнє завдання
  • Опрацювати підручник: повторити §36-§39, с. 177-224 (Інформатика, 9 клас, автори: Бондаренко О. О., Ластовецький В. В., Пилипчук О. П., Шестопалов Є. А.)

неділя, 11 березня 2018 р.

Двовимірний масив даних

Увага! Під час роботи з комп'ютером дотримуйтеся правил безпеки і санітарно-гігієнічних норм.
Види навчальної діяльності
Обговорюємо
  1. Опишіть двовимірний масив цілих чисел із 5 рядків і 8 стовпців.
  2. Як запрограмувати введення значень елементів двовимірного масиву з клавіатури?
  3. Як заповнити двовимірний масив випадковими числами?
  4. Запишіть фрагмент програми, що дозволяє створити такі масиви:
    Масиви цілих чисел
Діємо разом
  • Вправа 1. Створіть проект, у якому знаходять суму додатних елементів заданої таблиці.
  • Створення проекту з використанням мови Object Pascal
  1. Відкрийте середовище Lazarus, створіть новий проект, розмістіть на екранній формі об'єкти, як показано на скріншоті.
    Проект Сума додатних елементів двовимірної таблиці
  2. Заповніть таблицю значеннями. Для цього в контекстному меню об'єкта StringGrid1 оберіть команду Змінити StringGrid1... і  у вікні редактора введіть потрібні значення.
  3. Створіть процедуру опрацювання події натиснення кнопки Розрахувати. У вікні редактора коду опишіть змінні, які будуть використовуватись у проекті: а - масив дійсних чисел, i (номер рядка) та j (номер стовпця) - номери (індекси) елемента двовимірного масиву, s - сума додатних елементів масиву.
  4. var i, j : integer;
        s : real;
        a : array[1..4, 1..4] of real;
  5. У вікні редактора коду запишіть команди для присвоювання значень елементам масиву із таблиці, їх опрацювання та виведення значення суми додатних елементів. 
  6. begin
         s := 0;
         for i := 1 to 4 do
            for j := 1 to 4 do
               begin
                 a[i,j] := StrToFloat(StringGrid1.Cells[i,j]);
                 if a[i,j] > 0 then s := s + a[i,j];
               end;
         Edit1.Text := FloatToStr(s);
    end;
  7. Виконайте проект і проаналізуйте результати. Якщо є помилки, виправте їх і збережіть зміни. Обчисліть суму додатних елементів самостійно і порівняйте з результатами роботи програми.
  • Створення проекту з використанням мови Python
  1. Відкрийте середовище програмування мовою Python, створіть новий файл і збережіть його під іменем Сума додатних елементів.
  2. У вікні редактора коду запишіть команди для реалізації поставленого завдання.
  3. # імпорт модуля генерування випадкових чисел
    import random
    # створюємо два порожніх списки для утворення вкладеного
    a = []
    b = []
    for i in range(4):
        for j in range(4):
            # додаємо згенеровані виипадковим чином елементи до списку a
            a.append(round(random.uniform(-10, 10), 1))
        # формуємо список а у списку b
        b.append(a[-4:])
    # вводимо змінну s для обчислення суми елементів, значення яких більші нуля
    s = 0
    for i in range(4):
        for j in range(4):
            if b[i][j] > 0:
                s += b[i][j] # знаходимо суми відібраних елементів
    # виводимо вкладений список
    print(b)
    # виводимо результат суми
    print(round(s, 1))
    
  4. Запустіть проект на виконання. Якщо є помилки - виправте їх. Обчисліть суму додатних елементів самостійно і порівняйте з результатами роботи програми.
  • Вправа 2. На 10 земельних ділянках проведено обстеження рівня pH ґрунту. Результати обстеження подано в таблиці. Створіть проект Ґрунти, у якому можна визначити кількість земельних ділянок з кислими (pH < 7), нейтральними (pH = 7) та лужними (pH > 7) ґрунтами.
  • Створення проекту з використанням мови Object Pascal
  1. Відкрийте середовище Lazarus і створіть новий проект, розмістіть на екранній формі об'єкти, як на скріншоті, самостійно надайте значення їхнім властивостям.
  2. Створіть процедуру опрацювання події натискання на кнопку Визначити. Проаналізуйте програмний код нижче і використайте його у процедурі. 
  3. procedure TForm1.Button1Click(Sender: TObject);
    var i, kk, kn, kl: integer;
        a: array[1..10] of integer;
    begin
       kk := 0;
       kn := 0;
       kl := 0;
       for i := 1 to 10 do
          begin
            a[i] := StrToInt(StringGrid1.Cells[i,1]);
            if a[i] < 7 then
               kk := kk + 1
            else if a[i] > 7 then
                     kl := kl + 1
                 else
                     kn := kn + 1
          end;
       Edit1.Text := IntToStr(kk);
       Edit2.Text := IntToStr(kn);
       Edit3.Text := IntToStr(kl);
    end;
  4. Запустіть проект на виконання і проаналізуйте результати виконання. У разі появи помилок, виправте їх і збережіть зміни.
    Виконуємо самостійно
    • Завдання 1. У ході вивчення теми 5 учнів отримали оцінки з 10 тестів. Створіть проект у середовищі Lazarus під назвою Тестові оцінки для визначення суми балів, набраної кожним учнем.
      Проект Тестові оцінки
      Проаналізуйте програмний код, наведений нижче і скористайтеся ним для реалізації проекту.
    • procedure TForm1.FormCreate(Sender: TObject);
      var i: integer;
      begin
         // заповнення заголовків стовпців і рядків двовимірної таблиці
         for i := 1 to 10 do
            StringGrid1.Cells[i,0] := 'Тест ' + IntToStr(i);
         for i := 1 to 5 do
            StringGrid1.Cells[0,i] := 'Учень ' + IntToStr(i);
      end;
      
      procedure TForm1.Button1Click(Sender: TObject);
      var i, j, k, sum: integer;
      begin
         // очищення поля з результатами
         ListBox1.Clear;
         // заповнення двовимірного масиву оцінками
         Randomize;
         for i := 1 to 10 do
             for j := 1 to 5 do
                StringGrid1.Cells[i,j] := IntToStr(random(12));
         // обчислення суми оцінок за тести по кожному учню і виведення результатів
         ListBox1.Items.Add('Сума балів за тести: ');
         k := 1;    // лічильник рядка таблиці
         sum := 0;  // початкове значення суми
         for j := 1 to 5 do
            begin
                 for i := 1 to 10 do
                    begin
                      sum := sum + StrToInt(StringGrid1.Cells[i,j]);
                    end;
                 ListBox1.Items.Add(StringGrid1.Cells[0,k] + ': ' + IntToStr(sum) + ' балів.');
                 k := k + 1;
            end;
      end;
    • Завдання 2. Магічний квадрат - квадратна таблиця (n = m), в якій суми чисел кожного рядка, стовпця і діагоналі є рівними. Створіть у середовищі Lazarus ігровий проект, в якому гравець (або програмно випадковим чином) має заповнити порожні клітинки квадрата 3х3 числами від 4 до 12 таким чином, щоб утворити магічний квадрат.
      Проект Магічний квадрат
      Проаналізуйте програмний код (зверніть увагу, поданий увесь код із файлу
      unit1.pas) і використайте його для реалізації проекту.
    • unit Unit1;
      
      {$mode objfpc}{$H+}
      
      interface
      
      uses
        Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
        Grids;
      
      type
      
        { TForm1 }
      
        TForm1 = class(TForm)
          Button1: TButton;
          Button2: TButton;
          Edit1: TEdit;
          Edit2: TEdit;
          Edit3: TEdit;
          Edit4: TEdit;
          Edit5: TEdit;
          Edit6: TEdit;
          Edit7: TEdit;
          Edit8: TEdit;
          Label1: TLabel;
          StringGrid1: TStringGrid;
          procedure Button1Click(Sender: TObject);
          procedure Button2Click(Sender: TObject);
          procedure FormCreate(Sender: TObject);
        private
          { private declarations }
        public
          { public declarations }
        end;
      
      var
        Form1: TForm1;
        mk: array[1..3, 1..3] of Integer; // числа магічного квадрата
        Numbers: array[1..9] of Integer; // масив чисел від 4 до 12
        edit_array: array[1..8] of TEdit;
      implementation
      
      {$R *.lfm}
      
      { TForm1 }
      
      procedure TForm1.FormCreate(Sender: TObject);
      begin
        edit_array[1] := Edit1;
        edit_array[2] := Edit2;
        edit_array[3] := Edit3;
        edit_array[4] := Edit4;
        edit_array[5] := Edit5;
        edit_array[6] := Edit6;
        edit_array[7] := Edit7;
        edit_array[8] := Edit8;
      end;
      
      // кнопка Нова гра
      procedure TForm1.Button1Click(Sender: TObject);
      var i, j, k, n: Integer;
      begin
        Randomize;
        For i := 1 to 3 do // заповнення масиву mk нулями
            For j := 1 to 3 do mk[i,j] := 0;
        For i := 0 to 2 do StringGrid1.Rows[i].Clear; // очищення таблиці
        For i := 1 to 9 do Numbers[i] := i + 3; // заповнення масиву Numbers
        k := 0;
        While k < 9 do
            begin // k — лічильник виведених до таблиці значень
        { задавання індексів клітинок для початкових значень }
                i := random(3) + 1;
                j := random(3) + 1;
                n := random(12) + 1; // випадковий вибір числа з масиву Numbers
                If (mk[i,j] = 0) and (Numbers[n] <> 0) Then
                   begin
                        { якщо клітинка mk[i,j] вільна і значення Numbers[n] ще не задіяне }
                        mk[i,j] := Numbers[n];
                        k := k + 1;
                        Numbers[n] := 0; // використаний елемент Numbers[n] обнуляється
                        StringGrid1.Cells[j-1,i-1] := IntToStr(mk[i,j]);
                   end;
            end;
      end;
      
      // кнопка Перевірити
      procedure TForm1.Button2Click(Sender: TObject);
      var i, j, sum_row, sum_col, sum_diag: Integer;
          prap: Boolean;
      begin
          // присвоєння масиву значень, якими заповнений квадрат
          For i := 1 to 3 do
              For j := 1 to 3 do mk[i,j] := StrToInt(StringGrid1.Cells[j-1,i-1]);
          // обчислення суми по рядках (сума має = 24)
          prap := True;
          For i := 1 to 3 do
              begin
                   sum_row := 0;
                   For j := 1 to 3 do
                      sum_row := sum_row + mk[i,j];
                   edit_array[i].Text := IntToStr(sum_row);
                   If sum_row <> 24 Then
                      prap := False;
              end;
      
          // обчислення суми по стовцях (сума має = 24)
          For j := 1 to 3 do
              begin
                   sum_col := 0;
                   For i := 1 to 3 do
                      sum_col := sum_col + mk[i,j];
                   edit_array[j+3].Text := IntToStr(sum_col);
                   If sum_col <> 24 Then
                      prap := False;
              end;
      
          // обчислення суми по діагоналі (зліва-направо, згори-вниз) (сума має = 24)
          sum_diag := 0;
          for i := 1 to 3 do
             sum_diag := sum_diag + StrToInt(StringGrid1.Cells[i-1,i-1]);
          edit_array[7].Text := IntToStr(sum_diag);
          if sum_diag <> 24 then prap := False;
      
          // обчислення суми по діагоналі (cправа-наліво, згори-вниз) (сума має = 24)
          sum_diag := 0;
          for i := 1 to 3 do
             sum_diag := sum_diag + StrToInt(StringGrid1.Cells[3-i,i-1]);
          edit_array[8].Text := IntToStr(sum_diag);
          if sum_diag <> 24 then prap := False;
      
          // виведення результату
          If prap = True Then Label1.Caption := 'Перемога!'
          else Label1.Caption := 'Спробуй ще!';
      end;
      end.
      Магічний квадрат
    Домашнє завдання
    • Опрацювати підручник: §38 с. 212-217 (Інформатика, 9 клас, автори: Бондаренко О. О., Ластовецький В. В., Пилипчук О. П., Шестопалов Є. А.)

    неділя, 4 березня 2018 р.

    Складання і виконання алгоритмів опрацювання табличних величин

    Увага! Під час роботи з комп'ютером дотримуйтеся правил безпеки і санітарно-гігієнічних норм.
    Види навчальної діяльності
    Обговорюємо
    1. У чому полягає особливість пошуку елемента лінійної таблиці, який відповідає заданій умові?
    2. З якою метою впорядковують дані в лінійній таблиці?
    3. Чим відрізняється алгоритм пошуку найменшого елемента лінійної таблиці від алгоритму пошуку найбільшого елемента?
    Виконуємо самостійно
    • Завдання 1. Створіть проект у середовищі Lazarus під назвою Кількість опадів. Згідно умови, дано таблицю кількості опадів протягом року за місяцями. Необхідно визначити: кількість опадів за рік; місяць, в якому кількість опадів була найменшою; місяць, в якому кількість опадів була найбільшою; місяці, в які кількість опадів була менша від 40 мм, та кількість таких місяців. Реалізуйте також обчислення середнього арифметичного значень кількості опадів за рік.
    1. Створіть новий проект. Розробіть інтерфейс програми згідно скріншотів.
    2. Опишіть масиви-константи для збереження назв місяців і кількостей опадів як глобальні.
    3. var
        Form1: TForm1;
      const month: array[1..12] of string = ('січень', 'лютий', 'березень', 'квітень', 'травень', 'червень', 'липень', 'серпень', 'вересень', 'жовтень', 'листопад', 'грудень');
            data: array[1..12] of integer = (54, 13, 30, 15, 40, 32, 10, 20, 46, 60, 56, 38);
      implementation
    4. У процедурі обробки події OnCreate для форми запрограмуйте виведення назв місяців до рядка заголовків стовпців, а значення елементів масиву кількостей опадів - до першого рядка таблиці.
    5. // заповнення таблиці даними про місяці і дані опадів
      procedure TForm1.FormCreate(Sender: TObject);
      var i: Integer;
      begin
         StringGrid1.Cells[0,0] := 'місяць';
         StringGrid1.Cells[0,1] := 'дані';
         For i := 1 to 12 do
             begin
                  StringGrid1.Cells[i,0] := month[i];
                  StringGrid1.Cells[i,1] := IntToStr(data[i]);
             end;
      end;
    6. Створіть процедуру обробки події OnClick для командної кнопки Кількість опадів за рік, мм, користуючись алгоритмом знаходження суми елементів масиву. Реалізуйте обчислення середнього арифметичного кількості опадів за рік.
    7. // Обчислення кількості опадів за рік - сума елементів масиву даних про опади
      procedure TForm1.Button1Click(Sender: TObject);
      var i, sum: Integer;
      begin
         sum := 0;
         For i := 1 to 12 do
             sum := sum + data[i];
         ListBox1.Items.Add('Кількість опадів за рік: ' + IntToStr(sum) + ' мм.');
         ListBox1.Items.Add('Середнє значення: ' + FormatFloat('0.##', sum/12) + ' мм.');
      end;
    8. Створіть процедуру обробки події OnClick для командної кнопки Найсухіший місяць, користуючись алгоритмом знаходження найменшого елемента масиву.
    9. // Найсухіший місяць - найменший елемент масиву (впорядкування за спаданням)
      procedure TForm1.Button2Click(Sender: TObject);
      var i, c: Integer;
          prap: boolean;
          m: string;
      begin
        Repeat
              prap := False;
       For i := 1 to 11 do
           If data[i] < data[i+1] Then
                     begin
            c := data[i];
                          data[i] := data[i+1];
                          data[i+1] := c;
      
      
                          m := month[i];
                          month[i] := month[i+1];
                          month[i+1] := m;
      
                          prap := True;
                     end;
        Until prap = False;
        ListBox1.Items.Add('Найсухіший місяць в році: ' + month[12] + '.');
      end;
    10. Створіть процедуру обробки події OnClick для командної кнопки Найвологіший місяць, користуючись алгоритмом знаходження найбільшого елемента масиву.
    11. // Найвологіший місяць - найбільший елемент масиву (впорядкування за спаданням)
      procedure TForm1.Button3Click(Sender: TObject);
      var i, c: Integer;
          prap: boolean;
          m: string;
      begin
           Repeat
              prap := False;
       For i := 1 to 11 do
           If data[i] < data[i+1] Then
                     begin
            c := data[i];
                          data[i] := data[i+1];
                          data[i+1] := c;
      
      
                          m := month[i];
                          month[i] := month[i+1];
                          month[i+1] := m;
      
                          prap := True;
                     end;
        Until prap = False;
        ListBox1.Items.Add('Найвологіший місяць в році: ' + month[1] + '.');
      end;
    12. Створіть процедуру обробки події OnClick для командної кнопки Місяці, в які кількість опадів менша від 40, користуючись алгоритмом визначення кількості елементів із заданою властивістю. Додайте до цієї процедури команди для обчислення k - кількості елементів масиву, що задовольняють вищезгаданій умові, і виведення значення цієї кількості.  
    13. // Місяці, в які кількість опадів менша від 40 та їх кількість
      procedure TForm1.Button4Click(Sender: TObject);
      var i, k: Integer;
      begin
        k := 0;
        ListBox1.Items.Add('Місяці, в які кількість опадів менша від 40:');
        For i := 1 to 12 do
             begin
                if StrToInt(StringGrid1.Cells[i,1]) < 40 then
                   begin
                        k := k + 1;
                        ListBox1.Items.Add(StringGrid1.Cells[i,0]);
                   end;
             end;
        ListBox1.Items.Add('Кількість місяців з опадами менше 40 мм: ' + IntToStr(k) + '.');
      end;
    14.  Реалізуйте обробку події OnClick при натисненні кнопки Очистити результати.
    15. // Очищення результатів виведення
      procedure TForm1.Button5Click(Sender: TObject);
      begin
        ListBox1.Clear;
      end;
    16. Перевірте роботу програми. Виправте помилки, якщо такі з'являться, збережіть зміни.
    17. Зробіть висновок: як застосовувати типові алгоритми опрацювання одновимірних масивів для розв'язування задач.
    • Завдання 2. Cтворіть проект Магазин одягу. Згідно умови, у магазині одягу є гнучка система зміни цін. Кожного тижня товар змінював свою ціну згідно таблиці.
      Створіть проект, у якому за введеною вартістю товару можна обчислити значення ціни товару протягом кожного тижня та вивести її на екран у вигляді таблиці (списку) значень. Зверніть увагу, щоб знайти результат збільшення ціни price на 1%, виконують дію price*1.01; щоб зменшити на 1%, виконують дію price*0.99.
    • Cтворення проекту з використанням мови Python
    1. Відкрийте середовище програмування мовою Python, створіть новий файл і збережіть його під іменем Магазин одягу.
    2. У вікні редактора коду введіть команди.
    3. price = float(input('Введіть вартість товару (у грн.): '))
      discount = [1.1, 1.05, 0.93, 0.90]
      up_down = 'підвищення'
      result = 0
      print('Зміна значень ціни товару протягом 4-ох тижнів: ')
      for i in range(len(discount)):
          if i == 0:
              result = price * discount[0]
          else:
              if discount[i] >= 1:
                  up_down = 'підвищення'
                  result = result * discount[i]
              else:
                  up_down = 'зниження'
                  result = result * discount[i]
          print('У {0} тиждень ціна товару становить {1:0.2f} грн. ({2} на {3}%)'.format(i + 1, result, up_down, round(abs(100 - discount[i] * 100))))
    4. Запустіть проект на виконання і проаналізуйте результат.
    5. Змініть код програми, наприклад, зменшіть/збільшіть % зміни цін на товари, додайте ще один тиждень зміни ціни тощо.
    • Cтворення проекту з використанням мови Object Pascal
    1. Створіть новий проект. Розмістіть на формі компоненти і налаштуйте їхні властивості згідно із скріншотом.
    2. Таблицю з початковими даними заповніть за допомогою пункту Змінити StringGrid... контекстного меню компонента.
    3. Проаналізуйте програмний код, поданий нижче, і реалізуйте проект.
    4. procedure TForm1.Button1Click(Sender: TObject);
      var i: integer;
          s: real;
          a: array[1..4, 1..2] of real;
      begin
           s := StrToFloat(Edit1.Text);
           a[1,2] := s * StrToFloat(StringGrid1.Cells[1,1]);
           StringGrid1.Cells[1,2] := FloatToStr(a[1,2]);
           for i := 2 to 4 do
               begin
                 a[i,2] := a[i-1,2] * StrToFloat(StringGrid1.Cells[i,1]);
                 StringGrid1.Cells[i,2] := FloatToStr(a[i,2]);
               end;
      end;
    5. Перевірте роботу програми. Виправте помилки, якщо такі з'являться, збережіть зміни.
    Домашнє завдання
    • Опрацювати підручник: §32-§36 с. 179-202 (Інформатика, 9 клас, автори: Бондаренко О. О., Ластовецький В. В., Пилипчук О. П., Шестопалов Є. А.)

    Алгоритми впорядкування елементів масиву

    Увага! Під час роботи з комп'ютером дотримуйтеся правил безпеки і санітарно-гігієнічних норм.
    Види навчальної діяльності
    Обговорюємо
    1. У чому полягає сутність сортування масиву методом вибору максимального елемента?
    2. У чому полягає сутність методу сортування масиву методом бульбашки?
    3. На якому місці у масиві може міститися його найбільший/найменший елементи, якщо масив впорядковано за зростанням; за спаданням; масив невпорядкований?
    Діємо разом
    • Вправа 1. Створіть проект, у якому знаходять різницю між найбільшим і найменшим елементом лінійної таблиці з 10 дійсних чисел, які набувають значень від 5 до 10 випадково.
    • Створення проекту з використанням мови Object Pascal
    1. Відкрийте середовище Lazarus, створіть новий проект, розмістіть на екранній формі об'єкти, як показано на скріншоті
      Різниця між найбільшим і найменшим
    2. Створіть процедуру опрацювання події натиснення кнопки Знайти. У вікні редактора коду опишіть змінні, які будуть використовуватись у проекті: а - масив дійсних чисел, i - номер (індекс) елемента масиву, max - найбільше значення серед елементів, min - найменше значення серед елементів.
    3. var i: integer;
          max, min: real;
          a: array [1..10] of real;
    4. У вікні редактора коду запишіть команди для випадкового генерування елементів масиву та виведення їх у таблицю, пошуку найбільшого й найменшого елементів масиву, виведення різниці значень max і min. Зверніть увагу на вираз, який використовується для отримання випадкового дійсного числа. 
    5. begin
         // заповнення таблиці
         Randomize;
         StringGrid1.Cells[0,1] := 'a';
         for i := 1 to 10 do
             begin
               a[i] := 10.0 - random * 5.0;
               StringGrid1.Cells[i,0] := IntToStr(i);
               StringGrid1.Cells[i,1] := FloatToStrF(a[i], ffFixed, 3, 2);
             end;
         // пошук максимального і мінімального значень та обчислення їх різниці
         max := a[1];
         min := a[1];
         for i := 2 to 10 do
             begin
               if a[i] > max then max := a[i];
               if a[i] < min then min := a[i];
             end;
         Edit1.Text := FloatToStrF(max, ffFixed, 2, 2);
         Edit2.Text := FloatToStrF(min, ffFixed, 2, 2);
         Edit3.Text := FloatToStrF(max-min, ffFixed, 2, 2);
      end;
    6. Виконайте проект і проаналізуйте результати. Якщо є помилки, виправте їх і збережіть зміни. Знайдіть на екранній формі найбільше та найменше значення елементів згенерованої таблиці. Обчисліть їх різницю самостійно і порівняйте з результатами роботи програми.
    • Створення проекту з використанням мови Python
    1. Відкрийте середовище програмування мовою Python, створіть новий файл і збережіть його під іменем Випробування.
    2. У вікні редактора коду запишіть команди випадкового генерування елементів масиву (списку) та виведення елементів списку у вікні виконання проекту, пошуку найбільшого й найменшого елементів списку, виведення різниці значень max і min. Зверніть увагу на вираз для генерування випадкових дійсних чисел мовою Python.
    3. import random
      a = []
      for i in range(10):
          a.append(round((10.0 - random.random() * 5.0), 2))
      print('Вхідний масив випадкових дійсних чисел: ', a)
      a.sort()
      print('Відсортований масив за зростанням: ',a)
      print('max = {0}; min = {1}'.format(a[-1], a[0]))
      print('Різниця max-min: ', round(a[-1] - a[0], 2))
    4. Запустіть проект на виконання. Якщо є помилки - виправте їх. Обчисліть різницю найбільшого і найменшого значень самостійно і порівняйте її з результатом роботи програми.
    • Вправа 2. Створіть проект, у якому елементи лінійної таблиці з 10 цілих чисел впорядковуються за зростанням.
    • Створення проекту з використанням мови Object Pascal
    1. Відкрийте середовище Lazarus і створіть новий проект, розмістіть на екранній формі об'єкти, як на скріншоті, самостійно надайте значення їхнім властивостям.
      Упорядкування
    2. Створіть процедуру опрацювання події Упорядкувати. У вікні редактора коду опишіть змінні, які будуть використовуватись у проекті: а - масив цілих чисел, і - номер ітерації пошуку мінімального елемента масиву, j - номер елемента масиву, min - найменше значення елемента, nmin - номер найменшого елемента. 
    3. var a: array[1..10] of integer;
          i, j, min, nmin: Integer;
    4. У вікні редактора коду запишіть команди введення елементів масиву в багаторядкове текстове поле, впорядкування елементів та їх виведення в багаторядкове текстове поле. 
    5. begin
          for i := 1 to 10 do
              a[i] := StrToInt(Memo1.Lines[i-1]);
          j := 0;
          for i := 1 to 10 do
              begin
                min := a[i];
                nmin := i;
                for j := i to 10 do
                    if a[j] < min then
                       begin
                         min := a[j];
                         nmin := j;
                       end;
                a[nmin] := a[i];
                a[i] := min;
              end;
          for i := 1 to 10 do
              Memo2.Lines[i-1] := IntToStr(a[i]);
      end;
    6. Запустіть проект на виконання і проаналізуйте результати виконання. У разі появи помилок, виправте їх і збережіть зміни.
    • Створення проекту з використанням мови Python
    1. Відкрийте середовище програмування мовою Python, створіть новий файл і збережіть його під іменем Упорядкування.
    2. Реалізуйте проект, додавши в нього можливість сортувати і за спаданням. Скористайтеся поданим програмним кодом. 
    3. a = []
      for i in range(10):
          a.append(int(input('Введіть елемент масиву: ')))
      print('Вхідний список: ', a)
      a.sort()
      print('Впорядкований список за зростанням: ', a)
      a.sort(reverse = True)
      print('Впорядкований список за спаданням: ', a)
    4. Зверніть увагу на методи сортування масивів (списків) мовою Python. Проаналізуйте результати роботи програми.
    • Вправа 3. Створіть проект Прогноз погоди, у якому за поданою таблицею (списком) температури протягом тижня знаходять найбільший і найменший показники температури.
    • Створення проекту з використанням мови Python
    1. Відкрийте середовище програмування мовою Python, створіть новий файл і збережіть його під іменем Прогноз погоди.
    2. У вікні редактора коду запишіть команди випадкового генерування елементів масиву (списку) та виведення елементів списку у вікні виконання проекту, пошуку найбільшого й найменшого елементів списку.
    3. import random
      a = []
      for i in range(10):
          a.append(round(random.randint(-100, 100) * 0.5, 2))
      print('Вхідний масив значень температури протягом тижня: ', a)
      a.sort()
      print('Відсортований масив значень температури протягом тижня (за зростанням): ',a)
      print('max = {0} градусів\nmin = {1} градусів'.format(a[-1], a[0]))
    4. Запустіть проект на виконання і перевірте, чи відповідають умові завдання отримані результати. Якщо є помилки, виправте їх, збережіть зміни.
    Виконуємо самостійно
    • Завдання 1. Створіть проект у середовищі Lazarus під назвою Фігурне катання, у якому визначається загальна оцінка якості виконання елемента. У фігурному катанні загальна оцінка якості виконання елемента обчислюється за такими правилами: відкидаються найвища і найнижча оцінки, а з решти обчислюється середнє арифметичне.
      Проаналізуйте програмний код, наведений нижче і скористайтеся ним для реалізації проекту.
    • procedure TForm1.FormCreate(Sender: TObject);
      var i: Integer;
      begin
         For i := 1 to 10 do StringGrid1.Cells[i-1, 0] := 'Суддя ' + IntToStr(i);
      end;
      
      procedure TForm1.Button1Click(Sender: TObject);
      var a: array[1..10] of Real;
          i: Integer;
          c, s: real;
          prap: boolean;
      begin
        ListBox1.Clear;
        // заповнення масиву і відображення у таблиці
        Randomize;
        For i := 1 to 10 do
            begin
              a[i] := Random(20)*0.5;
       StringGrid1.Cells[i-1, 1] := FloatToStr(a[i]);
            end;
        // впорядкування масиву за спаданням
        Repeat
              prap := False;
       For i := 1 to 9 do
           If a[i] < a[i+1] Then
                     begin
            c := a[i];
                          a[i] := a[i+1];
                          a[i+1] := c;
            prap := True
                     end;
              For i := 1 to 10 do
           StringGrid1.Cells[i-1, 2] := FloatToStr(a[i]);
        Until prap = False;
        ListBox1.Items.Add('Найбільша оцінка: ' + FormatFloat('0.##', a[1]) + ' балів.');
        ListBox1.Items.Add('Найменша оцінка: ' + FormatFloat('0.##', a[10]) + ' балів.');
        For i := 2 to 9 do
           s := s + a[i];
        ListBox1.Items.Add('Середнє арифметичне: ' + FormatFloat('0.##', s/8) + ' балів.');
      end;
    • Завдання 2. Створіть у середовищі Lazarus проект під назвою Результати забігу, у якому дано список результатів забігу на 100 метрів восьми спортсменів. Необхідно визначити три кращі результати і вивести разом з іменами спортсменів.
      Проаналізуйте програмний код і використайте його для реалізації проекту.
    • procedure TForm1.Button1Click(Sender: TObject);
      var athletes_results: array[1..8] of Real;
          athletes_name: array[1..8] of String;
          i: Integer;
          c: Real;
          n: String;
          Prap: Boolean;
      begin
        // очищення таблиці результатів
        For i := 1 to 8 do StringGrid1.Cols[i-1].Clear;
        // заповнення таблиці випадковими значеннями результатів забігу спортсменів
        Randomize;
        For i := 1 to 8 do
          begin
             athletes_results[i] := (Random(100-20) + 100)/10.5; { нумерація елементів масиву з одиниці, а стовпців таблиці StringGrid1 — з нуля, тому і-й елемент масиву А виводиться в (і-1)-й стовпець таблиці}
             athletes_name[i] := IntToStr(i) + ' спортсмен';
             StringGrid1.Cells[i-1,0] := athletes_name[i];
             StringGrid1.Cells[i-1,1] := FormatFloat('0.###', athletes_results[i]);
          end;
         // сортування вибором максимального елемента
         n := '';
         Repeat
              Prap := False;
       For i := 1 to 7 do
           If athletes_results[i] < athletes_results[i+1] Then
                     begin
                          // поміняти у масиві athletes_results[1..8] місцями сусідні результати спортсменів
                          c := athletes_results[i];
                          athletes_results[i] := athletes_results[i+1];
                          athletes_results[i+1] := c;
                          // поміняти у масиві athletes_name[1..8] місцями сусідні імена спортсменів відповідно до зміни результатів
                          n := athletes_name[i];
                          athletes_name[i] := athletes_name[i+1];
                          athletes_name[i+1] := n;
      
                          Prap := True
                     end;
         Until Prap = False;
         // виведення результатів, не враховуються однакові результати
         ListBox1.Clear;
         ListBox1.Items.Add('Результати змагань:');
         For i := 1 to 3 do
             ListBox1.Items.Add(IntToStr(i) + ' місце: ' + FormatFloat('0.###', athletes_results[9-i]) + ' секунд, ' + athletes_name[9-i]);
      end;
    • Завдання 3. Використовуючи мову програмування Python створіть проект гри Відгадай число. Користувач вводить число, яке, на його думку, може міститися в лінійній таблиці з 10 цілих чисел, що генеруються випадково від 1 до деякого випадкового цілого числа. Якщо таке число відгадане, то гра припиняється й виводиться повідомлення про перемогу; якщо після 5 спроб число не вгадують, то гра припиняється з повідомленням про невдалі спроби. У грі можуть бути підказки, які спрямовуватимуть користувача на правильний вибір значення.
    1. Відкрийте середовище програмування мовою Python, створіть новий файл і збережіть його під іменем Відгадай число.
    2. У вікні редактора коду введіть команди.
    3. import random
      a = []
      for i in range(10):
          a.append(random.randint(1, 20))
      number = random.choice(a)
      guessesTaken = 0
      myName = input('Привіт! Як тебе звати? ')
      print('Отже, ' + myName + ', я задумав число від 1 до 20.')
      while guessesTaken < 6:
          guess = int(input('Спробуй відгадати. '))
          guessesTaken += 1
          if guess < number:
              print('Твоє число менше від задуманого.')
          elif guess > number:
              print('Твоє число більше за задумане.')
          else:
              break
      if guess == number:
          print('Дуже добре, ' + myName + '! Для відгадування тобі знадобилося ' + str(guessesTaken) + ' разів!')
      else:
          print('Ні. Число, яке я задумав: ' + str(number))
    4. Запустіть проект на виконання і проаналізуйте результат.
    5. Змініть правила гри, наприклад, зменшіть/збільшіть кількість спроб для вгадування задуманого числа. Реалізуйте ситуацію, коли число можна вгадати з першої спроби.
    • Завдання 4. Створіть проект у середовищі Lazarus, у якому дано одновимірний масив із 6 елементів і визначається, чи є масив упорядкованим за зростанням або спаданням. Якщо масив не впорядковано, вивести відповідь: "Невпорядкована послідовність". Блок-схему алгоритму розв'язування завдання показано на малюнку.
    1. Створіть новий проект. Розмістіть на формі компоненти і налаштуйте їхні властивості згідно із скріншотами. 
    2. У процедурі обробки події OnCreate для форми запрограмуйте виведення індексів елементів масиву до зафіксованого рядка заголовків стовпців.
    3. procedure TForm1.FormCreate(Sender: TObject);
      var i: Integer;
      begin
         For i := 1 to 6 do StringGrid1.Cells[i-1, 0] := IntToStr(i);
      end;
    4. Опишіть масив А: array[1..6] of Integer; як глобальний.
    5. var
        Form1: TForm1;
        A: array[1..6] of Integer;
      
      implementation
    6. Створіть процедуру обробки події для кнопки Ввести значення і запрограмуйте введення елементів масиву з клавіатури в ході виконання програми.
    7. procedure TForm1.Button1Click(Sender: TObject);
      var i: Integer;
      begin
         For i := 1 to 6 do
             begin
                  A[i] := StrToInt(InputBox('Уведіть значення елемента ','A[' + IntToStr(i) + ']:', '0'));
                  StringGrid1.Cells[i-1, 1] := IntToStr(A[i]);
             end;
      end;
    8. Створіть процедуру обробки події для кнопки Чи упорядкований масив? Додайте до оператора if, який перевіряє стан прапорцевої змінної prap, гілку else для перевірки послідовності на спадання.  
    9. procedure TForm1.Button2Click(Sender: TObject);
      var i: Integer;
          Prap, Prap2: Boolean;
      begin
          Prap := True;
          For i := 2 to 6 do
              If A[i] <= A[i-1] Then Prap := False;
          If Prap then
            Label1.Caption := 'За зростанням'
          else
              begin
                Prap2 := True;
                For i := 2 to 6 do
                    If A[i] >= A[i-1] Then Prap2 := False;
                if Prap2 then
                   Label1.Caption := 'За спаданням'
                else
                   Label1.Caption := 'Неупорядкована послідовність';
              end;
      end;
    10. Алгоритм розв'язування завдання наступний: перебрати усі елементи з другого до останнього. Якщо поточний елемент менший за попередній, то прапорцевій змінній prap присвоїти значення False. Якщо після перегляду масиву прапорцева змінна має значення False - це означає, що послідовність не була зростаючою.
    11. Перевірте роботу програми для послідовності, упорядкованої за зростанням, за спаданням, неупорядкованої послідовності. Збережіть зміни.
    Домашнє завдання
    • Опрацювати підручник: §36 с. 198-202 (Інформатика, 9 клас, автори: Бондаренко О. О., Ластовецький В. В., Пилипчук О. П., Шестопалов Є. А.)