Анализ технического задания




Введение

Современный уровень развития различных программных и аппаратно-программных систем, а так же систем управления, связан со значительным повышением их сложности из-за присущих им требований к гибкости, открытости, эргономичности и перенастраиваемости. Наиболее перспективным считается объектно-ориентированный подход (ООП) проектирования.

Объектно-ориентированное программирование является относительно новым подходом к созданию компьютерных приложений, который призван устранить многие из проблем, существующих в традиционных методиках программирования.

В ООП обычно используется гораздо больше модулей, каждый из которых обеспечивает конкретные функции и может быть изолирован или даже полностью отделен от всех остальных. Такое модульное программирование обеспечивает гораздо большую гибкость и возможности для многократного использования кода.

Также достоинством объектно-ориентированного подхода от традиционного проектирования относят возможность использования итеративно-поступательного цикла создания программного обеспечения и перенос акцента проектирования с разработки алгоритмов функционирования системы на построения системы абстракций и их взаимодействия.

Данная курсовая работа нацелена на создание приложения, которое будет производить построение графиков функций по заданному математическому выражению.

Построение графиков является одним из самых важных процессов в математике, физике, теории вероятностей, математической статистике и во многих других дисциплинах. Этот процесс необходим для наглядного представления выражений, а также для определения зависимости между двумя переменными и нахождению по этим данным некоторых физических и математических величин.

Целью работы является разработка программы «Генератор математических функций». Также целью работы является развитие навыков самостоятельной и творческой работы и закрепление навыков работы на языке С++.

В мире есть множество программных продуктов, позволяющих выполнять задачи по построению графиков, такие как Mathcad, Matlab, Excel. Если требуется решать задачи связанные только с графиками, то программа «Генератор математических функций» использовать предпочтительней, так как он сконцентрирован только на этой проблеме. Также данное приложение имеет простой пользовательский интерфейс, удобный мастер функций, возможность построения нескольких графиков функций.

Основными задачами курсовой работы являются – разработка приложения, которое будет позволять вводить выражение функции и строить график, а также сохранять график в файле, создание мастера функций для ввода математического выражения, тестирование приложения, разработка справочной системы для созданного приложения.


Анализ технического задания

В курсовом работе необходимо разработать программу «Генератор математических функций».

Для реализации поставленных задач необходимо:

- Разработать алгоритм ввода математического выражения с помощью мастера функций;

- Разработать алгоритм построения графика по заданному выражению;

- Реализовать возможность сохранения построенного графика в файл;

- Реализовать визуальные компоненты для работы с программой.

По заданию необходимо создать программу, которая будет выполнять построение графика по заданному выражению.

Данное приложение будет реализовано на мощном и гибком объектно-ориентированном языке программирования С++ [1]. Язык С++ предоставляет все средства для реализации базового и производных классов, а также оптимально использует системные ресурсы, что позволяет сделать приложение не только универсальным, но и не очень требовательным к ресурсам компьютера. Также язык С++ поддерживает платформу.NETFramework, что позволяет использовать приложение на различных персональных и переносных компьютерах, на которых установлена эта платформа.

По сравнению с другими объектно-ориентированными языками С++ обладает несколькими особенностями:

- Полная поддержка принципов инкапсуляции, наследования и полиморфизма;

- Полная поддержка классов и объектно-ориентированного программирования, включая наследование реализации и интерфейсов, виртуальные функции и перегрузку операций;

- Согласованный и четко определенный набор базовых типов;

- Возможность переопределения пользователем стандартных типов языка и операторов;

- Автоматическая очистка динамически распределяемой памяти;

- Полная поддержка библиотеки базовых классов.NET Framework наряду с легким доступом к Windows API;

- Указатели и прямой доступ в память при необходимости доступны, но язык спроектирован так, что в большинстве случаев без них можно обойтись.

Данное приложение создается для пользователя, следовательно, в тестирующем приложении должен быть реализован понятный и удобный интерфейс. Также необходимо реализовать справочную систему, которую пользователь сможет вызвать при затруднении использования приложения.

Метрики качества, выводимые из требований чрезвычайно важны для анализа качества приложения, однако они создаются на начальных этапах разработки, когда степень неопределенности и риск, связанный с разработкой и внедрением новых программных продуктов велики. Для эволюционного процесса разработки должны быть приняты к рассмотрению метрики качества программ, используемые в процессе реализации циклов разработки.

К числу подобных метрик относится:

1. Гибкость, которая аккумулирует ряд свойств:

- Модульность;

- Изменяемость;

- Сопровождаемость;

2. Адаптивность, которая подразумевает:

- Настраиваемость;

- Переносимость;

- Способность к взаимодействию;

В ходе приемосдаточных испытаний проходит проверка качества программного обеспечения, связанного с функциональностью, надежностью, производительностью в соответствии с документами, которые были приняты на начальных этапах. Оценка качества по приведенным выше метрикам, как правило, не проводится. Однако уже через короткое время обычно происходит снижение уровня качества программного обеспечения, связанное с расхождением текущих требований заказчика к системе. Обычно причиной этого является высокая стоимость исправлений или изменений в программной системе.

Исправления программного обеспечения может быть инициировано по следующим причинам:

1. исправление программы с недостаточным уровнем качества;

2. изменение программы для повышения уровня качества;

3. изменение программы для удовлетворения изменения в требованиях.

Измерение качества проектирования является очень важной составляющей частью в процессе обеспечения качества программного продукта.

Приложение будет реализовано в среде Microsoft Visual Studio 2010 [2] с использованием технологии Windows Forms [3]. Выбор обусловлен тем, что данная среда максимально совместима с операционной системой Microsoft Windows 7. Также данная среда поддерживает все версии.NETFramework, что позволяет создавать приложения для различных платформ. Microsoft Visual Studio 2010 включает в себя новые функции, позволяющие полностью контролировать и упрощать все этапы разработки приложения, выполнять его отладку и тестирование. Также данная среда разработки позволяет использовать визуальный конструктор, что очень важно для написания приложения. Исходя из вышеперечисленного, программный продукт будет обладать следующими аппаратными требованиями:

- 32-разрядный (x86) или 64-разрядный (x64) процессор с тактовой частотой 1 гигагерц (ГГц) или выше;

- 1 гигабайт (ГБ) (для 32-разрядной системы) или 2 ГБ (для 64-разрядной системы) оперативной памяти (ОЗУ);

- 16 гигабайт (ГБ) (для 32-разрядной системы) или 20 ГБ (для 64-разрядной системы) пространства на жестком диске;

- графическое устройство DirectX 9 с драйвером WDDM версии 1.0 или выше.

Исходя из приведенного анализа, ставятся основные требования к приложению:

1. Удобный пользовательский интерфейс;

2. Обеспечение гибкости программы для добавления новых функций;

3. Надежность программы.

 

 


 

2. Проектирование структуры классов

Программа «Генератор математических функций» имеет следующий алгоритм работы

1. Формируется область для прорисовки с помощью компонента ZedGraph;

2. Вводится выражение, представляющее строку;

3. Осуществляется синтаксический анализ строки;

4. Полученное на выходе значение используется для определения координат точек графика;

5. Вывод изображения на экран;

Для формирования области прорисовки графика функций используется компонент ZedGraph.

ZedGraph - это библиотека классов Windows Forms UserControl, предназначенная для построения 2D-линий, гистограмм, графиков произвольных наборов данных. Классы обеспечивают высокую степень гибкости, почти каждый элемент графика может быть изменен пользователем. В то же время, использование классов является простым, так как все значения обеспечиваются по умолчанию для всех аспектов графика.

Для ввода выражения необходим «Мастер функций». Он предоставляет возможность на основе списка исходных математических функций и списка арифметических операций создать требуемое выражение.

Преобразование введенной строки осуществляется с помощью класса Expression, который вычисляет значение математического выражения переданного в виде строки. В строке можно использовать переменную x и у, основные математические функции и операции, а так же определены константы pi и e. Расчёт производится в два этапа: сначала происходит разбор строки, далее осуществляется расчёт значения.

