Смекни!
smekni.com

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

4.Superhorner

Эта программа находит рациональные решения алгебраического уравнения с целочисленными коэффицентами с использованием схемы Горнера. Для этого нужно ввести старшую степень неизвестного , коэффиценты при них и свободный член. Далее, свободный член раскладывается на рациональные сомножители, которые в свою очередь подставляются в исходное уравнение. Для упрощения этой проверки используется схема Горнера. Заключается она в том, что к коэф. при старшей степени прибавляем коэффицент старшей степени,умноженный на выбранный сомножитель, + коэффицент n-1 степени + коэффицент n-1 степени, умноженный на выбранный сомножитель и т.д. Если выполняется равенство, следовательно, этот сомножитель и является одним из корней исходного уравнения.

5.Expressor

Эта программа представляет рациональную дробь в виде цепной. Для этого сначала выделяется целая часть из исходной дроби, затем остаток представляем в виде «обратной» дроби(например, было 3/5, стало 1/ (5/3)), выделяем целую часть из получившегося знаменателя и т.д., пока не останется дробь, «переворот» которой ничего не даст. Целые части и знаменатели записываются через запятую в квадратных скобках, это есть цепная дробь.

6. Antiexpressor

Эта программа представляет цепную дробь в виде рациональной. Она выполняет операцию, обратную той которая используется в программе Expressor, тем самым, «собирая» рациональную дробь.

6

Интерфейс программы.

1. Основная программа

2. Numerator 3. Factorizator 4. NOD_NOK

5. Superhorner 6. Expressor 7. Antiexpressor


Тесты

1.Numerator

а) Корректные

1)Разрядность: 2 Делители: 12,10 Остаток: 1 Результат: Чисел 1.

61

2) Разрядность: 3 Делители: 11, 13 Остаток: 7 Результат: Чисел 6. 150, 293, 436, 579, 722, 865

б) Некорректные

1) Разрядность: 2 Делители: 10 Остаток: 12 Сообщение об ошибке: «Остаток должен быть меньше делителя»

2)Разрядность 2 Делители: -2 Сообщение об ошибке: «Делитель должен быть больше 0» 2. Factorizator

а) Корректные

1)Число 123

Результат:

123 = 3^1 * 41^1

Кол-во делителей T(123)= 4

Множество делителейD(123)= { 1, 3, 41, 123 }

Сумма делителей S(123)= 168

2) Число 123 Результат:

4781 = 7^1 * 683^1

Кол-во делителей T(123)= 4

Множество делителей D(123)= { 1, 7, 683, 4781 }

Сумма делителей S(123)= 5472

б) Некорректные

1) Число 0 Сообщение об ошибке: «Число должно быть больше 0»

2) Число 2000000000 Сообщение об ошибке: «Число должно быть меньше 1000000000»

3.NOD_NOK

а) Корректные

1)Числа 11, 12 Результат:

НОД= 1 НОК= 132

2) Числа 3, 7, 5 Результат: НОД= 1

НОК= 105

б) Некорректные

1) Числа 0, 10 Сообщение об ошибке: «Число должно быть не меньше 1»

2) Число 1, 2, 4, 6, 5, 9, 12, 13 Сообщение об ошибке: «Количество чисел должно быть меньше 6» 4.Superhorner

а) Корректные

1)Степень: 4

Коэффиценты: 1, 2, -11, 4, 4 Результат:

1, 2

2) Степень: 3

Коэффиценты: 1, 17, 58, -24 Результат:

-12

б) Некорректные

1) Степень: 11 Сообщение об ошибке: «Максимальная степень неизвестного не больше 10»

2) Степень: 3

Коэффиценты: 1, 17 Сообщение об ошибке: «Введите еще 2 коэффицента уравнения»

5. Expressor

а) Корректные

1)Числитель: 123 Знаменатель: 456 Результат:

[0, 3, 1, 2, 2, 2, 2]

2) Числитель: 17 Знаменатель: 49 Результат: [0, 2, 1, 7, 2]

б) Некорректные

1) Числитель: 17 Знаменатель: 0 Сообщение об ошибке: «Знаменатель должен быть больше 0»

6. Antiexpressor

а) Корректные

1)Кол-во звеньев: 7 Звенья [0, 3, 1, 2, 2, 2, 2] Результат 41/152

2) Кол-во звеньев:4 Звенья [4, 2, 1, 7] Результат 100/23

б) Некорректные

1) Кол-во звеньев:4 Звенья [4, 0, 2, 1, ]

