Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Оглавление
1) Исходная постановка задачи
) Анализ задачи
) Формальная постановка задачи
) Спецификация программы
) Сценарий диалога с пользователем
) Разработка структур данных и алгоритмов
) Таблица параметров функций программы
) Текст прогаммы на языке C++
) Тестирование программы
) Итог
11) Вывод
1 Исходная постановка задачи
Разработать и протестировать класс фигура, который должен:
- представлять фигуру согласно индивидуальному заданию (окружность, часть которой (сектор, в основании которого заданный угол) вырезана);
- использовать экземпляр класса точка в качестве члена-данного класса фигура;
- обладать интерфейсными проблемными функции: симметричное отражение фигуры, а также поворот фигуры на заданный угол (относительно заданных точек);
- обладать интерфейсной функцией, вычисляющей заданной фигуры по указанным параметрам.
Анализ задачи
Задача реализуется с использованием типа данных класс, на языке С++. В роли входных данных выступает фигура, описываемая центральной точкой (центр окружности), точкой на внешней границе фигуры (точка на окружности) и углом разворота сектора. Также входными параметрами являются точки, относительно которых осуществляется симметричное отражение и «поворот» фигуры. В качестве выходных параметров выступают параметры фигуры, изменённые вследствие исполнения проблемных функций.
Формальная постановка задачи
1. Входные данные:
CenFig : Point;: Point;: double;
2. Исходные данные:
CenFig :Point;:Point;:double;
3. Выходные данные
CenFig : Point;PtOnFig : Point;SecAng : double;: double;AreaFigure : double;
4 Спецификация программы
1. Исходные данные:
2. В описании класса присутствует 4 атрибута класса: центр окружности (Point), точка на окружности (Point), угол в основании сектора (double) и радиус окружности (double). Доступ к членам-данным класса - “private”, что объясняется стремлением обезопасить класс от неконтролируемого метода доступа.
3. Функции программы при обработке исключительных ситуаций:
4. В программе реализован контроль на допустимый диапазон значений и формат входных данных.
. Выходные данные:
Выходные данными также являются атрибуты класса.
Сценарий диалога с пользователем
Общая схема диалога: пользователю предлагается ввести параметры фигуры и затем выполнить действия в соответствии с индивидуальным заданием.
6 Разработка структур данных и алгоритмов
Решение данной задачи можно разбить на этапы:
1. Выбор членов-данных класса
2. Создание конструктора
. Создание деструктора
. Реализация функций ввода (и расчёта) параметров фигуры
. Вывод значенийпараметров фигурына текущий момент
. Осуществление поворота фигуры, относительно заданной точки
. Построение симметричного отраженияфигуры относительно заданной точки
Модель структуры данных:
а) В программе описаны два класса: фигура(Figure) и точка (Point);
б) В описании класса Figureприсутствует 4 атрибута класса - центр окружности (Point), точка на окружности (Point), угол в основании сектора (double) и радиус окружности (double). Доступ к членам-данным класса - “private”, что объясняется стремлением обезопасить класс от неконтролируемого метода доступа.
в) Точки являются экземплярами класса Point, который был описан в предыдущей лабораторной работе “Разработка класса Точка.
в) Состав набора членов-функций определяется поставленными проблемными задачами. В данном случае в этот набор входят:
- конструктор/деструктор, для формирования и деинициализации экземпляров класса;
- вспомогательные функции вывода координат;
- функция инициализации параметров экземпляра класса;
- функция поворота фигурыотносительно заданной точки- для осуществления решения проблемы поворота;
- вспомогательные функцииввода/вывода параметров фигуры;
- функция симметричного отражения фигуры относительно заданной точки- для осуществления решения проблемы построения симметричной точки.
Параметры функций программы
Тип |
Имя функции |
Назначение |
Параметры |
Сообщения в ходе выполнения |
Предусловие |
Постусловие |
|
Входные |
Выходные |
||||||
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() //Функция вывода главного меню программы
{();(" Menu:");("1 - Initialize the figure");("2 - Output parameters initialized figures");("3 - Construct a symmetrical reflection to figure");("4 - Expand the figure at a given angle");("5 - About program");("0 - Exit");
};main()
{= NULL;flag = 0;();<< " 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;("\n\nPlease press Enter\n");
{= getch();
}while(ch != 13);Cen(0,0);PtOnSh(0,0);Shape(Cen,PtOnSh,0);
{();<<endl<< "User response - ";(stdin);("%c",&ch);(ch)
{'1':
{();<< "Please enter the coordinates of the center figure" <<endl;.SetCoord('P');();<< "Please enter the coordinates of points on the "
<< "outer boundary of a shape (circle)";.SetCoord('P');.SetFigure(Cen,PtOnSh);= 1;;
}'2':
{(flag)
{();.GetParamFigure(Shape);
}("\n\n >>Please enter the parameters figure<<");();;
}'3':
{(flag)
{();.RotateFig(Shape,0);("");.GetParamFigure(Shape);
}("\n\n >>Please enter the parameters figure<<");();;
}'4':
{(flag)
{();.RotateFig(Shape,1);("");.GetParamFigure(Shape);
}("\n\n >>Please enter the parameters figure<<");();;
}'5':
{();("File: Figure.exe");("Project: The class of point");("Author: Kupriyanov N.N.");("Date: 04.07.2012 Version 1.0");();;
}
}
}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.0Figure
{:; //Центр окружности
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); //Повернутьфигуру
};Figure::GetParamFigure(Figure &Shape)
{<< "Parameters of the figure:" <<endl
<< "Coordinate centre of figure = ";>GetCoordPt(this->CenFig);<<endl
<< "Coordinate point on circle = ";>GetCoordPt(this->PtOnFig);<<endl
<< "The angle at the base of the sector = " << this->SecAng<<endl
<< "Radius of figure = " << this->FigRad<<endl;>AreaFigure(Shape);
}Figure::AreaFigure(Figure &Shape)
{square;((this->SecAng*180/M_PI) > 360)<< "Area of the figure is = "
<<square;= pow(this->FigRad,2)*(2*M_PI - this->SecAng)/2;<< "Area of the figure is = "
<<square;
}Figure::RotateFig(Figure &Shape, int j)
{Angle;Rotate(0,0);<< "Please enter the coordinates of the point around which "
<< "to make his turn" <<endl;.SetCoord('P');(j)
{<<endl
<< "Please enter a corner where you want to rotate a shape - ";>> Angle;
}= M_PI;>CenFig.RotatePoint(Rotate, Angle, j);>PtOnFig.RotatePoint(Rotate, Angle, j);
}Figure::SetFigure(Point &Centre, Point &OnFigure)
{>CenFig = Centre;>PtOnFig = OnFigure;>SecAng = this->SetAngle();>CalcRadCirc();
}Figure::SetAngle()
{Angle;[2];();(;;)
{<< "Please enter a corner at the base of the sector " <<
"(in radians): ";= scanf("%lf""%1[^\n]""%*[^\n]", &Angle, str);(num != 1)
{("\n>>Only digits and only one number allowed!<<\n");();(num == 0)("%*[^\n]");
}(Angle < 0 || Angle > 2*M_PI)
{<<endl<< ">>corner at the base of the sector must be " <<
"greater than 0 and less than 2*Pi<<" <<endl;();
};
}Angle;
}::Figure(Point &Cen, Point &Pt, double Ang) : CenFig(Cen), PtOnFig(Pt), SecAng(Ang)
{_t seconds = time(NULL);* timeinfo = localtime(&seconds);>CalcRadCirc();<<endl<<endl
<<asctime(timeinfo)
<< "Figure:" <<endl
<< "Coordinate centre of figure = ";>GetCoordPt(this->CenFig);<<endl
<< "Coordinate point on circle = ";>GetCoordPt(this->PtOnFig);<<endl
<< "The angle at the base of the sector = " << this->SecAng<<endl
<< "Radius of figure = " << this->FigRad<<endl
<< "Figure."<<endl<<endl;();
}::~Figure()
{_t seconds = time(NULL);* timeinfo = localtime(&seconds);<<endl<<endl
<<asctime(timeinfo)
<< "~Figure:" <<endl
<< "Coordinate centre of figure = ";>GetCoordPt(this->CenFig);<<endl
<< "Coordinate point on circle = ";>GetCoordPt(this->PtOnFig);<<endl
<< "Angle of a turn of sector = " << this->SecAng<<endl
<< "Radius of figure = " << this->FigRad<<endl
<< "~Figure."<<endl<<endl;();
}Figure::CalcRadCirc()
{X0, Y0, X1, Y1;>CenFig.ConvertToXY(&X0,&Y0);>PtOnFig.ConvertToXY(&X1,&Y1);>FigRad = sqrt(pow((X1-X0),2)+pow((Y1-Y0),2));
}Figure::GetCoordPt(Point &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.0Point
{:; //Ро - радиальнаякоординататочки; //Фи - угловая координата точки;:(){};(double, double); //Преобразование в полярные координаты экземпляра класса(double*, double*); //Преобразование в декартовы координаты экземпляра класса(int);(double, double);//Конструкторэкземпляракласса
~Point();//Деструкторэкземпляракласса() const; //Выводрадиальнойкоординатыэкземпляракласса() const;//Выводугловойкоординатыэкземпляракласса(char); //Задать координату для экземпляра класса
voidRotatePoint(Point&, double, int); //Осуществить поворот экземпляра класса
voidGetRF();
};Point::GetRF()
{<< "RO: " <<CoordRO<< " Fi: " <<CoordFi;
}Point::SetQuiet(int q)
{(!q)= 0;= 1;
}::Point(double CoordX, double CoordY)
{_t seconds = time(NULL);* timeinfo = localtime(&seconds);>ConvertToRF(CoordX, CoordY);>SetQuiet(0);(Qu)
{<<endl<<endl
<<asctime(timeinfo)
<< "Point:" <<endl
<< "RO = " << this->CoordRO<<endl
<< "Fi = " << this->CoordFi<<endl
<< "Point."<<endl<<endl;();
}
}::~Point()
{_t seconds = time(NULL);* timeinfo = localtime(&seconds);>SetQuiet(0);(Qu)
{<<endl<<endl
<<asctime(timeinfo)
<< "~Point:" <<endl
<< "RO = " << this->CoordRO<<endl
<< "Fi = " << this->CoordFi<<endl
<< "~Point."<<endl<<endl;();
}
}Point::RotatePoint(Point &Second, double Angle, int j)
{, CrdY, X, Y;, CoordY;(&CoordX, &CoordY);.ConvertToXY(&X, &Y);= X + (CoordX - X)*cos(Angle) - (CoordY - Y)*sin(Angle);= Y + (CoordX - X)*sin(Angle) + (CoordY - Y)*cos(Angle);(CrdX,CrdY);
}Point::ConvertToXY(double *CoordX, double *CoordY)
{
*CoordX = CoordRO*cos(CoordFi);
*CoordY = CoordRO*sin(CoordFi);
}Point::ConvertToRF(double CoordX, double CoordY)
{= sqrt(pow(CoordX,2)+pow(CoordY,2));(CoordX> 0)
{(CoordY>= 0)= atan(CoordY/CoordX);= atan(CoordY/CoordX) + 2*M_PI;
}(CoordX< 0)= atan(CoordY/CoordX) + M_PI;(CoordY> 0)= M_PI/2;(CoordY< 0)= 3*M_PI/2;= 0;
}Point::GetCoordRO() const
{<< "The radial coordinate of the point - RO: " <<CoordRO<<endl;
}Point::GetCoordFi() const
{<< "The angular coordinate of a point in radians - Fi: " <<CoordFi<<endl;
}Point::SetCoord(char ch)
{
charstr[2]; // Будем вводить макс. один символ для проверки наличия лишнего
double work = NULL;(ch)
{'P':
{= NULL, CoordY = NULL;(;;)
{<<endl<< "Please enter a value of X coordinate (numeric) - ";= scanf("%lf""%1[^\n]""%*[^\n]", &CoordX, str);(num != 1)
{("\n>>Only digits and only one number allowed!<<\n");();(num == 0)("%*[^\n]");
}; // Из for(;;)
}(;;)
{<<endl<< "Please enter a value of Y coordinate (numeric) - ";= scanf("%lf""%1[^\n]""%*[^\n]",&CoordY,str);(num != 1)
{("\n>>Only digits and only one number allowed!<<\n");();(num == 0)("%*[^\n]");
};
}>ConvertToRF(CoordX, CoordY);0;
}'F':
{(;;)
{();<< "Enter the angular coordinate of a point " <<
"(in radians) - Fi: ";= scanf("%lf""%1[^\n]""%*[^\n]", &work, str);(num != 1)
{("\n>>Only digits and only one number allowed!<<\n");();(num == 0)("%*[^\n]");
}(work < 0 || work > 2*M_PI)
{<<endl<< ">>Radial coordinate of the point must be " <<
"be greater than 0 and less than 2*Pi<<" <<endl;();
};
}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 |
Итог
Общее количество строк текста: 208+168+122 = 498;
Количество строк комментариев, занимающих отдельные строки: 14;
Количество пустых строк: 38.
Вывод
Разработанная программа отвечает поставленным требованиям. Работоспособность программы подтверждается разработчиком на основании и тестирования основных функций программы. Несомненными достоинствами класса является легкая интегрируемость за счет понятности текста класса, удобство и надежность.