После разбора, значение будет передаваться в компонент ZedGraph, где и производится вычисления точек и построения графика.

Описание алгоритма работы программы показано на рисунке 1.

 

  Выбор действия в меню  
Ввод функции
Выбор функции
Очистка графика
Функция f(x)
Построение графика
Сохранение графика в файл
Возврат в главное меню
Мастер функций
Функция g(x)
Функция h(x)
Функция f(x)
Функция g(x)
Функция h(x)
Выход

Рисунок 1 – Описание алгоритма работы программы «Генератор математических функций».

Программная реализация

Для реализации визуальных компонентов было создано 2 формы: главная форма приложения, которая осуществляет все основные задачи программы, и производная форма (мастер функций), которая вызывается из главной формы и служит для упрощения ввода математического выражения.

На главной форме находятся:

- Область для построения графика;

- 3 текстовых области для ввода функции;

- Кнопка вызова мастера функций;

- Кнопка построения графиков;

- Кнопка очистки области;

- Кнопка сохранения графика в файл;

- 2 текстовых поля для указания диапазона значений X;

- Кнопка включения и отключения сетки на области построения графика;

- Выход из программы.

Производная форма представляет собой меню с набором доступных функций и действий:

- arccos – Арккосинус

- arcctg – Арккотангенс

- arcsin – Арксинус

- arctg – Арктангенс

- cos – Косинус

- ctg – Котангенс

- sin – Синус

- tg – Тангенс

- ln – Натуральный логарифм

- log – Десятичный логарифм

- sqrt – Квадратный корень

- abs – Модуль

- ‘+’ – Сложение

- ‘-’ – Вычитание

- ‘*’ – Умножение

- ‘/’ –Деление

- ‘^’ – Степень

Также доступны наиболее распространённые константы:

- e= 2.718281828459045

- pi= 3.141592653589793

Область построения графика представляет собой компонент ZedGraph. Для прорисовки области используем функцию Load_Graw.

// Функция преобразования компонента ZedGraph к необходимому виду

public:

void Load_Graw (void)

