Дисциплина: Объектно-ориентированное программирование




Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«Московский государственный технический университет имени Н.Э. Баумана» (МГТУ им. Н.Э. Баумана)

 

ФАКУЛЬТЕТ Информатика и системы управления

КАФЕДРА Компьютерные системы и сети

Отчет

По домашней работе № 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

 

Интерфейс:

Диаграмма интерфейса:

Вывод:

С++ позволяет программисту свободно работать с помощью парадигмы объектно-ориентированного программирования.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-14 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: