Разработка класса "Геометрическая фигура"
Формальная постановка задачи и спецификация программы. Сценарий диалога с пользователем. Разработка структур данных и алгоритмов. Таблица параметров и текст программы на языке C++. Тестирование программы с целью определения корректности ее работы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 07.07.2012 |
Размер файла | 27,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
- Оглавление
- 1) Исходная постановка задачи
- 2) Анализ задачи
- 3) Формальная постановка задачи
- 4) Спецификация программы
- 5) Сценарий диалога с пользователем
- 6) Разработка структур данных и алгоритмов
- 7) Таблица параметров функций программы
- 8) Текст прогаммы на языке C++
- 9) Тестирование программы
- 10) Итог
- 11) Вывод
- 1 Исходная постановка задачи
- Разработать и протестировать класс фигура, который должен:
- представлять фигуру согласно индивидуальному заданию (окружность, часть которой (сектор, в основании которого заданный угол) вырезана);
- использовать экземпляр класса точка в качестве члена-данного класса фигура;
- обладать интерфейсными проблемными функции: симметричное отражение фигуры, а также поворот фигуры на заданный угол (относительно заданных точек);
- обладать интерфейсной функцией, вычисляющей заданной фигуры по указанным параметрам.
2 Анализ задачи
Задача реализуется с использованием типа данных класс, на языке С++. В роли входных данных выступает фигура, описываемая центральной точкой (центр окружности), точкой на внешней границе фигуры (точка на окружности) и углом разворота сектора. Также входными параметрами являются точки, относительно которых осуществляется симметричное отражение и «поворот» фигуры. В качестве выходных параметров выступают параметры фигуры, изменённые вследствие исполнения проблемных функций.
3 Формальная постановка задачи
1. Входные данные:
CenFig : Point;
PtOnFig : Point;
SecAng : double;
2. Исходные данные:
CenFig :Point;
PtOnFig :Point;
SecAng :double;
3. Выходные данные
CenFig : Point;PtOnFig : Point;SecAng : double;
FigRad : double;AreaFigure : double;
4 Спецификация программы
1. Исходные данные:
2. В описании класса присутствует 4 атрибута класса: центр окружности (Point), точка на окружности (Point), угол в основании сектора (double) и радиус окружности (double). Доступ к членам-данным класса - “private”, что объясняется стремлением обезопасить класс от неконтролируемого метода доступа.
3. Функции программы при обработке исключительных ситуаций:
4. В программе реализован контроль на допустимый диапазон значений и формат входных данных.
5. Выходные данные:
Выходные данными также являются атрибуты класса.
5 Сценарий диалога с пользователем
Общая схема диалога: пользователю предлагается ввести параметры фигуры и затем выполнить действия в соответствии с индивидуальным заданием.
6 Разработка структур данных и алгоритмов
Решение данной задачи можно разбить на этапы:
1. Выбор членов-данных класса
2. Создание конструктора
3. Создание деструктора
4. Реализация функций ввода (и расчёта) параметров фигуры
5. Вывод значенийпараметров фигурына текущий момент
6. Осуществление поворота фигуры, относительно заданной точки
7. Построение симметричного отраженияфигуры относительно заданной точки
Модель структуры данных:
а) В программе описаны два класса: фигура(Figure) и точка (Point);
б) В описании класса Figureприсутствует 4 атрибута класса - центр окружности (Point), точка на окружности (Point), угол в основании сектора (double) и радиус окружности (double). Доступ к членам-данным класса - “private”, что объясняется стремлением обезопасить класс от неконтролируемого метода доступа.
в) Точки являются экземплярами класса Point, который был описан в предыдущей лабораторной работе “Разработка класса Точка.
в) Состав набора членов-функций определяется поставленными проблемными задачами. В данном случае в этот набор входят:
- конструктор/деструктор, для формирования и деинициализации экземпляров класса;
- вспомогательные функции вывода координат;
- функция инициализации параметров экземпляра класса;
- функция поворота фигурыотносительно заданной точки- для осуществления решения проблемы поворота;
- вспомогательные функцииввода/вывода параметров фигуры;
- функция симметричного отражения фигуры относительно заданной точки- для осуществления решения проблемы построения симметричной точки.
7 Параметры функций программы
Тип |
Имя функции |
Назначение |
Параметры |
Сообщения в ходе выполнения |
Предусловие |
Постусловие |
||
Входные |
Выходные |
|||||||
void |
RotateFig |
Поворот фигуры на заданный угол |
(Figure &, int) |
- |
Сообщения: - о работе конструктора и деструктора; - диалог ввода координат; - диалог ввода угла поворота. |
Существует экземпляр класса Figure |
Изменены значения CenFig и PtOnFig |
|
void |
CalcRadCirc |
Расчёт радиуса фигуры |
- |
- |
- |
Существует экземпляр класса Figure |
Изменено значениеFigRad |
|
void |
GetParamFigure |
Вывод значений параметров фигуры |
(Figure&) |
- |
Значения параметров фигуры |
Существует экземпляр класса Figure |
- |
|
void |
GetCoordPt |
Вывод значения координат точки |
(Point&) |
- |
Координаты точки |
Существует экземпляр класса Point |
- |
|
double |
SetAngle |
Инициализация угла в основании сектора |
- |
double |
Диалог ввода угла в основании сектора и сообщения о корректности данных |
- |
Изменено значение SecAng |
|
void |
SetFigure |
Инициализация параметров фигуры |
(Point&, Point&) |
void |
Диалог ввода угла в основании сектора и сообщения о корректности данных |
Существуют экземпляры класса Point |
Изменены значения CenFig, PtOnFig, SecAng, FigRad |
|
void |
AreaFigure |
Расчёт площади фигуры |
(Figure&) |
void |
Вывод величины площади фигуры |
Существует экземпляр класса Figure |
- |
|
Figure |
Конструктор, для формирования экземпляра |
(Point&, Point&, double) |
- |
Сообщения о работе конструктора |
- |
Создан экземпляр класса с инициализированными членами класса |
||
~Point |
Деструктор, для деинициализации экземпляра |
- |
- |
Сообщение о работе деструктора |
Существует экземпляр класса |
Удален экземпляр из памяти |
||
void |
main |
Главная функция |
- |
- |
- |
- |
Программа выполнена |
8 Текст программы на языке C++
ФайлMain.CPP:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <time.h>
#include "Point.h"
#include "Figure.h"
// File: Figure.cpp
// Project: Class of figure
// Author: Kupriyanov N.N.
// Date: 04.07.2012 Version 1.0
voidMainMenu() //Функция вывода главного меню программы
{
clrscr();
puts(" Menu:");
puts("1 - Initialize the figure");
puts("2 - Output parameters initialized figures");
puts("3 - Construct a symmetrical reflection to figure");
puts("4 - Expand the figure at a given angle");
puts("5 - About program");
puts("0 - Exit");
};
void main()
{
charch = NULL;
int flag = 0;
clrscr();
cout<< " Project: The class of figure" <<endl
<< " Author: Kupriyanov N.N." <<endl
<< " Date: 04.07.2012 Version 1.0" <<endl
<<endl<<endl
<< " This program on the set parametres of"
<< " a figure counts its square, and also " <<endl
<< "carries out turn and symmetric reflexion "
<< "of a figure."<<endl;
printf("\n\nPlease press Enter\n");
do
{
ch = getch();
}while(ch != 13);
Point Cen(0,0);
Point PtOnSh(0,0);
Figure Shape(Cen,PtOnSh,0);
do
{
MainMenu();
cout<<endl<< "User response - ";
fflush(stdin);
scanf("%c",&ch);
switch(ch)
{
case '1':
{
clrscr();
cout<< "Please enter the coordinates of the center figure" <<endl;
Cen.SetCoord('P');
clrscr();
cout<< "Please enter the coordinates of points on the "
<< "outer boundary of a shape (circle)";
PtOnSh.SetCoord('P');
Shape.SetFigure(Cen,PtOnSh);
flag = 1;
break;
}
case '2':
{
if(flag)
{
clrscr();
Shape.GetParamFigure(Shape);
}
else
printf("\n\n >>Please enter the parameters figure<<");
getch();
break;
}
case '3':
{
if(flag)
{
clrscr();
Shape.RotateFig(Shape,0);
puts("");
Shape.GetParamFigure(Shape);
}
else
printf("\n\n >>Please enter the parameters figure<<");
getch();
break;
}
case '4':
{
if(flag)
{
clrscr();
Shape.RotateFig(Shape,1);
puts("");
Shape.GetParamFigure(Shape);
}
else
printf("\n\n >>Please enter the parameters figure<<");
getch();
break;
}
case '5':
{
clrscr();
puts("File: Figure.exe");
puts("Project: The class of point");
puts("Author: Kupriyanov N.N.");
puts("Date: 04.07.2012 Version 1.0");
getch();
break;
}
}
}while(ch!='0');
}
ФайлFigure.h:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <time.h>
// File: Figure.h
// Project: Class of figure
// Author: Kupriyanov N.N.
// Date: 03.07.2012 Version 1.0
class Figure
{
private:
PointCenFig; //Центр окружности
PointPtOnFig; //Точка на кружности
doubleSecAng; //Угол разворота сектора (образован между точками 1 и 2)
doubleFigRad; //Радиус окружности
voidCalcRadCirc(); //Расчёт радиуса окружности
public:
voidSetFigure(Point&, Point&); //Инициализация параметров фигуры
Figure(Point &, Point &, double); //Конструкторэкземплярафигуры
~Figure(); //Деструкторэкземплярафигуры
voidAreaFigure(Figure &); //Площадьфигуры
voidGetParamFigure(Figure &); //Выводпараметровфигуры
doubleSetAngle(); //Вводугла в основаниисектора
voidGetCoordPt(Point &); //Выводкоординатыточки
voidRotateFig(Figure &, int); //Повернутьфигуру
};
void Figure::GetParamFigure(Figure &Shape)
{
cout<< "Parameters of the figure:" <<endl
<< "Coordinate centre of figure = ";
this->GetCoordPt(this->CenFig);
cout<<endl
<< "Coordinate point on circle = ";
this->GetCoordPt(this->PtOnFig);
cout<<endl
<< "The angle at the base of the sector = " << this->SecAng<<endl
<< "Radius of figure = " << this->FigRad<<endl;
this->AreaFigure(Shape);
}
void Figure::AreaFigure(Figure &Shape)
{
double square;
if((this->SecAng*180/M_PI) > 360)
cout<< "Area of ??the figure is = "
<<square;
else
square = pow(this->FigRad,2)*(2*M_PI - this->SecAng)/2;
cout<< "Area of the figure is = "
<<square;
}
void Figure::RotateFig(Figure &Shape, int j)
{
double Angle;
Point Rotate(0,0);
cout<< "Please enter the coordinates of the point around which "
<< "to make his turn" <<endl;
Rotate.SetCoord('P');
if(j)
{
cout<<endl
<< "Please enter a corner where you want to rotate a shape - ";
cin>> Angle;
}
else
Angle = M_PI;
this->CenFig.RotatePoint(Rotate, Angle, j);
this->PtOnFig.RotatePoint(Rotate, Angle, j);
}
void Figure::SetFigure(Point &Centre, Point &OnFigure)
{
this->CenFig = Centre;
this->PtOnFig = OnFigure;
this->SecAng = this->SetAngle();
this->CalcRadCirc();
}
double Figure::SetAngle()
{
double Angle;
charstr[2];
clrscr();
for(;;)
{
cout<< "Please enter a corner at the base of the sector " <<
"(in radians): ";
intnum = scanf("%lf""%1[^\n]""%*[^\n]", &Angle, str);
if (num != 1)
{
printf("\n>>Only digits and only one number allowed!<<\n");
getch();
if (num == 0)
scanf("%*[^\n]");
}
else
if (Angle < 0 || Angle > 2*M_PI)
{
cout<<endl<< ">>corner at the base of the sector must be " <<
"greater than 0 and less than 2*Pi<<" <<endl;
getch();
}
else
break;
}
return Angle;
}
Figure::Figure(Point &Cen, Point &Pt, double Ang) : CenFig(Cen), PtOnFig(Pt), SecAng(Ang)
{
time_t seconds = time(NULL);
tm* timeinfo = localtime(&seconds);
this->CalcRadCirc();
cout<<endl<<endl
<<asctime(timeinfo)
<< "Figure:" <<endl
<< "Coordinate centre of figure = ";
this->GetCoordPt(this->CenFig);
cout<<endl
<< "Coordinate point on circle = ";
this->GetCoordPt(this->PtOnFig);
cout<<endl
<< "The angle at the base of the sector = " << this->SecAng<<endl
<< "Radius of figure = " << this->FigRad<<endl
<< "Figure."<<endl<<endl;
getch();
}
Figure::~Figure()
{
time_t seconds = time(NULL);
tm* timeinfo = localtime(&seconds);
cout<<endl<<endl
<<asctime(timeinfo)
<< "~Figure:" <<endl
<< "Coordinate centre of figure = ";
this->GetCoordPt(this->CenFig);
cout<<endl
<< "Coordinate point on circle = ";
this->GetCoordPt(this->PtOnFig);
cout<<endl
<< "Angle of a turn of sector = " << this->SecAng<<endl
<< "Radius of figure = " << this->FigRad<<endl
<< "~Figure."<<endl<<endl;
getch();
}
void Figure::CalcRadCirc()
{
double X0, Y0, X1, Y1;
this->CenFig.ConvertToXY(&X0,&Y0);
this->PtOnFig.ConvertToXY(&X1,&Y1);
this->FigRad = sqrt(pow((X1-X0),2)+pow((Y1-Y0),2));
}
void Figure::GetCoordPt(Point &Pt)
{
Pt.GetRF();
}
ФайлPoint.h:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <time.h>
#include <time.h>
// File: Point.h
// Project: Class of figure
// Author: Kupriyanov N.N.
// Date: 03.07.2012 Version 1.0
class Point
{
private:
doubleCoordRO; //Ро - радиальнаякоординататочки
doubleCoordFi; //Фи - угловая координата точки
intQu;
public:
Point(){};
voidConvertToRF(double, double); //Преобразование в полярные координаты экземпляра класса
voidConvertToXY(double*, double*); //Преобразование в декартовы координаты экземпляра класса
voidSetQuiet(int);
Point(double, double);//Конструкторэкземпляракласса
~Point();//Деструкторэкземпляракласса
voidGetCoordRO() const; //Выводрадиальнойкоординатыэкземпляракласса
voidGetCoordFi() const;//Выводугловойкоординатыэкземпляракласса
doubleSetCoord(char); //Задать координату для экземпляра класса
voidRotatePoint(Point&, double, int); //Осуществить поворот экземпляра класса
voidGetRF();
};
void Point::GetRF()
{
cout<< "RO: " <<CoordRO<< " Fi: " <<CoordFi;
}
void Point::SetQuiet(int q)
{
if(!q)
Qu = 0;
else
Qu = 1;
}
Point::Point(double CoordX, double CoordY)
{
time_t seconds = time(NULL);
tm* timeinfo = localtime(&seconds);
this->ConvertToRF(CoordX, CoordY);
this->SetQuiet(0);
if(Qu)
{
cout<<endl<<endl
<<asctime(timeinfo)
<< "Point:" <<endl
<< "RO = " << this->CoordRO<<endl
<< "Fi = " << this->CoordFi<<endl
<< "Point."<<endl<<endl;
getch();
}
}
Point::~Point()
{
time_t seconds = time(NULL);
tm* timeinfo = localtime(&seconds);
this->SetQuiet(0);
if(Qu)
{
cout<<endl<<endl
<<asctime(timeinfo)
<< "~Point:" <<endl
<< "RO = " << this->CoordRO<<endl
<< "Fi = " << this->CoordFi<<endl
<< "~Point."<<endl<<endl;
getch();
}
}
void Point::RotatePoint(Point &Second, double Angle, int j)
{
doubleCrdX, CrdY, X, Y;
doubleCoordX, CoordY;
ConvertToXY(&CoordX, &CoordY);
Second.ConvertToXY(&X, &Y);
CrdX = X + (CoordX - X)*cos(Angle) - (CoordY - Y)*sin(Angle);
CrdY = Y + (CoordX - X)*sin(Angle) + (CoordY - Y)*cos(Angle);
ConvertToRF(CrdX,CrdY);
}
void Point::ConvertToXY(double *CoordX, double *CoordY)
{
*CoordX = CoordRO*cos(CoordFi);
*CoordY = CoordRO*sin(CoordFi);
}
void Point::ConvertToRF(double CoordX, double CoordY)
{
CoordRO = sqrt(pow(CoordX,2)+pow(CoordY,2));
if(CoordX> 0)
{
if(CoordY>= 0)
CoordFi = atan(CoordY/CoordX);
else
CoordFi = atan(CoordY/CoordX) + 2*M_PI;
}
else
if(CoordX< 0)
CoordFi = atan(CoordY/CoordX) + M_PI;
else
if(CoordY> 0)
CoordFi = M_PI/2;
else
if(CoordY< 0)
CoordFi = 3*M_PI/2;
else
CoordFi = 0;
}
void Point::GetCoordRO() const
{
cout<< "The radial coordinate of the point - RO: " <<CoordRO<<endl;
}
void Point::GetCoordFi() const
{
cout<< "The angular coordinate of a point in radians - Fi: " <<CoordFi<<endl;
}
double Point::SetCoord(char ch)
{
charstr[2]; // Будем вводить макс. один символ для проверки наличия лишнего
double work = NULL;
switch(ch)
{
case 'P':
{
doubleCoordX = NULL, CoordY = NULL;
for(;;)
{
cout<<endl<< "Please enter a value of X coordinate (numeric) - ";
intnum = scanf("%lf""%1[^\n]""%*[^\n]", &CoordX, str);
if (num != 1)
{
printf("\n>>Only digits and only one number allowed!<<\n");
getch();
if (num == 0)
scanf("%*[^\n]");
}
else
break; // Из for(;;)
}
for(;;)
{
cout<<endl<< "Please enter a value of Y coordinate (numeric) - ";
intnum = scanf("%lf""%1[^\n]""%*[^\n]",&CoordY,str);
if (num != 1)
{
printf("\n>>Only digits and only one number allowed!<<\n");
getch();
if (num == 0)
scanf("%*[^\n]");
}
else
break;
}
this->ConvertToRF(CoordX, CoordY);
return 0;
}
case 'F':
{
for(;;)
{
clrscr();
cout<< "Enter the angular coordinate of a point " <<
"(in radians) - Fi: ";
intnum = scanf("%lf""%1[^\n]""%*[^\n]", &work, str);
if (num != 1)
{
printf("\n>>Only digits and only one number allowed!<<\n");
getch();
if (num == 0)
scanf("%*[^\n]");
}
else
if (work < 0 || work > 2*M_PI)
{
cout<<endl<< ">>Radial coordinate of the point must be " <<
"be greater than 0 and less than 2*Pi<<" <<endl;
getch();
}
else
break;
}
return work;
}
}
return 0;
}
программа геометрическая фигура
9 Тестирование программы
Производится тестирование программы с целью ее отладки и определения корректности ее работы. Тестирование проводится по принципу черного ящика. Проверяется работоспособность функций поворота и создания симметричной фигуры относительно заданной точки.
Метод классов эквивалентности:
№ |
(X0,Y0) |
(X1,Y1) |
Angle |
Area |
(.) sim |
(RO,Fi) |
(RO',Fi') |
Radius |
|
1. |
(1;1) |
(0;0) |
0.785 |
5.49819 |
(5,5) |
12.7279 0.785398 |
14.1421 0.785398 |
1.41421 |
|
2. |
(3;4) |
(4;12) |
0.314 |
193.999 |
(-1,-6) |
16.7631 4.4095 |
24.7386 4.46741 |
193.999 |
|
3. |
(100;1000) |
(100;-700) |
5.781 |
725658 |
(33,18) |
964.599 4.67713 |
736.785 1.64696 |
1700 |
|
4. |
(-150;-5) |
(70,-49) |
6.211 |
1816.76 |
(0,22;1.76) |
150.681 0.056573 |
87.1604 2.49488 |
224.357 |
№ |
(X0,Y0) |
(X1,Y1) |
Angle |
(X,Y) |
Rotate |
(RO,Fi) |
(RO',Fi') |
Area |
|
1. |
(1;1) |
(0;0) |
0.785 |
(5,5) |
0.14 |
1.66815 0.292474 |
0.989141 5.56779 |
5.49819 |
|
2. |
(3;4) |
(4;12) |
0.314 |
(-1,-6) |
4.569 |
14.1069 5.34369 |
21.025 5.58466 |
193.999 |
|
3. |
(100;1000) |
(100;-700) |
5.781 |
(33,18) |
2.356 |
947.615 3.86724 |
756.171 0.85986 |
725658 |
|
4. |
(-150;-5) |
(70,-49) |
6.211 |
(0,22;1.76) |
5.555 |
151.32 2.44844 |
84.6179 4.93305 |
1816.76 |
10 Итог
Общее количество строк текста: 208+168+122 = 498;
Количество строк комментариев, занимающих отдельные строки: 14;
Количество пустых строк: 38.
11 Вывод
Разработанная программа отвечает поставленным требованиям. Работоспособность программы подтверждается разработчиком на основании и тестирования основных функций программы. Несомненными достоинствами класса является легкая интегрируемость за счет понятности текста класса, удобство и надежность.
Размещено на Allbest.ru
Подобные документы
Разработка и тестирование программы класса Точка. Спецификация программы. Сценарий диалога с пользователем. Разработка структур данных и алгоритмов. Таблица параметров функций программы. Текст программы на языке C++. Особенности тестирования программы.
лабораторная работа [43,1 K], добавлен 21.07.2012Изучение условий поставленной задачи и используемых данных для разработки программы хранения информации о рейсах поезда. Описание разработанных функций, листинга, блок-схем алгоритмов и дерева функции. Рассмотрение сценария диалога данной программы.
курсовая работа [532,7 K], добавлен 20.07.2014Графическая схема алгоритма выполнения программы определения запасов сырья. Решение задачи с помощью программы MS Excel. Разработка макроса для построения диаграммы. Использование интерфейса программы для работы с таблицей. Разработка базы данных.
курсовая работа [1,2 M], добавлен 24.04.2014Разработка эскизного и технического проектов программы, моделирующей игру "Кости". Постановка задачи, описание алгоритма; написание программы, организация входных и выходных данных; выбор программных средств; спецификация, текст, условия выполнения.
курсовая работа [93,8 K], добавлен 11.02.2012Введение в объектно-ориентированное программирование. Постановка задачи. Описание алгоритма решения в псевдокоде (команды в виде текста на русском языке). Исходный текст программы на С. Тестирование программы. Модификация программы. Полиморфизм.
курсовая работа [294,0 K], добавлен 08.09.2008Вычисление площади геометрических фигур с помощью интегрального исчисления. Основные свойства площади как функции. Разработка алгоритма работы программы на языке Object-Pascal в среде Delphi. Текст программы, порядок ее запуска и полученный результат.
курсовая работа [281,0 K], добавлен 06.06.2013Этапы процедуры принятия решений. Разработка математического алгоритма. Блок-схема алгоритма работы программы. Разработка программы на языке программирования С++ в среде разработки MFC. Текст программы определения технического состояния станка с ЧПУ.
курсовая работа [823,0 K], добавлен 18.12.2011Использование класса статических массивов структур и базы данных "ODER" при создании программы на языке С++. Основные формы выдачи результатов. Технические и программные средства. Тесты для проверки работоспособности алгоритма создания программы.
курсовая работа [1,1 M], добавлен 17.03.2015Составление транслятора на языке С для перевода кода программы из языка Pascal в код программы на языке Cи. Распознавание и перевод конструкций: for, type, function, integer. Вешняя спецификация, описание, структура, текст программы; распечатка текстов.
курсовая работа [287,8 K], добавлен 24.06.2011Разработка эскизного и технического проектов программы, ее назначение и область применения, технические характеристики. Организация входных и выходных данных, выбор состава технических и программных средств. Текст программы, ее описание и тестирование.
курсовая работа [1,3 M], добавлен 15.11.2009