{

// Получим панель для рисования

ZedGraph::GraphPane ^myPane = zedGraphControl1->GraphPane;

// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы

myPane->CurveList->Clear();

myPane->GraphObjList->Clear();

//Запрет на самосогласования и выход за установленные границы

myPane->XAxis->Scale->MaxGrace=0;

myPane->XAxis->Scale->MinGrace=0;

myPane->YAxis->Scale->MaxGrace=0;

myPane->YAxis->Scale->MinGrace=0;

// Установим размеры шрифтов для подписей по осям

myPane->XAxis->Title->FontSpec->Size = 14;

myPane->YAxis->Title->FontSpec->Size = 14;

// Установим размеры шрифта для легенды

myPane->Legend->FontSpec->Size = 12;

// Установим размеры шрифта для общего заголовка

myPane->Title->FontSpec->Size = 13;

myPane->Title->FontSpec->FontColor=System::Drawing::Color::Black;

myPane->Title->Text = "Область постороения графиков";

myPane->XAxis->Title->Text = "x";

myPane->YAxis->Title->Text = "y";

//Установка фона панели графиков (не рабочая часть)

myPane->Fill->Color=System::Drawing::Color::LightGray;

//Установка фона панели отображения графиков

myPane->Chart->Fill = gcnew Fill(Color::White, Color::White, 0);

//Установка границы вывода графиков

myPane->Chart->Border->Color=System::Drawing::Color::Black;

// Устанавливаем интересующий нас интервал по оси X

myPane->XAxis->Scale->Min = -10;

myPane->XAxis->Scale->Max = 10;

//Ручная установка шага оси Х

myPane->XAxis->Scale->MinorStep = 1;

myPane->XAxis->Scale->MajorStep = 1;

// Устанавливаем интересующий нас интервал по оси Y

myPane->YAxis->Scale->Min = -10;

myPane->YAxis->Scale->Max = 10;

//Ручная установка шага оси Y

myPane->YAxis->Scale->MinorStep = 1;

myPane->YAxis->Scale->MajorStep = 1;

//Устанавливаем метки только возле осей!

myPane->XAxis->MajorTic->IsOpposite = false;

myPane->XAxis->MinorTic->IsOpposite = false;

myPane->YAxis->MajorTic->IsOpposite = false;

myPane->YAxis->MinorTic->IsOpposite = false;

//Рисуем сетку по X

myPane->XAxis->MajorGrid->IsVisible=false;

myPane->XAxis->MajorGrid->DashOn=5;

myPane->XAxis->MajorGrid->DashOff=5;

myPane->XAxis->MajorGrid->Color=System::Drawing::Color::Gray;

myPane->XAxis->Color=System::Drawing::Color::Gray;

//Рисуем сетку по Y

myPane->YAxis->MajorGrid->IsVisible=false;

myPane->YAxis->MajorGrid->DashOn=5;

myPane->YAxis->MajorGrid->DashOff=5;

myPane->YAxis->MajorGrid->Color=System::Drawing::Color::Gray;

myPane->YAxis->Color=System::Drawing::Color::Gray;

//******************************************************************************

// Добавляем информацию по регистрам вывода точек

//******************************************************************************

RollingPointPairList ^list1= gcnew RollingPointPairList (10000);

RollingPointPairList ^list2= gcnew RollingPointPairList (10000);

RollingPointPairList ^list3= gcnew RollingPointPairList (10000);

// Выводим пустые линии графиков на экран

LineItem ^F1Curve = myPane->AddCurve("Функция f(x)", list1, Color::Blue, SymbolType::None);

LineItem ^F2Curve = myPane->AddCurve("Функция g(x)", list2, Color::Red, SymbolType::None);

LineItem ^F3Curve = myPane->AddCurve("Функция h(x)", list3, Color::Green, SymbolType::None);

// Ширина линии

F1Curve->Line->Width=2;

F2Curve->Line->Width=2;

F3Curve->Line->Width=2;

// Задаем что линии гладкии

F1Curve->Line->IsSmooth=true;

F2Curve->Line->IsSmooth=true;

F3Curve->Line->IsSmooth=true;

// Обновлем данные об осях

zedGraphControl1->AxisChange ();

// Обновляем график

zedGraphControl1->Invalidate();

}

 

Далее производится ввод математического выражения с помощью клавиатуры, либо с помощью мастера функций. Преобразование введенной строки к математической функции производится в два этапа.

На первом этапе используем функцию SystemStringToChar, которая преобразовывает введенную строку типа String к строке типа Char.

/ Функция преобразования строки типа String в тип char, так как класс разбора работает только с Сhar

public:

char* SystemStringToChar(System::String^ string)

