Лабораторная работа 3
.docМинистерство Образования Российской Федерации.
Санкт-Петербургский Государственный Электротехнический Университет «ЛЭТИ»
Кафедра МО ЭВМ
Лабораторная работа № 3
Выполнил: студент группы № 3341 Волков А.Н.
Проверил:
Санкт-Петербург
2006 год
Постановка задачи.
Содержательная постановка задачи.
На квадратном планшете реализовать размещение цветных треугольников
Уточнение постановки задачи.
Треугольники задаются списком из трех точек и цвета, при этом треугольник может быть произвольным.
Сценарий диалога с пользователем.
Тестирующая программа выполняет необходимые действия по тестированию методов классов и выводит текущие результаты на экран.
Разработка программы.
Разработка классов
Были разработаны необходимые для реализации Планшета класс треугольник, класс цветной треугольник, а также класс Квадратный планшет.
Для реализации данных классов активно использовались ранее разработанные классы.
Описание программы.
Классовая структура.
В программе разработаны 3 новых класса:
-
класс «cTriangle» - реализация треугольника
-
класс «cColTriangle» - реализация цветного треугольника
-
класс «cBoard» - реализация квадратного планшета
cBoard |
|||
члены-данные |
Члены-функции |
||
Er |
Список цветных тр-ков |
Correct |
Проверка треугольника |
|
|
addontable |
Проверка на возможность добавить треугольник |
|
|
reform |
Иодификатор планшета |
|
|
SetLi |
Модификатор списка треугольников |
|
|
Add |
Добавление треугольника |
|
|
boardout |
Вывод на экран состояние планшета |
cTriangle |
|||
члены-данные |
члены-функции |
||
Top |
Три вершины |
GetTopXY |
Селектор координат вершины |
|
|
SetTopXY |
Модификатор координат вершины |
|
|
GetTop |
Селектор вершины |
|
|
Move |
Движение треугольника |
|
|
Rotate |
Вращение треугольника |
|
|
Mirror |
Зеркальное отображение |
|
|
Scale |
Масштабирование |
|
|
GetX |
Модификатор абсциссы |
|
|
GetY |
Модификатор ординаты |
|
|
out |
Вывод состояния треугольника на экран |
cColTriangle |
|||
Члены-данные |
члены-функции |
||
Colors Color |
Цвета |
SetColor |
Модификатор цвета |
|
|
GetColor |
Селектор Цвета |
|
|
Set |
Установка треугольника |
|
|
Out |
Вывод треугольника на экран |
Характеристика программы.
Список файлов.
cpoint.h, cpoint.cpp класс точка
cfig.h, cfig.cpp класс квадрат
cLEl.h, cLiEl.cpp класс элемент списка
cList.h, cList.cpp класс циклический однонаправленный список
test3.cpp тестирующая программа.
ic.h дополнительный класс целого числа
ctria.h,ctria.cpp класс треугольник
ccoltria.h,ccoltria.cpp класс цветной треугольник
cboard.h,cboard.cpp класс квадратный планшет
Исследование.
Все проведенные тесты показывают корректность работы программы. Представленная тестирующая программа демонстрирует работу интерфейсных функций.
Приложения.
Листинг исходного кода программы.
СTRIA.H
#ifndef _triangle_
#define _triangle_
#include <conio.h>
#include <math.h>
#include <iostream.h>
#include <fstream.h>
#include "cPoint.cpp"
#include <values.h>
#include <stdlib.h>
class cTriangle
{
cPoint Top[3];
public:
cTriangle();
cTriangle(cPoint P1,cPoint P2,cPoint P3);
void GetTopXY(int i, double &x,double &y);
void SetTopXY(int i, double x, double y);
cPoint GetTop(int i);
void Move(double dx, double dy);
void Rotate(double x0,double y0, double a);
void Mirror(double x0, double y0);
void Scale(double coef);
double GetX(int i);
double GetY(int i);
void Set(cTriangle F);
void out();
~cTriangle() {};
};
#endif
CTRIA.CPP
#ifndef _trianglexe_
#define _trianglexe_
#include "cTria.h"
cTriangle::cTriangle()
{
double p1=0.0,p2=1.0;
Top[0].SetXY(p1,p1);
Top[1].SetXY(p2,p1);
Top[2].SetXY(p1,p2);
};
cTriangle::cTriangle(cPoint P1,cPoint P2,cPoint P3)
{
Top[0].SetXY(P1.GetX(),P1.GetY());
Top[1].SetXY(P2.GetX(),P2.GetY());
Top[2].SetXY(P3.GetX(),P3.GetY());
};
void cTriangle::GetTopXY(int i, double &x, double &y)
{
Top[i].GetXY(x,y);
}
double cTriangle::GetX(int i)
{
return Top[i].GetX();
}
double cTriangle::GetY(int i)
{
return Top[i].GetY();
}
void cTriangle::SetTopXY(int i, double x, double y)
{
Top[i].SetXY(x,y);
}
void cTriangle::Move(double dx,double dy)
{
Top[0].Move(dx,dy);
Top[1].Move(dx,dy);
Top[2].Move(dx,dy);
}
void cTriangle::Rotate(double x0,double y0,double a)
{
Top[0].Rotate(x0,y0,a);
Top[1].Rotate(x0,y0,a);
Top[2].Rotate(x0,y0,a);
}
void cTriangle::Mirror(double x0,double y0)
{
Top[0].Mirror(x0,y0);
Top[1].Mirror(x0,y0);
Top[2].Mirror(x0,y0);
}
void cTriangle::Scale(double coef)
{
double x,y;
if (!((coef<=MAXFLOAT)&&(coef>=-MAXFLOAT))) exit(1);
Top[0].GetXY(x,y);
x*=coef;
y*=coef;
Top[0].SetXY(x,y);
Top[1].GetXY(x,y);
x*=coef;
y*=coef;
Top[1].SetXY(x,y);
Top[2].GetXY(x,y);
x*=coef;
y*=coef;
Top[2].SetXY(x,y);
}
cPoint cTriangle::GetTop(int i)
{
cPoint P(GetX(i),GetY(i));
return P;
}
void cTriangle::Set(cTriangle F)
{
SetTopXY(0,F.GetX(0),F.GetY(0));
SetTopXY(1,F.GetX(1),F.GetY(1));
SetTopXY(2,F.GetX(2),F.GetY(2));
}
void cTriangle::out()
{
int i;
for (i=0;i<3;i++) {
Top[i].Out();Top[i].Out();
cout<<endl;}
}
#endif
CCOLTRIA.H
#ifndef _coltriangle_
#define _coltriangle_
#include "cTria.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
CCOLTRIA.CPP
#ifndef _coltriangleexe_
#define _coltriangleexe_
#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
CBOARD.H
CBOARD.CPP #ifndef _planshet_
#define _planshet_
#include "clist.cpp"
#include "cfig.cpp"
#include "ccoltria.cpp"
class cBoard : public List<cColTriangle>, public cFig
{
List<cColTriangle> Er;
public:
cBoard();
cBoard(const cPoint P1,const cPoint P2,const cPoint P3,const cPoint P4);
int Correct(cColTriangle T);
void addontable(cColTriangle T);
void reform();
void SetLi(List<cColTriangle> G)
{Er=G;}
void Add(cColTriangle T)
{
ListEl<cColTriangle> G;
G.SetDate(T);
Er.add(G);
}
void boardout();
~cBoard();
};
#endif
#ifndef _planshetexe_
#define _planshetexe_
#include "cBoard.h"
cBoard::cBoard()
{
Er.SetFirst(NULL);
List<cPoint> L;
L=GetL();
cPoint P5(0,0),P6(0,1),P7(1,0),P8(1,1);
ListEl<cPoint> G1,G2,G3,G4;
G1.SetDate(P5);G2.SetDate(P6);G3.SetDate(P7);G4.SetDate(P8);
L.add(G1);L.add(G2);L.add(G3);L.add(G4);
SetL(L);
}
cBoard::cBoard(const cPoint P1,const cPoint P2,const cPoint P3,const cPoint P4)
{
List<cPoint> L;
Er.SetFirst(NULL);
ListEl<cPoint> G1,G2,G3,G4;
G1.SetDate(P1);G2.SetDate(P2);G3.SetDate(P3);G4.SetDate(P4);
L.add(G1);L.add(G2);L.add(G3);L.add(G4);
if(correct()==0) {L.del();L.del();L.del();L.del();
cPoint P5(0,0),P6(0,1),P7(1,0),P8(1,1);
G1.SetDate(P5);G2.SetDate(P6);G3.SetDate(P7);G4.SetDate(P8);
L.add(G1);L.add(G2);L.add(G3);L.add(G4);
SetL(L);
}
}
int cBoard::Correct(cColTriangle T)
{
float X1,X2,X3,X4,Y1,Y2,Y3,Y4,a,b,c,d,e;
X1=GetX(2);
X2=GetX(4);
X3=GetX(3);
X4=GetX(1);
Y1=GetY(2);
Y2=GetY(4);
Y3=GetY(3);
Y4=GetY(1);
if(
((T.GetTop(0)).GetX()>=X1)&&
((T.GetTop(0)).GetX()>=X2)&&
((T.GetTop(0)).GetY()>=Y1)&&
((T.GetTop(0)).GetY()<=Y2)&&
((T.GetTop(1)).GetX()>=X1)&&
((T.GetTop(1)).GetX()>=X2)&&
((T.GetTop(1)).GetY()>=Y3)&&
((T.GetTop(1)).GetY()<=Y4)&&
((T.GetTop(2)).GetX()>=X3)&&
((T.GetTop(2)).GetX()>=X4)&&
((T.GetTop(2)).GetY()>=Y1)&&
((T.GetTop(2)).GetY()<=Y2)&&
((T.GetTop(2)).GetX()>=X3)&&
((T.GetTop(2)).GetX()>=X4)&&
((T.GetTop(2)).GetY()>=Y3)&&
((T.GetTop(2)).GetY()<=Y4)
) {return 1;}else{return 0;};
};
void cBoard::addontable(cColTriangle T)
{
if (Correct(T)){
List<cColTriangle> L;
ListEl<cColTriangle> G;
G.SetDate(T);
L.add(G);
SetLi(L);}
}
void cBoard::reform()
{
tobegin();
cColTriangle T;
if (!Empty())
while ( ((Er.GetCur()).GetNext() ) != (Er.GetFirst()) )
{
if (Correct(Er.GetInf()))
Er.move();
else
del();
};
if (!Empty())
{
if (!Correct(Er.GetInf()))
del();
};
Er.tobegin();
}
void cBoard::boardout()
{
cout<<endl<<"The map-board: ";cout<<endl<<endl;
Er.Out();
}
cBoard::~cBoard(){}
#endif