Разработка программы численного интегрирования дробно-рациональной функции
Появление же визуального программирования стало революционным шагом, кардинально облегчившим жизнь программистов, и нашедшее блестящее воплощение в Delphi. Оно позволило свести проектирование пользовательского интерфейса к простым и наглядным процедурам, которые дают возможность за минуты или часы сделать то, на что ранее уходили месяцы работы. В Delphi ведётся работа в Интегрированной Среде… Читать ещё >
Разработка программы численного интегрирования дробно-рациональной функции (реферат, курсовая, диплом, контрольная)
Курсовая работа
на тему:
Разработка программы ЧИСЛЕННОГО ИНТЕГРИРОВАНИЯ ДРОБНО-РАЦИОНАЛЬНОЙ ФУНКЦИИ
Оглавление Введение
1. Задание на курсовую работу
2. Разработка алгоритма решения задачи численного интегрирования методом трапеции
2.1 Словесное описание разработанного алгоритма
2.2 Блок-схема разработанного алгоритма
3. Разработка программного обеспечения
3.1 Описание интерфейса программы
3.1.1 Описание главного окна программы
3.1.1 Описание окна формы 2 программы
3.1.2 Описание окна формы 3
4. Проверка работоспособности программы Заключение Список литературы Приложение Введение
Delphi — одна из самых мощных систем визуального объектно-ориентированного программирования, позволяющих на самом современном уровне создавать как отдельные прикладные программы Windows, так и разветвленные комплексы, предназначенные для работы в корпоративных сетях и в Интернет.
Объектно-ориентированное программирование в наше время — это совершенно естественный подход к построению сложных (и не очень сложных) программ и систем. Приложение, построенное по принципам объектной ориентации — это совокупность объектов и способов их взаимодействия. И для надежного функционирования объекта поддерживается целостность и непротиворечивость его данных. Для внешних потребителей данных становится доступен только пользовательский интерфейс, в то время как внутренняя реализация — это дело разработчика объекта. При таком подходе разработчик может в любой момент модернизировать объект, изменить структуру хранения и форму представления данных, так же возможно создание и уничтожение объектов, чьей основной целью является экономия ресурсов компьютера и, прежде всего, памяти.
Появление же визуального программирования стало революционным шагом, кардинально облегчившим жизнь программистов, и нашедшее блестящее воплощение в Delphi. Оно позволило свести проектирование пользовательского интерфейса к простым и наглядным процедурам, которые дают возможность за минуты или часы сделать то, на что ранее уходили месяцы работы. В Delphi ведётся работа в Интегрированной Среде Разработки (ИСР или Integrated development environment — IDE) Delphi. Большим преимуществом является то, что результаты проектирования можно видеть, даже не компилируя программу, немедленно после выполнения какой-то операции с помощью мыши. Самое главное достоинство визуального программирования заключается в том, что во время проектирования формы и размещения на ней компонентов Delphi автоматически формирует коды программы, включая в нее соответствующие фрагменты, описывающие данный компонент. А затем в соответствующих диалоговых окнах пользователь может изменить заданные по умолчанию значения каких-то свойств этих компонентов и, при необходимости, написать обработчики каких-то событий. Визуальные компоненты сразу видны на экране, поэтому пользователь может очень легко выбрать место их расположения и их дизайн — форму, размер, оформление, текст, цвет и т. д. А библиотека визуальных компонентов Delphi включает множество типов компонентов, и их номенклатура очень быстро расширяется от версии к версии. Поэтому того, что имеется уже сейчас вполне достаточно, чтобы построить практически любое самое замысловатое приложение. При этом даже неопытный программист может создавать приложения, которые выглядят совершенно профессионально.
Благодаря визуальному объектно-ориентированному программированию была создана технология быстрой разработки приложений, получившая название Rapid Application Development (RAD). Эта технология является довольно распространенной и невероятно гибкой. Позволяет общаться с другими разработчиками, обмениваясь опытом и постоянно совершенствуясь, а так же используя Delphi, вы имеете возможность создавать прекрасные прикладные программы самого разного назначения.
Тип экранного представления, при котором пользователь может выбирать команды, запускать задачи и просматривать списки файлов, указывая на пиктограммы или пункты в списках меню, показанных на экране, имеет свои преимущества — графический интерфейс пользователя (Graphical User Interface — GUI). Действия могут, как правило, выполняться с помощью мыши, либо нажатием клавиш на клавиатуре. Типичным, примером графического интерфейса пользователя является сам Windows. Delphi предоставляет разработчику приложения широкие возможности быстрого и качественного проектирования графического интерфейса пользователя — различных окон, кнопок, меню и т. д. Так что разработчик может в полной мере проявить свою фантазию. Но полеты фантазии очень полезно ограничивать. Есть определенные принципы построения графического интерфейса пользователя, и пренебрегающий ими обречен на то, что его приложение будет выглядеть чужеродным объектом в среде Windows. Для пользователя одним из принципиальных преимуществ работы с Windows является то, что большинство имеющихся приложений выглядят и ведут себя сходным образом. После того как вы поработаете с несколькими приложениями, вы обнаружите, что можете заранее почти наверняка сказать, где можно найти ту или иную функцию в программе, которую только что приобрели, или какие быстрые клавиши надо использовать для выполнения тех или иных операций. Помимо этого, при разработке графического интерфейса полезно сначала построить его прототип, отражающий предлагаемый вами графический интерфейс, за которым на первых порах не скрывается реальных программ. Одним из главных преимуществ Delphi как раз и является возможность очень быстрого построения подобных прототипов.
1. Задание на курсовую работу Разработать в среде Delphi программу численного интегрирования дробно-рациональной функции вида по переменной методом трапеции на произвольном интервале по произвольному количеству точек .
Требования к разрабатываемому программному обеспечению:
1) Решение задачи должно быть возможно при любых значениях параметров .
2) Ввод параметров задачи производить через различные компоненты ввода, вывод промежуточных и окончательных результатов вычислений производить одновременно в несколько разных компонентов вывода (например: метку, сообщение, многострочное поле).
3) Необходимо производить проверку корректности введённых параметров. При необходимости производить коррекцию входных параметров и выдавать соответствующие уведомления.
4) Вычисления значения функции необходимо производить в отдельном модуле.
5) Предусмотреть возможность сохранения и загрузки начальных значений параметров в типизированном файле.
6) Предусмотреть возможность вывода результатов в текстовый файл.
7) На отдельно форме отобразить графическую интерпретацию задачи: график функции в заданных пределах, построенный в декартовой системе координат. Предусмотреть вывод на графике обоих координатных осей и единичных отрезков.
8) Привести не менее 5 примеров вычислений для различных характерных наборов значений параметров (кроме). Каждый пример должен содержать результаты расчёта при нескольких значениях (например, 10, 100 и 100), распечатку окна графической интерпретации и результаты проверки правильности интегрирования, выполненные в любой системе математических вычислений (например, Mathcad, Matlab, Maple и т. д.).
2. Разработка алгоритма решения задачи численного интегрирования методом трапеции
2.1 Словесное описание разработанного алгоритма
1) Ввод коэффициентов, ,;пределов интегрирования ,;количества точек интегрирования n.
2) Если, ,, тогда
3) Если, не заданы, тогда, ,.
4) Если, не заданы, тогда ,.Если, тогда ,.
5) Если или не задано, тогда .
6) Вычисляем шаг изменения аргумента:, где h — шаг изменения аргумента или длинна элементарного отрезка.
7) Начальное значение аргумента, начальное значение суммы ;
8) Пока повторять пункты 8, 9, 10.
9) Вычисление суммы значения функции и следующего значения функции через шаг, вычисляя при этом общую сумму:.
10) Переходим к следующему элементарному отрезку .
11) Вычисляем интеграл, умножая сумму, на половину высоты трапеции
12) Вывод INTEG.
2.2 Блок-схема разработанного алгоритма представлена на рисунке 1:
да
нет да нет да нет
да нет
3. Разработка программного обеспечения
3.1 Описание интерфейса программы Совокупность файлов, создаваемых и используемых Delphi для компиляции и сборки конечного исполняемого файла, называется проектом. Структура проекта Project2 представлена на рисунке.
3.1.1 Описание главного окна программы
1 — Компонент изображения (Image1).
Используется для помещения на форму фото студента.
Установленные свойства:
Picture = (TBitmap); (через через это свойство загружается необходимая картинка в компонент изображения)
2 — Текстовая метки (Label9)
Установленное свойство метки:
Font.Size = 28; (размер шрифта — 28)
Font.Name = Comic Sans MS
Font.Style = fsBold
3 — Текстовые метки (Label10, Label11, Label12).
Метки используются для отображения переменных, свойство Caption устанавливается по смыслу.
Установленные свойства меток:
Font.Size = 18; (размер шрифта — 18)
Font.Name = Comic Sans MS
4 — Кпопка (Button1)
Установленные свойства:
Caption = `ВХОД'; (заголовок кнопки) Событие OnClick=Button1Click. Процедура Button1Click организует переход на форму 2 и скрывает форму 1.
5 — Текстовые метки (Label1, Label2, Label3, Label4, Label5, Label6, Label7, Label8).
Используются для отображения текущей даты и времени.
3.1.2 Описание окна формы 2 программы Описание компонентов Формы 2.
1 — Форма (Form2).
Установленные свойства:
Caption=`Интегрирование дробно-рациональной функции методом трапеции'; (заголовок формы)
2 — Таблица строк (StringGrid1).
Установленные свойства:
Align = alLeft;
Color = clPurple; (цвет)
Font.Size = 12; (размер шрифта — 12)
Font.Name = Comic Sans MS (стиль шрифта)
RowCount = 11; (количество строк — 11)
3 — Поля ввода (Edit1, Edit2, Edit3, Edit4, Edit5, Edit6, Edit7, Edit8, Edit9, Edit10).
Используются для ввода соответствующих переменных.
Установленные свойства:
Font.Size = 8; (размер шрифта — 8)
Font.Name = MS Sans Serif
4 — Текстовые метки (Label1, Label2, Label3, Label4, Label5, Label6, Label10, Label11, Label12, Label13, Label14, Label15, Label16, Label17, Label18, Label19).
Метки используются для отображения переменных, свойство Caption устанавливается по смыслу.
Установленные свойства меток:
Font.Size = 14; (размер шрифта — 14)
Font.Name = MS Sans Serif
Font.Style = fsBold
5 — Многострочное поле (Memo1).
Используется для вывода результатов работы программы.
Установленные свойства:
Color = clMoneyGreen;(цвет)
Font.Size = 8; (размер шрифта — 8)
ReadOnly = True; (доступно только для чтения)
ScrollBars = ssVertical; (вертикальная полоса прокрутки)
6 — Панель (Panel1).
Установленные свойства:
Align = alClient; (привязка к левому карюю формы)
Caption = `'; (заголовок панели)
Color = clNavy; (цвет)
7 — Системные диалоги (OpenDialog1, SaveDialog1, ColorDialog1, FontDialog1,).
OpenDialog1 — диалог открытия файла.
SaveDialog1 — диалог сохранения файла.
ColorDialog1 — диалог задавания параметра цвета.
FontDialog1 — диалог задавания параметров шрифта.
8 — Компонент меню (MainMenu1).
Меню содержит следующие пункты:
1) File1. Содержит 3 подпункта.
Установленные свойства:
Caption= `Файл'; (заголовок) а) Open1.
Установленные свойства:
Caption= `Открыть данные'; (заголовок)
Событие OnClick=Open1Click. Процедура Open1Click организует сохранение начальных данных в типизированный файл, указанный в диалоге сохранения файла, из соответствующих полей ввода.
б) Save1.
Установленные свойства:
Caption= `Сохранить введенные данные'; (заголовок) Событие OnClick= Save1Click. Процедура Save1Click организует сохранение начальных данных в типизированный файл, указанного в диалоге сохранения файла, из соответствующих полей ввода.
в) N1.
Установленные свойства:
Caption = `Сохранить результаты вычислений'; (заголовок)
Enabled = False; (элемент недоступен) Событие OnClick=N1Click. Процедура N1Click организует сохранение начальных данных и результатов вычислений в текстовый файл, указанный в диалоге сохранения файла.
2) N2. Содержит 2 подпункта.
Установленные свойства:
Caption= `Вид'; (заголовок) а) N3.
Установленные свойства:
Caption= `Цвет фона многострочного поля; (заголовок)
Событие OnClick=N3Click. Процедура N3Click задаёт параметр цвета многострочного поля Memo1.
б) N4.
Установленные свойства:
Caption= `Шрифт многострочного поля; (заголовок) Событие OnClick=N4Click. Процедура N4Click задаёт параметры шрифта многострочного поля Memo1.
3)N5
Установленные свойства:
Caption = `Нарисовать график';
Событие OnClick= N5 Click. Процедура N5 Click делает активной форму Form3.
Осуществляются необходимые уведомления об ошибках.
1- При введении в поля ввода Edit4, Edit5, Edit6, Edit7 одновременно значения «0» будет выдано следующее сообщение:
2 — При неверном введении количества точек интегрирования (меньше 1) будет выдано следующее сообщение:
3.1.3 Описание окна формы3
В результате выполнения процедуры Button2Click на экране появляется Форма 3. При нажатии кнопки «Нарисовать график» или пункт меню «Нарисовать график», появляется графическая интерпретация задачи.
Описание компонентов Формы 3.
1 — Форма (Form3).
Установленные свойства:
Caption= `График; (заголовок формы)
2- Кнопка (Button1).
Создана процедура-обработчик нажатия на кнопку Button1Click для Button1, в которой выполняется построение графика функции в заданных пределах в декартовой системе координат. Предусмотрен вывод на графике обоих координатных осей и единичных отрезков.
Установленные свойства:
Caption = 'РИСОВАТЬ'; (заголовок кнопки)
4. Проверка работоспособности программы Пример № 1
Набор параметров:
Параметр | ||||||||||
Значение | ||||||||||
Решения методом трапеции:
Значение интеграла | 82,4 301 | 84,9 810 | 81,84 533 | 81,62 269 | |
Проверка вычисления интеграла в системе MathCAD
Пример № 2
Набор параметров:
Параметр | ||||||||||
Значение | — 5 | |||||||||
Решения методом трапеции:
Значение интеграла | 77,71 456 | 76,85 315 | 79,33 153 | 78,20 298 | |
Проверка вычисления интеграла в системе MathCAD
Пример № 3
Набор параметров:
Параметр | ||||||||||
Значение | — 2 | |||||||||
Решения методом трапеции:
Значение интеграла | 5,44 000 | 5,33 440 | 5,33 334 | 5,29 513 | |
Проверка вычисления интеграла в системе MathCAD
Пример № 4
Набор параметров:
Параметр | ||||||||||
Значение | — 5 | |||||||||
программа интерфейс алгоритм окно Решения методом трапеции:
Значение интеграла | 85,12 608 | 87,52 354 | 85,37 402 | 85,14 026 | |
Проверка вычисления интеграла в системе MathCAD
Пример № 5
Набор параметров:
Параметр | ||||||||||
Значение | — 4 | — 10 | ||||||||
Решения методом трапеции:
Значение интеграла | — 0,36 037 | — 0,31 047 | — 0,30 543 | — 0,30 543 | |
Проверка вычисления интеграла в системе MathCAD
Заключение
В ходе решения задачи численного интегрирования дробно-рациональной функции вида по переменной методом трапеции на произвольном интервале по произвольному количеству точек N. Был разработан алгоритм, для него приведено словесное описание и блок-схема.
Пользователь будет иметь решение задачи при любых значениях параметров .Ввод параметров осуществляется через различные компоненты ввода, вывод промежуточных и окончательных результатов вычислений производится одновременно в несколько разных компонентов вывода. Производится проверка корректности введённых параметров, в случае необходимости производится коррекция входных параметров и выдаются соответствующие уведомления.
Вычисления значения функции производится в отдельном модуле. Начальные данные получили возможность храниться и загружаться из типизированного файла. Предусмотрена возможность вывода результатов в текстовый файл. Полученные результаты так же имеют графическую интерпретацию: график функции в заданных пределах, построенный в декартовой системе координат.
Приведены примеры вычислений для различных характерных наборов значений параметров, где каждый пример содержит результаты расчёта при нескольких значениях N, а результаты проверки правильности интегрирования, выполненные в программе Mathcad.
Задание по разработке программы численного интегрирования дробно-рациональной функции методом трапеции выполнено полностью. Результатом является универсальная программа, которая даёт пользователю возможность интегрирования функции вида методом трапеции с построением графика решения и возможностью сохранения и загрузки необходимых данных.
1. Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических вычислений.- М.: Мир, 1980. — 280 с.
2. Павел Агуров. Последовательные интерфейсы ПК. Практика программирования. — М.: БХВ-Петербург, 2004.
3. Евгений Марков, Владимир Никифоров: Delphi 2005 для .NET /Н. А. Тюкачёв, К. С. Рыбак, Е. Е. Михайлова. — СПб.: БХВ-Петербург, 2005.
4. http://www.DelphiSources.ru/;
5. http://www.programmersforum.ru/
Приложение
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unit1, jpeg, ExtCtrls, MPlayer, mmsystem;
type
TForm1 = class (TForm)
button1: TButton;
Timer1: TTimer;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Image1: TImage;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
procedure button1Click (Sender: TObject);
procedure Timer1Timer (Sender: TObject);
procedure FormActivate (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1. button1Click (Sender: TObject);
begin
PlaySound (0,0,SND_PURGE);
Form2.show;
Form1.Hide;
end;
procedure TForm1. FormActivate (Sender: TObject);
begin
PlaySound ('please.wav', 0, SND_ASYNC);
end;
procedure TForm1. Timer1Timer (Sender: TObject);
begin
Label1.caption:=FormatdateTime ('hh', now);
Label3.caption:=FormatdateTime ('nn', now);
Label5.caption:=FormatdateTime ('ss', now);
Label6.caption:=FormatdateTime ('d', now);
Label7.caption:=FormatdateTime ('mmmmmmm', now);
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Grids, Menus;
type
InitialData=record //создание типа InitialData-запись
a2,a1,a0,b2,b1,b0,x1,x2:real;
N:integer;
end;
TForm2 = class (TForm)
Panel1: TPanel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
StringGrid1: TStringGrid;
Edit8: TEdit;
Label10: TLabel;
Edit9: TEdit;
Edit10: TEdit;
Button1: TButton;
memo1: TMemo;
MainMenu1: TMainMenu;
File1: TMenuItem;
Open1: TMenuItem;
Save1: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
FontDialog1: TFontDialog;
ColorDialog1: TColorDialog;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
Button2: TButton;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Image2: TImage;
N5: TMenuItem;
Timer1: TTimer;
procedure Button1Click (Sender: TObject);
procedure Save1Click (Sender: TObject);
procedure Open1Click (Sender: TObject);
procedure N1Click (Sender: TObject);
procedure N3Click (Sender: TObject);
procedure N4Click (Sender: TObject);
procedure Label10Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
procedure N5Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit3, unit2,unit4;
var
INTEG:real; //глобальная переменная INTEG-значение интеграла
work:tdatetime; //переменная даты и времени
{$R *.dfm}
//процедура обработки щелчка на кнопку «=»
procedure TForm2. Button1Click (Sender: TObject);
var
x1,x2:real;
//x1,x2-пределы интегрирования;
n:integer;
// n-количество интервалов
a0,a1,a2,b0,b1,b2:real;
//a0,a1,a2,b0,b1,b2-коэфф. функции;
begin
//проверка и исправление введенных данных
if (edit1.Text='')or (edit2.Text='')or (edit3.Text='')or (edit5.Text='')or (edit6.Text='')or (edit7.Text='') then
begin
messagedlg ('Некорректный ввод данных — не указаны коэффициенты!', mterror,[mbok], 0);
edit1.Text:='1';edit2.Text:='1';
edit3.Text:='1';
edit5.Text:='1';edit6.Text:='1';
edit7.Text:='1';
messagedlg ('Значения исправлены по умолчанию', mtinformation,[mbok], 0);
end;
if (edit8.Text='')or (edit9.Text='') then
begin
messagedlg ('Некорректный ввод данных — пределы интегрирования не указаны!', mterror,[mbok], 0);
edit8.Text:='01';edit9.Text:='5';
messagedlg ('Значения исправлены по умолчанию.', mtinformation,[mbok], 0);
end;
//считывание исходных данных и их преобразование в формат с плавающей запятой
a2:=strtofloat (edit1.Text);
a1:=strtofloat (edit2.Text);
a0:=strtofloat (edit3.Text);
b2:=strtofloat (edit5.Text);
b1:=strtofloat (edit6.Text);
b0:=strtofloat (edit7.Text);
x1:=strtofloat (edit8.Text);
x2:=strtofloat (edit9.Text);
//считывание исходных данных и их преобразование в формат Integer
N:=StrToInt (edit10.Text);
//проверка и исправление введенных данных
if (edit10.Text='') or (N<=0) then
begin
MessageDlg ('Количество точек интегрирования может быть только положительным, или введенные данные некорректны', mtError, [mbOk], 0);
N:=50;
Edit10.Text:=inttostr (N);
end;
//проверка и исправление введенных данных
if x2
MessageDlg ('X2 должно быть больше X1', mtError,[mbOK], 0);
x1:=0;
x2:=10;
//исправление значений полей ввода
Edit8.Text:='0';
Edit9.Text:='10';
end;
//проверка и исправление введенных данных
if (b2=0) and (b1=0) and (b0=0) then begin
MessageDlg ('Знаменатель не должен быть равен 0', mtError,[mbOK], 0);
b0:=1;
//исправление значения поля ввода
Edit7.Text:='1';
end;
//вывод данных в многострочное поле
memo1.Lines.Clear;
memo1.Lines.add ('Исходные данные:');
memo1.Lines.add ('a2='+FloatToStr (a2));
memo1.Lines.add ('a1='+FloatToStr (a1));
memo1.Lines.add ('a0='+FloatToStr (a0));
memo1.Lines.add ('b2='+FloatToStr (b2));
memo1.Lines.add ('b1='+FloatToStr (b1));
memo1.Lines.add ('b0='+FloatToStr (b0));
memo1.Lines.add ('Xнач='+FloatToStr (x1));
memo1.Lines.add ('Xкон='+FloatToStr (x2));
memo1.Lines.add ('N='+FloatToStr (N));
memo1.Lines.Add ('-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-');
memo1.Lines.Add ('Ход решения');
//вывод в таблицу
StringGrid1.Cells[0,0]: ='a2';
StringGrid1.Cells[0,1]:='a1';
StringGrid1.Cells[0,2]:='a0';
StringGrid1.Cells[0,3]:='b2';
StringGrid1.Cells[0,4]:='b1';
StringGrid1.Cells[0,5]:='b0';
StringGrid1.Cells[0,6]:='X1';
StringGrid1.Cells[0,7]:='X2';
StringGrid1.Cells[0,8]:='N';
StringGrid1.Cells[1,0]:=floattostr (a2);
StringGrid1.Cells[1,1]:=floattostr (a1);
StringGrid1.Cells[1,2]:=floattostr (a0);
StringGrid1.Cells[1,3]:=floattostr (b2);
StringGrid1.Cells[1,4]:=floattostr (b1);
StringGrid1.Cells[1,5]:=floattostr (b0);
StringGrid1.Cells[1,6]:=floattostr (x1);
StringGrid1.Cells[1,7]:=floattostr (x2);
StringGrid1.Cells[1,8]:=floattostr (n);
//вызов процедуры Calc из Unit2
MyCalc (a2,a1,a0,b2,b1,b0,x1,x2,N, INTEG);
//делаем видимыми «Сохранить результаты вычислений» ," Нарисовать график" кнопку «Нарисовать график»
Form2.N1.Enabled:=true;
Form2.Button2.Enabled:=true;
Form2.N5.Enabled:=true;
end;
//процедура обработки щелчка на кнопку «Нарисовать график»
procedure TForm2. Button2Click (Sender: TObject);
begin
form3.Show;
end;
//сохранение начальных данных
procedure TForm2. Save1Click (Sender: TObject);
var
f:file of initialdata; //файловая переменнная
init:initialdata;
begin
//начальная директория
SaveDialog1.InitialDir:='F:';
//фильтр типов файлов
SaveDialog1.Filter:='Файлы начальных данных | *.my';
//вызов диал. окна
if SaveDialog1. Execute then
begin
//создание начальных данных для сохранения
init.a2:=strtofloat (edit1.Text);
init.a1:=strtofloat (edit2.Text);
init.a0:=strtofloat (edit3.Text);
init.b2:=strtofloat (edit5.Text);
init.b1:=strtofloat (edit6.Text);
init.b0:=strtofloat (edit7.Text);
init.x1:=strtofloat (edit8.Text);
init.x2:=strtofloat (edit9.Text);
init.N:=StrToInt (edit10.Text);
//создание файла
AssignFile (f, SaveDialog1. FileName);
Rewrite (f);
//запись в файл
Write (f, init);
//закрытие файла
CloseFile (f);
//сообщение о действии в многострочное поле ввода
memo1.Lines.Add ('Исходные данные записаны в файл '+SaveDialog1.FileName);
end;
end;
procedure TForm2. Open1Click (Sender: TObject);
var
f:file of initialdata;
init:initialdata;
begin
//начальная директория
OpenDialog1.InitialDir:='F:';
//фильтр типов файлов
OpenDialog1.Filter:='Файлы начальных данных |*.my';
//вызов диал. окна
if OpenDialog1. Execute then
begin
//создание файла
AssignFile (f, OpenDialog1. FileName);
Reset (f);
//чтение из файла
read (f, init);
//закрытие файла
CloseFile (f);
//вывод исходных данных в соответствующие поля
edit1.Text:=floattostr (init.a2);
edit2.Text:=floattostr (init.a1);
edit3.Text:=floattostr (init.a0);
edit5.Text:=floattostr (init.b2);
edit6.Text:=floattostr (init.b1);
edit7.Text:=floattostr (init.b0);
edit8.Text:=floattostr (init.x1);
edit9.Text:=floattostr (init.x2);
edit10.Text:=floattostr (init.N);
//сообщение о действии в многострочное поле ввода
memo1.Lines.add ('Исходные данные считаны из файла '+OpenDialog1.FileName);
end;
end;
procedure TForm2. N1Click (Sender: TObject);
var
f:TextFile; //файловая переменная (текстовый файл)
begin
//присвоим переменной текущее время
work:=now;
//начальная директория
SaveDialog1.InitialDir:='F:';
//фильтр типов файлов (текстовые файлы)
SaveDialog1.Filter:='Текстовые файлы | *.txt';
// Заголовок
SaveDialog1.Title:= 'Сохранение результатов вычисления';
// Имя файла
Savedialog1.FileName:= 'Результаты.txt';
if SaveDialog1. Execute then
begin
AssignFile (f, SaveDialog1. FileName);
Rewrite (f);
//запись в файл значений из Таблицы
writeln (f, 'Файл результатов решения задачи');
writeln (f,'');
writeln (f,'|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|');
writeln (f, 'Исходные данные');
writeln (f,'a2='+stringgrid1.cells[1,0]);
writeln (f,'a1='+stringgrid1.cells[1,1]);
writeln (f,'a0='+stringgrid1.cells[1,2]);
writeln (f,'b2='+stringgrid1.cells[1,3]);
writeln (f,'b1='+stringgrid1.cells[1,4]);
writeln (f,'b0='+stringgrid1.cells[1,5]);
writeln (f,'x1='+stringgrid1.cells[1,6]);
writeln (f,'x2='+stringgrid1.cells[1,7]);
writeln (f,'N='+stringgrid1.cells[1,8]);
writeln (f,'-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|');
writeln (f, 'Результаты вычислений');
Writeln (f, 'INTEG= '+StringGrid1.Cells[1,9]);
writeln (f,'');
writeln (f,'');
writeln (f,'файл создан '+datetimetostr (work));
//закрываем файл
closefile (f);
memo1.Lines.add ('Результаты вычислений записаны в текстовый файл '+SaveDialog1.FileName);
end;
end;
//цвет многострочного поля
procedure TForm2. N3Click (Sender: TObject);
begin
//вызов диал. окна
if ColorDialog1. Execute then
//изменение цвета многострочного поля
memo1.color:=ColorDialog1.Color;
end;
//цвет шрифта многострочного поля
procedure TForm2. N4Click (Sender: TObject);
begin
if FontDialog1. Execute then
memo1.Font:=FontDialog1.Font;
end;
procedure TForm2. N5Click (Sender: TObject);
begin
form3.Show;
end;
procedure TForm2. Label10Click (Sender: TObject);
begin
edit10.text:=inputbox ('Введите количество интервалов ', 'Введите количество интервалов', edit10. text);
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unit1, Menus, ExtCtrls;
procedure MyCalc (a2,a1,a0,b2,b1,b0,x1,x2:real; N: integer; var INTEG: real);
//N-количество интервалов;x1,x2-пределы интегрирования;
//a0,a1,a2,b0,b1,b2-коэффиц. функции;
//выходной параметр: INTEG-значение интеграла
implementation
//дробно-рациональная фунция
function f (a2,a1,a0,b2,b1,b0,x:real):real;
begin
if abs (b2*x*x*x+b1*x+b0)<0.1 then f:=0 else
f:=(a2*x*x*x*x*x+a1*x*x+a0)/(b2*x*x*x+b1*(x)+b0);
end;
//процедура вычисления интеграла
procedure MyCalc (a2,a1,a0,b2,b1,b0,x1,x2:real; N: integer; var INTEG: real);
var
h, x, s, yi: real;
//h-длинна отрезка;
//x-значение аргумента
//yi-значение площади;
//s-сумма площадей;
begin
h:=(x2-x1)/N;
x:=x1;
s:=0;
while x < x2 do
begin
yi:=f (a2,a1,a0,b2,b1,b0,x);
s:=s+f (a2,a1,a0,b2,b1,b0,x)+f (a2,a1,a0,b2,b1,b0,x+h);
form2.memo1.Lines.Add ('f ('+floattostrf (x, ffFixed, 10,5)+')='+floattostrf (yi, ffFixed, 7,5));
x:=x+h;
end;
INTEG:=s*h/2;
//вывод решения в многострочное поле
form2.memo1.Lines.add ('Результат:');
form2.memo1.Lines.add ('INTEG='+FloatToStrf (INTEG, ffFixed, 10,5));
form2.StringGrid1.Cells[0,9]: ='INTEG';
form2.StringGrid1.Cells[1,9]:=floattostr (INTEG);
end;
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Math;
type
TForm3 = class (TForm)
Button1: TButton;
procedure Button1Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses Unit1, Unit4;
{$R *.dfm}
//Исходная фунция
function f (a2,a1,a0,b2,b1,b0,x:real):real;
begin
if abs (b2*x*x*x+b1*x+b0)<0.1 then f:=0 else
f:=(a2*x*x*x*x*x+a1*x*x+a0)/(b2*x*x*x+b1*x+b0);
end;
//процедура обработки щелчка на кнопку «РИСОВАТЬ»
procedure TForm3. Button1Click (Sender: TObject);
var
x1,x2,h:real;
i, n, x0,y0,gx, gy: integer;
a0,a1,a2,b0,b1,b2,ymin, ymax, x, y, mx, my, mx1, my1,x11,xk1,yk1,y11:real;
//x1,x2-пределы интегрирования;h-длинна отрезка;i-вспомогательная переменная;
//n-количество интервалов;x0,y0-координаты точки (0,0) на графике;
//gx, gy-графические коорд. функции;
//a0,a1,a2,b0,b1,b2-коэфф. функции;
//ymin, ymax-минимум и максимум функции;
//mx, my-масштабы аргумента и функции для перевода в графич. значения;
//х, y-значение аргумента и функции;mx1,my1-промежуточные значения масштабов;
//xk1,x11-промежуточные значения аргумента;yk1,y11-промежуточные значения функции;
begin
a2:=strtofloat (form2.edit1.Text);
a1:=strtofloat (form2.edit2.Text);
a0:=strtofloat (form2.edit3.Text);
b2:=strtofloat (form2.edit5.Text);
b1:=strtofloat (form2.edit6.Text);
b0:=strtofloat (form2.edit7.Text);
x1:=strtofloat (form2.edit8.Text);
x2:=strtofloat (form2.edit9.Text);
N:=StrToInt (form2.edit10.Text);
h:=(x2-x1)/N;
x:=x1;
//нахождение минимума и максимума функции
ymin:=0; ymax:=0;
for i:=1 to n do
begin
y:=f (a2,a1,a0,b2,b1,b0,x);
if i=1 then begin
ymin:=y;
ymax:=y;
end
else begin
if yymax then ymax:=y;
end;
x:=x+h;
end;
//нахождение масштаба аргумента
if (x2=0) and (x1=0) then mx:=0 else mx:=450/(abs (x2)+abs (x1));
//нахождение масштаба функции
if (ymax=0)and (ymin=0) then my:=0 else my:=420/(abs (ymax)+abs (ymin));
x0:=30+Abs (Round (x1*mx));
y0:=450-Abs (Round (ymin*my));
//рисование полотна (прямоугольник)
Form3.Canvas.Brush.Style:=bsClear;
Form3.Canvas.Brush.Color:=clWhite;
Form3.Canvas.Pen.Color:=clBlack;
Form3.Canvas.Pen.Width:=1;
Form3.Canvas.Pen.Style:=psSolid;
Form3.Canvas.Rectangle (0,0,550,475);
//ось X
Form3.Canvas.MoveTo (10,y0);
Form3.Canvas.LineTo (540,y0);
Form3.Canvas.LineTo (530,y0−5);
Form3.Canvas.MoveTo (540,y0);
Form3.Canvas.LineTo (530,y0+5);
Form3.Canvas.TextOut (534,y0+5,'X');
//ось Y
Form3.Canvas.MoveTo (x0,465);
Form3.Canvas.LineTo (x0,10);
Form3.Canvas.LineTo (x0−5,20);
Form3.Canvas.MoveTo (x0,10);
Form3.Canvas.LineTo (x0+5,20);
Form3.Canvas.TextOut (x0−15,5,'Y');
//рисуется точка (0,0) — начало координат
Form3.Canvas.TextOut (x0−10,y0+3,'0');
//определение единичного отрезка по оси Х
//обозначение его на графике
if mx>0 then begin
mx1:=mx;
if abs (x1)>abs (x2) then begin
x11:=abs (x1);
xk1:=abs (x1);
end
else begin
x11:=abs (x2);
xk1:=abs (x2);
end;
if x11<1 then begin
repeat
x11:=x11*10;
mx1:=mx1/10;
until x11>=1;
end
else begin
if x11>10 then begin
repeat
x11:=x11/10;
mx1:=mx1*10;
until x1<=10;
end;
end;
Form3.Canvas.MoveTo (round (x0+mx1), y0−5);
Form3.Canvas.LineTo (round (x0+mx1), y0+5);
Form3.Canvas.TextOut (round (x0+mx1), y0+10,floattostr (xk1/x11));
Form3.Canvas.MoveTo (round (x0-mx1), y0−5);
Form3.Canvas.LineTo (round (x0-mx1), y0+5);
Form3.Canvas.TextOut (round (x0-mx1), y0+10,'-'+floattostr (xk1/x11));
end;
//определение единичного отрезка по оси У и его обозначение на графике
if my>0 then begin
my1:=my;
if abs (ymin)>abs (ymax) then begin
y11:=abs (ymin);
yk1:=abs (ymin);
end
else begin
y11:=abs (ymax);
yk1:=abs (ymax);
end;
if y11<1 then begin
repeat
y11:=y11*10;
my1:=my1/10;
until y11>=1;
end
else begin
if y11>10 then begin
repeat
y11:=y11/10;
my1:=my1*10;
until y11<=10;
end;
end;
Form3.Canvas.MoveTo (x0−5,round (y0+my1));
Form3.Canvas.LineTo (x0+5,round (y0+my1));
Form3.Canvas.TextOut (x0+5,round (y0+my1),'-'+floattostr (yk1/y11));
Form3.Canvas.MoveTo (x0−5,round (y0-my1));
Form3.Canvas.LineTo (x0+5,round (y0-my1));
Form3.Canvas.TextOut (x0+5,round (y0-my1), floattostr (yk1/y11));
end;
//обозначение нижнего предела интегрирования
if x1<>0 then begin
Form3.Canvas.MoveTo (round (x0+x1*mx), y0−5);
Form3.Canvas.LineTo (round (x0+x1*mx), y0+5);
Form3.Canvas.TextOut (round (x0+x1*mx), y0+10,floattostr (x1));
end;
//обозначение верхнего предела интегрирования
if x2<>0 then begin
Form3.Canvas.MoveTo (round (x0+x2*mx), y0−5);
Form3.Canvas.LineTo (round (x0+x2*mx), y0+5);
Form3.Canvas.TextOut (round (x0+x2*mx), y0+10,floattostr (x2));
end;
//выделяем промежуток интегрирования
Form3.Canvas.Pen.Mode:=pmMask;
Form3.Canvas.Brush.Color:=clskyBlue;
Form3.Canvas.Pen.Color:=clskyBlue;
Form3.Canvas.Rectangle (round (x0+x1*mx), round (y0−5), round (x0+x2*mx), round (y0+5));
//строим график функции
Form3.Canvas.Pen.Mode:=pmCopy;
Form3.Canvas.Pen.Color:=clGreen;
Form3.Canvas.Pen.Width:=3;
x:=x1;
for i:=1 to n do
begin
gx:=x0+Round (x*mx);
if abs (b2*x*x*x+b1*x+b0)<0.1 then y:=0
else y:=f (a2,a1,a0,b2,b1,b0,x);
gy:=y0-Round (y*my);
if i=1 then Form3.Canvas.MoveTo (gx, gy) else Form3.Canvas.LineTo (gx, gy);
x:=x+h;
end;
end;
end.