Розробка уроку — практичної роботи

Тема: створення комп’ютерної моделі процесу взаємо­пов’язаного функціону­вання двох чи більше об’єктів за допомогою мови C++ у середовищі Qt Creator.

Мета:

Після виконання роботи учень:

Обладнання: ПК з встановленими ОС, середовищем Qt Creator.

Структура уроку

  1. Організаційний момент
  2. Актуалізація опорних знань
  3. Інструктаж з ТБ
  4. Вироблення практичних навичок
  5. Підбиття підсумків уроку
  6. Домашнє завдання

Хід уроку

1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.

2. Актуалізація опорних знань
Розгалуження — це простий, але потужний інструмент створення нелінійних алгоритмів. Для його запису використовують форму такого вигляду:

if (умова) {оператор1;}

або

if (умова) {оператор1;} else {оператор2;}

При справдженні умови процесор виконує оператор1. В другій формі при хибності умови процесор виконує оператор2. Фігурні дужки можна не використовувати, якщо під умовою виконується лише один оператор:

if (умова) оператор1;

Цикл з лічильникомконструкція мови програмування для створення алгоритму, у якому певні дії буде повторено певну кількість разів. Для його запису використовують форму такого вигляду:

for ( дія до початку циклу;
      умова продовження циклу;
      дія в кінці кожної ітерації циклy
    )
{ вказівка1;
  вказівка2;
  …
  вказівкаN;
}
Наприклад,

for (int j=0; j<10; j++) {cout<<i;}

Класконструкція мови програмування для групування пов'язаних змінних та функцій.

При цьому одні змінні та функції можуть бути прихованими (private) і недоступними за межами класу, а інші відкритими (public). Класи дозволяють створювати власні типи даних, на основі яких можна створювати змінні. Такі змінні називаються об'єктами класу. Їх створюють (описують) так само як і звичайні змінні:

назва_класу назва_об'єкта;

Для того щоб звернутись до змінної об'єкта або викликати його функцію, потрібно після назви об'єкта поставити крапку:

назва_об'єкта.назва_змінної = значення;
назва_об'єкта.назва_функції();

Cтворення (опис) класу має таку форму:

class назва_класу
{  public:  // вказівка на те, що наступні члени класу відкриті
   назва_типу1 назва_змінної1; // опис (оголошення) змінної
   назва_типу2 назва_змінної2; …
	
   назва_класу(…) {…} // конструктор
   ~назва_класу() {…} // деструктор

   назва_типуa назва_функціїa(){…} // опис (оголошення) змінної функції
   назва_типуb назва_функціїb(){…} …
}

Конструкторце функція, яка автоматично виконується після створення об'єкта класу для його ініціалізації (надання початкових значень властивостям-змінним). Конструкторів може бути декілька і вони можуть мати різну кількість аргументів.

Деструкторце функція, яку автоматично виконується перед видаленням об'єкта класу.

Класи в C++ можна створювати, використовуючи ключові слова class або struct. Різниця між ними така: у випадку з class всі елементи як усталено приховані, якщо не вказано інше, а з struct — відкриті. Наприклад,

struct MyClass
{ float x, y;
  MyClass() { cout<<"створено об'єкт класу MyClass"}
  MyClass(float x_, float y_)
  { x = x_;
    y = y_;
    cout<<"створено об'єкт класу MyClass"
  }
  ~MyCLass() {cout<<"видалено об'єкт класу MyClass"}

  void SetPosition(float x_, float y_)
  { x = x_;
    y = y_;
  }
};

int main()
{ MyClass a1, a2(0.0f, 10.5f);
  a1.SetPosition(0.0f, 10.5f);
  return 0;
}

Посилання на об'єкт можна здійснити декількома способами. Зокрема за допомогою вказівників та посилань.

3. Інструктаж з ТБ
4. Вироблення практичних навичок


Завдання 1. Створити проект у середовищі Qt Creator на основі шаблону QWidget «Злипання кругів»: два круги однакового розміру з випадковими початковими координатами і швидкостями рівномірно і прямолінійно рухаються у прямокутному замкненому полі. При зіткненні з межам поля об'єкти дзеркально відбиваються від них. При зіштовхувані один з одним круги злипаються та зливаються в одне ціле.

