Математическое моделирование физических задач на ЭВМ

2+Special,y+Sy1);

PlotLIne(x+Sx1*12 Div 20+Special,y+Sy1 Div 5,x+Sx1*12 Div

20+Special,y+Sy1*4 Div 5);

PlotLIne(x+Sx1*12 Div 20+Special,y+Sy1*4 Div 5,x+Sx1*8 Div

20+Special,y+Sy1*4 Div 5);

PlotLIne(x+Sx1*8 Div 20+Special,y+Sy1*4 Div 5,x+Sx1*8 Div

20+Special,y+Sy1 Div 5);

PlotLIne(x+Sx1*8 Div 20+Special,y+Sy1 Div 5,x+Sx1*12 Div

20+Special,y+Sy1 Div 5);

End

Else

If Currents[Sheme[i,j,2]]>0

Then

Begin

PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1*3 Div

10);

PlotLIne (x+Sx1 Div 2+Special,y+Sy1*7 Div 10,x+Sx1 Div

2+Special,y+Sy1);

PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1 Div

2+Special,y+Sy1*5 Div 8);

PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1*12 Div

20+Special,y+Sy1 Div 2);

PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1*8 Div

20+Special,y+Sy1 Div 2);

End

Else

Begin

PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1*3 Div

10);

PlotLIne (x+Sx1 Div 2+Special,y+Sy1*7 Div 10,x+Sx1 Div

2+Special,y+Sy1);

PlotLIne (x+Sx1 Div 2+Special,y+Sy1*3 Div 8,x+Sx1 Div

2+Special,y+Sy1*5 Div 8);

PlotLIne (x+Sx1 Div 2+Special,y+Sy1*5 Div 8,x+Sx1*12 Div

20+Special,y+Sy1 Div 2);

PlotLIne (x+Sx1 Div 2+Special,y+Sy1*5 Div 8,x+Sx1*8 Div

20+Special,y+Sy1 Div 2);

End;

End;

Procedure _0(x,y:Integer);

Begin

End;

Procedure _10(x,y:Integer);

Begin

PlotLIne(x+Sx1,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1 Div 2);

PlotLIne(x+Sx1 Div 2+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1);

End;

Procedure _11(x,y:Integer);

Begin

PlotLIne(x,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1 Div 2);

PlotLIne(x+Sx1 Div 2+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1);

End;

Procedure _12(x,y:Integer);

Begin

PlotLIne(x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1 Div 2);

PlotLIne(x+Sx1 Div 2+Special,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

End;

Procedure _13(x,y:Integer);

Begin

PlotLIne(x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1 Div 2);

PlotLIne(x,y+Sy1 Div 2,x+Sx1 Div 2+Special+1,y+Sy1 Div 2);

End;

Procedure _14(x,y:Integer);

Begin

PlotLIne (x,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1);

FillCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,3);

End;

Procedure _15(x,y:Integer);

Begin

PlotLIne (x+Sx1 Div 2+Special,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1);

FillCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,3);

End;

Procedure _16(x,y:Integer);

Begin

PlotLIne (x,y+Sy1 Div 2,x+Sx1 Div 2,y+Sy1 Div 2);

PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1);

FillCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,3);

End;

Procedure _17(x,y:Integer);

Begin

PlotLIne (x,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

PlotLIne (x+Sx1 Div 2+Special,y+Sy1 Div 2,x+Sx1 Div 2+Special,y+Sy1);

FillCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,3);

End;

Procedure _18(x,y:Integer);

Begin

PlotLIne (x,y+Sy1 Div 2,x+Sx1,y+Sy1 Div 2);

PlotLIne (x+Sx1 Div 2+Special,y,x+Sx1 Div 2+Special,y+Sy1 Div 2);

FillCircle(x+Sx1 Div 2+Special,y+Sy1 Div 2,3);

End;

Begin

Special:=Sx1 Div 10;

SetColOr(l);

FillRect(Ax,Ay,Sx1,Sy1);

SetColOr(4);

Case An Of

1:_1(Ax,Ay); 2:_2(Ax,Ay); 3:_3(Ax,Ay); 4:_4(Ax,Ay);

5:_5(Ax,Ay); 6:_6(Ax,Ay); 7:_7(Ax,Ay); 8:_8(Ax,Ay);

9:_9(Ax,Ay); 10:_10(Ax,Ay); 11:_11(Ax,Ay); 12:_12(Ax,Ay);

13:_13(Ax,Ay); 14:_14(Ax,Ay); 15:_15(Ax,Ay); 16:_16(Ax,Ay);