Сообщение об ошибке: «Элементы цепи должны быть больше 0»


Заключение

Была разработана программа, выполняющая следующие функции:

1. Формирование подмножества натуральных чисел, объединенных общими делителями и остатком среди чисел данной размерности.

2. Факторизация числа и формирование множества его делителей и их суммы.

3. Нахождение наименьшего общего кратного (НОК) и наибольшего общего делителя (НОД) заданной совокупности чисел.

4. Нахождение рациональных решений алгебраического уравнения с целочисленными коэффицентами с использованием схемы Горнера.

5. Представление рациональной дроби в виде цепной.

6. Представление цепной дроби в виде рациональной.

Программа написана на языке Delphi, ОС Microsoft Windows 7 Ultimate. Аппаратная часть:

Процессор: Intel Core i7-920, Видеокарта: GeForce GTX 275

Оперативная память: Kingston 3x2Gb RAM.

Проведенные тесты показали работоспособность программы.

К плюсам программы можно отнести нетребовательность к ресурсам компьютера (тестировалась на более слабом оборудовании), простоту в обращении.

Программа имеет четкую структуру: главная программа содержит описание и пункты в меню в соответствующие подпрограммы. Интерфейс прост и интуитивно понятен. В каждой подпрограмме есть кнопка «Помощь», которая описывает работу с ней.

Недостатком программы является ограниченность в оперировании с числами большой разрядности.

Для устранения этого недостатка в будущем, необходимо будет использовать более эффективные алгоритмы и средства написания, специально предназначенные для использования в вычислительных машинах.

Список используемых источников:

1. В.И. Николаев, В. Я. Пашкин “Основы дискретной математики”, 1999г.

11

Приложения


Листинг программы.

//Main programm unit KPUnit1; interface

uses

Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,

Dialogs, Menus, StdCtrls, jpeg, ExtCtrls;

type

TfrmKP = class(TForm)

MainMenu1: TMainMenu;

MmNum: TMenuItem;

MmFac: TMenuItem;

MmSuperGorner: TMenuItem;

MmExpressor: TMenuItem;

MmAntiExpresor: TMenuItem;

MmNOD_NOK: TMenuItem;

Image1: TImage;

Image2: TImage;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

Label12: TLabel;

Label13: TLabel;

Label14: TLabel;

Label15: TLabel;

Label16: TLabel; Label17: TLabel; procedure MmNumClick(Sender: TObject); procedure MmFacClick(Sender: TObject); procedure MmExpressorClick(Sender: TObject); procedure MmSuperGornerClick(Sender: TObject); procedure MmNOD_NOKClick(Sender: TObject); procedure MmAntiExpresorClick(Sender: TObject); private

{ Private declarations } public

{ Public declarations } end;

var frmKP: TfrmKP; implementation

uses dm002Unit, DM003Unit, DM004Unit, DM007Unit,

DM005Unit, dm001Unit,

DM008Unit; {$R *.dfm}

procedure TfrmKP.MmNumClick(Sender: TObject); var frmDM001: TfrmDM001; begin frmDM001:=TfrmDM001.Create(Self); frmDm001.Show; end;

procedure TfrmKP.MmFacClick(Sender: TObject); var

Form1: TForm1;

begin

Form1:=TForm1.Create(Self);

Form1.Show; end;

procedure TfrmKP.MmSuperGornerClick(Sender: TObject); var frmSuperGorner: TfrmSuperGorner; begin frmSuperGorner:=TfrmSuperGorner.Create(Self); frmSuperGorner.Show; end;

procedure TfrmKP.MmExpressorClick(Sender: TObject); var

Form2: TForm2; begin

Form2:=TForm2.Create(Self);

Form2.Show; end;

procedure TfrmKP.MmNOD_NOKClick(Sender: TObject); var frmNumer: TfrmNumer; begin frmNumer:=TfrmNumer.Create(Self); frmNumer.Show; end;

procedure TfrmKP.MmAntiExpresorClick(Sender: TObject); var

Antiexpressor: TAntiexpressor; begin

Antiexpressor:=TAntiexpressor.Create(Self);

Antiexpressor.Show; end; end.

//Numerator

unit dm001Unit; interface

uses

Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms,

Dialogs, ComCtrls, StdCtrls;

type

TfrmDM001 = class(TForm) edtNumDigit: TEdit; udNumDigit: TUpDown; lblNumDigit: TLabel;

