Лабораторная работа 31 / ооп3
.docСанкт-Петербургский Государственный Электротехнический
Университет «ЛЭТИ»
Кафедра МОЭВМ
Лабораторная работа №3 по
Объектно-ориентированному программированию
О Т Ч Е Т
Факультет КТИ
группа 3341
студент Марьяскин Е.
Санкт-Петербург
2006 г.
Постановка задачи.
Содержательная постановка задачи.
Разработать программу, моделирующую размещение набора цветных равнобедренных треугольников на круглом планшете. Представление цветного равнобедренного треугольника реализовать на основе простого наследования. Представление набора цветных равнобедренных треугольников на круглом планшете реализовать с помощью множественного наследования.
Сценарий диалога с пользователем.
Тестирующая программа выполняет необходимые действия по тестированию методов классов и выводит текущие результаты на экран.
Описание программы.
Классовая структура.
В программе разработаны 3 класса:
-
класс «cColTriangle» - реализация цветного равнобедренного треугольника. Наследник класса равнобедренный треугольник
-
класс «cMapboard» - реализация круглого планшета.
-
класс «сTrOnBoard» - реализация размещения кольцевого списка цветных равнобедренных треугольников на круглом планшете. Наследник класса кольцевой список и класса круглый планшет.
В программе использованы классы, разработанные в ходе выполнения предыдущих заданий: реализация точки, равнобедренного треугольника, элемента списка и кольцевого списка.
cColTriangle |
|||
члены-данные |
члены-функции |
||
Colors Color |
Цвет треугольника |
cColTriangle |
конструктор |
Тип Colors – перечисление цветов |
void SetColor |
Модификатор цвета |
|
|
|
Colors GetColor |
Селектор цвета |
|
|
void Set |
Модификатор треугольника |
|
|
void out |
Вывод на экран |
cMapboard |
|||
члены-данные |
члены-функции |
||
cPoint Center |
Данные |
cMapboard |
Конструктор |
Double Radius |
Ссылка на след. |
void SetCenter |
Модификатор точки центра |
|
|
void SetRad |
Модификатор значения радиуса |
|
|
void Set |
Модификатор планшета |
|
|
void GetX |
Селектор абсциссы центра |
|
|
void GetY |
Селектор ординаты центра |
|
|
void GetRad |
Селектор радиуса планшета |
|
|
inc inv |
Инвариант |
сTrOnBoard |
|||
члены-данные |
члены-функции |
||
|
|
cTrOnBoard |
Конструктор |
|
|
inc Correct |
Проверка треугольника на вместимость на планшет |
|
|
void addontable |
Добавление треугольника при (Correct == 1) |
|
|
void reform |
Удаление треугольников, не отвечающих Correct |
|
|
void SetNewCenter |
cMapboard::SetCenter + reform |
|
|
void SetNewRad |
cMapboard::SetRad + reform |
|
|
void boardout |
Вывод списка на экран |
Характеристика программы.
Список файлов.
сСolTriangle.h, cColTriangle.cpp класс цветной равнобедренный треугольник
cMapboard.h, cMapboard.cpp класс круглый планшет
cTrOnBoard.h, cTrOnBoard.cpp класс набор треугольников на планшете
tester3.cpp тестирующая программа.
Исследование.
Все проведенные тесты показывают корректность работы программы. Представленная тестирующая программа демонстрирует работу интерфейсных функций.
Приложения.
Листинг исходного кода программы.
1. cColTriangle.h
#ifndef H005
#define H005
#include "cTriangle.cpp"
enum Colors
{
red=1,green,blue
};
class cColTriangle : public cTriangle
{
private:
Colors Color;
public:
cColTriangle(cPoint P1, cPoint P2, cPoint P3);
cColTriangle();
void SetColor(Colors C);
Colors GetColor();
void Set(cColTriangle F);
void out();
};
#endif
2. cColTriangle.cpp
#ifndef CPP005
#define CPP005
#include "cColTria.h"
cColTriangle::cColTriangle()
{
cTriangle T;
int i;
for (i=0;i<3;i++)
SetTopXY(i,T.GetX(i),T.GetY(i));
SetColor(red);
}
void cColTriangle::Set(cColTriangle F)
{
int i;
for (i=0;i<3;i++)
SetTopXY(i,F.GetX(i),F.GetY(i));
SetColor(F.GetColor());
}
cColTriangle::cColTriangle(cPoint P1, cPoint P2, cPoint P3)
{
cTriangle T(P1,P2,P3);
int i;
for (i=0;i<3;i++)
SetTopXY(i,T.GetX(i),T.GetY(i));
SetColor(red);
}
void cColTriangle::SetColor(Colors C)
{
Color = C;
}
Colors cColTriangle::GetColor()
{
return Color;
}
void cColTriangle::out()
{
cout<<"The ";
Colors CurColor;
CurColor = GetColor();
if (CurColor == blue)
cout<<"blue";
else if (CurColor == green)
cout<<"green";
else
cout<<"red";
cout<<" triangle:"<<endl;
int i;
for (i=0;i<3;i++)
GetTop(i).out();
cout<<endl<<endl;
}
#endif
3. cMapBoard.h
#ifndef H006
#define H006
#include "cPoint.cpp"
class cMapboard
{
private:
cPoint Center;
double Radius;
public:
cMapboard();
cMapboard(cPoint P, double R);
void SetCenter(cPoint P);
void SetRad(double R);
void Set(cPoint P, double R);
double GetX();
double GetY();
double GetRad();
~cMapboard();
int inv();
};
#endif
4. cMapBoard.cpp
#ifndef CPP006
#define CPP006
#include "cMapboard.h"
void cMapboard::SetCenter(cPoint P)
{
Center.SetXY(P.GetX(),P.GetY());
}
void cMapboard::SetRad(double R)
{
if ((R>0)&&(R<MAXFLOAT))
Radius = R;
else
Radius = 1;
}
void cMapboard::Set(cPoint P,double R)
{
SetCenter(P);
SetRad(R);
}
cMapboard::cMapboard()
{
cPoint P;
Set(P,1.0);
}
cMapboard::cMapboard(cPoint P,double R)
{
Set(P,R);
}
double cMapboard::GetX()
{
return Center.GetX();
}
double cMapboard::GetY()
{
return Center.GetY();
}
double cMapboard::GetRad()
{
return Radius;
}
int cMapboard::inv()
{
return ( (GetRad() > 0)&&(GetRad() < MAXFLOAT));
}
cMapboard::~cMapboard(){};
#endif
5. cTrOnBoard.h
#ifndef H007
#define H007
#include "List1.cpp"
#include "cMapboard.cpp"
class cTrOnBoard : public List , public cMapboard
{
public:
cTrOnBoard();
cTrOnBoard(cPoint P, double R);
int Correct(cColTriangle T);
void addontable(cColTriangle T);
void reform();
void SetNewCenter(cPoint P);
void SetNewRad(double R);
void boardout();
~cTrOnBoard();
};
#endif
6. cTrOnBoard.cpp
#ifndef CPP007
#define CPP007
#include "cTrOnBoard.h"
cTrOnBoard::cTrOnBoard()
{
First=NULL;
cPoint P(0,0);
double R = 1;
Set(P,R);
}
cTrOnBoard::cTrOnBoard(cPoint P, double R)
{
First=NULL;
Set(P,R);
}
int cTrOnBoard::Correct(cColTriangle T)
{
int A =
((T.GetTop(0)).Distance(GetX(),GetY()) <= GetRad() + 0.01) &&
((T.GetTop(1)).Distance(GetX(),GetY()) <= GetRad() + 0.01) &&
((T.GetTop(2)).Distance(GetX(),GetY()) <= GetRad() + 0.01);
return A;
}
void cTrOnBoard::addontable(cColTriangle T)
{
if (Correct(T))
add(T);
}
void cTrOnBoard::reform()
{
tobegin();
cColTriangle T;
if (!Empty())
while ((*current).GetNext() != First)
{
GetInf(T);
if (Correct(T))
move();
else
del();
};
if (!Empty())
{
GetInf(T);
if (!Correct(T))
del();
};
tobegin();
}
void cTrOnBoard::SetNewCenter(cPoint P)
{
SetCenter(P);
reform();
}
void cTrOnBoard::SetNewRad(double R)
{
SetRad(R);
reform();
}
void cTrOnBoard::boardout()
{
cout<<"The map-board center: ";
cPoint P(GetX(),GetY());
P.out();
cout<<endl<<"The map-board radius: "<<GetRad()<<endl<<endl;
out();
}
cTrOnBoard::~cTrOnBoard(){}
#endif
7. tester3.cpp
#include <stdio.h>
#include "cTrOnBoard.cpp"
void main()
{
cout.precision(3);
cPoint P(0,0),P1(1,0),P2(3,0),P3(2,1);
cColTriangle T1,T2(P1,P2,P3),T3;
T2.SetColor(green);
clrscr();
textcolor(GREEN);
cprintf("This program will show you few testes for the class named");
cout<<endl;
cprintf(" 'The ring list of colored isoscales triangles,");
cout<<endl;
cprintf(" placed on round map-board'");
cout<<endl<<endl;
getch();
textcolor(RED);
cprintf("RED COLOR");
textcolor(WHITE);
cprintf(" - action");
cout<<endl;
cprintf("WHITE COLOR - result");
cout<<endl<<endl<<endl;
getch();
textcolor(RED);
cprintf("initializing by arguments");
cout<<endl<<endl;
cTrOnBoard Board(P,10);
Board.boardout();
cout<<endl<<endl;
getch();
////////////////////////////////////////
cprintf("Adding 2 triangles(created by default and by arguments)");
cout<<endl<<endl;
Board.addontable(T1);
Board.addontable(T2);
Board.boardout();
cout<<endl;
getch();
////////////////////////////////////////
cprintf("Rotate ((1;0) (3;0) (2;1)) by ((3;0);-Pi/2)");
cout<<endl<<endl;
Board.move();
Board.GetCur(T3);
T3.Rotate(3,0,-1.57089632679);
Board.addontable(T3);
Board.boardout();
cout<<endl;
getch();
////////////////////////////////////////
cprintf("Change the ((1;0) (3;0) (2;1))'s color ");
cout<<endl<<endl;
Board.GetCur(T3);
T3.SetColor(blue);
Board.addontable(T3);
Board.boardout();
cout<<endl;
getch();
////////////////////////////////////////
cprintf("Try to add ((0;0) (11;0) (0;11))");
cout<<endl<<endl;
T1.Scale(11);
Board.addontable(T1);
Board.boardout();
cout<<endl;
getch();
////////////////////////////////////////
cprintf("Rotate ((0;0) (1;0) (0;1)) by ((-6;0);Pi)");
cout<<endl<<endl;
Board.GetCur(T3);
T3.Rotate(-6,0,3.14159265358);
Board.addontable(T3);
Board.boardout();
cout<<endl;
getch();
////////////////////////////////////////
cprintf("Change board center to (3;0)");
cout<<endl<<endl;
cPoint NC(3,0);
Board.Set(NC,Board.GetRad());
Board.boardout();
cout<<endl;
getch();
////////////////////////////////////////
cprintf("Change board radius to 1.5");
cout<<endl<<endl;
Board.SetNewRad(1.5);
Board.boardout();
cout<<endl;
getch();
////////////////////////////////////////
}
Вывод.
Разработана программа, отвечающая заданию и корректная с точностью до всех проведенных тестов.