17:_17(Ax,Ay); 18:_18(Ax,Ay);

Else _0(Ax,Ay);

End;

End;

Begin

C:= GetColOr(6);

{Определение цвета нормального текста}

SetColOr(C shr 4);

With Size Do

Begin

FillRect(0, 0, Size.X, Size.Y);

Sx1:=x Div mS;

Sy1:=y Div nS;

For i:=1 To nS Do

For j:=1 To mS Do

Begin

ElDraw((j-1)*Sx1+(x-Sx1*mS) Div 2 ,(i-1)*Sy1+(y-Sy1*nS) Div

2,Sheme[i,j,1],((i+j) mod 2)+14);

Case Sheme[i,j,1]Of

3,4,5,6:WriteStr((j-1)*Sx1+(x-Sx1*mS) Div 2 ,(i-1)*Sy1+(y-Sy1*nS)

Div 2,'E'+IntToStr(Sheme[i,j,2]));

7,8: If IsResist

Then WriteStr((j-1)*Sx1+(x-Sx1*mS) Div 2 ,(i-1)*Sy1+(y-

Sy1*nS) Div 2,'R'+IntToStr(Sheme[i,j,2]))

Else WriteStr((j-1)*Sx1+(x-Sx1*mS) Div 2 ,(i-1)*Sy1+(y-

Sy1*nS) Div 2,'I'+IntToStr(Sheme[i,j,2]));

End; {Of Case}

End;

{ RestOreFont;}

End;

End;

Procedure TShemeView.HAndleEvent;

Var x,y:Integer;

Begin

Inherited HAndleEvent(Event);

If (Event.What=evMouseDown) And (Event.Buttons=mbLeftButton)

Then

Begin

x:=(Event.Where.X-Sx1*3 Div 8-(Size.X-Sx1*mS) Div 2) Div Sx1-3;

y:=(Event.Where.Y-(Size.Y-Sy1*nS) Div 2) Div Sy1;

Case Sheme[y,x,1] Of

3..6: EDS[y,x]:=0;

7..8: Res[y,x]:=0;

End;

Sheme[y,x,1]:=CurrentElement;

Changed:=True;

ElNumbers(Sheme);

DrawView;

Case CurrentElement Of

3..6: EDS[y,x]:=PShemeWIn(Owner)^.ElMatter(True);

7..8: Res[y,x]:=PShemeWIn(Owner)^.ElMatter(False);

End;

ClearEvent(Event);

End;

End;

Function IntToStr(I: LongInt): String;

{ Convert any Integer Type To a String }

Var S: String[11];

Begin

Str(I, S);

IntToStr:= S;

End;

Procedure ElNumbers(Var ASheme:TSheme);

{Нумерует элементы схемы (ЭДС, резисторы и узловые элементы для служебных

целей).Вызывается когда схема готова}

Var i,j:Integer;

nE,nR,nN:Byte;

Begin

nE:=0;nR:=0;nN:=0;

For j:=1 To mS Do

For i:=1 To nS Do

Case ASheme[i,j,1] Of

3,4,5,6: Begin {ЭДС} Inc(nE); ASheme[i,j,2]:=nE; End;

7,8: Begin {резистор} Inc(nR); ASheme[i,j,2]:=nR; End;

14..18: Begin Inc(nN); ASheme[i,j,2]:=nN; Nodes[nN,1]:=i;

Nodes[nN,2]:=j; End;

End; {Of Case}

ECount:=nE; RCount:=nR; NoDecount:=nN;

End;

ConstructOr TShemeWIn.Init;

Begin

Inherited Init(R, 'Схема без имени');

SetPhase:=True;

Exist:=True;

Options:= Options Or OfCentered;

DragMode:=0;

Palette:= wpCyanWInDow;

GeTextentWIn(R);

R.B.X:=R.A.X+(R.B.X-R.A.X) Div 4;

Insert(New(PToolBar, Init(R)));

GeTextentWIn(R);

R.A.X:=(R.B.X-R.A.X) Div 4;

Insert(New(PShemeView, Init(R)));

HelpCtx:= hcGraphic;

End;

Function TShemeWIn.ElMatter;

Var R:TRect;

M:Real;

c:wOrd;

i:Integer;

D:PDialog;

L:PInputLIne;

s:String;

Begin

M:=0;

GeTextentWIn(R);

R.B.X:=R.A.X+(R.B.X-R.A.X) Div 4;

Inc(R.A.Y,CurrentFont^.Height*5);

