Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
ЦЕЛЬ И ЗАДАЧИ КУРСОВОЙ РАБОТЫ. Методические указания по выполнению курсовой работыСтр 1 из 3Следующая ⇒
Марапулец Ю.В.
Методические указания по выполнению курсовой работы по курсу " Системное программирование" для студентов, обучающихся по направлению подготовки бакалавров 010400 «Прикладная математика и информатика»
г. Петропавловск-Камчатский УДК 681.306 ББК 32.973-018.2 М25
Рецензент: Водинчар Г.М., кандидат физико-математических наук, доцент кафедры " Прикладной математики" КамГУ
Марапулец Ю.В.
М25 Методические указания по выполнению курсовой работы по курсу " Системное программирование" для студентов, обучающихся по направлению подготовки бакалавров 010400 «Прикладная математика и информатика». -Петропавловск-Камчатский: ФГБОУ ВПО КамГУ им В.Беринга, 2014. - …. с.
Методические указания предназначены для выполнения курсовой работы по курсу " Системное программирование". В тексте приводится задание на курсовую работу, краткие теоретические сведения, требования по оформлению, в приложении приведены примеры выполнения курсовой работы. Рекомендовано к изданию решением учебно-методического совета ФГБОУ ВПО КамГУ им. В.Беринга (протокол № от ).
УДК 681.306 ББК 32.973-018.2
©КамГУ, 2014 ©Марапулец Ю.В., 2014 ВВЕДЕНИЕ Методические указания содержат теоретические сведения, необходимые для разработки программных продуктов. Значительная часть пособия посвящена ознакомлению студентов со стандартами, входящими в единую систему программной документации (ЕСПД), которые регламентируют состав и содержание программных документов, оформляемых в процессе выполнения курсовой работы. Приводится пример на один из возможных способов решения и оформления поставленной задачи. ДОКУМЕНТИРОВАНИЕ И СТАДИИ РАЗРАБОТКИ ПРОГРАММЫ Программа, как правило, разрабатывается не для того, кто является ее автором. Программу необходимо разрабатывать так, чтобы было понятно, как ее запускать, какой метод решения задачи в ней заложен, каковы требования к вводу (выводу) и т.д. Например, если в программной документации не указана размерность вводимых данных, то пользователь будет в большом затруднении при работе с такой программой. При разработке программной документации нужно придерживаться государственных стандартов, объединенных в Единую систему программной документации (ЕСПД). Согласно ГОСТ 19.101-77 «Виды программ и программных документов» программы делятся на компоненты и комплексы. Компонент - это программа, рассматриваемая как единое целое, выполняющая законченную функцию и применяемая самостоятельно или в составе комплекса. Комплекс - это программа, состоящая из двух или более компонентов и (или) комплексов, выполняющих взаимосвязанные функции, и применяемая самостоятельно или в составе другого комплекса. Указанный стандарт определяет в качестве программных документы, содержащие сведения, необходимые для разработки, изготовления, сопровождения и эксплуатации программы. Все документы делятся на две группы: программные (таблица 1) и эксплуатационные (таблица 2). Таблица 1
Таблица 2
Строгой регламентации перечня документов для каждой программы ГОСТ 19.101—77 не устанавливает, так как сложность программы и условия ее эксплуатации могут варьироваться в таких широких пределах, что невозможно точно указать, какая именно документация должна быть разработана в каждом конкретном случае. По этой причине ГОСТ 19.101-77 допускает объединение отдельных видов эксплуатационных документов (за исключением ведомости эксплуатационных документов и формуляра). Рекомендуемый перечень документов, разрабатываемых в процессе выполнения курсовой работы, должен включать: § Техническое задание § Описание программы § Текст программы § Программа и методика испытаний (тестирования) § Описание применения Поскольку вся документация, разрабатываемая в процессе выполнения курсовой работы, должна отвечать требованиям ЕСПД, ниже приводится необходимая часть содержания стандартов.
ОБЩИЕ СВЕДЕНИЯ О ЕСПД Согласно ГОСТ 19.001—93 «Единая система программной документации. Общие требования», ЕСПД - это комплекс государственных стандартов, устанавливающих взаимоувязанные правила разработки, оформления и обращения программ и программной документации. Регламентация указанных процессов обеспечивает возможность: · - унификации программных изделий для взаимного обмена программами и применения ранее разработанных программ в новых разработках; · - снижения трудоемкости и повышения эффективности разработки, сопровождения, изготовления и эксплуатации программных изделий; · - автоматизации изготовления и хранения программной документации. Каждый документ должен иметь титульный лист и лист утверждения. Правила их заполнения регламентируются ГОСТ 19.104-78 «Единая система программной документации. Основные надписи». На титульный лист и лист утверждения выносятся следующие надписи: наименование министерства; наименование документа: обозначение документа; сведения о носителе данных, на котором представлен подлинник; общее количество листов утверждения; объем документа; сведения о разработчике; подпись нормоконтролера; отметка об учете и хранении; сведения об изменениях. Лист утверждения оформляется на каждый программный документ на листах формата А4 (ГОСТ 2.301—68) независимо от вида документа, который может быть выполнен на любом носителе данных. Обозначение листа утверждения состоит из обозначения документа, к которому он относится, и через дефис — шифра листа утверждения. Лист утверждения не входит в общее количество листов документа. Лист утверждения хранится на предприятии-держателе подлинника документа. Копии листа утверждения высылают заказчику и головному предприятию. Программные документы подразделяются в зависимости от способа выполнения и характера применения на подлинники, дубликаты и копии (ГОСТ 2.102—68), предназначенные для разработки, сопровождения и эксплуатации программы. Титульный лист заполняют по форме и правилам, установленным для листа утверждения. Правила оформления последующих листов программных документов регламентируется ГОСТ 19.105—78 «Единая система программной документации. Общие требования к программной документации». Согласно этому стандарту программный документ состоит из следующих условных частей: - титульной; - информационной; - основной; - регистрации изменений. Титульная часть состоит из листа утверждения и титульного листа. Информационная часть включает аннотацию и содержание (перечень разделов, подразделов с указанием номеров страниц). В аннотации приводятся сведения о назначении документа и краткое изложение его основной части. Состав и структура основной части программного документа устанавливается другими стандартами ЕСПД (с частью из них мы познакомимся ниже). Программные документы выполняют на листах формата А4 (ГОСТ 2.306-68). Материалы программного документа располагают в последовательности: титульная часть: лист утверждения; титульный лист (первый лист документа); информационная часть; аннотация; лист содержания. основная часть: текст документа (с рисунками, таблицами и т. п.); приложения; перечень терминов; перечень сокращений; перечень рисунков; перечень таблиц; предметный указатель; перечень ссылочных документов; перечень символов и числовых коэффициентов; часть регистрации изменений; лист регистрации изменений. Составляющие основной части, начиная от приложения и далее, выполняются при необходимости. Рассматриваемый ГОСТ 19.106-78 устанавливает правила оформления, размещения в документе и нумерации текста, рисунков, таблиц и формул (из-за ограниченности объема методических указаний они здесь не приводятся). Иллюстрированный материал, таблицы или текст вспомогательного характера допускается оформить в виде приложений. Приложения оформляют как продолжение данного документа или выпускают в виде отдельного документа. Каждое приложение должно начинаться с новой страницы с указанием в правом верхнем углу слова «ПРИЛОЖЕНИЕ» и иметь тематический заголовок, записываемый симметрично тексту прописными буквами. На приложения должны быть даны ссылки в основном документе. Все приложения должны быть перечислены в листе «Содержание». В данном подразделе приводятся сведения о содержании лишь тех документов, оформление которых является обязательным при выполнении курсовой работы. Порядок построения и оформления технического задания (ТЗ) на разработку программы или программного изделия устанавливается ГОСТ 19.201-78 «Единая система программной документации. Техническое задание. Требования к содержанию и оформлению». На ТЗ оформляются лист утверждения и титульный лист. В документ не включаются информационная часть и лист регистрации изменений. Изменения и дополнения в Т3 на последующих стадиях разработки оформляют в виде дополнения к нему. ТЗ содержит следующие разделы: - введение (наименование, краткая характеристика области применения программы и объекта, в котором используют программу); - основание для разработки (документы), на базе которых ведется разработка; организация, утвердившая этот документ, и дата его утверждения; наименование и (или) условное обозначение темы разработки; - назначение разработки (функциональное и эксплуатационное назначение программы); - требования к программе или программному изделию (см. ниже); - требования к программной документации (состав и специальные требования к ней); - технико-экономические показатели (ориентировочная экономическая эффективность, предполагаемая годовая потребность, экономические преимущества разработки по сравнению с лучшими отечественными и зарубежными образцами или аналогами); - стадии и этапы разработки (содержание работ на каждом этапе, сроки и исполнители); - порядок контроля и приемки (виды испытаний и общие требования к приемке работы). В зависимости от особенностей программы допускается уточнять содержание разделов, вводить новые разделы или объединять некоторые из них. Раздел «Требования к программе или программному изделию» должен содержать подразделы: - требования к функциональным характеристикам (составу выполняемых функций, организации входных и выходных данных, временным характеристикам и т. д.); - требования к надежности; - условия эксплуатации (для выбранных типов носителей данных); - требования к составу и параметрам технических средств (их основные технические характеристики); - требования к информационной и программной совместимости (информационных структур на входе и на выходе, методов решения, исходных кодов, языков программирования и программных средств, используемых программ); - требования к маркировке и упаковке; - требования к транспортировке и хранению; - специальные требования. Требования к содержанию и оформлению текста программы устанавливаются ГОСТ 19.401-78 «Единая система программной документации. Текст программы». Согласно этому стандарту составление информационной части (аннотации и содержания) является необязательным. Основная часть документа должна состоять из одного или нескольких разделов, которым даны наименования. Каждый из разделов реализуется одним из типов символической записи (например, запись на исходном языке). В символическую запись разделов рекомендуется включать комментарии. Требования к описанию программы устанавливает ГОСТ 19.402—78 «Единая система программной документации. Описание программы». Согласно этому стандарту составление информационной части (аннотации и содержания) не обязательно. Описание программы должно включать разделы: - общие сведения (обозначение и наименование программы - программное обеспечение, необходимое для функционирования программы, языки программирования, на которых она написана); - функциональное назначение (классы решаемых задач и/или назначение программы и сведения о функциональных ограничениях на применение); - описание логической структуры (алгоритм программы, используемые методы, структура программы с описанием функции составных частей и связи между ними, связи программы с другими программами); - используемые технические средства (для работы программы); - вызов и загрузка (способ вызова программы с соответствующего носителя данных, входные точки в программу, при необходимости сведения об использовании оперативной памяти, объем программы); - входные данные (характер и организация, формат, описание и способ кодирования входных данных); - выходные данные (то же, что и для входных данных). Допускается содержание разделов иллюстрировать пояснительными примерами, таблицами, схемами, графиками. Требования к программе и методике испытаний устанавливаются ГОСТ 19.301-79 «Единая система программной документации. Программа и методика испытаний». Согласно этому стандарту составление информационной части не обязательно. Документ должен содержать разделы: - объект испытаний (наименование, область применения и обозначение испытуемой программы); - цель испытания; - требования к программе (требования, подлежащие проверке во время испытаний и заданные в ТЗ на программу); - требования к программной документации (состав программной документации, предъявляемой на испытания, а также специальные требования, если они заданы в ТЗ на программу); - средства и порядок испытаний (технические и программные средства, используемые во время испытаний, а также порядок их проведения); - методы испытаний (описания проверок с указанием результатов проведения испытаний — перечней тестовых примеров, контрольных распечаток тестовых примеров и т. п.). Требования к описанию применения программы определены ГОСТ 19.502—78 «Единая система программной документации. Описание применения». Составление информационной части является обязательным. Текст документа должен включать разделы: - назначение программы (возможности программы, ее основные характеристики, ограничения, накладываемые на область применения программы); - условия применения (требования к необходимым для данной программы техническим средствам и другим программам, общие характеристики входной и выходной информации, а также требования и условия организационного, технического и технологического характера и т. п.); - описание задачи (определения задачи и методы ее решения); - входные и выходные данные. Стадии разработки программ и программной документации устанавливаются ГОСТ 19.102-77 «Единая система программной документации. Стадии разработки». Стадии разработки должны быть следующие: 1. Техническое задание. 2. Эскизный проект. 3. Технический проект. 4. Рабочий проект. 5. Внедрение. Этапы и содержание работ должны соответствовать приведенным в таблице в ГОСТ 19.102-77. ПРИМЕР РАЗРАБОТКИ ИСХОДНОГО ТЕКСТА ПРОГРАММЫ Разработаем приложение для построения графиков зависимостей у = f(х), где х и у заданы в виде динамических массивов, созданных по шаблону: CArray< double, double& >. Размерность массивов мы ограничим разумным пределом в 1000 элементов. Такое количество точек позволяет достаточно точно отобразить поведение довольно широкого класса функций. Главной особенностью данного приложения будет то, что мы создадим его на базе динамически подключаемой библиотеки (DLL), которую в дальнейшем смогут использовать другие приложения, выполненные как в SDI, так и в MDI-интерфейсе. Созданный динамический модуль система интегрирует в пространство другого (клиентского) процесса, загрузив его по определенному базовому адресу. Мы воспользуемся преимуществом, которое предоставляет библиотека MFC, расширяющая Win32-поддержку DLL. DLL-расширение способно экспортировать не только отдельные функции, но и целые классы C++. Приложение, использующее DLL, может создавать объекты импортированного класса, а также создавать производные классы на основе класса, реализованного в DLL. Обычные DLL могут экспортировать функции. DLL-расширения могут экспортировать как функции, так и классы. С целью иллюстрации обеих возможностей наше приложение наряду с классом CGraph будет экспортировать также четыре функции: Aperiodic, Oscillating, Gauss и Poisson, которые изображают известные математические зависимости. Первые две соответствуют переходным процессам систем, описываемых линейными дифференциальными уравнениями второго порядка, а вторые две задают распределение плотности вероятности случайных величин. DLL-расширение динамически связывается с кодом DLL-версии библиотеки MFC и требует, чтобы клиентская программа тоже компоновалась с ним динамически. До сих пор при создании остовов приложения мы выбирали как раз этот вариант. Обычная DLL может связываться с библиотекой MFC как динамически, так и статически. Но это не снижает привлекательности DLL-расширений, так как при необходимости можно поставить заказчику необходимые системные DLL, такие как Mfc42d.d11, Mfco42.dl1 и другие. Задача будет решена в два этапа. Сначала мы создадим модуль DLL-расширения, затем создадим клиентское приложение для демонстрации динамического подключения библиотеки. С помощью App Wizard создайте приложение с именем Graph. Вместо AppWizard(exe), выберите AppWizard(dll). На этот раз AppWizard предложит диалог, состоящий только из одного шага, на котором вы должны указать тип DLL. Выберите опцию MFC Extension DLL [using shared MFC DLL]. Просмотрите сгенерированный код. Как видите, создана одна глобальная функция DllMain, которая представляет собой точку входа в динамически подключаемую библиотеку. Она является некоторого рода заглушкой (placeholder) для реального (декорированного и определяемого библиотекой) имени функции. Первый параметр DllMain, поданный системой, представляет собой Windows-описатель DLL. Его можно использовать при вызове функций, требующих этот описатель, например GetModuleFileName. Второй параметр указывает причину вызова DLL. Он может принимать одно из следующих четырех значений: - DLL_PROCESS_ATTACH - указывает на то, что DLL загружается в виртуальное адресное пространство процесса, так как стартовал сам процесс или была вызвана функция LoadLibrary. Второй случай - это явный вызов DLL; - DLL_THREAD_ATTACH - указывает на то, что текущий процесс создает новый поток (thread). В этот момент система вызывает все DLL, которые уже загружены в пространстве процесса, с тем, чтобы они учли новый поток в TLS-слотах (Thread Local Storage); - DLL_THREAD_DETACH - указывает на то, что поток завершается и DLL может освободить динамические ресурсы, связанные с данным потоком (если они были); - DLL_PROCESS_DETACH - указывает на то, что DLL выгружается из адресного пространства процесса, либо в результате завершения процесса, либо потому, что процесс вызвал функцию FreeLibrary. В этом случае DLL может освободить память (TLS). Если DllMain вернет FALSE или 0, то клиентское приложение завершится с кодом ошибки. Вызов AfxInitExtensionModule необходим для того, чтобы DLL захватила структуру CRuntimeClass экспортируемого класса, которая ей нужна при создании объекта класса CDynLinkLibrary, который, к сожалению, не документирован. Известно лишь, что объект этого класса необходим, если экспортируется класс или нестандартные ресурсы. Так как мы собираемся использовать шаблоны массивов и математические функции, то вставьте в файл StdAfx.h директивы подключения нужных библиотек:
#include < afxtempl.h> #inc1ude < math.h> Для того чтобы описать экспортируемый класс, достаточно ввести макроподстановку AFX_EXT_CLASS, которая также необходима при описании класса в клиентском приложении, импортирующем его. Класс CGraph содержит достаточно много данных, которые помогают масштабировать абсциссы и ординаты, создать их целочисленные аналоги, которые нужны для изображения точек на экране, и привести числа в экспоненциальную форму для удобства отображения разметки осей. Так как мы собираемся работать с двумя массивами вещественных чисел, содержащими абсциссы и ординаты точек графика, то удобно ввести новый тип данных
typedef CArray< doub1e, doub1e& > TValues;
который определяет массив вещественных, индексируемый целочисленными переменными. Создайте новый файл Graph2D.h, подключите его к проекту и введите в него коды интерфейса класса:
#if _MSC_VER > = 1000 #pragma once // Защита от повторного включения файлов заголовков #endif // Тип данных для хранения координат точек графика typedef CArray< double, double& > TValues; // Тип для унификации данных экспортируемых функций struct TData { double d1, d2, d3; };
class AFX_EXT_CLASS CGraph { double dMinX, dMaxX; // Min-Max значения погоризонтали double dMinY, dMaxY; // Min-Max значения по вертикали double dSpanX; // Размах графика по горизонтали double dSpanY; // Размах графика по вертикали double dStepX, dStartX; // Шаг и начальное значение double dStepY, dStartY; UINT nPoints; // Количество точек // Целочисленные аналоги UINT nStepsX, nStepX, MinX, MaxX; UINT nStepsY, nStepY, MinY, MaxY; UINT *X, *Y; // Координаты точек на экране int iPowerX, iPowerY; // Экспоненты CRect rect; // Прямоугольник вывода // Три типа шрифтов: для осей, заголовка и экспонент CFont TextFont, TitleFont, PowerFont; public: CGraph (CRect, UINT); // Функции нормировки исходных массивов void ScaleX(TValues& ); void ScaleY(TValues& ); // Масштабирование массива void Scale (double, int&, double& ); // Изображение координатной сетки void DrawGrid (CDC*, CString&, CString&, CString&, TValues&, TValues& ); // Изображение графика зависимости void DrawFunc (CDC*); virtual ~CGraph (); }; Далее создадим новый файл Graph2D.cpp, подключим его к проекту и добавим следующий код:
#include " stdafx.h" #include " Graph2D.h"
#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif
// Доли экрана, занимаемые прямоугольником вывода const double dXLeft=0.15; // Левый верхний угол const double dYTop =0.2; const double dFracX=0.55; // Ширина и высота const double dFracY=0.55;
Else step=1.; }
CGraph:: ~CGraph () { delete [] X; // В деструкторе освобождаем память, занимаемую delete [] Y; // целочисленными аналогами входных массивов }
void CGraph:: DrawGrid (CDC* dc, CString& Title, CString& Xlab, CString& Ylab, TValues& xGr, TValues& yGr) { // Рисуем координатную сетку и надписи dc-> SelectObject(& TextFont); // Основной шрифт TEXTMETRIC tm; // Метрики шрифта dc-> GetTextMetrics (& tm);
ScaleX (xGr); // Масштабируем абсциссы ScaleY(yGr); // Масштабируем ординаты
UINT x, y, i, // Рабочие переменные LW=tm.tmMaxCharWidth, // Средняя ширина буквы LH=tm.tmHeight, // Средняя высота буквы h2=LH/2, h4=LH/4, // Доли ширины (для подстройки) w2=LW/2, w4=LW/4, // Доли высоты ww=LW+LW, hh=LH+LH, // Удвоенные ширина и высота xy=MinX-ww, // X-координата шкалы оси Y yx=MaxY+h2, // Y-координата шкалы оси X xh=MaxX+ww, // X-координата заголовка оси X yh=MinY-hh; // Y-координата заголовка оси Y double d; // Рабочие переменные CString s;
dc-> SetBkMode(TRANSPARENT); // Фон текста — прозрачный dc-> SetTextAlign(TA_CENTER); // Выравнивание — по центру
for (i=0, x=MinX, d=dStartX; // Разметка оси X i< =nStepsX; x+=nStepX, d+=dStepX, i++) { dc-> MoveTo(x, MinY); dc-> LineTo (x, MaxY); // Изображение оси X s.Format(" %3.1f", d); dc-> TextOut (x, yx, s); // Оцифровка шкалы оси X }
for (i=0, y=MinY, d=dStartY; // Разметка оси Y i< =nStepsY; y+=nStepY, d-=dStepY, i++) { dc-> MoveTo(MinX, y); dc-> LineTo(MaxX, y); s.Format(" %5.1f", d); dc-> TextOut(xy, y-h2, s); } // Вывод диапазона изменения ординат s.Format(" Range = (%.3g, %.3g)", dMinY, dMaxY); dc-> TextOut((MinX+MaxX)/2, yh+h2, s); // Вывод наименований осей dc-> TextOut (MinX+w2, yh-h2, Ylab); dc-> TextOut (xh+w2, yx, Xlab); // Выбираем более мелкий шрифт dc-> SetTextColor (RGB(0, 0, 255)); dc-> SelectObject(& PowerFont); // Рамочка вокруг экспоненты оси Y dc-> RoundRect(xy-w2-w2, yh-LH, xy+LW+w2, yh+LH, h2, h2); dc-> TextOut(xy, yh-h4, " 10" ); // Рамочка вокруг экспоненты оси X dc-> RoundRect(xh-w2-w2, yx-hh-h2, xh+LH+w4, yx-h2, h2, h2); dc-> TextOut(xh, yx-hh+h4, " 10" ); // Вывод экспонент осей Y и X s.Format(" %d", iPowerY); dc-> TextOut(xy+w2+w4, yh-LH, s); s.Format(" %d", iPowerX); dc-> TextOut(xh+w2+w4, MaxY-hh, s); // Выбираем крупный шрифт и выводим заголовок всего графика dc-> SelectObject(& TitleFont); dc-> TextOut((MinX+MaxX)/2, yh-ww, Title); } // Изображение кривой Y (X) void CGraph:: DrawFunc (CDC* dc) { // Ставим перо в первую точку dc-> MoveTo(X[0], Y[0]); // и соединяем последовательно все точки for (UINT i=0; i < nPoints; i++) dc-> LineTo (X[i], Y[i]); }
Далее рассмотрим, как описываются экспортируемые функции. Добавим в файл Graph2D.cpp следующий код, описывающий четыре функции, которые мы будем использовать в приложении:
extern " C" __declspec(dllexport) double Aperiodic(double x, TData* p) { // Апериодический переходный процесс // Постоянные времени и коэффициент усиления double T1=p-> d1, T2=p-> d2, K=p-> d3; // Выделяется случай равенства собственных чисел double TT=T1-T2; return TT? K * (exp(-x/T1) - exp(-x/T2))/TT : K * x * exp(-x/T1)/(T1*T1); } extern " C" __declspec(dllexport) double Oscillating(double x, TData* p) { // Колебательный переходный процесс double T=p-> d1, Ksi=p-> d2, K=p-> d3; // T — постоянная времени, Ksi — постоянная затухания double d = sqrt(1.-Ksi*Ksi); return K * exp(-Ksi*x/T) * sin (d*x/T) / (T*d); } extern " C" __declspec(dllexport) double Gauss(double x, TData* p) { // Нормальный закон распределения плотности вероятностей // M — математическое ожидание, Sigma — дисперсия double M=p-> d1, Sigma=p-> d2; x = (x-M)/Sigma; return exp(-x*x/2.)/(Sigma*sqrt(6.2831853718)); }
extern " C" __declspec(dllexport) double Poisson(double x, TData* p) { // Дискретное распределение Пуассона // M — математическое ожидание double M=p-> d1; double mk, m = M; ULONG i, k; if (x< 0 || M==0) return 0.; k = unsigned(x); // k - беззнаковый x for (i=2, mk=m; i< =k; i++) // mk = M^k/k! mk *= m/i; return mk*exp(-m); } Откомпилируем и скомпонуем приложение. В результате в папке Debug будут созданы два файла: Graph.dll и Graph.lib. На следующем этапе разработаем клиентское приложение, в которое мы и вставим разработанную библиотеку. Для этого создадим новый проект под именем Test, который основан на обычной стартовой программе с SDI-интерфейсом. После того как AppWizard выполнит эту задачу, уберите из меню и панели инструментов все команды чтения и записи в файл, а также команду Recent Files. Затем выберите команду Project -> Settings, раскройте вкладку Link и введите строку Graph.lib в поле Object/library modules. Далее скопируйте из папки предыдущего проекта в папку настоящего файл Graph, h (только интерфейс класса) и подключите его к проекту. Не забудьте также скопировать два файла Graph.dll и Graph.lib из папки Debug приложения Graph в папку с новым проектом. Вставим директивы подключения файлов заголовков и прототипы импортируемых классов. 1. В файл stdafx.h: // stdafx.h: include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // . . .
#include < afxwin.h> // MFC core and standard components #include < afxext.h> // MFC extensions #include < afxdisp.h> // MFC Automation classes #include < afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#include < afxtempl.h> // Шаблоны Collection #include < math.h> // Математические функции #include < time.h> // Функции управления временем . . . 2. В файл TestView.cpp // TestView.cpp: implementation of the CTestView class //
#include " stdafx.h" #include " Test.h"
#include " TestDoc.h" #include " TestView.h"
#include " Graph2D.h" // Заголовок подключаемой DLL . . .
3. В файл TestDoc.h // TestDoc.h: interface of the CTestDoc class // #if! defined(AFX_TESTDOC_H__6E75B7CB_D6B9_11D5_B5B3_F00CBE90EA6C__INCLUDED_) #define AFX_TESTDOC_H__6E75B7CB_D6B9_11D5_B5B3_F00CBE90EA6C__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
#include " Graph2D.h" // Заголовок подключаемой DLL
extern " C" __declspec(dllimport) double Aperiodic(double, TData*);
extern " C" __declspec(dllimport) double Oscillating(double, TData*);
extern " C" __declspec(dllimport) double Gauss(double, TData*);
extern " C" __declspec(dllimport) double Poisson (double, TData*);
// Обобщенный тип импортируемых функций, то есть // тип указателей на любую из них typedef double (*TFunc)(double, TData*);
class CTestDoc: public CDocument { protected: // create from serialization only CTestDoc(); DECLARE_DYNCREATE(CTestDoc)
// Attributes public:
// Operations public:
// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CTestDoc) public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); virtual void DeleteContents(); //}}AFX_VIRTUAL
// Implementation public: TValues xGr, yGr; // Массивы абсцисс и ординат UINT NPoints; // Количество точек TFunc pFunc[4]; // Массив указателей на функции TFunc pCurFunc; // Адрес текущей (выбранной) функции CString sFunc[4]; // Массив заголовков графиков функций CString sCurFunc; // Заголовок текущего графика функции double Time; // Диапазон изменения координаты X UINT nFunc; // Количество функций (==4) TData data; // Обобщенные параметры функций void Calc(); // Метод вычисляющий Y (X) . . . Идея демонстрации возможностей библиотечного класса CGraph состоит в том, что при каждом нажатии кнопки New (то есть вызове OnNewDocinnent) будет случайным образом выбрана одна из четырех импортированных функций, таким же образом выбраны ее параметры, вычислены значения функции и с помощью импортируемого класса построен график. Если оставить произвол в выборе параметров, то могут возникнуть исключительные ситуации, поэтому мы ограничиваем этот произвол так, чтобы обеспечить надежность вычислений и показать поведение функций в их наиболее характерном виде. Так как генератор случайных чисел будет использоваться достаточно интенсивно, определим макроподстановку, упрощающую управление ГСЧ. Введем ее в начало файла TestDoc.cpp. Введите также коды конструктора Документа и функции OnNewDocument.
// CTestDoc construction/destruction
// Вычисляет вещественное случайное число в диапазоне (min, max) #define getrand(min, max) \ (min)+double(rand())*((max)-(min))/32767
CTestDoc:: CTestDoc() { // Начальная одноразовая инициализация nFunc = 4; sFunc[0]=" Aperiodic Response"; // Заголовки графиков sFunc[1]=" Oscillating Response"; sFunc[2]=" Gauss Distribution"; sFunc[3]=" Poisson Distribution"; pFunc[0] = Aperiodic; // Адреса функций pFunc[1] = Oscillating; pFunc[2] = Gauss; pFunc[3] = Poisson; data.d1 = 0.1; // Надежные параметры data.d2 = 0.1; data.d3 = 1.; }
BOOL CTestDoc:: OnNewDocument() { if (! CDocument:: OnNewDocument()) return FALSE;
// TODO: add reinitialization code here // (SDI documents will reuse this document) NPoints = 300; // Начальное предложение xGr.SetSize (NPoints); // Отводим память yGr.SetSize (NPoints); Time=getrand(5., 15.); // Случайный интервал времени int i = rand()%4; // Случайный номер функции sCurFunc = sFunc[i]; // Ее заголовок pCurFunc = pFunc[i]; // Ее адрес Switch (i) { // В зависимости от выбранной функции case 0: // Определяем выгодный диапазон параметров data.d1 = getrand(1e-2, 1.); // Параметры data.d2 = getrand(1e-2, 1.); // для апериодического data.d3 = getrand(1., 100.); // переходного процесса break; case 1: // То же, но для data.d1 = getrand(1e-1, 0.5); // колебательного data.d2 = getrand(1e-3,.9); // переходного процесса data.d3 = getrand(1., 100.); break; case 2: data.d1 = getrand(1e-2, 9.); // для Гауссова data.d2 = getrand(1e-2,.9); // распределения break; case 3: data.d1 = getrand(1., 9.); // для Пуассоновского break; // распределения } // В режиме отладки вы увидите этот вывод в окне Output-Debug Популярное:
|
Последнее изменение этой страницы: 2016-05-29; Просмотров: 484; Нарушение авторского права страницы