LblDiv: TLabel; edtlost: TEdit; Lbllost: TLabel; btnRun: TButton; mmResultList: TMemo; cbViewList: TCheckBox; lblResult: TLabel; edtResult: TEdit; btnHelp: TButton; mmInp: TMemo; procedure edtDivKeyPress(Sender: TObject; var

Key: Char);

procedure btnRunClick(Sender: TObject); procedure edtlostExit(Sender: TObject);

12

procedure edtNumDigitChange(Sender: TObject); procedure btnHelpClick(Sender: TObject); procedure btnExitClick(Sender: TObject); procedure mmInpExit(Sender: TObject); procedure mmInpKeyPress(Sender: TObject; var Key: Char);

private { Private declarations } function power(const Base, Exponent: integer):

integer; public

{ Public declarations } end;

var frmDM001: TfrmDM001; implementation uses HelpUnit; {$R *.dfm}

function TfrmDM001.power(const Base, Exponent: integer): integer; var i: integer; begin result:=1; for i:=1 to Exponent do result:=result*Base; end;

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

Key:=#0;

Beep; end; end;

procedure TfrmDM001.edtNumDigitChange(Sender: TObject); begin if (length(edtNumDigit.Text)>0) and (length(edtLost.Text)>0) then btnRun.Enabled:=true else btnRun.Enabled:=false; end;

procedure TfrmDM001.edtlostExit(Sender: TObject); var i:integer; begin if (length(edtLost.Text)>0) then begin For I:=1 to mmInp.Lines.Count-1 do begin if StrToInt(edtLost.Text)>=StrToInt(mmInp.

Lines[i]) then begin

MessageDlg(‘Остаток должен быть меньше делителя’, mtError, [mbOK], 0); edtLost.SetFocus; end; end; if StrToInt(edtLost.Text)>=StrToInt(mmInp.

Lines[0]) then begin

MessageDlg(‘Остаток должен быть меньше делителя’, mtError, [mbOK], 0); edtLost.SetFocus; end; end;

end;

procedure TfrmDM001.btnRunClick(Sender: TObject); var nDigit, nLost: integer; nMin, nMax: integer; nCount: integer; Stl,Finl:integer;

Dig: array of integer;

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

P: Int64;

Bul, mBul:Boolean; begin edtResult.Text:=IntToStr(0); mmResultList.Lines.Clear; nDigit:=StrToInt(edtNumDigit.Text); nLost:=StrToInt(edtLost.Text); if nDigit<=1 then begin nMin:=0; nMax:=9; end else begin nMin:=power(10, nDigit-1); nMax:=nMin*10-1; end; if nlost>= nMin then mBul:=true;

For I:=1 to mmInp.Lines.Count-1 do begin if StrToInt(mmInp.Lines[I])> nMax then begin MessageDlg(‘Делитель должен быть меньше наибольшего числа данной разрядности’, mtError,

[mbOK], 0); end; end;

NOK:=0;

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

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

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;


13


end; J:=J+Max; end; end;

If NOK > nMax then begin mmResultList.text:=’ ‘; end else begin

if mBul then begin

Stl:=nMin mod NOK;

Finl:=nMax mod NOK; nMin:=nMin+NOK-Stl+nLost; nMax:=nMax-NOK+nlost-Finl; end else begin

Stl:=nMin mod NOK;

If Stl>nLost then nMin:=nMin+NOK-Stl+nLost else nMin:=nMin+NOK-Stl;

Finl:=nMax mod NOK;

If Finl<nLost then nMax:=nMax-NOK+nLost-Finl

Else nMax:=nMax-Finl+NOK; end;

nCount:=(nMax-nMin+NOK) div NOK; edtResult.Text:=IntToStr(nCount); if cbViewList.Checked then begin try mmResultList.Lines.BeginUpdate; Screen.Cursor:=crAppStart; while nMin <= nMax do begin mmResultList.Lines.Append(IntToStr(nMin)); nMin:=nMin+NOK; end; finally

Screen.Cursor:=crDefault; mmResultList.Lines.EndUpdate; end; end; end; end;

procedure TfrmDM001.btnHelpClick(Sender: TObject); begin

ShowMessage(‘Эта программа определяет мощность множества с заданными параметрами’+ #13#10 +

‘Для этого введите разряд чисел, делители и остаток от деления и нажмите“Считать!”.’); end;

procedure TfrmDM001.btnExitClick(Sender: TObject); begin

((Sender as TButton).Owner as TForm).Close; end; procedure TfrmDM001.mmInpExit(Sender: TObject);