Сторінка 1

неділю, 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 клас, автори: Бондаренко О. О., Ластовецький В. В., Пилипчук О. П., Шестопалов Є. А.)