Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!Отчёт ЯВУ 2 семестр. Не скатывать, Шина может...docx
Скачиваний:
9
Добавлен:
07.05.2019
Размер:
2.39 Mб
Скачать

Лабораторная работа №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.

Экранные формы

Главное меню:

Ввод исходных данных для уравнения:

Окно построения графика

Подменю «Решение методами»:

Окна с решениями уравнения методами хорд, касательных:

Окно вывода коэффициентов из файла:

Окно решения СЛУ:

Окно проверки подстановкой:

Окно «Справка»: