- •Министерство науки и образовАния Российской федерации Вятский государственный университет Факультет автоматики и вычислительной техники
- •Содержание
- •Задание и исходные данные…………………………………………………...10
- •Лабораторная работа №1.
- •Метод трапеций.
- •Метод Симпсона
- •Метод Трапеций
- •Лабораторная работа №2
- •Фоновая задача
Лабораторная работа №2
Конструирование собственных личных библиотек модулей. Использование библиотеки Turbo Vision как средство визуализации.
Задание 1: Решить уравнение методами хорд и касательных
Задание 2: Решить систему уравнений методом простой итерации.
Методические указания: Программный продукт должен обеспечить: ввод и корректировку данных, определение корней уравнения графически, уточнение корней данными методами, проверку корней подстановкой, ввод коэффициентов системы уравнений из файла, решение системы уравнений, перепрограммирование «горячих» клавиш.
Основная программа должна осуществлять диалог с пользователем через всплывающее меню.
Программа состоит из 4 частей:
1) Newlab.pas – основная программа, из неe производится обращение к подчиняемым модулям Graf.pas, Metods.pas, Zeyd.pas, а также к стандартным модулям пакета Turbo Vision, при помощи которого формируется пользовательский интерфейс.
2) Grafs.pas – модуль содержит процедуру построения графика заданной функции.
3) Metods.pas – модуль содержит процедуры реализующие решение уравнения методами итерации, хорд и касательных.
4) Systema.pas – модуль содержит процедуры, отвечающие за решение системы уравнений методом Зейделя, а также за проверку полученных корней подстановкой.
Для решения системы уравнений коэффициенты при неизвестных х1, х2, х3 находятся в файле datasys.txt
Уравнение: x3+x-3=0
С истема уравнений:
0.63*х1 + 0.05*х2 + 0.15*х3 = 0.34
0.05*х1 + 0.34*x2 + 0.1*х3 = 0.32
0.15*х1 + 0.1*х2 + 0.71*х3 = 0.42
Содержимое файла datasys.txt:
0.63 0.05 0.15 0.34
0.05 0.34 0.1 0.32
0.15 0.1 0.71 0.42
Содержание модуля newlab.pas
Program Labs2;
Uses crt,menus,drivers,views,app,objects,
msgBox,Dos,dialogs,stdDlg,metods,grafs,systema;
Const
cmOproge=243;
cmIter = 244;
cmFileOpen = 245;
cmDataGr = 248;
cmUravn = 246;
cmGrafs = 247;
cmMet_Hord = 249;
cmMet_Cas = 250;
cmProv_Met = 251;
cmProv_Sist = 252;
cmSpravWindow = 253;
Type
TFApp = object(TApplication)
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
procedure ShowGrafic;
procedure SpravWindow;
end;
var
{MyMenu: TFApp;}
xn,xk,h,kor: Real;
s,sn,sk,st: String;
CommandWin: TCommandSet;
NameF: PathStr;
g: Matr;
Xsys,Xs: vec;
sg: array[1..4,1..5] of string;
bool: boolean;
{$F+}
function F(x:real):real;
begin
F:=x*x*x+x-3;
end;
function F1(x:real):real;
begin
F1:=3*x*x+1;
end;
{$F-}
{Статусная строка состояния }
Procedure TFApp.InitStatusLine;
var
R: TRect;
begin
GetExtent(R);
R.A.Y:=R.B.Y-1;
StatusLine:=New(PStatusLine, Init(R,
NewStatusDef(0,0,
NewStatusKey('~Alt-X~ Выход', kbAltX, cmQuit,
NewStatusKey('~Alt-C~ Закрыть окно', kbAltC, cmClose,nil)),
NewStatusDef(1,1,
NewStatusKey('~F1~ ввод исходных данных ', kbF1, cmDataGr,
NewStatusKey('~F2~ Построение графика ', kbF2, cmGrafs,nil)),
NewStatusDef(2,2,
NewStatusKey('~F3~ Методом ~хорд~', kbF3, cmMet_Hord,
NewStatusKey('~F4~ Методом ~касательных~', kbF4, cmMet_Cas,
NewStatusKey('~Alt-Z~ Проверка подстановкой', kbAltQ, cmProv_Met,nil))),
NewStatusDef(3,3,
NewStatusKey('~F5~ Вывод коэффицентов из файла ', kbF5, cmFileOpen,
NewStatusKey('~F6~ Методом итераций', kbF6, cmIter,
NewStatusKey('~F7~ Проверка подстановкой'', kbF7, cmProv_Sist,nil))),
NewStatusDef(4,4,
NewStatusKey('~F8~ О программе', kbF8, cmSpravWindow, nil),
NewStatusDef(5,5,
NewStatusKey('~Alt-X~ Выход', kbAltX, cmQuit, nil), nil))))))));
end;
Procedure TFApp.InitMenuBar;
var
R: TRect;
begin
GetExtent(R);
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar, Init(R, NewMenu(
NewSubMenu('~Р~ешение уравнения', hcNoContext,
NewMenu(
NewItem('‚Ввод исходных данных,'F1', kbF1, cmDataGr, 1,
NewItem('График','F2', kbF2, cmGrafs, 1,
NewSubMenu('Решение методами', 1,
NewMenu(
NewItem('Хорд','F3', kbF3, cmMet_Hord, 2,
NewItem('Касательных','F4', kbF4, cmMet_Cas, 2,
NewItem('Проверка подстановкой','Alt-Z', kbAltZ, cmProv_Met, 2,nil)))),nil)))),
NewSubMenu('~Р~ешение СЛУ', hcNoContext,
NewMenu(
NewItem('Вывод коэффицентов из файла ','F5', kbF5, cmFileOpen, 3,
NewItem('Решение методом итераций','F6', kbF6, cmIter, 3,
NewLine(
NewItem('проверка подстановкой','F7', kbF7, cmProv_Sist, 3,nil))))),
NewSubMenu('Справка ', hcNoContext,
NewMenu(
NewItem('О программе,'F8', kbF8,cmSpravWindow,4 ,nil)),
NewLine(
NewItem('~В~ыход','Alt-X',kbAltX, cmQuit, 5, nil))))))));
end;
{Открытие файла }
Procedure FileOpen;
var
FD: PFileDialog;
Cm,i,j: Word;
Ft: Text;
a,b: string;
Dlg: PDialog;
R: Trect;
begin
New(FD,Init('*.txt','Выберите файл:','Имя файла :',fdOpenButton,0));
FD^.palette:=0;
Cm:=DeskTop^.ExecView(FD);
a:=''; b:='';
NameF:='c:\koef.txt';
Case Cm of
stdDlg.cmFileOpen, cmOk:
begin
FD^.GetFileName(NameF);
Assign (Ft,NameF);
Reset (Ft);
end;
end;
If NameF<>'' then
begin
For i:=1 to 4 do
For j:=1 to 5 do
begin
Read(Ft,g[i,j]);
end;
reset(Ft);
For i:=1 to 4 do
begin
Readln(Ft,a);
b:=b+a+#13;
end;
end;
If NameF<>'' then Close (Ft);
Dispose(FD,Done);
R.Assign(2,2,33,9);
Dlg:=New(PDialog,Init(R,’коэффиценты’));
With Dlg^ do
begin
palette:=0;
Options:=Options or ofCentered;
R.Assign(2,1,30,6);
Insert(New(PStaticText, Init(R, b)));
end;
DeskTop^.Insert(Dlg);
end;
{Вывод исходного уравнения }
Procedure Uravn;
Var
R: TRect;
Dlg: PDialog;
begin
R.Assign(2,4,30,7);
Dlg:=New(PDialog,Init(R,'исходное уравнение'));
With Dlg^ do
begin
R.Assign(3,1,25,2);
Insert(New(PStaticText,Init(R,'y = x^3+x-3')));
end;
DeskTop^.Insert(Dlg);
end;
{Окошко ввода данных}
Procedure DataGr(Var xn, xk, h: Real);
Type DialogD = record
inp1, inp2, inp3: String[10];
end;
Var
in1, in2, in3: PInputLine;
R: TRect;
Dlg: PDialog;
Cm,g: Word;
dd: DialogD;
begin
R.Assign(6,7,39,18);
Dlg:=New(PDialog, Init(R,'Ввод исходных данных'));
With Dlg^ do
begin
Options:=Options or ofCentered;
R.Assign(13,2,30,3);
In1:=New(PInputLine, Init(R,10)); insert(in1);
R.Assign(13,4,30,5);
In2:=New(PInputLine, Init(R,10)); insert(in2);
R.Assign(13,6,30,7);
In3:=New(PInputLine, Init(R,10)); insert(in3);
R.Assign(2,2,11,3);
Insert(New(PLabel, Init(R, 'Начало',in1)));
R.Assign(2,4,11,5);
Insert(New(PLabel, Init(R, 'Конец',in2)));
R.Assign(2,6,11,7);
Insert(New(PLabel, Init(R, 'Точность',in3)));
R.Assign(6,8,16,10);
Insert(New(PButton,Init(R,'~O~K',cmOK,bfDefault)));
R.Assign(17,8,28,10);
Insert(New(PButton,Init(R,'~О ~тмена ',cmCancel,bfNormal)));
end;
Cm:=DeskTop^.ExecView(dlg);
If cm<>cmCancel then
begin
Dlg^.GetData(dd);
Val(dd.inp1,xn,g);
Val(dd.inp2,xk,g);
Val(dd.inp3,h,g);
end;
end;
{Метод Хорд }
Procedure Met_Hord;
Var
R: TRect;
Dlg: PDialog;
begin
Hord(F,xn,xk,h,kor);
Str(kor:8:5,s);
Str(xn:2:1,sn);
Str(xk:2:1,sk);
R.Assign(7,4,48,11);
Dlg:=New(PDialog, Init(R, 'Метод Хорд'));
With Dlg^ do
begin
Dlg^.palette:=0;
R.Assign(3,1,40,5);
Insert(New(PStaticText, Init(R,'Исходное уравнение:'+#13#3+'y = x^3+x-3'+ #13+
'Корень уравнения: x = '+S+ #13+
'Интервал: ['+sn+','+sk+']')));
end;
DeskTop^.Insert(Dlg);
end;
{Метод касательных }
Procedure Met_Cas;
Var
R: TRect;
Dlg: PDialog;
begin
kasat(F,F1,xn,xk,h,kor);
Str(kor:8:5,s);
Str(xn:2:1,sn);
Str(xk:2:1,sk);
R.Assign(7,4,48,11);
Dlg:=New(PDialog, Init(R, 'Метод Касательных'));
With Dlg^ do
begin
Dlg^.palette:=0;
R.Assign(3,1,40,5);
Insert(New(PStaticText, Init(R, 'Исходное уравнение'y = x^3+x-3'+ #13+
'Корень уравнения: x = '+S+ #13+
'Интервал: ['+sn+','+sk+']')));
end;
DeskTop^.Insert(Dlg);
end;
{Проверка методов}
Procedure Prov_Met;
Var
R: TRect;
Dlg: PDialog;
x1, x2: Real;
s1,s2,sx1,sx2: String;
begin
Hord(F,xn,xk,h,x1);
kasat(F,F1,xn,xk,h,x2);
str(abs(x1):5:3,sx1);
str(abs(x2):5:3,sx2);
x1:=F(x1);
x2:=F(x2);
str(abs(x1):7:5,s1);
str(abs(x2):7:5,s2);
str(kor:2:1,sn);
str(xk:2:1,sk);
R.Assign(2,4,40,18);
Dlg:=New(PDialog, Init(R,'проверка подстановкой'));
With Dlg^ do
begin
Dlg^.palette:=0;
Options:=Options or ofCentered;
R.Assign(2,1,32,12);
Insert(New(PStaticText, Init(R,^c+'Метод хорд:'+#13+
'Корень уравнения: x = '+sx1+ #13#13+
^c+sx1+'^5+'+sx1+'^2-2.75 ='+s1+#13+
^c+'0 = '+s1+#13#13+
^c+'Метод касательных:'+#13+
'Корень уравнения: x = '+sx2+#13#13+
^c+sx2+'^5+'+sx2+'^2-2.75 ='+s1+#13+
^c+'0 = '+s2+#13)));
end;
DeskTop^.Insert(Dlg);
end;
{Решение системы методом итераций }
Procedure IterProc;
Var
R: TRect;
Dlg: PDialog;
d: Real;
i,j: Integer;
sv: array[1..4] of string;
begin
Iter(g,Xsys);
bool:=true;
R.Assign(2,4,53,16);
Dlg:=New(PDialog,Init(R,'Решение СЛУ'));
For i:=1 to 3 do
For j:=1 to 4 do
begin
str(g[i,j]:4:2,sg[i,j]);
If (g[i,j] > 0) and (j <> 2) and (i=1) then sg[i,j]:='+'+sg[i,j];
If (g[i,j] > 0) and (j <> 1) and (i<>1)then sg[i,j]:='+'+sg[i,j];
end;
For i:=1 to 4 do
Str(Xsys[i]:5:3,sv[i]);
With Dlg^ do
begin
palette:=0;
Options:=Options or ofCentered;
R.Assign(2,1,49,10);
Insert(New(PStaticText,Init(R,^c+'Исходная система уравнний:'+#13#13+
'x1 = '+sg[1,2]+'*x2'+sg[1,3]+'*x3'+sg[1,4]+'*x4'+sg[1,5]+#13+
'x2 = '+sg[2,1]+'*x1'+sg[2,3]+'*x3'+sg[2,4]+'*x4'+sg[2,5]+#13+
'x3 = '+sg[3,1]+'*x1'+sg[3,2]+'*x2'+sg[3,3]+'*x3'+sg[3,5]+#13+
^c+'Корни системы¬л:'+#13+
'x1 = '+sv[1]+' x2 ='+sv[2]+' x3 = '+sv[3])));
end;
DeskTop^.Insert(Dlg);
end;
{Проверка системы}
procedure Prov_Sist;
Var
R: TRect;
FT:text;
Dlg: PDialog;
d: Real;
a,b:string;
i,j: Integer;
sv,sx,sx1,sx2: array[1..4] of string;
begin
Assign(ft,'d:\DataSys.txt');
reset(ft);
a:='';
b:='';
For i:=1 to 4 do
For j:=1 to 5 do
begin
Read(Ft,g[i,j]);
end;
reset(Ft);
For i:=1 to 4 do
begin
Readln(Ft,a);
b:=b+a+#13;
end;
Iter(g,Xsys);
bool:=true;
R.Assign(2,4,53,24);
Dlg:=New(PDialog,Init(R,'Решение системы уравнений'));
For i:=1 to 4 do
For j:=1 to 5 do
begin
str(g[i,j]:4:2,sg[i,j]);
If (g[i,j] > 0) and (j <> 2) and (i=1) then sg[i,j]:='+'+sg[i,j];
If (g[i,j] > 0) and (j <> 1) and (i<>1) then sg[i,j]:='+'+sg[i,j];
end;
For i:=1 to 4 do
Str(Xsys[i]:5:4,sv[i]);
For i:=1 to 4 do
For j:=1 to 4 do
Xs[i]:=Xs[i]+g[i,j]*XSys[j];
For i:=1 to 4 do
Xs[i]:=Xs[i]+g[i,4];
For i:=1 to 4 do
Str(Xs[i]:5:4,sx[i]);
For i:=1 to 4 do
Str(Xsys[i]:6:5,sx1[i]);
For i:=1 to 4 do
Str(Xs[i]:6:5,sx2[i]);
With Dlg^ do
begin
palette:=0;
Options:=Options or ofCentered;
R.Assign(2,1,48,18);
Insert(New(PStaticText,Init(R,^c+'Исходная система уравнений:'+#13+
'x1 = '+sg[1,2]+'*x1'+sg[1,3]+'*x2'+sg[1,4]+'*x3'+sg[1,5]+#13+
'x2 = '+sg[2,1]+'*x1'+sg[2,3]+'*x2'+sg[2,4]+'*x3'+sg[2,5]+#13+
'x3 = '+sg[3,1]+'*x1'+sg[3,2]+'*x2'+sg[3,3]+'*x3'+sg[3,5]+#13+
^c+'Корни системы:'+#13+
'x1='+sv[1]+' x2='+sv[2]+' x3='+sv[3])));
R.Assign(2,8,48,18);
Insert(New(PStaticText,Init(R,^c+'Подстановка :'+#13+
sg[1,2]+'*x1'+sg[1,3]+'*x2'+sg[1,4]+'*x3'+sg[1,5]+' = '+sx[1]+#13+
sg[2,1]+'*x1'+sg[2,3]+'*x2'+sg[2,4]+'*x3'+sg[2,5]+' = '+sx[2]+#13+
sg[3,1]+'*x1'+sg[3,2]+'*x2'+sg[3,3]+'*x3'+sg[3,5]+' = '+sx[3]+#13)));
R.Assign(2,13,48,19);
Insert(New(PStaticText,Init(R,^c+'Результат:'+#13+
^c+sx1[1]+' = '+sx2[1]+#13+
^c+sx1[2]+' = '+sx2[2]+#13+
^c+sx1[3]+' = '+sx2[3]+#13)));
end;
DeskTop^.Insert(Dlg);
For i:=1 to 4 do
For j:=1 to 4 do
Xs[i]:=0;
end;
{Обработка событий}
procedure TFApp.HandleEvent(var Event:TEvent);
var R:TRect; c:PView;
begin
inherited HandleEvent(Event);
if Event.What=evCommand then
case Event.Command of
cmFileOpen: FileOpen;
cmUravn: Uravn;
cmDataGr: DataGr(xn,xk,h);
cmGrafs:Grafic(F,xn,xk);
cmMet_Hord:Met_Hord;
cmMet_Cas: Met_Cas;
cmProv_Met: Prov_Met;
cmSpravWindow: Spravwindow;
cmIter: IterProc;
cmProv_Sist: Prov_Sist; end;
ClearEvent(Event);
end;
procedure TFApp.ShowGrafic;
begin
Grafic(F,xn,xk);
SetScreenMode(ScreenMode);
Redraw;
end;
procedure TFApp.SpravWindow;
Var Dialog: PDialog;
R: TRect;
C: Word;
begin
R.Assign(22,6,75,19);
Dialog := New(PDialog, Init(R, 'О программе'));
with Dialog^ do
begin
R.Assign(3,1,53,5);
Insert(New(PStaticText, Init(R,'Программа решает системы линейных уравнений и')));
R.Assign(3,2,53,6);
Insert(New(PStaticText, Init(R,'нелинейные уравнения методами хорд, касательных,')));
R.Assign(3,3,53,7);
Insert(New(PStaticText, Init(R, ' а также графически отделяет корни.')));
R.Assign(17,10,27,12);
Insert(New(PButton, Init(R, 'Закрыть', cmCancel, bfNormal)));
end;
C := DeskTop^.ExecView(Dialog);
Dispose(Dialog, Done);
end;
Var FApp:TFApp;
Begin
FApp.Init;
FApp.Run;
FApp.Done;
End.
Экранные формы
Главное меню:
Ввод исходных данных для уравнения:
Окно построения графика
Подменю «Решение методами»:
Окна с решениями уравнения методами хорд, касательных:
Окно вывода коэффициентов из файла:
Окно решения СЛУ:
Окно проверки подстановкой:
Окно «Справка»: