Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
![]() | «Московский государственный технический университет имени Н.Э. Баумана» (МГТУ им. Н.Э. Баумана) |
ФАКУЛЬТЕТ Информатика и системы управления
КАФЕДРА Компьютерные системы и сети
Отчет
По домашней работе № 3
Дисциплина: Объектно-ориентированное программирование
Название домашней работы: Программирование с использованием классов в С++
Студент гр. ИУ6 -21 __________________ Салып Б.Ю.
(Подпись, дата) (И.О. Фамилия)
Преподаватель __________________ __________________
(Подпись, дата) (И.О. Фамилия)
Москва, 2016
Часть 1. Композиция
Цель работы:
Разработать и реализовать диаграмму классов для описанных объектов предметной области, используя механизм композиции. Проверить ее на тестовом примере, с демонстрацией всех возможностей разработанных классов на конкретных данных.
Даны:
Объект «Целое число», умеющий печатать свое значение и отвечать на запрос о значении своего числового поля.
Объект «Запись», состоящая из двух полей: целого числа и массива целых чисел, который умеет печатать содержимое своих полей, возвращать значение числового поля записи, упорядочивать по возрастанию массив и определять его максимальный и минимальный элементы.
В отчете привести диаграмму разработанных классов и объектную декомпозицию.
Диаграмма классов:
Объектная декомпозиция:
Код программы:
#include <iostream>
using namespace std;
const int LENGTH = 10;
class Int {
private:
int i;
public:
Int(): i(0) {}
Int(int n): i(n) {}
void Display() { cout << i << endl; }
int get() { return i; }
void set() {
cout << "Enter a value: ";
cin >> i;
}
};
class IntArr {
private:
Int i;
Int a[LENGTH];
public:
IntArr(){}
void set() {
i.set();
for(int j = 0; j < LENGTH; j++){
cout << "Enter #" << j << ": ";
a[j].set();
}
}
void Display() {
for(int j = 0; j < LENGTH; j++)
cout << a[j].get() << endl;
}
int getInt() { return i.get(); }
void sort() {
for(int j = 0; j < LENGTH - 1; j++)
for(int k = 0; k < LENGTH - j - 1; k++)
if(a[k].get() > a[k+1].get()) {
Int buf = a[k];
a[k] = a[k+1];
a[k+1] = buf;
}
}
int getMax() {
int max = a[0].get();
for(int j = 0; j < LENGTH; j++)
if(a[j].get() > max)
max = a[j].get();
return max;
}
int getMin() {
int min = a[0].get();
for(int j = 0; j < LENGTH; j++)
if(a[j].get() < min)
min = a[j].get();
return min;
}
};
int main(int argc, char* argv[]) {
Int i(5);
cout << "Get fnc: " << i.get() << endl;
cout << "Print fnc: ";
i.Display();
IntArr a;
a.set();
cout << "Int in a: " << a.getInt() << endl;
cout << "Print..." << endl;
a.Display();
cout << "Sort..." << endl;
a.sort();
cout << "Print..." << endl;
a.Display();
cout << "Max: " << a.getMax() << endl;
cout << "Min: " << a.getMin() << endl;
return 0;
}
Пример работы:
Get fnc: 5
Print fnc: 5
Enter a value: 7
Enter #0: Enter a value: 5
Enter #1: Enter a value: 4
Enter #2: Enter a value: 3
Enter #3: Enter a value: 2
Enter #4: Enter a value: 1
Enter #5: Enter a value: 9
Enter #6: Enter a value: 8
Enter #7: Enter a value: 7
Enter #8: Enter a value: 6
Enter #9: Enter a value: 5
Int in a: 7
Print...5
Sort...
Print...1
Max: 8
Min: 1
Часть 2. Qt. Полиморфное наследование
Цель работы:
Разработать программу, содержащую описание трех графических объектов:
квадрат, ромб, два одинаковых взаимно ортогональных ромба с общими центрами.
Реализуя механизм полиморфизма, привести объекты в одновременное движение по экрану по горизонтали с отражением от его границ.
В отчете привести диаграмму используемых классов Qt и разработанных классов, граф состояний пользовательского интерфейса и объектную декомпозицию.
Диаграмма классов:
Объектная декомпозиция:
Код программы:
Area.cpp
#include "area.h"
Area::Area(QWidget *parent):QWidget(parent)
{
setFixedSize(QSize(800,500));
S=new TSquare(150,20,Sq);
R=new TRhombus(300,200,Rh);
D=new TDiamonds(500,380,450,380,Di);
t = 0;
}
void Area::showEvent(QShowEvent *)
{
myTimer=startTimer(5);
}
void Area::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::red);
S->move(t*10,&painter);
R->move(t*2,&painter);
D->move(t*100,&painter);
}
void Area::timerEvent(QTimerEvent *event)
{
if (event->timerId() == myTimer)
{
t=t+1;
update();
}
else
QWidget::timerEvent(event);
}
void Area::hideEvent(QHideEvent *)
{
killTimer(myTimer);
}
Area::~Area()
{
delete S;
delete R;
delete D;
}
Area.h
#ifndef area_h
#define area_h
#include "figura.h"
class Area: public QWidget
{
int myTimer;
public:
Area(QWidget *parent = 0);
~Area();
TSquare *S;
TRhombus *R;
TDiamonds *D;
float t;
protected:
void paintEvent(QPaintEvent *event);
void timerEvent(QTimerEvent *event);
void showEvent(QShowEvent *event);
void hideEvent(QHideEvent *event);
};
#endif
Figura.cpp
#include <math.h>
#include "figura.h"
void TFigure::rel(float t)
{
int b;
switch (cl){
case 0:
b = 100;
break;
case 1:
b = 200;
break;
case 2:
b = 200;
}
if ((x+dx!=799) && ((x+dx-b)!=0))
{
if (orient == rght)
{
if ((int)t > a)
{
dx++;
a = (int)t;
}
}
else
{
if ((int)t > a)
{
dx=dx-1;
a = (int)t;
}
}
}
else
if (x+dx == 799)
{
orient = lft;
a = (int)t;
dx = dx - 1;
}
else
{
orient = rght;
a = (int)t;
dx = dx + 1;
}
}
void TFigure::move(float t,QPainter *Painter)
{
rel(t);
draw(Painter);
}
void TSquare::draw(QPainter *Painter)
{
Painter->drawLine(x+dx,y,x+dx,y+100);
Painter->drawLine(x+dx,y+100,x+dx-100,y+100);
Painter->drawLine(x+dx-100,y+100,x+dx-100,y);
Painter->drawLine(x+dx-100,y,x+dx,y);
}
void TRhombus::draw(QPainter *Painter)
{
Painter->drawLine(x+dx,y,x+dx-100,y+50);
Painter->drawLine(x+dx-100,y+50,x+dx-200,y);
Painter->drawLine(x+dx-200,y,x+dx-100,y-50);
Painter->drawLine(x+dx-100,y-50,x+dx,y);
}
void TDiamonds::draw(QPainter *Painter)
{
Painter->drawLine(x+dx,y,x+dx-100,y+50);
Painter->drawLine(x+dx-100,y+50,x+dx-200,y);
Painter->drawLine(x+dx-200,y,x+dx-100,y-50);
Painter->drawLine(x+dx-100,y-50,x+dx,y);
Painter->drawLine(x1+dx,y,x1+dx-50,y+100);
Painter->drawLine(x1+dx-50,y+100,x1+dx-100,y);
Painter->drawLine(x1+dx-100,y,x1+dx-50,y-100);
Painter->drawLine(x1+dx-50,y-100,x1+dx,y);
}
Figura.h
#ifndef figura_h
#define figura_h
#include <QtGui>
enum vid {Sq, Rh, Di};
enum ornt {rght,lft};
class TFigure
{
protected:
int x,y,dx,a;
vid cl;
ornt orient;
virtual void draw(QPainter *Painter)=0;
virtual void rel(float t);
public:
TFigure(int ax, int ay, vid cll){x = ax; y = ay; cl = cll; orient = rght; a=0;}
void move(float t,QPainter *Painter);
};
class TSquare:public TFigure
{
protected:
void draw(QPainter *Painter);
public:
TSquare(int ax,int ay, vid cll):TFigure(ax,ay,cll){}
};
class TRhombus:public TFigure
{
protected:
void draw(QPainter *Painter);
public:
TRhombus(int ax,int ay, vid cll):TFigure(ax,ay,cll){}
};
class TDiamonds: public TFigure
{
protected:
void draw(QPainter *Painter);
int x1, y1;
public:
TDiamonds(int ax, int ay, int ax1, int ay1, vid cll):TFigure(ax,ay,cll)
{
x1 = ax1; y1 = ay1;
}
};
#endif
Main.cpp
#include "window.h"
int main(int argc, char *argv[])
{
QApplication appl(argc, argv);
Window win;
win.show();
return appl.exec();
}
Window.cpp
#include "window.h"
Window::Window()
{
this->setWindowTitle(RUS("Figures"));
area = new Area(this);
btn = new QPushButton(RUS("Close"), this);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(area);
layout->addWidget(btn);
connect(btn, SIGNAL(clicked(bool)),this,SLOT(close()));
};
Window.h
#ifndef window_h
#define window_h
#include "area.h"
class Window: public QWidget
{
QTextCodec *codec;
Area * area;
QPushButton * btn;
public:
Window();
};
#endif
Интерфейс:
Диаграмма интерфейса:
Вывод:
С++ позволяет программисту свободно работать с помощью парадигмы объектно-ориентированного программирования.