Тема: створення комп’ютерної моделі процесу взаємопов’язаного функціонування двох чи більше об’єктів за допомогою мови C++ у середовищі Qt Creator.
Мета:
вдосконалити уміння визначати зв'язки між об'єктами, представляти їх у нових взаємозв'язках;
формувати обізнаність про можливості ПК як інструменту навчально-пізнавальної діяльності.
Після виконання роботи учень:
Обладнання: ПК з встановленими ОС, середовищем Qt Creator.
Структура уроку
Хід уроку
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; }
Посилання на об'єкт можна здійснити декількома способами. Зокрема за допомогою вказівників та посилань.
При створенні вказівника на об'єкт перед його назвою пишуть *. Для отримання вказівника на об'єкт перед його назвою пишуть амперсанд &. Наприклад,
int integer, *p;
p = &integer;
Щоб звернутись до елементів об'єкта, використовуючи його вказівник, замість крапки використовують ->
вказівник -> елемент_об'єкта
Отримати значення об'єкта через вказівник можна через *
змінна = *вказівник
Таким чином отримати елемент об'єкта через вказівник можна ще й таким спобом:
(*вказівник).елемент_об'єкта
При створенні посилання на об'єкт перед його назвою пишуть амперсанд &, при цьому посилання потрібно одразу ініціалізувати. Наприклад,
int integer; int &p = integer;
В С++ посилання компілятор сприймає так само, як і об'єкт, на який воно посилається. Тобто, звернення до змінної-посилання повертає нам не адресу об'єкта, а його значення. Надання значення посиланню призводить до зміни значення об'єкту.
Для звернення до елементів об'єкта через його посилання використовують крапку (на відміну від вказівника). Наприклад,
my_class &p = object; int value = p.integer;
3. Інструктаж з ТБ
4. Вироблення практичних навичок
Завдання 1. Створити проект у середовищі Qt Creator на основі шаблону QWidget «Злипання кругів»: два круги однакового розміру з випадковими початковими координатами і швидкостями рівномірно і прямолінійно рухаються у прямокутному замкненому полі. При зіткненні з межам поля об'єкти дзеркально відбиваються від них. При зіштовхувані один з одним круги злипаються та зливаються в одне ціле.
Вказівки до виконання
Створити новий проект, натиснувши кнопку + Новий проект.
Обрати зі списку шаблонів Програма / Праграма Qt Widgets і натиснути кнопку Оберіть… .
Вписати назву проекту (наприклад, MyProject) і натиснути кнопку Далі.
Обрати у списку комплектів Desktop Qt 5.X.X і натиснути кнопку Далі.
У полі Базовий клас обрати QWidget, прибрати мітку Генерувати форму (якщо не потрібно налаштовувати форму вікна) та натиснути кнопку Далі.
Натиснути кнопку Завершити.
Після цього буде створено 4 файли:
У середовищі вбудованого редактора Qt Creator внести у вказані файли тексти, які доповнити згідно з коментарями:
#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();// запуск основного циклу програми }
… 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
У разі потреби внести необхідні зміни у код програми з метою зробити його дієздатним.
Повідомити учителя про завершення роботи над проектом.
Порівняти створену програму з демонстраційним розв'язанням:
Завдання 2. Ускладнити програму: використати більшу кількість об'єктів різних розмірів.
5. Підбиття підсумків уроку
Виставлення оцінок.
6. Домашнє завдання
Завдання 3. Написати аналогічну програму, в якій об'єкти замість злипання відштовхуються один від одного.
Текст упорядкував Павленко Денис Вікторович, учитель школи І─ІІІ ступенів № 133 Печерського району м. Києва, на курсах підвищення кваліфікації з 29.10.2018 по 02.11.2018.