Dec(R.B.Y,CurrentFont^.Height*10);

If IsEDS

Then s:='Напряжение'

Else s:='Сопртивление';

D:=New(PDialog,Init(R,s));

Inc(R.A.Y,CurrentFont^.Height*3);

Inc(R.A.X,CurrentFont^.Width*5);

Dec(R.B.X,CurrentFont^.Width*5);

R.B.Y:=R.A.Y+CurrentFont^.Height*1;

L:=New(PInputLIne,Init(R,10));

If D<>Nil

Then

Begin

D^.GeTextentWIn(R);

Inc(R.A.Y,CurrentFont^.Height Div 2);

Inc(R.A.X,CurrentFont^.Width);

Dec(R.B.X,CurrentFont^.Width*4);

R.B.Y:=R.A.Y+CurrentFont^.Height;

L:=New(PInputLIne,Init(R,10));

R.A.X:=R.B.X+CurrentFont^.Width;

R.B.X:=R.A.X+CurrentFont^.Width*3;

If IsEDS

Then s:='В'

Else s:='Ом';

D^.Insert(New(PStaticText,Init(R,s)));

D^.GeTextentWIn(R);

R.Move(CurrentFont^.Width*2,CurrentFont^.Height*2);

R.B.Y:=R.A.Y+CurrentFont^.Height;

R.B.X:=R.A.X+CurrentFont^.Width*15;

D^.Insert(New(PButton,Init(R,'O~k~',cmOk,bfDefault)));

If L<>Nil

Then

D^.Insert(L);

c:=DeskTop^.ExecView(D);

If c<>cmCancel

Then

Begin

If L<>Nil

Then

Begin L^.GetData(s); Dispose(L,Done); End;

i:=0;

val(s,M,i);

End;

If D<>Nil

Then

Dispose(D,Done);

End;

ElMatter:=M;

End;

DestructOr TShemeWIn.Done;

Begin

Inherited Done;

Exist:=False;

End;

END.

3. Модуль вычисления токов ветвей

Unit Applic1;

{$F+,O+,X+,V-,R-,I-,S-}

Interface

Uses

Crt,

Objects, Drivers, Dialogs, Views, Menus, App, StdDlg,

Fonts, HelpFile, MsgBox, TxtRead, WInDows,

PalObj, Grv16, DemoHlp, Types2;

Const

cmAbout = 100;

cmReCounte = 101;

cmTxtWInDow = 102;

cmDialog = 103;

cmDemOfonts = 104;

cmDemoPic = 105;

cmWInWIn = 106;

cmCur = 107;

cmRes = 108;

cmIdle = 6000;

HelpName:String ='Sheme.hlp';

Var

ValDel: LongInt;

Ticks: WOrd absolute $40:$6C; { BIOS Timer ticks counter }

Type

TMyApp = Object(TApplication)

MemoAvail: LongInt; {Свободная мем}

ShemeWInDow: PShemeWIn; {Окно}

ShemeName: String; {Имя схемы}

ConstructOr Init; {Добавление нового }

Procedure HAndleEvent(Var Event: TEvent); Virtual;

Procedure InitMenuBar; Virtual;

Procedure InitStatusLIne; Virtual;

Procedure ReCounte; Virtual;

Procedure About;

Procedure HlpWInDow;

Procedure NewSheme;

Procedure OpenSheme;

Procedure SaveSheme;

Procedure SaveShemeAs;

Procedure Idle; Virtual; {Обновление показ. памяти}

End;

Implementation

ConstructOr TMyApp.Init;

Var

R: TRect;

Begin

Inherited Init;

InitSheme(Sheme);

ShemeName:='';

Changed:=False;

StatusLIne^.GetBounds(R);

R.A.X:= R.B.X - 65;

Insert(New(PMemoView, Init(R)));

MemoAvail:= MemAvail;

ValDel:= Ticks;

DeskTop^.GeTextent(R);

ShemeWInDow:=New(PShemeWIn,Init(R));

DeskTop^.Insert(ShemeWInDow);

DisableCommAnds([cmRes]);

EnableCommAnds([cmCur]);

End;

Procedure TMyApp.Idle;

Function IsTileable(P: PView): Boolean;

Begin

IsTileable:= (P^.Options And OfTileable) <> 0;

End;

Begin

Inherited Idle;

Message(@Self, evBroadCast, cmIdle, Nil);

If MemoAvail <> MemAvail Then Begin

Message(@Self, evBroadCast, cmMemoViewChange, Nil);

MemoAvail:= MemAvail;

End;

If Desktop^.FirstThat(@IsTileable) <> Nil

Then EnableCommAnds([cmTile, cmCascade])

Else DisableCommAnds([cmTile, cmCascade]);

End;

Procedure TMyApp.InitMenuBar;

Var R: TRect;

Begin

GeTextent (R);

R.B.Y:= R.A.Y + CurrentFont^.Height + 1;

MenuBar:= New(PMenuBar, Init(R, NewMenu(

NewItem('~Ё~', '', kbAltSpace, cmAbout, hcMenu10,

NewSubMenu('~Ф~айл', hcMenu20, NewMenu(

NewItem('~Н~овая схема', '', kbNoKey, cmNew, hcNoConText,

NewItem('~Ч~итать схему с диска', 'F3', kbF3, cmOpen, hcNoConText,

NewItem('~C~охранить схему', 'F2', kbF2, cmSave, hcNoConText,

NewItem('Cохранить ~к~ак...', 'ShIft-F2', kbShIftF2, cmSaveAs,

hcNoConText,

NewLIne(

NewItem('~В~ыход', 'Alt-X', kbAltX, cmQuit, hcNoConText,

Nil))))))),

NewSubMenu('~О~кно', hcMenu30, NewMenu(

NewItem('~С~ледующее', 'F6', kbF6, cmNext, hcNoConText,

NewItem('~П~редыдущее', 'F5', kbF5, cmPrev, hcNoConText,

NewItem('~З~акрыть', 'AltF3', kbAltF3, cmClose, hcNoConText,

Nil)))),

Nil)

)))));

MenuBar^.State:= MenuBar^.State Or sfActive;

End;

Procedure TMyApp.InitStatusLIne;

Var R: TRect;

Begin

GeTextent(R);

R.A.Y:= R.B.Y - 19;

SetFont(@Font8x14);

StatusLIne:= New(PStatusLIne, Init(R,

NewStatusDef(0, $0FFF,

NewStatusKey('', kbAltF3, cmClose,

NewStatusKey('~F1~ Помощь', kbF1, cmHelp,

NewStatusKey('', kbF10, cmMenu,

NewStatusKey('~Alt-X~ Выход', kbAltX, cmQuit,

NewStatusKey('~F7~Токи', kbF7, cmCur,

NewStatusKey('~F8~Резисторы', kbF8, cmRes,

NewStatusKey('~F9~ Обсчет', kbF9, cmReCounte,

Nil))))))),

NewStatusDef($1000, $1001,

NewStatusKey('~Ctrl-'#24#25#26#27'~ Перемещение', kbNoKey, cmNo,

NewStatusKey('~Shft-'#24#25#26#27'~ Размер', kbNoKey, cmNo,

NewStatusKey('~'#17#217'~ Подтвердить', kbNoKey, cmNo,

NewStatusKey('~Esc~ Отменить', kbNoKey, cmNo,

Nil)))),

NewStatusDef($FFFE, $FFFF,

NewStatusKey('', kbAltF3, cmClose,

NewStatusKey('~Tab~ След. индекс', kbTab, cmNextTopic,

NewStatusKey('~ShIft-Tab~ Пред. индекс', kbShIftTab, cmPrevTopic,

NewStatusKey('~Esc~ Закрыть', kbEsc, cmClose,

Nil)))),

Nil)))

));

RestOreFont;

End;

Procedure TMyApp.HAndleEvent(Var Event: TEvent);

Var

R: TRect;

P: PView;

Control: WOrd;

SavePalette: PaletteType;

Begin

Inherited HAndleEvent(Event);

If Event.What = evCommAnd Then

Begin

Case Event.CommAnd Of

cmNew : NewSheme;

cmOpen : OpenSheme;

cmSave : If ShemeName=''

Then SaveShemeAs

Else SaveSheme;

cmSaveAs : SaveShemeAs;

cmReCounte : ReCounte;

cmAbout : About;

cmHelp : HlpWInDow;

cmCur : Begin

IsResist:=False;

DisableCommAnds([cmCur]);

EnableCommAnds([cmRes]);

ShemeWInDow^.DrawView;

End;

cmRes : Begin

IsResist:=True;

DisableCommAnds([cmRes]);

EnableCommAnds([cmCur]);

ShemeWInDow^.DrawView;

End;

Else

Exit;

End;

ClearEvent(Event);

End;

End;

Procedure TMyApp.OpenSheme;

Var

D: PFileDialog;

