Сторінка 1

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

Компетентнісні задачі: табличні величини та алгоритми їх опрацювання

Увага! Під час роботи з комп'ютером дотримуйтеся правил безпеки і санітарно-гігієнічних норм.
Види навчальної діяльності
Виконуємо самостійно
  • Завдання 1. Створити комп'ютерну програму, яка реалізує відому гру «Морський бій».
  1. Постановка задачі.
    1. Двовимірний масив А розмірністю 6x6 випадковим чином заповнено нулями та одиницями.
    2. Якщо A(i,j) = 1, то у відповідній позиції знаходиться корабель. Гравець задає координати елементу масиву і «стріляє».
    3. Якщо елемент з указаними індексами дорівнює 1, то виводиться повідомлення «Влучив!», значення лічильника влучень збільшується на 1. Якщо A(i,j) = 0, виводиться повідомлення «Не влучив!», місце влучення позначається кружком.
    4. Якщо гравець робить три невдалі спроби, виводиться повідомлення «Ти програв!».
    5. Якщо ж значення лічильника влучень зрівняється з кількістю кораблів, виводиться повідомлення «Ти виграв!».
  2. Побудова інформаційної моделі
    Інформаційна модель гри "Морський бій"
  3. Визначення засобів опрацювання даних
    1. Підготовка графічних файлів за допомогою графічного редактора.
    2. Пошук в Інтернеті й опрацювання інформації про відображення графічних даних у комірках об'єкта StringGrid.
    3. Створення проекту з використанням мови Object Pascal і середовища Lazarus.
  4. Опрацювання даних
    1. Підготовка зображень. У графічному редакторі підготуйте малюнки для відображення етапів гри (або скористайтеся поданими нижче).
      Корабель
      Влучив у корабель
      Море
      Не влучив у корабель
    2. Повторення навчального матеріалу
      1. Опрацювання двовимірних масивів.
      2. Використання компонентів Image, Edit, Button.
      3. Відображення графічних даних у комірках об'єкта StringGrid.
    3. Створення програми.
      1. Розробіть інтерфейс програми (наприклад, як на зразку).
        Інтерфейс програми "Морський бій"
      2. Опишіть глобальні змінні.
      3. Form1: TForm1;
          A: array[0..5, 0..5] of Integer;
          k, sum, sproba: Integer;
      4. У процедурі обробки події OnCreate для форми запрограмуйте заповнення випадковим чином нулями та одиницями масиву А і відображення значень A[i,j] у таблиці StringGrid.
      5. procedure TForm1.FormCreate(Sender: TObject);
        var i, j: Integer;
        begin
          k := 0; sum := 0; sproba := 0;
          For i := 0 to 5 do begin
             StringGrid1.ColWidths[i] := 50;
             StringGrid1.RowHeights[i] := 50;
             end;
        Randomize;
        For i := 0 to 5 do
             For j:=0 to 5 do begin
                A[i,j] := Random(2);
         sum := sum+A[i,j];
         StringGrid1.Cells[j,i] := IntToStr(A[i,j]);
         end;
        end;
      6. Для виведення малюнків у комірки StringGrid створіть для цього об'єкта обробник події OnDrawCell. Процедура StringGrid1DrawCell викликається під час кожного звернення до комірки StringGrid1DrawCell[j,i], значення індексів комірки (j,i) надаються параметрами aCol, aRow. Залежно від текстового значення StringGrid1DrawCell[j,i] до комірки виводиться малюнок з одного з об'єктів Image. Запишіть програмний код, поданий нижче.
      7. procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
          aRect: TRect; aState: TGridDrawState);
        begin
          If StringGrid1.Cells[aCol, aRow] = '1' Then
            begin
               If sproba < 3 Then  // якщо гру не закінчено, малюнок «Хвилі»
                  StringGrid1.Canvas.StretchDraw(aRect, Image1.Picture.Graphic)
               Else StringGrid1.Canvas.StretchDraw(aRect,Image3.Picture.Graphic);
            end;
        If StringGrid1.Cells[aCol, aRow] = '2' Then  // якщо влучив
           StringGrid1.Canvas.StretchDraw(aRect, Image2.Picture.Graphic);
        If StringGrid1.Cells[aCol, aRow] = '0' Then
           StringGrid1 .Canvas.StretchDraw(aRect, Image1.Picture.Graphic);
        If StringGrid1.Cells[aCol, aRow] = '3' Then  // якщо не влучив
           StringGrid1.Canvas.StretchDraw(aRect, Image4.Picture.Graphic);
        end;
      8. Реалізація алгоритму гри здійснюється в обробнику події для кнопки Стріляй!.
      9. procedure TForm1.Button1Click(Sender: TObject);
        var x, y, i, j: Integer;
        begin
        x := StrToInt(Edit1.Text); // введення координат корабля
        y := StrToInt(Edit2.Text);
        If a[x,y] = 1 Then
          begin
             sproba := 0;
             k := k+1;
             a[x,y] := 2;
             StringGrid1.Cells[y,x] := IntToStr(A[x,y]);
             Label2.Caption := 'Влучив!';
          end
           Else If a[x,y] = 0 Then
             begin
                a[x,y] := 3;
         StringGrid1.Cells[y,x] := IntToStr(A[x,y]);
         sproba := sproba+1;
                Label2.Caption := 'Мимо!';
             end;
        If sproba = 3 Then
          begin
             Label2.Caption := 'Ти програв!';
             Edit1.Visible := False; Edit2.Visible := False;
             Button1.Visible := False;
             { якщо гру програно, виводяться кораблі, в які не влучили }
             For i := 0 to 5 do
                 For j := 0 to 5 do StringGrid1.Cells[j,i] := IntToStr(A[i,j]);
          end;
        If k = sum Then
          begin
             Label2.Caption := 'Ти виграв!';
             Edit1.Visible:= False;
             Edit2.Visible:= False;
             Button1.Visible := False;
             sproba := 3;   // кінець гри
          end;
        end;
  5. Аналіз результатів
    1. Перевірте роботу програми (нумерація клітинок ігрового поля починається з нуля). 
      Гра "Морський бій"
    2. Оцініть повноту і вірогідність результатів розв'язування задачі.
  • Завдання 2. Розробіть програму «Телефонний довідник»
  1. Постановка задачі. Довідник складається із двох полів: Прізвище та Номери телефонів. У програмі треба реалізувати завантаження із файлу прізвищ абонентів і запис у інший файл прізвищ і номерів телефонів абонентів через кому у вигляді, наприклад, Хокінг, 123456. Номери телефонів вводяться вручну в поле Номери телефонів навпроти відповідного прізвище з поля Прізвище. Запрограмуйте пошук номера телефону абонента за введеним прізвищем і пошук прізвище -  за введеним номером телефону. 
  2. Побудова інформаційної моделі.
  3. Визначення засобів опрацювання даних.
    1. Створення двох текстових файлів (input.txt - з прізвищами абонентів, вводяться вручну за допомогою текстового редактора, output.txt - із прізвищами і телефонами, розділеними через кому, записуються через саму програму довідника).
    2. Пошук в Інтернеті й опрацювання інформації про об'єкт MainMenu, завантаження даних із файлу і запис даних у файл.
    3. Створення проекту з використанням мови Object Pascal і середовища Lazarus.
  4. Опрацювання даних.
    1. Повторення навчального матеріалу.
      1. Використання компонентів Image, Edit, Button.
      2. Відображення даних у комірках об'єкта Memo, GroupBox.
    2. Створення програми.
      1. Розробіть інтерфейс програми (наприклад, як на зразку). Для додавання пунктів меню для об'єкта MainMenu викличте контекстне меню і оберіть команду Menu Editor... .
        Створення інтерфейсу програми "Телефонний довідник"
        Створення пунктів меню
      2. Створіть процедуру обробки події OnClick для кнопки Відкрити із меню Файл.
        Процедура обробки події OnClick для кнопки "Відкрити"
      3. // пункт Файл - Відкрити
        // відкривання файлу з прізвищами і запис у поле Мемо1
        procedure TForm1.MenuItem2Click(Sender: TObject);
        var f: TextFile;  // для текстових файлів
            s: String;    // міститиме кожний рядок з файлу
        begin
           AssignFile(f, 'input.txt');      // зв'язок файлової змінної з файлом на диску
             Reset(f);                        // встановлення режиму для читання з файлу
             while (not EOF(f)) do            // доки не кінець файлу
                   begin
                        Readln(f, s);         // зчитування порядково з файлу
                        Memo1.Lines.Add(s);   // запис кожного рядка у поле Мемо
                   end;
             CloseFile(f);                    // закриття роботи з файлом
        end;
      4. Створіть процедуру обробки події OnClick для кнопки Записати із меню Файл (аналогічно, як і на попередньому кроці).
      5. // пункт Файл - Записати
        // записуються дані з двох полів Мемо1 і Мемо2 у файл
        procedure TForm1.MenuItem3Click(Sender: TObject);
        var f: TextFile;
            i: Integer;
        begin
             AssignFile(f, 'output.txt');
             Rewrite(f);                      // створюється новий файл або перезаписується старий
             for i:=0 to Memo1.Lines.Count - 1 do
                 Writeln(f, Memo1.Lines[i] + ', ' + Memo2.Lines[i]);  // запис у файл з поля Мемо
             CloseFile(f);
        end;
      6. Створіть процедуру обробки події OnClick для кнопки Пошук по прізвищу.
      7. // Кнопка Пошук по прізвищу
        // перед пошуком записати номери в поле Мемо2 навпроти прізвищ
        procedure TForm1.Button1Click(Sender: TObject);
        var i: integer;
        begin
           Edit2.Text := '';
           for i := 0 to Memo1.Lines.Count - 1 do
              if Edit1.Text = Memo1.Lines[i] then Edit2.Text := Memo2.Lines[i];
        end;
      8. Створіть процедуру обробки події OnClick для кнопки Пошук по номеру.
      9. // Кнопка Пошук по номеру
        // перед пошуком записати номери в поле Мемо2 навпроти прізвищ
        procedure TForm1.Button2Click(Sender: TObject);
        var i: integer;
        begin
           Edit1.Text := '';
           for i := 0 to Memo2.Lines.Count - 1 do
              if Edit2.Text = Memo2.Lines[i] then Edit1.Text := Memo1.Lines[i];
        end;
  5. Аналіз результатів.
    1. Перевірте роботу програми. Зверніть увагу на вміст текстових файлів input.txt і output.txt.
      Файли з прізвищами і номерами телефонів
    2. Вкажіть, на вашу думку, на позитивні та негативні моменти в роботі програми.
    3. Поміркуйте, як можна удосконалити програму.
  • Завдання 3. Розробіть програму «Текстовий редактор»
  1. Постановка задачі. Текстовий редактор матиме наступні функції: створення нового файлу, відкривання і зберігання файлів, форматування тексту (зміна шрифту, накреслення, розміру). У програмі також необхідно реалізувати кнопки: Вихід - для закривання текстового редактора і Про програму - з інформацією про текстовий редактор, ім'я розробника тощо.
  2. Побудова інформаційної моделі.
  3. Визначення засобів опрацювання даних.
    1. Пошук в Інтернеті й опрацювання інформації про об'єкти MainMenu, OpenDialog, SaveDialog, FontDialog.
    2. Створення проекту з використанням мови Object Pascal і середовища Lazarus.
  4. Опрацювання даних.
    1. Повторення навчального матеріалу.
      1. Використання компоненту Memo, функцій MessageDlg і ShowMessage.
      2. Відображення даних в об'єкті Memo.
    2. Створення програми.
      1. Розробіть інтерфейс програми (наприклад, як на зразку).
        Простий текстовий редактор (анімація)
        Додайте на форму об'єкт MainMenu1. 
        Об'єкт MainMenu
        Для додавання пунктів меню для об'єкта MainMenu1 викличте контекстне меню і оберіть команду Menu Editor.... Додайте пункти меню.
      2. Додайте на форму інші компоненти (OpenDialog1SaveDialog1FontDialog1, Memo1), як на малюнку.
        Компоненти форми текстового редактора
      3. Змініть властивість Caption доданих на форму компонентів.
      4. Створіть процедуру обробки події OnClick для кнопки Новий файл із меню Файл.
      5. // пункт Файл - Новий файл
        procedure TForm1.MenuItem7Click(Sender: TObject);
        begin
          Memo1.Clear;
        end;  
        
      6. Створіть процедуру обробки події OnClick для кнопки Відкрити файл із меню Файл (аналогічно, як і на попередньому кроці).
      7. // пункт Файл - Відкрити файл
        procedure TForm1.MenuItem2Click(Sender: TObject);
        begin
          if OpenDialog1.Execute
          then Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
        end;
        
      8. Створіть процедуру обробки події OnClick для кнопки Зберегти файл із меню Файл.
      9. // пункт Файл - Зберегти файл
        procedure TForm1.MenuItem3Click(Sender: TObject);
        begin
          if SaveDialog1.Execute
          then Memo1.Lines.SaveToFile(SaveDialog1.FileName);
        end; 
      10. Створіть процедуру обробки події OnClick для кнопки Шрифт із меню Редагувати.
      11. // пункт Редагувати - Шрифт
        procedure TForm1.MenuItem5Click(Sender: TObject);
        begin
          if FontDialog1.Execute
          then Memo1.Font := FontDialog1.Font;
        end; 
        
      12. Створіть процедуру обробки події OnClick для кнопки Про програму із меню Довідка.
      13. // пункт Довідка - Про програму
        procedure TForm1.MenuItem9Click(Sender: TObject);
        begin
          // #13#10 - перехід на новий рядок
          ShowMessage('Простий текстовий редактор.' + sLineBreak + 'Розробник - Мізюк Олександр Миколайович.');
        end;
        
      14. Створіть процедуру обробки події OnClick для кнопки Вихід із меню Файл.
      15. // пункт Файл - Вихід
        procedure TForm1.MenuItem8Click(Sender: TObject);
        begin
          if MessageDlg('Вийти з програми?', mtConfirmation, [mbYes, mbNo], 0) = mrYes
          then Application.Terminate;
        end; 
        
  5. Аналіз результатів.
    1. Перевірте роботу програми. Створіть новий файл, збережіть його у форматі txt, відкрийте вже створений текстовий файл, відформатуйте текст у файлі.
    2. Вкажіть, на вашу думку, на позитивні та негативні моменти в роботі програми.
    3. Поміркуйте, як можна удосконалити програму, додавши необхідні функції.
  • Завдання 4. Розробіть програму «Тест»
  1. Постановка задачі. Текстова програма матиме наступні функції: вибір варіантів тесту (з текстових файлів variant1.txt, variant2.txt і т.д.), оцінювання тесту і виведення інформації про тест та результатів тестування. У програмі також необхідно реалізувати кнопки: Вихід - для закривання тестової програми і Про програму - з інформацією про тестову програму, ім'я розробника тощо. Тестова програма міститиме лише один тип запитань - одинарний вибір з багатьох.
  2. Побудова інформаційної моделі.
  3. Визначення засобів опрацювання даних.
    1. Пошук в Інтернеті й опрацювання інформації про об'єкт MainMenu, роботу з файлами.
    2. Створення проекту з використанням мови Object Pascal і середовища Lazarus.
  4. Опрацювання даних.
    1. Повторення навчального матеріалу.
      1. Використання компоненту RadioGroup, функції MessageDlg, операторів repeat until.
      2. Відображення даних в об'єкті ListBox.
    2. Створення програми.
      1. Розробіть інтерфейс програми (наприклад, як на зразку).
        Тестова програма
        Додайте на форму об'єкт MainMenu1. 
        Для додавання пунктів меню для об'єкта MainMenu1 викличте контекстне меню і оберіть команду Menu Editor.... Додайте пункти меню.
      2. Додайте на форму інші компоненти (RadioGroup1, ListBox1, Button1), як на малюнку.
        Інтерфейс тестової програми
      3. Змініть властивість Caption доданих на форму компонентів.
      4. Опишіть глобальні змінні.
      5. var
          Form1: TForm1;
          f: TextFile; // файлова змінна
          s, v: String;   // s - міститиме кожний рядок з файлу, v - назва варіанта
          n, number, points: integer; // n - номер правильної відповіді, number - номер запитання, points - кількість набраних балів
          rate: real; // відсоток правильних відповідей
        
        implementation 
      6. Створіть процедуру обробки події FormCreate (створення форми).
      7. // початкові налаштування при створенні форми
        procedure TForm1.FormCreate(Sender: TObject);
        begin
          MenuItem7.Enabled := False; // кнопк Запуск тесту не активна
          Button1.Enabled := False;   // кнопк Далі не активна
          RadioGroup1.Caption := 'Оберіть варіант тесту з меню Варіанти';
        end;
      8. Створіть процедуру обробки події OnClick для кнопки Варіант 1  меню Варіанти.
      9. // Варіанти  - Варіант 1
        procedure TForm1.MenuItem2Click(Sender: TObject);
        begin
           MenuItem2.Enabled := False; // вибір Варіант 1 стає недоступним
           MenuItem3.Enabled := True;  // вибір Варіант 2 стає доступним
           MenuItem7.Enabled := True; // кнопк Запуск тесту стає активною
           v := 'variant1.txt';
           RadioGroup1.Items.Clear; // очищення вмісту радіогрупи для наступного запитання
           ListBox1.Clear;
           ListBox1.Items.Add('Тут відображатимуться результати тесту');
           RadioGroup1.Caption := 'Запустіть тест з меню Тестування';
        end;   
        
      10. Створіть процедуру обробки події OnClick для кнопки Варіант 2  меню Варіанти.
      11. // Варіанти  - Варіант 2
        procedure TForm1.MenuItem3Click(Sender: TObject);
        begin
           MenuItem3.Enabled := False; // вибір Варіант 2 стає недоступним
           MenuItem2.Enabled := True;  // вибір Варіант 2 стає доступним
           MenuItem7.Enabled := True; // кнопк Запуск тесту стає активною
           v := 'variant2.txt';
           RadioGroup1.Items.Clear; // очищення вмісту радіогрупи для наступного запитання
           ListBox1.Clear;
           ListBox1.Items.Add('Тут відображатимуться результати тесту');
           RadioGroup1.Caption := 'Запустіть тест з меню Тестування';
        end;   
        
      12. Створіть процедуру обробки події OnClick для кнопки Запуск тесту із меню Тестування.
      13. // Тестування - Запуск тесту
        procedure TForm1.MenuItem7Click(Sender: TObject);
        begin
          MenuItem7.Enabled := False; // кнопк Запуск тесту не активна
          AssignFile(f, v); // зв'язок файлової змінної з файлом обраного варіанта
          Button1.Enabled := True;   // після обрання варіанта активізуємо кнопку Далі
          Reset(f); // встановлення режиму для читання з файлу
          points := 0; // початкова кількість балів рівна нулю
          number := 1; // початковий номер запитання
          Readln(f, s); // зчитування першого рядка з файлу
          repeat
            if (s[1] = '+') then           // якщо перший символи "+" значить це запитання
                  begin
                    Delete(s,1,1);         // видаляємо символ "+" із зчитаного рядка
                    RadioGroup1.Caption := 'Запитання №1. ' + s; // формування заголовка в радіогрупі
        
                  end
            else if (s[1] = '*') then      // якщо перший символ "*" значить це номер правильної відповіді
                  begin
                      Delete(s,1,1);       // видаляємо символ "*" із зчитаного рядка
                      n := StrToInt(s);    // записуємо номер правильної відповіді у змінну n
                  end
            else
                RadioGroup1.Items.Add(s); // інакше це варіант відповіді
            Readln(f, s);
           until (s[1] = '+') or (EOF(f));
           number := number + 1;  // збільшення номера запитань на 1
        end; 
        
      14. Створіть процедуру обробки події OnClick для кнопки Далі в процесі проходження тесту.
      15. // кнопка Далі
        procedure TForm1.Button1Click(Sender: TObject);
        begin
          if (RadioGroup1.ItemIndex > -1) and (not EOF(f)) then
            begin
              if RadioGroup1.ItemIndex = n-1 then points += 1; // якщо обрано вірну відповідь, збільшуємо кількість балів
              RadioGroup1.Items.Clear; // очищення вмісту радіогрупи для наступного запитання
        
              repeat
                if (s[1] = '+') then
                  begin
                    Delete(s,1,1);
                    RadioGroup1.Caption := 'Запитання №' + IntToStr(number) + '. ' + s;
        
                  end
                else if (s[1] = '*') then
                    begin
                      Delete(s,1,1);
                      n := StrToInt(s);
                    end
                else
                    RadioGroup1.Items.Add(s);
                Readln(f, s);
              until (s[1] = '+') or (EOF(f));
              number += 1;
            end
          else if EOF(f) then
                 begin
                   Delete(s,1,1);
                   n := StrToInt(s);
                   if RadioGroup1.ItemIndex = n-1 then points += 1;
                   ListBox1.Clear; // очищення результатів тесту
                   ListBox1.Items.Add('Результати тесту: ');
                   ListBox1.Items.Add('----------');
                   ListBox1.Items.Add('Всього задано запитань: ' + IntToStr(number-1) + '.');
                   ListBox1.Items.Add('Система оцінювання: 2 бали за вірну відповідь.');
                   ListBox1.Items.Add('Максимально можна набрати: ' + IntToStr((number-1)*2) + ' балів.');
                   ListBox1.Items.Add('----------');
                   ListBox1.Items.Add('Вірних відповідей: ' + IntToStr(points) + '.');
                   rate := points/(number-1)*100;
                   if rate <> 0 then
                          ListBox1.Items.Add('Відсоток правильних відповідей: ' + FormatFloat('#,##', rate) + '%.')
                   else
                          ListBox1.Items.Add('Відсоток правильних відповідей: 0%.');
                   ListBox1.Items.Add('Ви набрали: ' + IntToStr(points*2) + ' бали(ів).');
                   // додаткове повідомлення
                   if (rate >= 80) and (rate <= 100) then ListBox1.Items.Add('Тест успішно пройдено! Молодець!')
                   else if (rate >= 60) and (rate < 80) then ListBox1.Items.Add('Тест пройдено! Але ти можеш краще!')
                   else if (rate >= 40) and (rate < 60) then ListBox1.Items.Add('Тест не пройдено! Забагато помилок, спробуй ще!')
                   else if (rate <40) then ListBox1.Items.Add('Тест не пройдено! Ще раз опрацюй навчальний матеріал, і тоді повертайся до тесту!');
                   CloseFile(f);      // закриття роботи з файлом
                   Button1.Enabled := False;
                 end;
        end;
        
      16. Створіть процедуру обробки події OnClick для кнопки Про програму із меню Довідка.
      17. // Довідка - Про програму
        procedure TForm1.MenuItem6Click(Sender: TObject);
        begin
            // #13#10 - перехід на новий рядок
          ShowMessage('Тестова програма.' + sLineBreak + 'Розробник - Мізюк Олександр Миколайович.');
        end; 
        
      18. Створіть процедуру обробки події OnClick для кнопки Вихід.
      19. // кнопка Вихід
        procedure TForm1.MenuItem8Click(Sender: TObject);
        begin
          if MessageDlg('Завершити тестування?', mtConfirmation, [mbYes, mbNo], 0) = mrYes
          then Application.Terminate;
        end;   
        
  5. Аналіз результатів.
    1. Створіть файли variant1.txtvariant2.txt і т.д. наступного вмісту.
      Зміст тесту
    2. Використовуються такі позначення: символом + починається рядок із запитанням (запитань можна створювати довільну кількість), символом * починається рядок із номером правильної відповіді на запитання, усі інші рядки - це варіанти відповідей, яких може бути довільна кількість. 
    3. Перевірте роботу програми, пройшовши тест. 
    4. Вкажіть, на вашу думку, на позитивні та негативні моменти в роботі програми.
    5. Поміркуйте, як можна удосконалити програму, додавши необхідні функції.