Вказівки до виконання

  1. Створити новий проект, натиснувши кнопку + Новий проект.

  2. Обрати зі списку шаблонів Програма / Праграма Qt Widgets і натиснути кнопку Оберіть… .

  3. Вписати назву проекту (наприклад, MyProject) і натиснути кнопку Далі.

  4. Обрати у списку комплектів Desktop Qt 5.X.X і натиснути кнопку Далі.

  5. У полі Базовий клас обрати QWidget, прибрати мітку Генерувати форму (якщо не потрібно налаштовувати форму вікна) та натиснути кнопку Далі.

  6. Натиснути кнопку Завершити.

    Після цього буде створено 4 файли:

    • MyProject.pro — файл налаштувань проекту;
    • main.cpp — файл коду головної програми;
    • MyProject.pro.user
    • widget.cpp — файл коду допоміжної програми;
    • widget.h — файл заголовку допоміжної програми.
  7. У середовищі вбудованого редактора Qt Creator внести у вказані файли тексти, які доповнити згідно з коментарями:

    • main.cpp:
      #include <cmath> // замовлення бібліотеки з математичними функціями
      …
      Widget *window;// вказівник на вікно програми
      struct object  // клас об'єкт
      { float x,y,   // координати
            vx,vy,   // проекції швидкості
            radius;  // радіус круга
        QColor color; // колір круга
      
        void paint(QPainter &painter)    // метод відображення об'єкта
        { painter.setBrush(QBrush(color, Qt::SolidPattern)); // встановлення кольору пензлика
          painter.drawEllipse(QPointF(x,y), radius, radius); // малювання круга
        }
      … // метод опрацювання руху об'єкта:
        //   прямолінійний рівномірний рух
        //   відбивання від стінок
        }
      }*objects[2];// вказівники на об'єкти
      int objects_count = 0;// загальна кількість об'єктів
      
      void Step(QPainter &painter)
      { for(int i=0; i<objects_count;i++)  // рух та відображення об'єктів
        { objects[i]->move();
          objects[i]->paint(painter);
        }
        if(objects_count>1)    // перевірка злиття об'єктів
        { …
          // якщо об'єкти дотикаються або перетинаються
          { // злиття
            // видалення зайвого об'єкта
          }
        }
      }
      
      int main(int argc, char *argv[])
      {  QApplication a(argc, argv);
         Widget w;       // створення вікна
         w.show();
         window = &w;
                         // створення об'єктів
         objects[0] = new object{rand()%w.width(),
                                 rand()%w.height(),
                                (rand()%2001)*0.001f-1.0f,
                                (rand()%2001)*0.001f-1.0f,
                                 30.0f, Qt::red};
         objects[1] = new object{rand()%w.width(),
                                 rand()%w.height(),
                                (rand()%2001)*0.001f-1.0f,
                                (rand()%2001)*0.001f-1.0f,
                                 30.0f, Qt::yellow};
         objects_count = 2;
         return a.exec();// запуск основного циклу програми
      }
    • widget.cpp:
      …
      void Step(QPainter &painter); // оголошення функції,
                                    // описаної у main.cpp
      void Widget::paintEvent(QPaintEvent *)
      { // налаштування пензлика
        QPainter painter(this);
        painter.setPen(QPen(QColor(0,0,0,255)));
        painter.setBrush(QBrush(Qt::darkGreen, Qt::SolidPattern));
        painter.drawRect(0,0, width(),height()); // фарбування тла
        Step(painter); // виклик функції з main.cpp
                       // для опрацювання й відображення об'єктів
        update();      // оновлення вікна програми, щоб змусити
                       // вікно виклакати paintEvent знову
      }
    • widget.h (подано повністю):

      #ifndef WIDGET_H
      #define WIDGET_H
      
      #include <QWidget>
      #include <QPainter>
      
      class Widget : public QWidget // клас вікна програми
      { Q_OBJECT // макрос, що вказує прекомпілятору на те,
                 // що цей клас має елементи GUI, та дозволяє
                 // використовувати систему сигналів/слотів Qt
        public:
          Widget(QWidget *parent = 0);// це основне вікно,
                                      // що не має батьківського вікна
          ~Widget();
        protected:  // перевизначення методу-події малювання, що викликається 
          void paintEvent(QPaintEvent *event) override; // автоматично при оновленні вікна
      };
      
      #endif // WIDGET_H
  8. Запустити проект на виконання:
    • або натиснути клавіші Ctrl + R;
    • або натиснути кнопку Запустити.
    Можна використати зневадження:
    • або натиснути клавіші F5;
    • або натиснути кнопку Запустити;
    • або використати вказівку меню
      Зневадження / Почати зневадження / Почати зневадження.
  9. У разі потреби внести необхідні зміни у код програми з метою зробити його дієздатним.

  10. Повідомити учителя про завершення роботи над проектом.

  11. Порівняти створену програму з демонстраційним розв'язанням:

Завдання 2. Ускладнити програму: використати більшу кількість об'єктів різних розмірів.

5. Підбиття підсумків уроку
Виставлення оцінок.

6. Домашнє завдання

Завдання 3. Написати аналогічну програму, в якій об'єкти замість злипання відштовхуються один від одного.


Текст упорядкував Павленко Денис Вікторович, учитель школи І─ІІІ ступенів № 133 Печерського району м. Києва, на курсах підвищення кваліфікації з 29.10.2018 по 02.11.2018.