Учебная работа. Курсовая работа: Программа вычисления значения и вывода графика определенного интеграла
КАФЕДРА КОМПЬЮТЕРНЫХ ИНФОРМАЦИОННЫХ
ТЕХНОЛОГИЙ
КУРСОВАЯ РАБОТА ПО СИСТЕМНОМУ ПРОГРАММИРВАНИЮ
2006 г
ЗАДАНИЕ
1. Личное задание:
1. Создать метод расчета и воплотить его программно для решения последующей задачки:
Вычислить определенный интеграл 1) по формуле трапеций с 3-мя десятичными знаками.
Вычислить определенный интеграл 2) по формуле Симпсона при n=50
1) 2)
2. Изучить предназначение и способности компонент средства разработки Delphi, их характеристики, способы и доступные к обработке действия, применить составляющие при разработке проекта: GroupBox
,
SavePictureDialog
.
3. Сделать DLL-библиотеку с внедрением средства разработки Delphi, содержащую функцию, реализующую фрагмент метода вычислений теоретической части личного задания и возвращающую итог вычисления. Выполнить вызов процедуры (функции) из головного модуля приложения, при всем этом организовать загрузку подпрограмм из библиотеки методом динамической загрузки DLL-библиотеки.
4. Изучить предназначение, организовать программно вызов и внедрение возвращаемых результатов последующими функциями WindowsAPI. Для исследования функций употреблять файл справки в стиле WindowsWin32.hlp, находящийся в подкаталоге HELP каталога Delphi (используйте свои познания технического британского или программы-переводчики типа Stylus), также источник [2], номера страничек которого указаны опосля наименования функции:
ClipCursor 355, GetSystemInfo 103
5. Сделать справочную подсистему, которая содержит в себе:
1) справку в стиле Windows с неотклонимым включением последующих разделов:
— содержание тем справки;
— информация о предметной области приложения — определенных интегралах и способах их вычисления;
— аннотацию для неподготовленного юзера по приемам работы с приложением.
При всем этом справка обязана обеспечивать поиск по главным словам подходящих тем и включать в себя пиктограммы (картинки), являющиеся активными элементами для перехода к разделам справки;
2) Подсказки по разным элементам пользовательского интерфейса, появляющиеся при наведении на их курсора мыши.
3) Подменю в меню приложения, через команды которой вызываются общие сведения о приложении, аннотацию по работе со справкой, отдельные темы справки, информация о программке.
6. Создать пользовательский интерфейс, включающий в себя:
1) — главную форму, меню приложения с подменю «Сервис» и командами, осуществляющими запись и открытие файлов, закрытие файлов и приложения и т.п., с подменю «Опции» и командами, осуществляющими предназначение режимов работы приложения, иными подменю;
2) — область отрисовки графического представления результатов работы приложения на главной форме;
3) — командные клавиши для выполнения ряда действий вашего приложения и элементы для ввода требуемой для этих действий инфы (ввод данных должен выполняться с проверкой их на соответствие ограничениям и выдачей соответственных сообщений юзеру);
4) — диалоговое окно для предназначения режимов работы вашего приложения с помощью переключателей;
5) — окна сообщений для информирования юзера, доказательства выполняемых действий, предупреждения о ошибках и их обработки.
7. Обработку ошибок ввода данных и открытия файлов (каталогов) провести с помощью:
защищенного блока try-finally-end и соответственных фильтров обработки исключительных ситуаций.
8. Организовать с помощью соответственных компонент, объектов, их способов и параметров, для интеграла, чье файл.
2. Размер и содержание курсовой работы:
1. Внедрение современных средств зрительного программирования под WINDOWS (Visual Basic, Delphi) для реализации разработанных алгоритмов.
2. Реализация концепции смешанного программирования в согласовании с личным заданием (внедрение библиотек DLL, функций WINDOWS API, объектных модулей на языке программирования Ассемблер и т.д.).
3. Реализация пользовательского интерфейса с обеспечением:
— эргономических требований;
— контекстно-зависимой помощи по управляющим элементам и отдельным формам приложения, включающей в себя подсказки, панель для отображения длинноватой части подсказки;
— структурированной по темам справки в стиле WINDOWS, содержащей управление юзеру, с возможностью контекстного вызова соответственных ее разделов;
— проверки вводимых юзером данных на требуемые ограничения с указанием, каким должен быть верный ввод;
— запросов на доказательство выполнения действий, угрожающих целостности данных;
— способности отказа от выполняемой обработки и отката выполненных операций на любом шаге.
4. Визуализация результатов обработки данных с помощью функций WINDOWS API с внедрением контекстов устройств, режимов отображения, областей вывода и т.д., или с помощью компонент средств зрительного программирования, в каких инкапсулированы вызовы соответственных функций.
5. Вывод в файлы результатов обработки данных.
6. Обработка вероятных ошибок (отсутствие файлов и каталогов, неправильные математические операции и т.д.) с помощью механизма обработки исключительных ситуаций в виде защищенных блоков программ, фильтров исключений и соответственных объектов.
7. Соблюдение при программировании соглашений по наименованию переменных, констант и частей управления (венгерской нотации), также подробное документирование программных частей методом использования объяснений.
8. Создание отлаженного под разные операционные системы и системное свита приложения, что предполагает возможность пуска и надежного функционирования приложения под управлением Windows 95 либо WindowsNT, при отсутствии специфичных библиотек средств разработки, вне зависимости от структуры дерева каталогов и т.д.
3. Объяснительная записка к курсовой работе обязана содержать:
1) — задание на проектирование;
2) — аннотацию курсовой работы;
3) — содержание;
4) — введение, в каком коротко излагается современное состояние операционных систем и средств разработки, также обосновывается выбор того либо другого средства разработки для реализации данной курсовой работы; — 2 с.
5) — описание предметной области проектирования, в каком коротко раскрывается содержание личного задания, применяемого для разработки алгоритмического обеспечения программной системы; — 2 с.
6) — описание процесса разработки программного комплекса (ПК ), включающее в себя укрупненную структурно-функциональную схему ПК , описание содержания и функций модулей ПК с указанием применяемых при всем этом форм и открываемых (создаваемых) файлов; — 3-4 с.
7) — эскиз частей пользовательского интерфейса — меню, форм с списком управляющих частей и указанием их предназначения, области вывода графической инфы с указанием содержания крайней, структуры и лаконичного содержания справочной подсистемы (распечатка файла справки, применяемого для компиляции справки в стиле WINDOWS, обязана войти в приложения под заглавием «Управление юзеру») ; — 4-5 с.
8) — методику использования в Вашей работе смешанного программирования: описания функций (процедур) DLL-библиотеки и метода ее построения и компиляции (листинг библиотеки должен войти в приложения), выданных в качестве личного задания и использованных при программировании функций WINDOWS API (описание предназначения функций и характеристик их вызова); — 2 с.
9) — методику визуализации в Вашей работе результатов обработки данных (перечислить и отдать короткое описание использованных компонент, их параметров, способов и обработчиков событий); — 1-2 с.
10) — методику вывода в файлы результатов обработки данных (отдать короткое описание технологии, объектов, параметров и способов, привести соответственный фрагмент программки); — 1-2 с.
11) — требования к аппаратным и программным платформам, на которых может работать разработанное приложение; — 1 с.
12) — результаты самостоятельной работы, задания для которой выдаются персонально (описание функций WindowsAPI и фрагменты листингов программки с их применением в вашем проекте; описание параметров и способов компонент Delphi и фрагменты листингов программки с их применением в вашем проекте) – 3-4 с.;
13) — приложения, включающие: фрагменты документированных листингов, отражающих, по вашему воззрению, главные моменты разработанных программных средств; управление юзеру, в каком содержаться указания по правильной работе с разработанным программным средством и содержание справки в стиле Windows. — не наиболее 5 с.
АННОТАЦИЯ
В работе рассмотрена программка вычисления значения и вывода графика определенного интеграла.
Работа содержит __ странички машинописного текста, __ рисунков, __ таблицы, __ приложения.
Система Win32, ассемблер, Си, компилятор.
СОДЕРЖАНИЕ
ЗАДАНИЕ
АННОТАЦИЯ
ВВЕДЕНИЕ
1. ТЕОРЕТИЧЕСКИЕ АСПЕКТЫ ПРОГРАММЫ
1.1 Численные способы вычисления определенных интегралов
1.1.1 Вычисление определенных интегралов способом трапеций
1.1.2 Вычисление определенных интегралов способом Симпсона
1.2 Описание среды программирования
2. структура ПРОГРАММЫ
2.1 Описание процесса разработки
2.2 Многофункциональная схема программного комплекса
2.3 Реализация подынтегральных функций
2.4 Реализация функции разбора произвольно данных математических функций
2.5 Реализация численных способов вычисления интегралов
2.5 Реализация функций построения и сохранения графиков
2.5.1 Основная теория
2.5.2 Функция отрисовки графика
2.5.3 Описание методики сохранения графика в графический файл
2.6 Описание модулей и форм
2.7 Вызовы API-функций
2.8 методика смешанного программирования
2.9 Контроль неквалифицированных действий юзера
3. ЭЛЕМЕНТЫ ИНТЕРФЕЙСА ПРОГРАММНОГО КОМПЛЕКСА
3.1 Шаблоны окон
3.2 Структурно-функциональная схема программного комплекса
3.3 Описание компонент: GroupBox, SavePictureDialog
4. ТЕСТОВЫЕ ВЫЗОВЫ ПРОГРАММЫ
5. ОПИСАНИЕ РАЗРАБОТКИ СПРАВОЧНОЙ системы
ЗАКЛЮЧЕНИЕ
ПЕРЕЧЕНЬ ССЫЛОК
ПРИЛОЖЕНИЕ А
ПРИЛОЖЕНИЕ Б
приложение В
ВВЕДЕНИЕ
В истинное время на рынке операционных систем более обширно всераспространенными являются операционные системы семейства MicrosoftWindows. MS-Windows предоставляет юзерам оболочку графического интерфейса (GUI), которая обеспечивает обычную среду юзера и программера. (GUI) дает наиболее сложное и дружелюбное свита юзера, чем командно-управляемый интерфейс DOS. Работа в Windows базирована на интуитивно понятных принципах. Для вас просто переключиться с задачки на задачку и производить обмен информацией меж ними. Но создатели приложений обычно сталкиваются с трудностями программирования, так как организация среды Windows является очень сложной.
Delphi — язык и среда программирования, относящаяся к классу RAD- (Rapid Application Development ‑ «Средство резвой разработки приложений») средств CASE — технологии. Delphi сделала разработку массивных приложений Windows резвым действием, доставляющим для вас наслаждение. Приложения Windows, для сотворения которых требовалось огромное количество человечьих усилий к примеру в С++, могут быть написаны одним человеком, использующим Delphi.
Выгоды от проектирования в среде Windows при помощи Delphi:
— Устраняется необходимость в повторном вводе данных;
— Обеспечивается согласованность проекта и его реализации;
— Возрастает производительность разработки и переносимость программ.
Зрительное программирование вроде бы добавляет новое измерение при разработке разработке приложений, давая возможность изображать эти объекты на дисплее монитора до выполнения самой программки. Без зрительного программирования процесс отображения просит написания фрагмента кода, создающего и настрающего объект «по месту». Узреть закодированные объекты было может быть лишь в процессе выполнения программки. При таком подходе достижение того, чтоб объекты выглядели и вели себя данным образом, становится мучительным действием, который просит многократных исправлений программного кода с следующей прогонкой программки и наблюдения за тем, что в итоге вышло.
Благодаря средствам зрительной разработки можно работать с объектами, держа их перед очами и получая результаты фактически сходу. Способность созидать объекты таковыми, какими они возникают в процессе выполнения программки, снимает необходимость проведения огромного количества операций вручную, что типично для работы в среде не обладающей зрительными средствами — вне зависимости от того, является она объектно-ориентированной либо нет. Опосля того, как объект помещен в форму среды зрительного программирования, все его атрибуты сходу показываются в виде кода, который соответствует объекту как единице, исполняемой в процессе работы программки.
Размещение объектов в Delphi соединено с наиболее тесноватыми отношениями меж объектами и настоящим программным кодом. Объекты помещаются в вашу форму, при всем этом код, отвечающий объектам, автоматом записывается в начальный файл. Этот код компилируется, обеспечивая значительно наиболее высшую производительность, чем зрительная среда, которая интерпретирует информацию только в процессе выполнения программки.
В мире почти все создатели твердо ориентируются на внедрение Delphi как на инструмент, позволяющий создавать высокоэффективные клиент-серверные приложения. Спектр разработанных с помощью Delphi программных товаров также поражает — от игровых программ до мощнейших банковских систем.
Таковым образом, Delphi является одним из более симпатичных для программера средств разработки, свойство создаваемых программ соответствуют уровню, обеспечиваемому компилятором языка С++. Все приведенные выше причины определили выбор Delphi в качестве средства разработки программного комплекса в данной курсовой работе.
1. ТЕОРЕТИЧЕСКИЕ АСПЕКТЫ ПРОГРАММЫ
1.1 Численные способы вычисления определенных интегралов
Задачка вычисления интегралов возникает в почти всех областях прикладной арифметики. Почти всегда не удается отыскать аналитической формулы, т.е. выразить неопределенный интеграл в виде алгебраических и непознаваемых функций. Даже если аналитическая формула находится ,то она выходит так сложной, что вычислять интеграл с ее помощью сложнее, чем иными методами. Всераспространенными являются также случаи, когда подынтегральная функция задается графиком либо таблицей экспериментально приобретенных значений. В таковых ситуациях употребляют разные способы численного интегрирования, которые основаны на том, что интеграл представляется в виде предела интегральной суммы (суммы площадей), и разрешают найти эту сумму с применимой точностью.
1.1.1 Вычисление определенных интегралов способом трапеций
В данном способе заменяется на линейный интерполяционный многочлен, т.е. на простом отрезке [ xi-1
, xi
] подынтегральная функция представляет собой отрезок прямой полосы. I
в границах [ xi-1
, xi
] , равное площади криволинейной фигуры, заменяется площадью прямоугольной трапеции с высотойhi
и основаниями f(xi-1
) , f(xi
)
:
Si
= 0.5 (yi-1
+ yi
) hi
, i=1,2,…n .
Опосля сложения этих соотношений получим формулу трапеций
I = 0.5 hi
(yi-1
+ yi
) + R .
Если шаг интегрирования неизменный ( hi
= h = const
) , то
I = h ( (y0
+ yn
)/2 + yi
) + R
Набросок 1 — Графическая интерпретация способа трапеций
1.1.2 Вычисление определенных интегралов способом Симпсона
Для вычисления интеграла
можно поступить таковым методом.
Разобьем поначалу просвет [a, b] на некое число, n, равных промежутков
[x0
, x1
], [x1
, x2
], …, [xn-1
, xn
] (x0
= a, xn
= b),
разыскиваемый интеграл представится в виде суммы
Опосля этого, к любому из этих промежутков применим параболическое интерполирование, т.е. станем вычислять перечисленные интегралы по одной из приближенных формул: прямоугольников, трапеций либо по параболической формуле.
В первых 2-ух вариантах мы получим уже известные формулы прямоугольников и трапеций.
Применим сейчас параболическую формулу к любому из интегралов, при всем этом положим, что
Получим
Складывая почленно эти равенства, получим формулу:
(8)
Эта формула именуется формулой Симпсона. Ею пользуются для приближенного вычисления интегралов почаще, чем формулами прямоугольников и трапеций, потому что она дает наиболее четкий итог.
1.2 Описание среды разработки
Delphi — это среда разработки, применяемая до этого всего для сотворения и поддержки приложений, предназначенных как для отдельных индивидуальных компов, так и для серверов. Delphi, как и разработанные с ее помощью приложения, могут работать под фактически хоть какой 32 разрядной операционной системой типа Windows 95, 98, 2000, NT. Это достаточно легкая в исследовании среда, и в то же время достаточно непростая. Изучить ее вполне и конкретно – нереально. Delphi имеет пользовательский графический интерфейс, схожий Visual Basic и C++. Человек, ранее работавший в схожей среде, не будет ощущать себя не в собственной тарелке. На данный момент огромное количество компаний приняло за эталон данный интерфейс для собственных приложений. Неплохим стимулом к получению познаний по данному предмету является познание хоть какого-либо языка программирования, либо принципов написания программки. Совершенно – познание языка программирования Pascal. Ведь весь начальный текст программки на Delphi пишется на языке Object Pascal, фактически ничем не отличающимся от принципов, заложенных в таковой известной программной оболочке. Синтаксис, принцип модуля, процедуры, функции, все взято за базу.
О Delphi молвят как о среде резвого сотворения приложений. Это разработка зрительного программирования, т.е. юзер оформляет свою будущую программку, и лицезреет результаты собственной работы еще до пуска самой программки. В принципе, сам процесс написания приложения делится на две части. На первой стадии программер располагает на окна собственной программки нужные элементы, позиционирует, устанавливает нужные размеры, меняет характеристики. На 2-ой стадии – фактически, написание программного кода, описание параметров частей, доступных лишь во время работы приложения, описание реакций на событие возникновение окна, нажатия на клавишу и др. Для задания каких-то параметров элементу разрабатываемого приложения совсем не непременно писать мощные текстовые строчки, довольно поменять это свойство в инспекторе объектов (так именуемом мониторе параметров избранного элемента). Это изменение автоматом дополнит либо видоизменит программный код.
Это большенный плюс в зрительной технологии программирования. Создавая либо модифицируя собственный программный продукт, юзер не зная либо не обращая внимания на некие характеристики элемента программки, а используя лишь нужные, пишет вполне готовый рабочий продукт, иногда выступающий на равных по трудности, с написанными на невизуальном редакторе.
Доп удобство в работе в среде Delphi это мощная справочная система. Контекстно-зависимая от текущего избранного элемента либо строчки программки, дозволяет получить подробнейшую справку. Вложенные примеры разрешают, не отходя далековато от интересующей вас инфы, просмотреть реализацию уже готовой, может быть полезной вам, программки. естественно, справка, как и сама среда разработки, описана на британском языке. сразу есть и русифицированные файлы справки.
Контекстно-зависимое внедрение файлов справки дозволяет поднять уровень проектируемого приложения на порядок выше. А не сказать про поддержку работы с базами данных – означает не сказать многого. При работе в среде программирования средством так именуемого BDE (Borland Database Engine), системного админа баз данных, можно получать прямой доступ к таковым обычным форматам данных, как dBASE, Paradox, FoxPro, Access, ASCII таблицам. Набор драйверов Borland SQL Links обеспечивает все нужные соединения с SQL-серверами.
Delphi употребляет структурный объектно-ориентированный язык (Object Pascal), который соединяет с одной стороны выразительную мощь и простоту программирования, соответствующую для языков 4GL, а с иной стороны эффективность языка 3GL. Программеры немедля могут начать создавать работающие приложения, и им не придется для этого учить индивидуальности программирования событий в Windows. Delphi вполне поддерживает передовые программные концепции включая инкапсуляцию, наследование, полиморфизм и управление событиями.
Редактирование программ можно производить, используя запись и выполнение макросов, работу с текстовыми блоками, настраиваемые композиции кнопок и цветовое выделение строк.
Delphi владеет мощным, интегрированным в редактор графическим отладчиком, позволяющим отыскивать и устранять ошибки в коде. Вы сможете установить точки останова, проверить и поменять переменные, с помощью пошагового выполнения в точности осознать способности наиболее узкой отладки, Вы сможете употреблять раздельно доступный Turbo Debugger, проверив ассемблерные аннотации и регистры микропроцессора.
В состав RAD Pack заходит эксперт для преобразования ресурсов, сделанных в Borland Pascal 7.0, в формы Delphi. Уже возникли специалисты, облегчающие построение DLL и даже написание собственных профессионалов
2. структура ПРОГРАММЫ
2.1 Описание процесса разработки
Процесс разработки программного комплекса реализующего задачки поставленные в задании к курсовому проекту начинается с сотворения новейшего проекта в среде программирования Delphi.
Основная форма программки содержит составляющие, нужные для реализации пользовательского интерфейса, также для выполнения других нужных функций:
— PageControl – компонент предназначен для сотворения многостраничного диалога: на одной страничке будет размещен диалог расчета интегралов, а на 2-ой – диалог построения графиков.
— MainMenu – основное меню программки.
— SavePictureDialog – диалог созданный для сохранения графических файлов (в программке употребляется для сохранения графика).
При помощи компонента PageControl реализуется многостраничный диалог. 1-ая страничка диалога содержит составляющие:
— Panel – компонент употребляется в декоративных целях
— Label —
служит для отображения текста на дисплее;
— ComboBox – служит для выбора инфы из перечня (употребляется для выбора подынтегральной функции)
— Edit – употребляется в программке для ввода значений (в программке употребляется для ввода численных значений)
— Button — дозволяет выполнить какие-либо деяния при нажатии клавиши во время выполнения программки (в программке по нажатию клавиш происходит расчет интегралов).
2-ая страничка диалога содержит компонент:
— Image – компонент употребляется для построения графика.
В программке нужно воплотить последующие функции:
1. Реализация подынтегральных функций (реализовано в functions.dll).
2. Реализация функции разбора произвольно данных математических функций (реализовано в модуле evalcomp.pas)
3. Реализация численных способов вычисления интегралов способами трапеций и Симпсона (реализовано в integrals.dll).
4. Реализация функции построения графика (реализовано в модуле Chart.pas).
5. Реализация функции сохранения графика в файл (реализовано в модуле Chart.pas).
6. Реализация вызовов API функций
Не считая того нужно сделать справочную систему помогающую юзерам в процессе работы с программкой
2.2 Многофункциональная схема программного комплекса
Укрупненная многофункциональная схема приложения изображена на рис. 2. Схема указывает взаимодействие главных частей программки.
Набросок 2 – Многофункциональная схема приложения
Стрелки на рисунке указывают взаимодействие частей программки и операционной системы. В виде прямоугольников на схеме изображены элементы программки и ОС.
2.3 Реализация подынтегральных функций
Подынтегральные функции, которые нужны для вычисления интегралов и, данных в задании к курсовому проекту реализованы в отдельной динамической библиотеке functions.dll. Данная библиотека динамически присоединяется к программке в процессе работы. Листингифункцийпредставленынарисунке3.
function Integral1Function(x: real; var y: real):boolean;
begin
Result:=true;
try
y:=1/sqrt(2+0.5*x*x)
except
result:=false;
end;
end;
function Integral2Function(x: real; var y: real):boolean;
begin
Result:=true;
try
y:=sin(2*x)/sqr(x)
except
result:=false;
end;
end;
2.4 Реализация функции разбора произвольно данных математических функций
В программке реализована возможность расчета интегралов и построения графиков не только лишь для функций, данных в процессе разработки программки, да и для математических функций задаваемых юзером в процессе работы с программкой. Данная функция реализована в модуле evalcomp.pas. Потому что разработка данной способности не была предусмотрена в задании к курсовому проекту, то реализации данного модуля не будет тщательно рассматриваться в записке. Разглядим только правила использования функции.
Для использования данной способности в основном модуле создается объект типа
. объект нужно инициализировать строчкой содержащей математическую функцию.
Пример:
new(calc, init(‘x’));
где calc – переменная типа
Для вычисления значения данной функции нужно вызывать способ eval1d:
function eval1d(x:real):real;
В качестве параметра для данной функции нужно задавать
2.5 Реализация численных способов вычисления интегралов
Теоретические выкладки для вычисления интегралов численными способами были приведены выше в п.1.1.1 и п.1.1.2 данной записки. Программно данные способы реализованы в динамической бибилотеке integrals.dll. Листинги процедур для вычисления интегралов способами трапеций и Симпсона представлены на рисунках 4 и 5.
function Simpson(MainFunction: IntegralFunction;a,b:real;n: integer; var Res: real): boolean;
var
s, h, x,y: real;
i: integer;
begin
Result:=true;
try
s:=0;
h:=(b-a)/n;
for i:=0 to n do
begin
x:=a+h*i;
if (i=0) or (i=n) then if MainFunction(x,y) then s:=s+y else Result:=false else
if i mod 2 = 0 then if MainFunction(x,y) then s:=s+2*y else Result:=false else
if MainFunction(x,y) then s:=s+4*y else Result:=false;
end;
except
Simpson:=false;
end;
Res:=s*h/3;
end;
function CountTrap(MainFunction: IntegralFunction; a,b, eps: real; var Res: real): boolean;
function PTrap(MainFunction: IntegralFunction; a,b:real; DivNo: Integer; var Res: real): boolean;
var
x1, x2,y1,y2,y3,dx,sum: real;
i: integer;
begin
PTrap:=true;
try
sum:=0;
dx:=(b-a)/DivNo;
for i:=1 to DivNo-1 do
begin
x1:=a+dx*i;
if MainFunction(x1,y1) then sum:=sum+y1 else Raise EAbort.Create(»);
end;
sum:=sum*2;
if MainFunction(a,y1) and MainFunction(b,y2) then
sum:=sum+y1+y2 else Raise EAbort.Create(»);
Res:=sum*dx/2;
except
PTrap:=False;
end;
end;
{——}
var
T: integer;
i1, i2: real;
begin
countTrap:=true;
try
if PTrap(MainFunction,a,b,2,i1) and PTrap(MainFunction,a,b,4,i2) then
begin
T:=4;
while абс(i1-i2)>eps do
begin
if PTrap(MainFunction,a,b,t,i1) and PTrap(MainFunction,a,b,t*2,i2) then t:=t*2
else EAbort.Create(»);
T:=T*2;
end;
end else EAbort.Create(»);
Res:=(i1+i2)/2;
except
CountTrap:=false;
end;
end;
2.5 Реализация функций построения и сохранения графиков
2.5.1 Основная теория
В программке функции построения графика выделены в отдельный модуль chart.pas. Для реализации функций построения графика применены принципы объектно-ориентированного программирования. Этот подход дозволяет располагать на форме несколько областей для отображения графиков. Не считая того, на каждой области могут отображаться не один, а сходу несколько графиков разных функций. Для каждой области построения графиков нужно создавать объекты класса TChart. При разработке объекта в конструктор Create передается указатель на Canvas области построения графиков (в нашем случае в программке передается указатель на Canvas компонента TImage).
Для всякого графика, который нужно показывать нужно создавать объект класса TChartFunction. В качестве параметра в конструктор Create передается указатель на функцию, график которой нужно показывать. Опосля сотворения объекта класса TChartFunction нужно вызывать способ TChart.AddFunction, который добавляет график текущей функции в перечень графиков объекта TChart.
2.5.2 Функция отрисовки графика
способ DrawFuncitons класса TChart перебирает по очередности все графики из перечня графиков и по очередности отрисовывает любой из их используя для этого вызов процедуры TChart.DrawFunction. Листинг данной процедуры представлен на рис. 6.
procedure TChart.DrawFunction(funct: TChartFunction);
var
x, y: real;
x1,y1,x2,y2: integer;
a,b: boolean;
f: GraphFunction;
begin
x:=-(x0/FScale);
a:=false;
f:=funct.MainFunction;
while (x0+x*FScale)<(Width-BorderRight) do
begin
if f(x,y) then
begin
x1:=round(x0+x*FScale);
y1:=round(y0-y*FScale);
if (x1>BorderLeft) and (x1<width-BorderRight) and (y1>BorderTop) and (y1<height-BorderBottom) then
begin
PutPixel(x1,y1, funct.Color);
end;
end;
x:=x+0.01;
end;
end;
В данной процедуре используя вызов функции MainFunction объекта класса TChartFunction определяются абсолютные координаты каждой точки графика в спектре значений, отображаемых на области отрисовки графика. Используя за ранее данные масштаб и абсолютные координаты начала координат графика просчитываются координаты каждой точки графика.
2.5.3 Описание методики сохранения графика в графический файл
Для сохранения сделанного графика в графический файл употребляется способ SaveToFile класса TChart. В качестве параметра в данный способ передается название файла в который нужно сохранять изображение.
Данная процедура делает временный объект класса TPicture, копирует канвас графика в канвас вновь сделанного объекта и опосля этого, используя способ TPicture.SaveToFile сохраняет изображение в файл. Полный листинг данного способа представлен на рисунке 7.
procedure TChart.SaveToFile(filename: string);
var
temporary: TPicture;
begin
temporary:=TPicture.Create;
temporary.Bitmap.Width:=width;
temporary.Bitmap.Height:=height;
Temporary.Bitmap.Canvas.CopyRect(Temporary.Bitmap.Canvas.ClipRect,MainCanvas, MainCanvas.ClipRect);
Temporary.SaveToFile(filename);
temporary.Destroy;
end;
2.6 Описание модулей и форм
MainForm (MainUnit.pas) – основная форма программки на которой показываются вычисления интегралов, также происходит построение графиков функций
AboutForm (Abut.unit) – форма содержащая сведения о разрабе программки
EvalForm (EvalFormUnit.pas) – форма для ввода случайных математических функций
SystemInfoForm (SysInfo.pas) – форма отображающая итог выполнения API-функции GetSystemInfo
Набросок 8 – Схема взаимодействия форм приложения
2.7 Вызовы
API
-функций
В качестве задания к курсовому проекту нужно обрисовать и употреблять в программке две API-функции: ClipCursor и GetSystemInfo.
1. Функция ClipCursor содержится в обычной библиотеке User32.dll
Описаниефункции:
functionClipCursor(Rect: TRect);
Эта функция заключает курсор в Rect. Если Rect имеет
характеристики:
Rect: ограничивающий TRect в координатах экрана.
Пример использования данной функции в программке приведен в листинге на рисунке 9.
procedure TMainForm.ClipCursor1Click(Sender: TObject);
var
R: TRect;
begin
ClipCursor1.Checked:=not ClipCursor1.Checked;
if ClipCursor1.Checked then
beginGetClipCursor(ClipRect);
Left:=MainForm.Left;
Right:=MainForm.Left+MainForm.Width;
Bottom:=MainForm.Top+MainForm.Height;
end;
ClipCursor(@R);
end else ClipCursor(@ClipRect);
end;
2. ФункцияGetSystemInfo
Описаниефункции:
procedure GetSystemInfo(lpSystemInfo: TSystemInfo);
Функция в качестве параметра получает указатель на структуру SystemInfo, которую она заполняет. Структуру SystemInfo содержит информацию о текущей системе.
dwOemId:
DWord
Устаревший элемент, созданный для сопоставимости с прошлыми версиями Windows NT (3.5 и ранее). Начиная с Windows 3.51 приложения должны употреблять переход wProcessorArchitecture объединения. Windows 95/98/Me: система постоянно устанавливает этот элемент, чтоб обнулить
wProcessorArchitecture:
Word
Описывает архитектуру микропроцессора системы. Сиим элементом быть может одно из последующих значений:
PROCESSOR_ARCHITECTURE_UNKNOWN
PROCESSOR_ARCHITECTURE_INTEL
PROCESSOR_ARCHITECTURE_MIPS — Windows NT 3.51
PROCESSOR_ARCHITECTURE_ALPHA — Windows NT 4.0 иранее
PROCESSOR_ARCHITECTURE_PPC — Windows NT 4.0 иранее
PROCESSOR_ARCHITECTURE_IA64 — 64-битнаяверсия Windows
PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 — 64-битнаяверсия
Windows PROCESSOR_ARCHITECTURE_AMD64 — 64-битнаяверсия
Зарезервирован для грядущего использования.
dwPageSize
: DWord
Описывает размер странички и степень детализации защиты странички и блокирования. Это — размер странички, применяемый функцией VirtualAlloc.
lpMinimumApplicationAddress
: Pointer
Указатель на самый маленький адресок памяти, доступный для приложений и библиотек динамической связи (DLLs).
lpMaximumApplicationAddress
: Pointer
Указатель на самый высочайший адресок памяти, доступный для приложений и DLLs.
dwActiveProcessorMask
: DWord
Описывает маску, представляющую набор микропроцессоров, конфигурированных в систему. бит 0 — микропроцессор 0; бит 31 — машина — комплекс технических средств, предназначенных для автоматической обработки информации в процессе решения вычислительных и информационных задач) (либо вычислительной системы) которое делает арифметические и логические операции данные программкой преобразования инфы управляет вычислительным действием и коор 31.
dwNumberOfProcessors
: DWord
Описывает количество микропроцессоров в системе.
dwProcessorType
: DWord
Устаревший элемент, созданный для сопоставимости с прошлыми версиями Windows NT (3.5 и ранее). Windows 95/98/Me: Описывает тип микропроцессора в системе. Windows NT: Этот элемент больше не имеет значения, но сохранен для сопоставимости с Windows 95 и прошлыми версиями Windows NT. нужно употреблять wProcessorArchitecture, wProcessorLevel, и wProcessorRevision элементы, чтоб найти тип микропроцессора. Этимэлементомможетбытьодноизследующихзначений: PROCESSOR_INTEL_386 PROCESSOR_INTEL_486 PROCESSOR_INTEL_PENTIUM PROCESSOR_MIPS_R4000 — Windows NT PROCESSOR_ALPHA_21064 — Windows NT
dwAllocationGranularity
: DWord
Описывает степень детализации распределения виртуальной памяти.
wProcessorLevel
: Word
Windows 95 — этот элемент не поддерживается. Windows NT — описывает строительный уровень микропроцессора.
2.8 методика смешанного программирования
При запуске нескольких экземпляров 1-го приложения, Windows загружает в оперативку лишь одну копию кода и ресурсов — модуль приложения, создавая несколько отдельных частей данных, стека и очереди сообщений, любой набор которых представляет из себя задачку, в осознании Windows. Копия приложения представляет из себя контекст, в каком производится модуль приложения. DLL — библиотека также является модулем. Она находится в памяти в единственном экземпляре и содержит сектор кода и ресурсы, также сектор данных. DLL — библиотека, в отличие от приложения не имеет ни стека, ни очереди сообщений. Функции, помещенные в DLL, производятся в контексте вызвавшего приложения, пользуясь его стеком. Но эти же функции употребляют сектор данных, принадлежащий библиотеке, а не копии приложения.
В силу таковой организации DLL, экономия памяти получается из-за того, что все запущенные приложения употребляют один модуль DLL, не включая те либо другие обычные функции в состав собственных модулей.
Нередко, в виде DLL создаются отдельные наборы функций, объединенные по тем либо другим логическим признакам, аналогично тому, как философски происходит планирование модулей ( в смысле unit ) в Pascal. Отличие состоит в том, что функции из модулей Pascal компонуются статически — на шаге линковки, а функции из DLL компонуются динамически, другими словами в run-time.
Таковым образом, DLL разрешают:
— избежать громоздкости исполняемого кода прикладной программки;
— сделать лучше структурированность и модульность приложения;
— уменьшить занимаемый приложением размер памяти за счет того, что несколько сразу выполняющихся программ могут употреблять одну и ту же копию подпрограммы из DLL, при всем этом в памяти будет на физическом уровне загружена лишь одна копия библиотеки;
— употреблять всякую библиотеку в всех программках, не зависимо от того, на каком языке была написана программка и библиотека.
DLL являются одними из более принципиальных главных частей при написании хоть какого приложения Windows. Само ядро Windows представлено 3-мя большенными по размеру динамическими библиотеками: KERNEL.DLL, User.DLL и GDI.DLL. Файл KERNEL.DLL, к примеру, отвечает за управление памятью, действиями и потоками; User.DLL содержит функции интерфейса юзера, нужные для сотворения окон и обработки сообщений Windows; на GDI.DLL возложена работа с графикой. Общее количество применяемых самой Windows динамических библиотек составляет порядка 2-ух тыщ.
В курсовом проекте также употребляется методика смешанного программирования. Так подынтегральные функции, применяемые для расчета интегралов вынесены в отдельную динамическую библиотеку functions.dll. Численные способы вынесены также в отдельную библиотеку integrals.dll.
В главный программке употребляется динамическая загрузка dll-библиотек. Весь процесс загрузки библиотек вынесен в отдельную функцию, листинг которой приведен на рисунке 10.
procedure TMainForm.LoadDlls;
var
x: real;
begin
IntegralsDll:=LoadLibrary(‘Integrals.dll’);
FunctionsDll:=LoadLibrary(‘Functions.dll’);
if IntegralsDll=0 then
begin
Application.MessageBox(‘Ненайденмодуль »Integrals.dll».
Работа приложения будет прекращена’,
‘Ошибка!!!’, MB_Ok or MB_ICONERROR);
Application.Terminate;
end;
if FunctionsDll=0 then
begin
Application.MessageBox(‘Ненайденмодуль »Functions.dll». Работаприложениябудетпрекращена’,
‘Ошибка!!!’, MB_Ok or MB_ICONERROR);
Application.Terminate;
end;
@Simpson:=GetProcAddress(IntegralsDLL,’Simpson’);
@CountTrap:=GetProcAddress(IntegralsDLL,’CountTrap’);
if (@CountTrap=nil) or (@Simpson=nil) then
begin
Application.MessageBox(‘Ошибкавмодуле »Integrals.dll».
Работа приложения будет прекращена’,
‘Ошибка!!!’, MB_Ok or MB_ICONERROR);
Application.Terminate;
end;
@Integral1Function:=GetProcAddress(FunctionsDLL,’Integral1Function’);
@Integral2Function:=GetProcAddress(FunctionsDLL,’Integral2Function’);
if (@Integral1Function=nil) or (@Integral1Function=nil) then
begin
Application.MessageBox(‘Ошибкавмодуле »Functions.dll».
Работа приложения будет прекращена’,
‘Ощибка!!!’, MB_Ok or MB_ICONERROR);
end;
2.9 Контроль неквалифицированных действий юзера
В приложении предусмотрен контроль за неквалифицированными действиями юзера. программка разработана таковым образом, чтоб при всех действиях юзера не появлялось сбоя в программке.
Выполнение данной задачки достигалось методом использования структурной обработки исключительных ситуаций- системы, позволяющей программеру при появлении ошибки (исключительной ситуации) связаться с кодом программки, приготовленным для обработки таковой ошибки. Это производится при помощи языковых конструкций, которые вроде бы “охраняют” фрагмент кода программки и определяют обработчики ошибок, которые будут вызываться, если что-то пойдет не так в “охраняемом” участке кода. В данном случае понятие исключительной ситуации относится к языку и не необходимо его путать с системными исключительными ситуациями (hardware exceptions), таковыми как General Protection Fault. Исключительные ситуации в Delphi же независимы от “железа”, не употребляют прерываний и употребляются для обработки неверных состояний, с которыми подпрограмма не готова иметь дело. Системные исключительные ситуации, естественно, могут быть перехвачены и преобразованы в языковые исключительные ситуации, но это лишь одно из применений языковых исключительных ситуаций.
При классической обработке ошибок, ошибки, обнаруженные в процедуре обычно передаются наружу (в вызывавшую функцию) в виде возвращаемого значения функции, характеристик либо глобальных переменных (флагов). Любая вызывающая процедура обязана инспектировать итог вызова на наличие ошибки и делать надлежащие деяния. Нередко, это просто выход еще выше, в наиболее верхнюю вызывающую функцию и т.д. : функция A вызывает B, B вызывает C, C обнаруживает ошибку и возвращает код ошибки в B, B инспектирует возвращаемый код, лицезреет, что появилась ошибка и возвращает код ошибки в A, A инспектирует возвращаемый код и выдает сообщение о ошибке или собирается сделать чего-нибудть еще, раз 1-ая попытка не удалась.
Структурная обработка исключительной ситуации замещает ручную обработку ошибок автоматической, сгенерированной компилятором системой извещения. В приведенном выше примере, процедура A установила бы “охрану” со связанным обработчиком ошибки на фрагмент кода, в каком вызывается B. B просто вызывает C. Когда C обнаруживает ошибку, то делает (
) исключительную ситуацию. Особый код, сгенерированный компилятором и интегрированный в Run-Time Library (RTL) начинает поиск обработчика данной исключительной ситуации. При поиске “защищенного” участка кода употребляется информация, сохраненная в стеке. В процедурах C и B нет такового участка, а в A — есть. Если один из обработчиков ошибок, которые употребляются в A, подступает по типу для появившейся в C исключительной ситуации, то программка перебегает на его выполнение. При всем этом, область стека, применяемая в B и C, очищается; выполнение этих процедур прекращается.
Если в A нет пригодного обработчика, то поиск длится в наиболее верхнем уровне, и так может идти, пока поиск не достигнет пригодного обработчика ошибок посреди применяемых по дефлоту обработчиков в RTL. Обработчики ошибок из RTL лишь демонстрируют сообщение о ошибке и форсированно прекращают выполнение программки. Неважно какая исключительная ситуация, которая осталась необработанной, приведет к прекращению выполнения приложения.
Без проверки возвращаемого кода опосля всякого вызова подпрограммы, код программки должен быть наиболее обычным, а скомпилированный код — наиболее резвым. При наличии исключительных ситуаций подпрограмма B не обязана содержать доп код для проверки возвращаемого результата и передачи его в A. B ничего не обязана созодать для передачи исключительной ситуации, появившейся в C, в функцию A — интегрированная система обработки исключительных ситуаций делает всю работу.
Данная система именуется
так как обработка ошибок определяется областью “защищенного” кода; такие области могут быть вложенными. Выполнение программки не может перейти на случайный участок кода; выполнение программки может перейти лишь на обработчик исключительной ситуации активной программки.
Пример использования структурной обработки исключительных ситуаций с внедрением блока try-exceptв процедуре TMainForm.btnSimpsonRunClick приведен на рисунке 11.
try
a:=StrToFloat(edSimpA.Text);
b:=StrToFloat(edSimpB.Text);
n:=StrToInt(edSimpN.Text);
if a>b then
begin
Application.MessageBox(‘Нижний предел больше верхнего’, ‘Ошибка!’,MB_OK or MB_ICONError);
exit;
end;
except
on EConvertError do
begin
Application.MessageBox(‘Ошибка ввода численных значений’, ‘Ошибка!’,MB_OK or MB_ICONError);
exit;
end;
end;
Также в программке применяется методика сотворения и обработки пользовательской исключительной ситуации. Так в модуле evalComp.pas создается класс EvalException, являющийся потомком класса EAbort. В процессе работы с модулем может произойти генерация исключительной ситуации, которую в свою очередь будет обрабатывать вызывающий модуль (в нашем случае процедура TEvalForm.btnOkClick). Листинг примера работы с пользовательскими исключительными ситуациями приведен на рисунке 12.
type
EvalException = class(EAbort)
end;
function myfac(x,y:real):real;
var
begin
if x<0 then begin raise EvalException.Create(»); halt; end;
if x = 0 then myfac := 1
else
end;
procedure TEvalForm.btnOkClick(Sender: TObject);
begin
Dispose(calc, done);
try
new(calc, init(edEval.Text)); Close;
except
on EvalException do ShowMessage(‘Ошибка в формуле’);
end;
end;
Не считая того, в программке для предотвращения появления неожиданных ситуаций применяется защищенный блок try-finally-end. Листингприведеннарисунке 13.
procedure TChart.SaveToFile(filename: string);
var temporary: TPicture;
begin
temporary:=TPicture.Create;
try
temporary.Bitmap.Width:=width; temporary.Bitmap.Height:=height;
Temporary.Bitmap.Canvas.CopyRect(Temporary.Bitmap.Canvas.ClipRect,MainCanvas, MainCanvas.ClipRect);
Temporary.SaveToFile(filename);
finally
temporary.Destroy;
end;
end;
3. ЭЛЕМЕНТЫ ИНТЕРФЕЙСА ПРОГРАММНОГО КОМПЛЕКСА
3.1
Шаблоны окон
На рисунках 12 и 13 изображено основное окно программки, которое может изменять собственный вид зависимо от избранной закладки. На рисунке 14 изображено окно, созданное для ввода случайной функции. На рисунке 15 представлена форма окна отображающего сведения о системе. Окно на рисунке 16 изображено окно сведений о разрабе.
Набросок 12 – основное окно программки –
Набросок 13 – основное окно программки –
Набросок 14 – Окно «Случайная функция»
Набросок 15 – Окно отображающее информацию о текущей системе
Набросок 16 – Окно сведений о программке
Все составляющие, которые размещены на формах представленных на рисунках 12-16, описаны в таблицах 1-4.
3.2 Структурно-функциональная схема программного комплекса
файл формы – MainUnit.pas
Имя формы – MainForm
Заголовок – Курсовая работа по СПр
Предназначение формы – ввод начальных данных для вычисления интегралов, для отрисовки графика зависимости значения интеграла от значения верхнего предела интегрирования при фиксированном нижнем пределе, вывод на экран приобретенного графика, приобретенных результатов расчета интегралов и вызов доп форм, демонстрирующих работу API-функций, формы для ввода случайной функции, формы для получения инфы о разрабе, также вызова справки в стиле Windows.
В таблице 1 представлен список компонент содержащихся на форме.
Таблица 1 – Описание главной формы приложения
имя компонента в модуле
Предназначение компонента
Действия компонента
Предназначение обработчиков событий
Примечания
cbSimpFunct, cbTrapFunct
Компонент ComboBox созданный для выбора подинтегральной функции
-
-
-
edSimpA, edSimpB, edTrapA, edTrapB
Поля для ввода конфигурации границ интегрирования
-
-
-
edSimpN
Поле для ввода числа разбиений в способе Симпсона
-
-
-
edTrapEPS
Поля для ввода точности вычислений в способе трапеций
-
-
-
edSimpResult,
edTrapResult
Поля для вывода результатов интегрирования
-
-
-
btnSimpsonRun
Клавиша для расчета интеграла способом Симпсона
onClick
Поначалу выполняться проверка на наличие верхней и нижней границ. Дальше проверка на то, чтоб нижняя граница была меньше либо равна верхней. Контроль записи вещественных чисел. В случае прохождения всех перечисленных выше проверок—расчет способом Симпсона и
выдача в поле вывода результата. Вывод значения интеграла в edSimpResult.
MessageBox(‘Нижний предел больше верхнего’, ‘Ошибка!’,MB_OK or MB_ICONError);
MessageBox(‘Ошибка ввода численных значений’, ‘Ошибка!’,MB_OKorMB_ICONError)
btnTrapRun
Клавиша для расчета интеграла способом трапеций
onClick
Поначалу выполняться проверка на наличие верхней и нижней границ, проверка на то, чтоб нижняя граница была меньше либо равна верхней. Контроль записи вещественных чисел.—расчет способом трапеций и
выдача в поле вывода результата. Вывод значения интеграла в TrapResult.
MessageBox(‘Нижний предел больше верхнего’, ‘Ошибка!’,MB_OK or MB_ICONError);
MessageBox(‘Ошибка ввода численных значений’, ‘Ошибка!’,MB_OKorMB_ICONError)
imInt1, imInt2
Image для отображения интегралов 1 и 2
-
-
-
PageControl
Компонент TPageControl, для управления закладками
-
-
-
ChartBox
Компонент Image для отрисовки графиков
OnMouseDown
Производится проверка какая кнопка нажата – левая либо правая – устанавливается соответственный флаг — и в итоге принимается решение о начале масштабирования или перемещения графика
-
OnMouseMove
Производится проверка флага нажатия клавиши мыши и в итоге: если нажата левая кнопка – продолжение перемещения, правая – продолжение масштабирования
-
OnMouseUp
Производится проверка флага нажатия клавиши мыши и в итоге: если нажата левая кнопка – окончание перемещения и снятие флага, правая – окончание масштабирования и снятие флага
-
SavePictureDialog
Компонент странички DIALOGS служащий для сохранения изображения графика в виде отдельного файла.
Execute
Вызов обычного окна сохранения файлов
MainMenu
Основное меню программки состоящее из разделов: «Файл», «Фукции», «Сервис», «Помощь»
-
-
-
mmSave
Пункт меню для сохранения графика
onClick
Вызов обычного окна сохранения графика
mmExit
Пункт меню для выхода из программки
onClick
Выход программки
mmIntFunct1
Пункт меню для отображения/скрытия графика подынтегральной функции 1
onClick
Показывает/прячет график подынтегральной функции 1
mmIntFunct2
Пункт меню для отображения/скрытия графика подынтегральной функции 2
onClick
Показывает/прячет график подынтегральной функции 2
mmIntegral1
Пункт меню для отображения/скрытия графика интеграла 1
onClick
Показывает/прячет графикинтеграла 1
mmEval
Пункт меню для открытия окна ввода случайной функции
onClick
Вызывает окно ввода случайной функции (форма EvalForm)
mmGrid
Пункт меню для установки сетки на графике
onClick
Разрешает/воспрещает отрисовку сетки на графике
mmSysInfo
Пункт меню для вывода инфы о системе
onClick
Выводит окно с информацией о системе (форма SystemInfoForm)
mmClipCursor
Пункт меню для использования функции ClipCursor
onClick
Показывает внедрение функции ClipCursor
mmHelp
Пункт меню для вызова помощь
onClick
mmAbout
Пункт меню для вывода окна инфы о разрабе
onClick
Вызов формы FormAbout с информацией о разрабе
файл формы – evalForm.pas
Имя формы – EvalForm
Заголовок – Случайная функция
Описание – форма создана для ввода случайной пользовательской функции, отображении/скрытия ее графика.
В таблице 2 представлен список компонент содержащихся на форме.
Таблица 2 – Описание формы ввода случайной функции
имя компонента в модуле
Предназначение компонента
Действия компонента
Предназначение обработчиков событий
Примечания
edEval
Поле для ввода случайной функции
-
-
-
cbEval
CheckBox для отображения/скрытия графика случайной функции
-
-
-
btnOk
Функция принятия конфигураций в случайной функции
onClick
Производится проверка введенной функции, если функция соответствует правилам, то происходит изменение случайной функции, по другому выводится сообщение
ShowMessage(‘Ошибка в формуле’);
файл формы – SysInfo.pas
Имя формы – SystemInfoForm
Заголовок — информация о системе
Описание – форма создана для вывода инфы о текущей системе
Таблица 3 – Описание формы инфы о системе
имя компонента в модуле
Предназначение компонента
Действия компонента
Предназначение обработчиков событий
SystemInfoForm
Форма для отображения инфы о системе
onCreate
Вызывается функция GetSystemInfo и итог заносится в поля формы
leProcessorType, leProcessorArchitecture, leProcessorLevel,
leAllocationGranularity, lePageSize, leMinimumApplicationAddress, leMaximumApplicationAddress, leActicveProcessorMask, leNumberOfProcessor
Составляющие для отображения инфы о системе
файл формы – About.pas
Имя формы – AboutForm
Заголовок — О программке
Описание – форма создана для вывода инфы о разрабе
Таблица 4 – Описание формы инфы о разрабе
имя компонента в модуле
Предназначение компонента
Действия компонента
Предназначение обработчиков событий
Примечания
meAabout
Поле для вывода инфы о разрабе
-
-
-
btnOk
Клавиша закрытия формы
onClick
Закрытие формы
3.3 Описание компонент:
GroupBox
,
SavePictureDialog
1. Компонент TGroupBox
Модуль — StdCtrls
Описание:
TGroupBox употребляется для дизайна наружного вида приложения и для группировки установленных в форму компонент по смыслу. Все составляющие в форме можно поделить по многофункциональным назначениям и расположить в таковых компонентах. Комфортен при предназначении порядка перехода по компонентам при помощи клавиши Tab. Заголовок этого компонента меняется свойством Caption.
Приведем иерархию классов для компонента TGroupBox
TObject -> TPersistent -> TComponent -> TWinControl -> TCustomControl -> TCustomGroupBox -> TGroupBox
Главные характеристики, способы и действия для этого компонента приведены в таблицах 5,6 и 7.
Таблица 5 – Главные характеристики компонента ТGroupBox
Наименование
Описание
property Components[Index: Integer]: TComponent;
Перечень всех компонент, для которых данный компонент является обладателем.
property Brush: TBrush;
Описывает цвет и шаблон для отрисовки фона копмонента.
property ClientOrigin: TPoint;
Возвращает координаты экрана в пикселях левого верхненго угла клиентской области компонента.
property TabOrder: TTabOrder;
Показывает номер в последовательности при переходе по компонента при помощи
property Controls[Index: Integer]: TControl;
Перечень всех дочерних компонент
Таблица 6 – Главные способы компонента ТGroupBox
Наименование
Описание
procedure Broadcast(var Message);
Отправляет сообщение любому из дочерних компонент
function CanFocus: Boolean; dynamic;
Возвращает имени.
procedure SetFocus; virtual;
Устанавливает фокус на компонент
Таблица 7 – Главные действия компонента ТGroupBox
Наименование
Описание
property OnEnter: TNotifyEvent;
Событие вызывается когда компонент получает фокус
property OnExit: TNotifyEvent;
Событие вызывается когда компонент теряет фокус
property OnClick: TNotifyEvent;
Событие вызывается когда происходит клик на компоненте
property OnDblClick: TNotifyEvent;
Событие вызывается при двойном нажатии левой клавиши мыши на компоненте
property OnMouseDown: TMouseEvent;
Событие вызывается когда происходит нажатие клавиши мыши при установленном на компоненте указателе мыши
2. Компонент TSavePictureDialog
Модуль – ExtDlgs
Описание:
Компонент TSavePictureDialog показывает модальное диалоговое окно для выбора имени и сохранения графических файл. Этот компонент похож на компонент TSaveDialog, кроме того, что он содержит в себе квадратное окно подготовительного просмотра. Если избранная картина может отображаться с внедрением компонента TPicture, то она отображается в области подготовительного просмотра; поддерживаемые типы файлов содержат в себе точечные картинки Windows(.BMP), иконки (.ICO), Windows метафайлы (.WMF), и расширенный метафайл Windows (.EMF). Если избранный файл не быть может отображен, в области подготовительного просмотра появляестя надпись “(None)”.
Иерархиякомпонента:
TObject -> TPersistent -> TComponent -> TCommonDialog -> TOpenDialog -> TOpenPictureDialog -> TSavePictureDialog
Пример использования данного компонента в программке приведен на рисунке 17.
procedure TMainForm.mmSaveClick(Sender: TObject);
begin
if SavePictureDialog.Execute then Charter.SaveToFile(SavePictureDialog.FileName);
end;
Главные характеристики, способы и действия для этого компонента приведены в таблицах 8,9 и 10.
Таблица 8 – Главные характеристики компонента ТGroupBox
Наименование
Описание
property DefaultExt: String;
Устанавливает расширение файлов применяемое по дефлоту
property FileName: TFileName;
Описывает имя крайнего избранного файла
property Filter: String;
Описывает маску файлов доступную в текущем диалоге
property Title: String;
Описывает заголовок текущего диалога
property InitialDir: String;
Описывает текущую директорию при открытии диалога
Таблица 9 – Главные способы компонента ТGroupBox
Наименование
Описание
function Execute: Boolean; override;
Открывает диалоговое окно
function GetStaticRect: TRect; virtual;
Описывает координаты зарезервированной области диалогового окна
Таблица 10 – Главные действия компонента ТGroupBox
Наименование
Описание
property OnCanClose: TCloseQueryEvent;
Происходит когда юзер пробует закрыть диалоговое окно
property OnFolderChange: TNotifyEvent;
Происходит при смене директории
property OnIncludeItem: TIncludeItemEvent;
Происходит перед тем, как избранный файл добавляется в перечень
property OnTypeChange: TNotifyEvent;
Происходит когда типы файлов, отображаемых в диалоговом окне меняются
4. ТЕСТОВЫЕ ВЫЗОВЫ ПРОГРАММЫ
Ниже приведены примеры тестовых вызовов программки: набросок 18 — пример отображения графика первого интеграла с переменным верхним пределом, набросок 19 — примеры расчета первого и второго интеграла с данными параметрами точности вычислений. На рисунке 20 представлен пример исключительной ситуации, вызванной неправильным задание границ интегрирования. На рисунке 21 — пример вызова API-функции GetSystemInfo, отображающей информацию о текущей системе.
Набросок 18 — Построение графика интеграла
Набросок 19 — Примеры расчета интегралов
Набросок 20 — Тестовый вызов исключительной ситуации
Набросок 21 — Тестовый вызов API-функции GetSystemInfo
Для проверки корректности выполненных расчетов интегралов, представленных на рисунке 19, и отображения графика первого интеграла с переменным верхним пределом приведем пример вычисления интеграла и расчета графика выполненных в программке MathcadProfessional 2000, представленном на рисунке 22.
Набросок 22 — Решение задачки в Mathcad
Как видно из рисунка, значения интегралов рассчитанных в разрабатываемой программке и в программке MathcadProfessional 2000 фактически сходятся, что гласит корректности решения поставленной задачки.
5. ОПИСАНИЕ РАЗРАБОТКИ СПРАВОЧНОЙ системы
Для сотворения справочной системы я употреблял программку DotCHM. Эта программка на лету делает справочные системы нескольких эталонов: 16-разрядная справка, 32-разрядная справка, chm-справка и справка для WindowsCE. В DotCHMможно создавать вполне рабочий справочный файл, с поиском, обзором и содержанием, за считанные минутки. Все, что требуется это набрать текст справки.
Создав новейший проект справочной системы, создаю обычное содержание. Потом создаю перечень разбиений справки на пункты, заполняю эти пункты, добавляю нужные изображения, ссылки и т.д. Связываю все разделы с содержанием и компилирую.
Набросок 23 – Пример вызова справки
ЗАКЛЮЧЕНИЕ
Разработанная программка предоставляет способности по вычислению интегралов при помощи численных способов с довольно большенный степенью точности, что подтверждается проведением подобных расчетов в проф математической программке MathcadProfessional 2000. Не считая того, программка предоставляет возможность ввода случайных функций, вычисления их интегралов и построения графиков функций. Данная программка быть может применена в учебных целях.
При разработке данной программки были приобретены способности:
—
разработки программ в среде программирования Delphi
—
использования методики смешанного программирования
—
использования динамической компоновки dll-библиотек
—
программной реализации численных способов для вычисления определенных интегралов
—
написания 16-ти разрядного Help-а под Windows
ПЕРЕЧЕНЬ ССЫЛОК
1. Турчак Л.И. Базы численных способов: Учеб. пособие. — М.: Наука, Гл. ред. физ. -мат. лит., 2002. — 320 с
2. Стив Т., Ксавье П. Delphi6 управление разраба.-М.: Вильямс, 2005г.- 1112с.
3. Дан Эпплман. Win32 API и VisualBasic для экспертов.-М.: Питер, 2001г.- 1256с.
приложение А
Листинг dll-библиотеки integrals.dll
libraryintegrals;
uses
SysUtils,
Classes;
{$R *.res}
type
IntegralFunction= function (x: real; var y: real): boolean;
function Simpson(MainFunction: IntegralFunction;a,b:real;n: integer; var Res: real): boolean;
var
s, h, x,y: real;
i: integer;
begin
Result:=true;
try
s:=0;
h:=(b-a)/n;
for i:=0 to n do
begin
x:=a+h*i;
if (i=0) or (i=n) then if MainFunction(x,y) then s:=s+y else Result:=false else
if i mod 2 = 0 then if MainFunction(x,y) then s:=s+2*y else Result:=false else
if MainFunction(x,y) then s:=s+4*y else Result:=false;
end;
except
Simpson:=false;
end;
Res:=s*h/3;
end;
function CountTrap(MainFunction: IntegralFunction; a,b, eps: real; var Res: real): boolean;
function PTrap(MainFunction: IntegralFunction; a,b:real; DivNo: Integer; var Res: real): boolean;
var
x1, x2,y1,y2,y3,dx,sum: real;
i: integer;
begin
PTrap:=true;
try
sum:=0;
dx:=(b-a)/DivNo;
for i:=1 to DivNo-1 do
begin
x1:=a+dx*i;
if MainFunction(x1,y1) then sum:=sum+y1 else Raise EAbort.Create(»);
end;
sum:=sum*2;
if MainFunction(a,y1) and MainFunction(b,y2) then
sum:=sum+y1+y2 else Raise EAbort.Create(»);
Res:=sum*dx/2;
except
PTrap:=False;
end;
end;
{——}
var
T: integer;
i1, i2: real;
begin
countTrap:=true;
try
if PTrap(MainFunction,a,b,2,i1) and PTrap(MainFunction,a,b,4,i2) then
begin
T:=4;
while абс(i1-i2)>eps do
begin
if PTrap(MainFunction,a,b,t,i1) and PTrap(MainFunction,a,b,t*2,i2) then t:=t*2
else EAbort.Create(»);
T:=T*2;
end;
end else EAbort.Create(»);
Res:=(i1+i2)/2;
except
CountTrap:=false;
end;
end;
exports Simpson index 1;
exports CountTrap index 2;
begin
end.
приложение
Б
Листинг dll-библиотеки functions.dll
library functions;
uses
SysUtils,
Classes;
{$R *.res}
function Integral1Function(x: real; var y: real):boolean;
begin
Result:=true;
try
y:=1/sqrt(2+0.5*x*x)
except
result:=false;
end;
end;
function Integral2Function(x: real; var y: real):boolean;
begin
Result:=true;
try
y:=sin(2*x)/sqr(x)
except
result:=false;
end;
exports Integral1Function;
exports Integral2Function;
begin
end.
приложение В
Листинг модуля chart.pas
unit Chart;
interface
uses Graphics, SysUtils, Classes;
const
BorderTop=10;
BorderBottom=40;
BorderLeft=40;
BorderRight=10;
type
GraphFunction = function(x: real; var y: real): boolean;
TChartFunction = class
private
MainFunction: GraphFunction;
FColor: TColor;
FShow: boolean;
public
constructor Create(f: GraphFunction);
published
property Color: TColor read FColor write FColor;
property Show: boolean read FShow write FShow;
end;
TChart = class
private
functions: TStringList;
ChartBitmap: TBitmap;
MainCanvas: TCanvas;
bgBrush: TBrush;
gridPen: TPen;
AxisPen: TPen;
Width: integer;
Height: integer;
FScale: real;
FStep: real;
FShowGrid: boolean;
xx0, yy0: integer;
nsteps: integer;
x0, y0: integer;
procedure DrawGrid;
procedure DrawFunction(funct: TChartFunction);
procedure DrawFunctions;
procedure PutPixel(x,y: integer; Color: TColor);
procedure OutTextCenter(s: string; x, y: integer);
public
constructor Create(Canvas: TCanvas);
procedure AddFunction(f: TChartFunction; Ident: String);
function DelFunction(s: string): boolean;
procedure ReDraw;
procedure ShiftHor(value: integer);
procedure ShiftVer(value: integer);
procedure Rescale(xvalue, yvalue: integer; Maximize: boolean);
procedure GetXY(x,y: integer; var x1,y1: real);
procedure SaveToFile(filename: string);
published
property ShowGrid: boolean read FShowGrid write FShowGrid;
end;
implementation
{ TChart }
constructor TChart.Create(Canvas: TCanvas);
begin
functions:=TStringList.Create;
MainCanvas:=Canvas;
ChartBitmap:=TBitmap.Create;
bgBrush:=TBrush.Create;
bgBrush.Color:=clWhite;
gridPen:=TPen.Create;
gridPen.Style:=psDot;
AxisPen:=TPen.Create;
AxisPen.Width:=2;
AxisPen.Style:=psInsideFrame;
AxisPen.Color:=clRed;
Width:=MainCanvas.ClipRect.Right-MainCanvas.ClipRect.Left;
Height:=MainCanvas.ClipRect.Bottom-MainCanvas.ClipRect.Top;
ChartBitmap.Width:=Width;
ChartBitmap.Height:=Height;
FShowGrid:=true;
xx0:=40+trunc((width-50)/2);
yy0:=10+trunc((height-50)/2);
x0:=xx0;
y0:=yy0;
NSteps:=20;
FScale:=20;
FStep:=(width/fscale)/nsteps;
ReDraw;
end;
procedure TChart.DrawFunction(funct: TChartFunction);
var
x, y: real;
x1,y1,x2,y2: integer;
a,b: boolean;
f: GraphFunction;
begin
x:=-(x0/FScale);
a:=false;
f:=funct.MainFunction;
while (x0+x*FScale)<(Width-BorderRight) do
begin
if f(x,y) then
begin
x1:=round(x0+x*FScale);
y1:=round(y0-y*FScale);
if (x1>BorderLeft) and (x1<width-BorderRight) and (y1>BorderTop) and (y1<height-BorderBottom) then
begin
PutPixel(x1,y1, funct.Color);
end;
end;
x:=x+0.01;
end;
end;
procedure TChart.OutTextCenter(s: string; x, y: integer);
begin
x:=x-round(MainCanvas.TextWidth(s)/2);
y:=y-round(MainCanvas.TextHeight(s)/2);
MainCanvas.TextOut(x,y,s);
end;
procedure TChart.DrawGrid;
var
x, y: integer;
k: real;
s: string;
begin
With MainCanvas do begin
Brush.Assign(bgBrush);
FillRect(ClipRect);
begin
if FShowGrid then
Pen.Assign(GridPen) else Pen.Style:=psClear;;
x:=x0 mod trunc(FScale*FStep);
while x<(width-BorderRight) do
end;
procedure TChart.ReDraw;
begin
DrawGrid;
DrawFunctions;
end;
procedure TChart.ShiftHor(value: integer);
begin
x0:=x0+value;
ReDraw;
end;
procedure TChart.ShiftVer(value: integer);
begin
y0:=y0+value;
ReDraw;
end;
procedure TChart.AddFunction(f: TChartFunction; Ident: String);
begin
functions.AddObject(Ident,f);
ReDraw;
end;
procedure TChart.DrawFunctions;
var
i: integer;
begin
for i:=0 to functions.Count-1 do
if TChartFunction(functions.Objects[i]).Show then
DrawFunction(TChartFunction(functions.Objects[i]));
end;
begin
if x>BorderLeft then
begin
MoveTo(x,BorderTop); LineTo(x, Height-BorderBottom);
k:=(x-x0)/FScale;
s:= FloatToStrF(k,ffGeneral,4,2);
OutTextCenter(s, x, height-round(BorderBottom/2));
end;
x:=x+trunc(FStep*FScale);
end;
y:=y0 mod trunc(FScale*FStep);
while y<(height-BorderBottom) do
begin
if y>BorderTop then
begin
MoveTo(BorderLeft,y); LineTo(Width-BorderRight, y);
k:=(y0-y)/FScale;
s:= FloatToStrF(k,ffGeneral,4,2);
OutTextCenter(s,round(BorderLeft/2), y);
end;
y:=y+trunc(FStep*FScale);
end;
end;
// юЄЁшёютър ъююЁфшэрЄэ√ї юёхщ
Pen.Assign(AxisPen);
if (x0>BorderLeft) and (x0<(width-BorderRight)) then
begin
MoveTo(x0, BorderTop); lineto(x0, height-BorderBottom-1);
end;
if (y0>BorderTop) and (y0<(Height-BorderBottom)) then
begin
Moveto(BorderLeft,y0); lineTo(width-BorderRight-1, y0);
end;
Pen.Assign(gridPen);
Pen.Style:=psSolid;
Brush.Style:=bsClear;
Rectangle(40, 10, Width-10, height-40);
Brush.Style:=bsSolid;
end;
end;
procedure TChart.PutPixel(x, y: integer; Color: TColor);
var
i, j: integer;
begin
with MainCanvas do
for i:=x to x+1 do
for j:=y to y+1 do
MainCanvas.Pixels[i,j]:=Color;
function TChart.DelFunction(s: string): boolean;
label 1;
var
i: integer;
begin
result:=false;
for i:=0 to functions.Count-1 do
if functions.Strings[i]=s then
begin
result:=true;
functions.Delete(i);
goto 1;
end;
1:
end;
procedure TChart.Rescale(xvalue, yvalue: integer; Maximize: boolean);
var
mx, my: Real;
begin
if xvalue*yvalue<>0 then begin
mx:=(width-borderleft-borderright)/xvalue;
my:=(height-bordertop-borderbottom)/yvalue;
if Maximize then
if mx<my then FScale:=FScale*mx else FScale:=FScale*my
else
if mx<my then FScale:=FScale/mx else FScale:=FScale/my;
FStep:=(width/FScale)/NSteps;
ReDraw; end;
end;
procedure TChart.GetXY(x, y: integer; var x1, y1: real);
begin
x1:=(x-x0)/FScale;
y1:=(y0-y)/FScale;
end;
procedure TChart.SaveToFile(filename: string);
var
temporary: TPicture;
begin
temporary:=TPicture.Create;
temporary.Bitmap.Width:=width;
temporary.Bitmap.Height:=height;
Temporary.Bitmap.Canvas.CopyRect( Temporary.Bitmap.Canvas.ClipRect, MainCanvas, MainCanvas.ClipRect);
Temporary.SaveToFile(filename);
temporary.Destroy;
end;
{ TChartFunction }
constructor TChartFunction.Create(f: GraphFunction);
begin
MainFunction:=f;
Show:=true;end;end.
]]>