Санкт-Петербургский Государственный Электротехнический
Университет «ЛЭТИ»
Кафедра МОЭВМ
Лабораторная работа №2 по
Объектно-ориентированному программированию
О Т Ч Е Т
Факультет КТИ
группа 3341
студент Худяков Я.
Санкт-Петербург
2006 г.
Постановка задачи.
Содержательная постановка задачи.
Реализовать минимальный необходимый набор классов для работы с какой-нибудь геометрической фигурой и со списком произвольного типа. Разработать программу, позволяющую тестировать созданные классы. В качестве основного объекта выбран равнобедренный треугольник. В программе используется циклический список.
Сценарий диалога с пользователем.
Тестирующая программа выполняет автоматически необходимые действия по тестированию методов классов и выводит соответствующие результаты на экран.
Описание программы.
Классовая структура.
В программе разработаны 4 класса:
класс «l1c1Point» - реализация точки
класс «l1c2Triangle» - реализация равнобедренного треугольника
класс «l1c3LiEl» - реализация элемента списка
класс «l1c4List1» - реализация циклического списка
cPoint
члены-данны
double x Декартова абсцисса
double y Декартова ордината
Int quantity Кол-во объектов
члены-функции
void inv Инвариант
void GetXY Селектор
void SetXY Модификатор
void Move Перемещение точки
void Rotate Поворот точки
ListEl
члены-данные
Typer Date Данные
ListEl* Next Ссылка на след.
члены-функции
Void GetFig Селектор данных
ListEl* GetNext Селектор ссылки на следующий
void GetNext Селектор ссылки на следующий
void SetEl Модификатор
void SetFig Модификатор данных
void SetNext Модификатор ссылки на след.
List1
члены-данные
ListEl* First Указатель на первый
ListEl* current Указатель на текущий
члены-функции
void move Перемещение по списку
Void add Добавление элемента
Void del Удаление элемента
Void out Вывод списка на экран
void GetCur Извлечение текущего
void GetInf Селектор
Void tobegin Возвращение в начало списка
int Empty Проверка на пустоту списка
cTriangle
члены-данные
List<cPoint> список точек
члены-функции
Int rb Проверка равнобедренности
Int correct Строгое н/в треугольника
float GetX Селектор абсциссы
float GetY Селектор ординаты
void Move Перемещение треугольника
void Rotate Поворот треугольника
void Scale Масштабирование треугольника
void Set модификатор
Характеристика программы.
Список файлов.
L1c1point.h, l1c1point.cpp класс точка
L1c2triangle.h, l1c2triangle.cpp класс треугольник
L1c3LiEl.h, l1c3LiEl.cpp класс элемент списка
L1c4List.h, l1c4List.cpp класс циклический однонаправленный список
tester.cpp тестирующая программа.
Исследование.
Все проведенные тесты показывают корректность работы программы. Представленная тестирующая программа демонстрирует работу интерфейсных функций.
Приложения.
Листинг исходного кода программы.
1. l1c1point.h
#ifndef IIIpointIII
#define IIIpointIII
#include <math.h>
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <values.h>
#include <conio.h>
class cPoint
{
private:
double x,y;
static int quantity;
public:
void inv() const;
void SetXY(const double x1,const double y1);
void Set(const cPoint &F);
void Move(const double dx,const double dy);
void GetXY(double &x1,double &y1) const;
int Getquantity();
double GetX() const;
double GetY() const;
void Rotate(const double x0,const double y0,const double alpha);
void Mirror(const double x0,const double y0);
double Distance(const double x0,const double y0) const;
void Out() const;
cPoint(const double x1,const double y1);
cPoint();
~cPoint ();//cout<<"Point ("<<x<<","<<y<<") deleted";}//Destructor
};
#endif
2. L1c1point.Cpp
#include "l1c1point.h"
int cPoint::quantity = 0;
cPoint::cPoint(const double x1,const double y1)
{
SetXY(x1,y1);
quantity++;
};
cPoint::cPoint()
{};
cPoint::~cPoint()
{
quantity--;
};
int cPoint::Getquantity()
{
return quantity;
};
void cPoint::inv() const
{
if ( (x > MAXFLOAT) || (x < -MAXFLOAT) || (y > MAXFLOAT) || (y < -MAXFLOAT))
{
clrscr();
cout<<"incorrect conditions";
getch();
exit(1);
}
}
void cPoint::GetXY(double &x1, double &y1) const
{
x1=x;
y1=y;
}//GetXY
void cPoint::Set(const cPoint &F)
{
SetXY(F.GetX(),F.GetY());
};
void cPoint::SetXY(const double x1,const double y1)
{
if ((x1 > MAXFLOAT)||(x1 < -MAXFLOAT)||(y1 > MAXFLOAT)||(y1 < -MAXFLOAT))
{
clrscr();
cout<<"incorrect conditions";
getch();
exit(1);
};
x=x1;
y=y1;
}//SetXY
void cPoint::Move(const double dx,const double dy)
{
if ((dx > MAXFLOAT)||(dx < -MAXFLOAT)||(dy > MAXFLOAT)||(dy < -MAXFLOAT))
{
clrscr();
cout<<"incorrect conditions";
getch();
exit(1);
};
inv();
double x1,y1;
GetXY(x1,y1);
x1+=dx;
y1+=dy;
SetXY(x1,y1);
inv();
}//Move
void cPoint::Rotate(const double x0,const double y0,const double alpha)
{
if ((x0 > MAXFLOAT)||(x0 < -MAXFLOAT)||(y0 > MAXFLOAT)||(y0 < -MAXFLOAT))
{
clrscr();
cout<<"incorrect conditions";
getch();
exit(1);
};
inv();
double x1,y1,c,s,x11,x12,y11,y12;
GetXY(x1,y1);
c=cos(alpha);
s=sin(alpha);
x11=(x1-x0)*c;
x12=(y1-y0)*s;
y11=(y1-y0)*c;
y12=(x1-x0)*s;
x1=x11-x12+x0;
y1=y11+y12+y0;
SetXY(x1,y1);
inv();
}//Rotate
void cPoint::Mirror(const double x0,const double y0)
{
inv();
if ((x0 > MAXFLOAT)||(x0 < -MAXFLOAT)||(y0 > MAXFLOAT)||(y0 < -MAXFLOAT))
{
clrscr();
cout<<"incorrect conditions";
getch();
exit(1);
};
double x1,y1;
GetXY(x1,y1);
x1=2*x0-x1;
y1=2*y0-y1;
SetXY(x1,y1);
inv();
}
double cPoint::GetX() const
{
return x;
}//GetX
double cPoint::GetY() const
{
return y;
}//GetY
double cPoint::Distance(const double x0,const double y0) const
{
if ((x0 > MAXFLOAT)||(x0 < -MAXFLOAT)||(y0 > MAXFLOAT)||(y0 < -MAXFLOAT))
{
clrscr();
cout<<"incorrect conditions";
getch();
exit(1);
};
inv();
double x1,y1,ans;
GetXY(x1,y1);
ans=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
if (ans>MAXFLOAT)
{
clrscr();
cout<<"incorrect result";
getch();
exit(1);
}
inv();
return ans;
}//Distance
void cPoint::Out() const
{
cout<<"("<<GetX()<<";"<<GetY()<<") ";
};
3. l1c3LiEl.h
#ifndef IIIlistelementIII
#define IIIlistelementIII
#include <stdio.h>
template <class Typer>
class ListEl
{
private:
Typer Date;
ListEl* Next;
// static int quantity;
public:
ListEl(Typer El,ListEl<Typer>* ListNext);
ListEl();
void GetFig(Typer &F) const;
ListEl* GetNext() const;
void GetNext(ListEl* &L) const;
void SetEl(const Typer El,ListEl<Typer>* ListNext);
void SetFig(const Typer El);
void SetNext(ListEl<Typer>* ListNext);
// int Getquant();
~ListEl();
};
#endif
4. l1c3liel.cpp
#ifndef IIIlielcppIII
#define IIIlielcppIII
#include "l1c3liel.h"
template <class Typer>
ListEl<Typer>::ListEl(Typer El,ListEl<Typer>* ListNext)
{
SetEl(El,ListNext);
};
template <class Typer>
ListEl<Typer>::ListEl()
{
Typer F;
SetFig(F);
SetNext(NULL);
}
template <class Typer>
void ListEl<Typer>::GetFig(Typer &F) const
{
F.Set(Date);
};
template <class Typer>
ListEl<Typer>* ListEl<Typer>::GetNext() const
{
return Next;
};
template <class Typer>
void ListEl<Typer>::GetNext(ListEl<Typer>* &L) const
{
L=Next;
};
template <class Typer>
void ListEl<Typer>::SetFig(const Typer El)
{
Date.Set(El);
};
template <class Typer>
void ListEl<Typer>::SetNext( ListEl<Typer>* ListNext)
{
Next=ListNext;
};
template <class Typer>
void ListEl<Typer>::SetEl(const Typer El,ListEl<Typer>* ListNext)
{
SetFig(El);
SetNext(ListNext);
};
template <class Typer>
ListEl<Typer>::~ListEl()
{};
#endif
5. l1c4list.h
#ifndef IIIlistIII
#define IIIlistIII
#include "l1c3liel.cpp"
#include <stdio.h>
template <class Typer>
class List
{
ListEl<Typer>* First;
ListEl<Typer>* current;
public:
List();
void tobegin();
void move();
void add(Typer F);
void del();
void out();
void GetCur(Typer &F);
void GetInf(Typer &F);
void SetInf(const Typer F);
int GetNum();
int Empty();
~List();
};
#endif
6. l1c4list.cpp
#ifndef IIIlistcppIII
#define IIIlistcppIII
#include "l1c4list.h"
template <class Typer>
List<Typer>::List()
{
First = NULL;
}
template <class Typer>
void List<Typer>::tobegin()
{
current=First;
};
template <class Typer>
void List<Typer>::move()
{
current=(*current).GetNext();
};
template <class Typer>
void List<Typer>::add(Typer F)
{
ListEl<Typer>* pNewEl;
pNewEl = new ListEl<Typer>;
(*pNewEl).SetFig(F);
if (Empty())
{
First = pNewEl;
(*First).SetNext(First);
}
else
{
ListEl<Typer>* P=First;
ListEl<Typer>* XY=(*First).GetNext();
tobegin();
while ((*P).GetNext() != First)
P = (*P).GetNext();
(*P).SetNext(pNewEl);
(*pNewEl).SetNext(First);
First = pNewEl;
};
tobegin();
};
template <class Typer>
void List<Typer>::del()
{
if (!Empty())
{
if (First == (*First).GetNext())
{
delete First;
First = NULL;
}
else
{
ListEl<Typer> *P=First;
while ((*P).GetNext() != current)
P = (*P).GetNext();
if (current == First)
First = P;
(*P).SetNext((*((*P).GetNext())).GetNext());
delete current;
};
tobegin();
}
};
template <class Typer>
void List<Typer>::out()
{
if (Empty())
cout<<"empty list";
else
{
ListEl<Typer> *P=First;
Typer F;
do
{
(*P).GetFig(F);
F.Out();
P = (*P).GetNext();
}
while (P != First);
};
};
template <class Typer>
void List<Typer>::GetCur(Typer &F)
{
(*current).GetFig(F);
del();
};
template <class Typer>
void List<Typer>::GetInf(Typer &F)
{
(*current).GetFig(F);
}
template <class Typer>
int List<Typer>::Empty()
{
return (First == NULL);
}
template <class Typer>
void List<Typer>::SetInf(const Typer F)
{
(*current).SetFig(F);
}
template <class Typer>
List<Typer>::~List()
{
delete First;
delete current;
}
#endif