{

//возвращает значение ввиде Сhar

return (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(string);

}

На втором этапе используем класс разбора Expression, который разбирает строку типа Char и осуществляет расчёт значения.

class Expression

{

 

private:

struct sintElem {

char lexeme;

double number;

};

 

double * numArray;

 

sintElem* walkthroughArray;/*Массив в котором хранятся результаты предразбора строки.

Признаком конца такого массива является walkthroughArray[i].lexeme == 127*/

sintElem* start;/*Хранит ссылку на первый элемент массива walkthroughArray

чтобы восстановить её после исполнения вычислительной части*/

 

//Функции конструктора. Подробные коментарии указаны в теле функций.

/*Функции хранящиеся в файле ArifmometrSortSigment.

Комплекс функций необходим для сортировки в польскую нотацию*/

void sortPoland (sintElem*);

void recursionMain (sintElem*,short&,short&);

void recursionPlus (sintElem*,short&,short&);

void recursionMult (sintElem*,short&,short&);

void recursionPow (sintElem*,short&,short&);

void recursionUnary(sintElem*,short&,short&);

/*Функции хранящиеся в файле ArifmometrPreparationSigment.

Комплекс функция необходимых для полготовки строки к сортировке в польскую нотацию*/

void sintAdaptation (char*);

double setPoint (double, short);

static char* addMult (char*);

sintElem* setArray (char*);

static void addCode (char*);

 

static inline bool isNumber(char);

static inline bool isLetter(char);

static inline char* argTest(char*);

static inline bool isUnary(char);

sintElem doIt(char,sintElem);

sintElem doIt(char,sintElem,sintElem);

static bool isOperation(char);

unsigned operatorCount(sintElem*);

void delElements(sintElem*, unsigned);

 

public:

 

Expression();

Expression(const Expression&);

Expression(char*);

Expression(const std::string&);

Expression& rebild(const std::string&);

Expression& rebild(const char*);

 

~Expression(void);

 

static bool isExp(const std::string&);

static bool isExp(const char*);

 

//Функции выдающие результат вычисления

double calculate ();

double calculate (double);

double calculate (double,double);

 

Expression& optimization ();

};

После этого данные передаются в функцию Graw_Draw, где производится вычисление значений и передача их в область построения графиков.

// Функция построения графиков

public:

void Graw_Draw (void)

{

// Объявляем переменные, которые указывают диапазон значений X

double min_x = System::Convert::ToDouble(textBox_x1->Text);

double max_x = System::Convert::ToDouble(textBox_x2->Text);

// Построение первого графика

if(textBox11->Text!= "")

{

// Преобразование строки типа String к типу Сhar

char *stroka1 = SystemStringToChar(textBox11->Text);

// Получаем линии от графиков

LineItem ^F1Curve=(LineItem ^)zedGraphControl1->GraphPane->CurveList[0];

IPointListEdit ^list1= (IPointListEdit ^) F1Curve->Points;

if(Expression::isExp(stroka1) == true)

{

// Вызов функции, которая разбирает строку типа Сhar, преобразуя ее в математическое выражение

Expression exp(stroka1);

for (double x =min_x; x <= max_x; x = x+0.01)

list1->Add(((double)(x)), exp.calculate(x));

}

else

MessageBox::Show("Не верный ввод даных","Ошибка", MessageBoxButtons::OK);}

Для сохранения графиков используем метод компонента ZedGraph.

// Сохранение графика в файл

zedGraphControl1->SaveAsBitmap ();

Этот метод позволяет сохранить график в файле в следующих форматах: png, gif, jpg, tif, bmp.

Тестирование

Конечным этапом создания программного продукта является его тестирование и отладка. В ходе тестирования программы выявляются все ее недостатки и особенности работы. Обнаруженные недостатки устраняются в ходе отладки.

В результате было создано тестирующее приложение (рисунок 2), которое позволяет вводить выражение функции и строить график, а также сохранять график в файле.

Рисунок 2 – Тестирующее приложение. Главное окно.

Рисунок 3 – Тестирующее приложение. Ввод выражения с помощью клавиатуры и построение графика.

 

Рисунок 4 – Тестирующее приложение. Очистка области построения графика.

Рисунок 5 – Тестирующее приложение. Ввод выражения с помощью мастера функций.

Рисунок 6 – Тестирующее приложение. Построение графиков функций.

Рисунок 7 – Тестирующее приложение. Изменение диапазона

значений x. Рисование сетки.

Рисунок 7 – Тестирующее приложение. Сохранение графиков в файле.

Рисунок 8 – Тестирующее приложение. Некорректный ввод выражения.

Рисунок 9 – Тестирующее приложение. Построение прерывных функций.

Рисунок 10 – Тестирующее приложение. Выход из программы.

Результат тестирования: в ходе тестирования программы недостатков, влияющих на правильную работу приложения, не выявлено.

Недочетом данной программы является построение прерывных функций, так как вместе с графиком происходит построения вертикальных асимптот. Это связано с тем, что выбранный компонент ZedGraph не предусматривает возможности построения прерывных функций.

Листинг тестирующего приложения предложен в Приложении В.

Данная программа тестировалась на компьютере следующей конфигурации:

1. Процессор Intel(R) Core(TM) i5 CPU

2. ОЗУ 4.00 ГБ

3. ОС Microsoft Windows 7 Ultimate 32-разрядная



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2021-12-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: