Смекни!
smekni.com

Методика создания программы-калькулятора DMCexe (стр. 3 из 3)

var i:integer; begin

{For I:=1 to mmInp.Lines.Count do begin if StrToInt(edtLost.Text)>=StrToInt(mmInp.

Lines[i]) then begin if (length(edtLost.Text)>0) and (length(mmInp.Lines[i])>0) then begin if StrToInt(edtLost.Text)>=StrToInt(mmInp. Lines[i]) then edtLost.Text:=IntToStr(StrToInt(mmInp.

Lines[i])-1); end; end; }

For I:=1 to mmInp.Lines.Count do begin if (length(mmInp.Lines[i])>0) then begin If StrToInt(mmInp.Lines[i])<=0 then begin

MessageDlg(‘Делитель должен быть больше 0’, mtError, [mbOK], 0); end; end; end; end;

procedure TfrmDM001.mmInpKeyPress(Sender: TObject; var Key: Char); begin if not (Key in [‘0’..’9’, #8, #13]) then begin

Key:=#0;

Beep; end; end; end.

// Factorizator unit dm002Unit; interface

uses

Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,

Dialogs, StdCtrls, Menus;

type

TForm1 = class(TForm)

Edit1: TEdit;

Label2: TLabel;

Button1: TButton;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

Memo1: TMemo;

procedure Button1Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key:

Char);

procedure FormCreate(Sender: TObject); procedure N2Click(Sender: TObject); procedure N1Click(Sender: TObject); procedure Edit1Exit(Sender: TObject); //procedure Edit1Change(Sender: TObject);

private

{ Private declarations } public

{ Public declarations } end;

var Form1: TForm1; implementation //uses dm002Unit; {$R *.dfm}

procedure TForm1.Edit1KeyPress(Sender: TObject; var

Key: Char); begin case Key of

‘0’..’9’: ; //

#8 : ; // <Backspace>

#13 : Button1.SetFocus;

else Key :=Chr(0); end; end;

procedure TForm1.Button1Click(Sender: TObject);

function pow(a,x:longint):longint; var t,i:longint; begin t:=a; for i:=1 to x-1 do t:=t*a; pow:=t; end; {pow}

var numb, powers: array [1..100] of integer; ch: integer; c1: longint; n: longint; n1: longint; i: longint; h,k: longint; sum: longint; T:longint; begin

memo1.text := ‘ ‘; ch := StrToInt(Edit1.Text); if ch=0 then

MessageDlg(‘Число должно быть больше 0’, mtError,

[mbOK], 0) else begin

c1:=ch; n:= 1; n1:= 0; while ch <> 1 do begin i:= 2;

while ch mod i <> 0 do

Inc(i);

Inc(n1); if n1 = 1 then begin numb[n]:= i; powers[n]:= 1; end else if numb[n] = i then Inc(powers[n]) else begin

Inc(n); numb[n]:= i; powers[n]:= 1; end; ch:= ch div i; end;

memo1.text := memo1.text+ ‘ ‘ + IntToStr(c1)+’ =

‘;

k:=1;

T:=1; for i:= 1 to n do begin memo1.text := memo1.text+ ‘ ‘ +

IntToStr(numb[i])+’^’ + IntToStr(powers[i]); k:=k*((pow(numb[i],powers[i]+1) - 1) div

(numb[i] - 1)); t:=t*(powers[i]+1); if i <> n then begin memo1.text := memo1.text+ ‘ ‘ +’ * ‘+’ ‘; end; end; memo1.text := memo1.text+ chr(13) + chr(10)+ chr(13) + chr(10);

memo1.text := memo1.text + ‘ Количество делителей‘ + ‘T(‘ + IntToStr(c1)+’)= ‘+IntToStr(T)+ chr(13) + chr(10)+ chr(13) + chr(10);

memo1.text := memo1.text+ ‘ Множество делителей ‘

+ ‘D(‘ + IntToStr(c1)+’)= {‘;

for h:=1 to c1 do begin if c1 mod h=0 then begin memo1.text := memo1.text + ‘ ‘ +

IntToStr(h)+’, ‘ ; end; end; memo1.text := memo1.text +’}’+ chr(13) + chr(10)+ chr(13) + chr(10);

memo1.text := memo1.text+ ‘ Сумма делителей ‘ +

‘S(‘ + IntToStr(c1)+’)= ‘; sum:=0; for h:=1 to c1 do begin if c1 mod h=0 then begin sum:=sum+h; end; end; memo1.text := memo1.text +IntToStr(sum); end; end;

procedure TForm1.FormCreate(Sender: TObject); begin memo1.text := ‘’; end;

procedure TForm1.N2Click(Sender: TObject); begin

ShowMessage(‘МАИ, 3 факультет, 2010 год’+#13#10+’ДМДЗ308.03, гр 03-119, каф

308,’+#13#10+’Студент: Злобин Д.В.,’ +#13#10+

‘Преподаватель: к.т.н. Гридин.А.Н’); exit; end;

procedure TForm1.N1Click(Sender: TObject); begin

ShowMessage(‘Эта программа выполняет факторизацию чисел, находит все делители числа, их сумму и количество’+ #13#10 +’Для этого введите число от 1 до

1000000000 в поле и нажмите “Считать!’); end;

procedure TForm1.Edit1Exit(Sender: TObject); begin

//if (StrToInt(Edit1.Text) <> 0) then begin if (StrToInt(Edit1.Text) > 1000000000) or

(StrToInt(Edit1.Text) < 0) then begin

ShowMessage(‘Число должно быть меньше

1000000000’);

Edit1.SetFocus; end; end; end; end.

// NOD_NOK unit DM003Unit; interface

uses

15

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TfrmNumer = class(TForm) mmInp: TMemo; lblInp: TLabel; edtNOD: TEdit; edtNOK: TEdit; btnResult: TButton; btnHelp: TButton; lblNOD: TLabel; lblNOK: TLabel; btnToFile: TButton; procedure mmInpKeyPress(Sender: TObject; var Key:

Char);

procedure btnResultClick(Sender: TObject); procedure mmInpExit(Sender: TObject); procedure mmInpChange(Sender: TObject); procedure btnHelpClick(Sender: TObject); procedure btnExitClick(Sender: TObject); procedure btninfClick(Sender: TObject); procedure btnToFileClick(Sender: TObject); private

{ Private declarations } public

{ Public declarations } end;

var frmNumer: TfrmNumer; implementation uses CreateUnit, HelpUnit;

{$R *.dfm}

procedure TfrmNumer.mmInpKeyPress(Sender: TObject; var Key: Char); begin if not (Key in [‘0’..’9’, #8,#13,#10]) then begin

Key:=#0;

Beep; end; end;

procedure TfrmNumer.btnResultClick(Sender: TObject);

Var

Dig: array of integer;

I, Max, Min, J, NOD, NOK: integer;

P: Int64;

Bul:Boolean; begin NOD:=0; NOK:=0;

if mmInp.Lines.Count-1<=6 then begin Setlength(Dig,mmInp.Lines.Count); try

Dig[0]:=StrToInt(mmInp.Lines[0]);

Min:=Dig[0];

Max:=Dig[0];

P:=Dig[0];

For I:=1 to mmInp.Lines.Count-1 do begin

Dig[I]:=StrToInt(mmInp.Lines[I]);

P:=P*Dig[I]; if Dig[I]<Min then

Min:=Dig[I]; if Dig[I]>Max then

Max:=Dig[I]; end;

For J:=Min downto 1 do begin if Min mod j=0 then begin

Bul:=true;

For I:=0 to mmInp.Lines.Count-1 do begin if Dig[I] mod J<>0 then begin

Bul:=false;

Break; end; end; if Bul then begin NOD:=J;

Break; end; end; end; J:=Max;

While J<=P do begin

Bul:=true;

For I:=0 to mmInp.Lines.Count-1 do begin if J mod Dig[I]<>0 then begin

Bul:=false;

Break; end; end; if Bul then begin

NOK:=J;

Break; end;

J:=J+Max; end; edtNOD.Text:=IntToStr(NOD); edtNOK.Text:=IntToStr(NOK); // if cbPrint.Checked then begin

finally Dig:=nil; end; end else begin

MessageDlg(‘Количество чисел должно быть не больше 6’, mtError, [mbOK], 0); end; end;

procedure TfrmNumer.mmInpExit(Sender: TObject); var

I:integer; begin if (length(mmInp.Lines.Text)>0) and (mmInp.Lines.

Count>1) then begin

For I:=0 to mmInp.Lines.Count-1 do begin if length(mmInp.Lines[I])>0 then begin if StrToInt(mmInp.Lines[I])<1 then begin

MessageDlg(‘Число должно быть не меньше 1’, mtError, [mbOK], 0); mmInp.Lines[I]:=’1’; mmInp.SetFocus; break; end; if StrToInt(mmInp.Lines[I])>100000 then begin

MessageDlg(‘Число должно быть меньше

100000’, mtError, [mbOK], 0); mmInp.Lines[I]:=’100000’; mmInp.SetFocus; break; end; end else begin

MessageDlg(‘Строка должна быть заполнена’, mtError, [mbOK], 0); mmInp.Lines[I]:=’1’; mmInp.SetFocus; break; end end; end; end;

procedure TfrmNumer.mmInpChange(Sender: TObject); begin if (length(mmInp.Lines.Text)>0) and (mmInp.Lines.

Count>1)then begin btnToFile.Enabled:=True; btnResult.Enabled:=True; end else begin btnResult.Enabled:=False; btnToFile.Enabled:=False; end; end;

procedure TfrmNumer.btnHelpClick(Sender: TObject); begin

ShowMessage(‘Эта программа находит НОК и НОД заданной


совокупности чисел’+ #13#10 +

‘Для этого в соответсвующем поле введите числа и нажмите “Считать!”.’+ #13#10 +

‘Также можно сохранить результаты в отдельном файле с помощью кнопки “Печать”.’); end; procedure TfrmNumer.btnExitClick(Sender: TObject); begin

((Sender as TButton).Owner as TForm).Close; end;

procedure TfrmNumer.btninfClick(Sender: TObject); var frmCreate: TfrmCreate; begin frmCreate:=TfrmCreate.Create(Application); try frmCreate.ShowModal;

finally frmCreate.Free; end; end; procedure TfrmNumer.btnToFileClick(Sender: TObject); var slText: TStringList; tStr: string; i: Integer; begin slText:=TStringList.Create; try tStr:=’×èñëà: ‘; for i:=0 to mmInp.Lines.Count-1 do begin if i>0 then tStr:=tStr+’, ‘; tStr:=tStr+mmInp.Lines[i]; end; slText.Append(tStr); slText.Append(‘НОД=’+edtNOD.Text); slText.Append(‘НОК=’+edtNOK.Text); slText.SaveToFile(‘DM003File.txt’);

finally slText.Free; end; end; end. //SuperHorner unit DM005Unit; interface

uses

Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,

Dialogs, StdCtrls, ComCtrls;

type

TfrmSuperGorner = class(TForm) edtPower: TEdit; mmInp: TMemo; mmResult: TMemo; btnResult: TButton; lblPower: TLabel; lblInp: TLabel; lblResult: TLabel; btnHelp: TButton; btnPrint: TButton; edtTest: TEdit; lblTest: TLabel; udPower: TUpDown; procedure mmInpKeyPress(Sender: TObject; var Key:

Char);

procedure btnResultClick(Sender: TObject); procedure btnExitClick(Sender: TObject); procedure btnPrintClick(Sender: TObject); procedure btnHelpClick(Sender: TObject);

private

{ Private declarations } public

{ Public declarations } function NOD(a:integer;b:integer):integer; end;

var

frmSuperGorner: TfrmSuperGorner; implementation uses HelpUnit, CreateUnit, DM004Unit;

{$R *.dfm}

function TfrmSuperGorner.NOD(a:integer;b:integer):i nteger; var

T:integer; begin a:=ABS(a); b:=ABS(b); if a>b then begin

T:=a; a:=b; b:=T; end;

WHILE b mod a<>0 do begin

T:=a; a:=b mod a; b:=T; end; result:=a; end; procedure TfrmSuperGorner.mmInpKeyPress(Sender: TObject; var Key: Char); begin if not (Key in [‘0’..’9’, #8,#13,#10,’-’]) then begin

Key:=#0;

Beep; end; end;

procedure TfrmSuperGorner.btnResultClick(Sender: TObject); const K=11; var a:array[1..K] of real; x, i, n, L, j, p, T, R, M, s:integer; y, result:extended;

Bol:boolean; begin mmResult.Lines.Clear; n:=StrToInt(edtPower.Text); n:=n+1; if n>mmInp.Lines.Count then begin

MessageDlg(‘Введите ‘+IntToStr(n-mmInp.Lines.

Count)+’ коэффицента(-ов) уравнения’, mtError,

[mbOK], 0); mmInp.SetFocus; end else begin try mmResult.Lines.BeginUpdate; Screen.Cursor:=crAppStart; if (length(mmInp.Lines[0])>0)and

(StrToInt(mmInp.Lines[0])<>0)then begin for i:=1 to n do a[i]:=StrToFloat(mmInp.Lines[i-1]); for T:=n downto 2 do if a[T]<>0 then break; y:=Abs(a[T]); if T<2 then begin mmResult.Lines.Append(‘0’+’

‘+IntToStr(n-T)); end else begin if T<n then if T=n-1 then mmResult.Lines.Append(‘0’) else mmResult.Lines.Append(‘0’+’

‘+IntToStr(n-T)); p:=1;

While (p<=ABS(a[1])) and (n>1) do begin if trunc(a[1]) mod p=0 then begin i:=1;

While (i<=y) and (n>1)do begin if (trunc(y) mod i=0)and ((i<>p) or(p=1)) then begin x:=-i; for L:=1 to 2 do begin result:=a[1]; for j:=2 to n do begin result:= result*x/p; result:= result + a[j];

end;{forj} if result=0 then begin

R:=NOD(x,p); x:=x div R; M:=p div R; s:=1;

if s=1 then begin if M>1 then mmResult.Lines.Append(IntTo

Str(x)+’/’+IntToStr(M)) else mmResult.Lines.

Append(IntToStr(x)); end else begin if M>1 then mmResult.Lines.Append(IntTo

Str(x)+’/’+IntToStr(M)+’ ‘+IntToStr(s)) else mmResult.Lines. Append(IntToStr(x)+’ ‘+IntToStr(s)); end ; end; x:=(-1)*x; end;{forl} end;{if} i:=i+1; end; end;{if} p:=p+1;

end;{while} end;

end else begin if length(mmInp.Lines[0])=0 then begin MessageDlg(‘Введите коэффицент старшей степени’, mtError, [mbOK], 0); mmInp.SetFocus; end else begin

MessageDlg(‘Коэффицент старшей степени должен быть отличен от нуля’, mtError, [mbOK], 0); mmInp.SetFocus; end; end; finally mmResult.Lines.EndUpdate; Screen.Cursor:=crDefault; end;{finally} if length(mmResult.Lines[0])=0 then mmResult.Lines.Append(‘Íåò êîðíåé’); end; end;

procedure TfrmSuperGorner.btnExitClick(Sender: TObject); begin

//frmSuperGorner.Close;

((Sender as TButton).Owner as TForm).Close; end;

procedure TfrmSuperGorner.btnPrintClick(Sender: TObject); var slText: TStringList;

tStr: string; i:integer; begin slText:=TStringList.Create; try for i:=0 to mmResult.Lines.Count-1 do slText.Append(mmResult.Lines[i]); tStr:=TimeToStr(Time); tStr:=tStr+’ ‘+DateToStr(Date); slText.Append(tStr); slText.SaveToFile(edtTest.Text);

finally slText.Free; end; end;

procedure TfrmSuperGorner.btnHelpClick(Sender: TObject);

begin

ShowMessage(‘Эта программа находит целочисленные решения алгебраического уравнения, используя схему

Горнера’+ #13#10 +

‘Для этого введите степень уравнения и коэффиценты по убыванию степеней и нажмите “Считать”.’+ #13#10 +

‘Также можно сохранить результаты в отдельном файле с помощью кнопки “Печать”.’); end;

end.

//Expressor unit DM007Unit; interface

uses

Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm2 = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Label1: TLabel;

Label2: TLabel;

Button2: TButton;

Memo1: TMemo;

Button1: TButton; procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Edit2KeyPress(Sender: TObject; var Key:

Char);

procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private

{ Private declarations } public

{ Public declarations } end;

var Form2: TForm2; implementation {$R *.dfm}

procedure TForm2.Edit2KeyPress(Sender: TObject; var

Key: Char); begin case Key of

‘0’..’9’: ;

#8 : ; // <Backspace>

#13 : Button2.SetFocus; // <Enter>

else Key :=Chr(0); end; end; procedure TForm2.Button2Click(Sender: TObject);

var a,b,t:integer; begin

a := StrToInt(Edit1.Text); b := StrToInt(Edit2.Text); if b<=0 then begin

ShowMessage(‘Знаменатель должен быть больше 0’); end else begin

memo1.text := ‘ [ ‘; while (a mod b>0) do begin memo1.text := memo1.text + IntToStr(a div b)+ ‘,

‘; a:=a mod b; t:=b; b:=a; a:=t; end;

memo1.text := memo1.text + IntToStr(a div b)+ ‘ ]’; end; end;

procedure TForm2.Edit1KeyPress(Sender: TObject; var

Key: Char); begin

case Key of

‘0’..’9’: ;

#8 : ; // <Backspace>

#13 : Edit2.SetFocus; // <Enter>

else Key :=Chr(0); end;

end; procedure TForm2.Button1Click(Sender: TObject); begin

ShowMessage(‘Эта программа преобразовывает обычные дроби в цепные.’+ #13#10 +

‘Для этого в соответсвующих полях введите числитель и знаменатель.’

+ #13#10 +’и нажмите “Считать!”.’); end; end. // Antiexpressor unit DM008Unit; interface

uses

Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TAntiexpressor = class(TForm)

Label1: TLabel;

Help: TButton;

Run: TButton;

mmInp: TMemo; Memo1: TMemo; edtPower: TEdit; Label2: TLabel; Label3: TLabel; procedure Memo1KeyPress(Sender: TObject; var Key:

Char);

procedure edtPowerKeyPress(Sender: TObject; var

Key: Char);

procedure RunClick(Sender: TObject); procedure HelpClick(Sender: TObject); private

{ Private declarations } public

{ Public declarations } end;

var Antiexpressor: TAntiexpressor; implementation {$R *.dfm} uses HelpUnit, CreateUnit;

procedure TAntiexpressor.edtPowerKeyPress(Sender: TObject; var Key: Char); begin

case Key of

‘0’..’9’: ;

#8 : ; // <Backspace>

#13 : Memo1.SetFocus; // <Enter> else Key :=Chr(0); end; end;

procedure TAntiexpressor.Memo1KeyPress(Sender: TObject; var Key: Char); begin if not (Key in [‘0’..’9’, #8, #13]) then begin

Key:=#0;

Beep; end; end;

procedure TAntiexpressor.RunClick(Sender: TObject); var s: array [0..100] of integer; a,b,t, i, n, j:integer; bul:boolean; begin

Memo1.Lines.Clear; n:=StrToInt(edtPower.Text);

for i:=0 to n-1 do begin s[i]:=StrToInt(mmInp.Lines[i]); end;

for j:= 1 to n-1 do begin if StrToInt(mmInp.Lines[j])<=0 then begin bul:=false;

MessageDlg(‘Элементы цепной дроби, кроме первого, должны быть>0’, mtError, [mbOK], 0); mmInp.SetFocus; break; end else begin bul:=true; a:=1; b:=s[n-1]; for i:= n-1 downto 1 do begin


19


t:=s[i-1]*b+a; a:=b; b:=t; end;

// memo1.text:=memo1.Text+ #13#10+IntToStr(b) + ‘

/ ‘+ IntToStr(a); end;

end; if bul then memo1.text:=memo1.Text+ #13#10+IntToStr(b) + ‘ / ‘+

IntToStr(a) else memo1.Text:=’ ‘; end;

procedure TAntiexpressor.HelpClick(Sender: TObject); begin

ShowMessage(‘Эта программа переводит цепные дроби в обыкновенные’+ #13#10 +

‘Для этого введите элементы цепной дроби и нажмите

“Считать!”.’); end; end.

20