FileName: String[79];

i,j:Integer;

f:Text;

c:wOrd;

Begin

If Not Exist

Then NewSheme;

D:= PFileDialog(ValidView(New(PFileDialog, Init('*.shm', 'Выбор файла',

'~И~мя файла со схемой', fDopenButton, 100))));

If D <> Nil Then

Begin

c:=Desktop^.ExecView(D);

If c <> cmCancel Then

Begin

D^.GetFileName(FileName);

Assign(f,FileName);

reset(f);

For i:=1 To nS Do Begin For j:=1 To mS Do Read (f,Sheme[i,j,1]);

Readln(f);

End;

For i:=1 To nS Do Begin For j:=1 To mS Do Read(f,EDS[i,j]); Readln(f);

End;

For i:=1 To nS Do Begin For j:=1 To mS Do Read(f,Res[i,j]); Readln(f);

End;

Close(f); ShemeName:=FileName;

DisposeStr(ShemeWInDow^.Title);

ShemeWInDow^.Title:=NewStr('Схема '+ShemeName);

ElNumbers(Sheme);

ShemeWInDow^.DrawView;

End; Dispose(D, Done); End;

End;

Procedure TMyApp.SaveSheme;

Var f:Text;

i,j:Integer;

Begin

Assign (f,ShemeName); ReWrite (f);

For i:=1 To nS Do Begin

For j:=1 To mS Do Write(f,Sheme[i,j,1]:4); Writeln(f);

End;

For i:=1 To nS Do Begin For j:=1 To mS Do Write(f,EDS[i,j]:5:2,' ');

Writeln(f);

End;

For i:=1 To nS Do Begin For j:=1 To mS Do Write(f,Res[i,j]:5:2,' ');

Writeln(f);

End;

Close(f);

End;

Procedure TMyApp.SaveShemeAs;

Var

D: PFileDialog;

FileName: String[79];

W: PWInDow;

C:wOrd;

Begin

D:= New(PFileDialog, Init('*.SHM', 'Выбор файла', ShemeName,

fDokButton, 100));

C:= Desktop^.ExecView(D); D^.GetFileName(ShemeName);

Dispose(D, Done);

If ShemeName='' Then exit; SaveSheme;

ShemeWInDow^.Title:=NewStr('Схема '+ShemeName);

ShemeWInDow^.DrawView;

End;

Procedure TMyApp.HlpWInDow;

Var

W: PWInDow;

Begin

W:= PWInDow(ValidView(New(PFileWInDow,Init(HelpName))));

W^.HelpCtx:= hcMenu30; If W <> Nil Then Desktop^.Insert(W);

End;

Procedure TMyApp.NewSheme;

Var R:TRect;

c:wOrd;

Begin

If Exist And Changed

Then Begin

R.Assign((Size.X-CurrentFont^.Width*50) Div 2,(Size.Y-

CurrentFont^.Height*10) Div 2,

(Size.X+CurrentFont^.Width*50) Div 2,(Size.Y+

CurrentFont^.Height*10) Div

2);

c:=MessageBoxRect(R,

'В текущую схему внесены изменения с момента последнего '+

'сохранения, которые будут потеряны. Хотите ли Вы сохранить текущую

'+

'схему?',Nil,mfYesNoCancel+mfConfirmation);

Case c Of

cmYes:If ShemeName<>'' Then SaveSheme Else SaveShemeAs;

cmCancel:Exit; End; End;

If Not Exist Then Begin

DeskTop^.GeTextent(R);

ShemeWInDow:=New(PShemeWIn,Init(R));

DeskTop^.Insert(ShemeWInDow);End;

ShemeName:=''; DisposeStr(ShemeWInDow^.Title);

ShemeWInDow^.Title:=NewStr('Схема без имени');

Changed:=False; InitSheme(Sheme); ShemeWInDow^.DrawView;

End;

Procedure TMyApp.About;

Begin

MessageBox('Обсчет разветвленных цепей. Ver.1.0.',Nil,

mfInFormation+mfOkButton);

End;

Procedure TMyApp.ReCounte;

Begin Abstract;{This method must be overriden} End;

END.

-----------------------

E1 R1

E2 R2 R4

R6

R5

E3 R3

E1 R1

E2 R2 R4

R6

?????????? R5

E3 R3

Страницы: 1, 2, 3, 4, 5, 6, 7



Реклама
В соцсетях
скачать рефераты скачать рефераты скачать рефераты скачать рефераты скачать рефераты скачать рефераты скачать рефераты