Реферат: Методика создания программы-калькулятора DMCexe - Refy.ru - Сайт рефератов, докладов, сочинений, дипломных и курсовых работ

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

Рефераты по информатике » Методика создания программы-калькулятора DMCexe
MOCKOВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ(МАИ)
(ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
Факультет №3
«СИСТЕМЫ УПРАВЛЕНИЯ, ИНФОРМАТИКА И
ЭЛЕКТРОЭНЕРГЕТИКА»
каф. 308
«Информационные системы»
Пояснительная записка к курсовой работе
по теории чисел
Выполнил студент
1 курса,
группы 03-119,
Злобин Д.В.
Преподаватель:
доцент, к.т.н.
Гридин А.Н.
Москва 2010
Задание
Разработать и отладить программу на языке Pascal (Delphi), в операционной системе Windows 7
Ultimate, выполняющую следующие функции:
1. Формирование подмножества натуральных чисел с заданными параметрами.
2. Факторизация числа с опциями.
3. Нахождение наименьшего общего кратного (НОК) и наибольшего общего делителя (НОД) задан-
ной совокупности чисел.
4. Нахождение рациональных решений алгебраического уравнения с целочисленными коэффицен-
тами.
5. Представление рациональной дроби в виде цепной
6. Представление цепной дроби в виде рациональной.
2
Содержание
1. Задание .................................................................................................................................................2
2. Содержание ..........................................................................................................................................3
3. Введение .............................................................................................................................................4
4. Математическая основа, алгоритмы .................................................................................................6
6. Интерфейс программы .......................................................................................................................7
5. Тесты ....................................................................................................................................................8
6. Заключение ........................................................................................................................................11
7. Приложения .......................................................................................................................................12
Листинг .............................................................................................................................................12
3
Введение
Дуальность природы (единство и борьба противоположностей, положительное и отрицательное,
притяжение и отталкивание, аморфное и структурированное и т.п.) отражается и в математике, где
выделяются непрерывные образования (например, множество точек на отрезке линии, на плоскости,
в объеме, множество действительных чисел и т.п.) и отдельные (конечные) объекты (множество нату-
ральных чисел, особые точки функций, логические переменные, операторы и операнды и т.п.).
Область математики, которая занимается изучением структур финитного (конечного) характера, в
настоящее время обычно называют дискретной математикой в отличие от классической математики,
которая в основном занимается изучением свойств объектов непрерывного характера.
В общем случае дискретная математика охватывает все произвольные дискретные структуры: алге-
браические системы, графы (включая и бесконечные графы), конечные группы, вычислительные среды
и проч..
Свойства изучаемого дискретной математикой объекта приводят к ряду особенностей, отличающих
дискретную математику от классической.
Прежде всего, это отказ от таких понятий классической математики, как предел и непрерывность, а
отсюда и малопригодность многих ее мощных средств анализа.
Другими особенностями являются: •проблемы алгоритмической разрешимости и построение конкретных решающих алгоритмов; •исследование дискретных многоэкстремальных задач, где методы существенно использующие глад-
кость функции, мало эффективны (типичные примеры: построение нормальных минимальных дизъюн-
ктивных форм; определение условий, ограничивающих полный перебор и т.п.)
Еще одна особенность дискретной математики связана с методами ее изучения. В настоящее время
при изучении классической математики в высшей школе (исключая, естественно, подготовку математи-
ков-профессионалов) имеет место склонность к «рецептурному»методу (решение задач по существую-
щим алгоритмам или, в других случаях, по более или менее сложным моделям).
Изучение же дискретной математики, связанной, и весьма тесно, с проблемами управления и разви-
тия информационных технологий, часто направлено на создание моделей и эффективных алгоритмов.
В такой ситуации математика нужна, прежде всего, как метод мышления, как язык, как средство форму-
лирования и организации понятий. Такое владение математикой требует большей культуры: понимания
важности точных формулировок и умения обходиться без них там, где это целесообразно; умения по-
нять, что просто, что сложно, а что невозможно, ощущения связи между может быть далекими идеями
и понятиями.
Таким образом, цель изучения дискретной математики состоит не только в освоении определенного
набора понятий и приемов решения задач, а и в существенном повышении культуры пользования мате-
матическим аппаратом в вышеприведенном смысле.
Теория чисел — это одно из направлений математики, которое иногда называют «высшей арифме-
тикой». Данная наука изучает натуральные числа и некоторые сходные с ними объекты, рассматривает
различные свойства (делимость, разложимость, взаимосвязи и так далее), алгоритмы поиска чисел, а
также определяет ряд достаточно интересных наборов натуральных чисел.
Теория чисел среди математических дисциплин выделяется скорее психологической установкой, чем
предметом «целые числа». Более сильное утверждение было бы неверным: в теоретико-числовых рабо-
тах исследуются и алгебраические, и трансцендентные числа; или, вообще, не числа, а скажем, анали-
тические функции очень специального вида {ряды Дирихле, модулярные формы); или геометрические
объекты {решетки, схемы над Z). Прежде всего, целые числа образуют первичную материю математи-
ки вообще (точнее, одну из двух первичных материй; Вторая — это «фигуры», геометрия).
История элементарной теории чисел поэтому столь длинна, как история всей математики, а историю
современной математики можно было бы условно начинать с того времени, когда «числа» и «фигу-
ры» прочно объединились в идее координатизации, которая по замечанию И. Р. Шафаревича лежит в
основе алгебры. Далее, целые числа как универсум идеи дискретного являются также универсумом
4
любых логических конструкций, в том числе любых математических рассуждений, оформленных зкак
таковые. Мы подчеркиваем, что математика как акт индивидуального творчества, конечно, к логике
не сводится, но в коллективном сознании нашей эпохи существует в виде потенциально завершимой
огромной и точной логической конструкции. Если этот образ постоянно размывается его, так сказать,
нежизненностью, то и восстанавливающие его тенденции сильны; сейчас к ним добавилась компью-
терная реальность с ее чрезвычайно жесткими требованиями к логической структуре математической
продукции в виде программного обеспечения. Пониманием того, что свойства целых чисел суть свой-
ства дискретного вообще и, стало быть, свойства мира математических рассуждений, в частности, мы
обязаны математике двадцатого века, в первую очередь Гёделю. При желании, это донимание может
быть оформлено внутри математики в виде теоремы о том, что задача доказуемости внутри любой
формальной системы равносильна задаче о разрешимости в целых числах подходящего диофантова
уравнения. Этот парадоксальный факт — свидетельство того, что теория чисел, будучи малой частью
математического знания, в потенции все это знание содержит. Недаром Карл Фридрих Гаусс любил
говорить, что математика — царица наук, а теория чисел — царица математики.
Сама же написанная программа включает в себя набор из нескольких основных операций, которые
могут понадобиться при решении более сложных задач, как из теории чисел, так и из других разделов
математики.
1.2.Описание программы
DMC.exe 1. Назначение Выполняет следующие функции:
1. Формирование подмножества натуральных чисел, объединенных общими делителями и остатком
среди чисел данной размерности.
2. Факторизация числа и формирование множества его делителей и их суммы.
3. Нахождение наименьшего общего кратного (НОК) и наибольшего общего делителя (НОД) задан-
ной совокупности чисел.
4. Нахождение рациональных решений алгебраического уравнения с целочисленными коэффицен-
тами с использованием схемы Горнера.
5. Представление рациональной дроби в виде цепной.
6. Представление цепной дроби в виде рациональной.
1.2.Оборудование и ПО ОС Microsoft Windows 7 Ultimate, среда программирования Borland Delphi 7. Аппаратная часть: Процессор: Intel Core i7-920, Видеокарта: GeForce GTX 275 Оперативная память: Kingston 3x2Gb RAM.
Математическая основа решения, алгоритмы.
1. Numerator
Эта программа выполняет формирование подмножества натуральных чисел, объединённых общими
делителями и остатком среди чисел данной размерности. Для этого сначала ищется наименьщее общее
кратное (НОК) делителей, далее, находится 1-е число среди необходимой размерности, которое делит- 5
ся на НОК с заданным остатком. Затем, к этому числу мы прибавляем НОК и получаем 2-е число и так
далее, пока не дойдем до границ размерности.
2.Factorizator
Эта программа выполняет факторизацию числа, то есть разложение его на простые сомножители, а
также формирует множество этих сомножителей и считает их сумму. Для начала ищем простые числа,
на которые делится заданное число, проверяем кол-во повторений ( то есть степень этого простого чис-
ла). Далее находим все делители числа и составляем из них множество. Вычисляем сумму делителей.
3.NOD_NOK Эта программа находит наименьшее общее кратное (НОК) и наибольший общий делитель (НОД)
заданной совокупности чисел, используя алгоритм Евклида. Для этого сначала мы считаем по этому
алгоритму НОД 2х чисел - находим максимальное из двух, делим на 2-е с остатком, затем делим второе
на полившийся остаток и так далее, пока не остаток не станет равным 0. Остаток, предшествующий
остатку, равному 0 и будет НОДом. НОК находится перемножением двух исходных чисел и деление их
на НОД. Далее, мы находим НОД и НОК следующего числа с НОД и НОК предыдущей двойки. Про-
должаем да тех пор, пока не найдем НОД и НОК всей совокупности.
4.Superhorner Эта программа находит рациональные решения алгебраического уравнения с целочисленными коэф-
фицентами с использованием схемы Горнера. Для этого нужно ввести старшую степень неизвестного
, коэффиценты при них и свободный член. Далее, свободный член раскладывается на рациональные
сомножители, которые в свою очередь подставляются в исходное уравнение. Для упрощения этой про-
верки используется схема Горнера. Заключается она в том, что к коэф. при старшей степени прибавляем
коэффицент старшей степени,умноженный на выбранный сомножитель, + коэффицент n-1 степени +
коэффицент n-1 степени, умноженный на выбранный сомножитель и т.д. Если выполняется равенство,
следовательно, этот сомножитель и является одним из корней исходного уравнения.
5.Expressor Эта программа представляет рациональную дробь в виде цепной. Для этого сначала выделяется це-
лая часть из исходной дроби, затем остаток представляем в виде «обратной» дроби(например, было 3/5,
стало 1/ (5/3)), выделяем целую часть из получившегося знаменателя и т.д., пока не останется дробь,
«переворот» которой ничего не даст. Целые части и знаменатели записываются через запятую в ква-
дратных скобках, это есть цепная дробь.
6. Antiexpressor Эта программа представляет цепную дробь в виде рациональной. Она выполняет операцию, обрат-
ную той которая используется в программе Expressor, тем самым, «собирая» рациональную дробь.
6
Интерфейс программы.
3. Factorizator 4. NOD_NOK
6. Expressor 7. Antiexpressor
7
Тесты
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 }
8
Сумма делителей 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
9
Коэффиценты: 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»
10
Заключение
Была разработана программа, выполняющая следующие функции:
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: TOb-
ject);
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); end; procedure TfrmDM001.btnRunClick(Sender: TObject);
procedure btnHelpClick(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure mmInpExit(Sender: TObject); var
procedure mmInpKeyPress(Sender: TObject; var Key: nDigit, nLost: integer;
Char); private nMin, nMax: integer;
nCount: integer;
Stl,Finl:integer;
{ Private declarations } Dig: array of integer;
function power(const Base, Exponent: integer): I, Max, Min, J, NOK: integer;
integer; P: Int64;
public Bul, mBul:Boolean;
{ Public declarations } begin
end; var edtResult.Text:=IntToStr(0);
mmResultList.Lines.Clear;
nDigit:=StrToInt(edtNumDigit.Text);
frmDM001: TfrmDM001; implementation uses HelpUnit; {$R *.dfm} function TfrmDM001.power(const Base, Exponent: inte- nLost:=StrToInt(edtLost.Text);
if nDigit<=1 then
begin
nMin:=0;
nMax:=9;
end
else
begin
nMin:=power(10, nDigit-1);
ger): integer; nMax:=nMin*10-1;
var end; if nlost>= nMin then mBul:=true; For I:=1 to mmInp.Lines.Count-1 do begin
i: integer;
begin
result:=1;
for i:=1 to Exponent do
result:=result*Base; if StrToInt(mmInp.Lines[I])> nMax then begin
end; procedure TfrmDM001.edtDivKeyPress(Sender: TObject; MessageDlg(‘Делитель должен быть меньше
наибольшего числа данной разрядности’, mtError,
[mbOK], 0);
var Key: Char); end;
begin end;
if not (Key in [‘0’..’9’, #8]) then begin
Key:=#0; NOK:=0;
Beep; if mmInp.Lines.Count-1<=6 then begin
end; Setlength(Dig,mmInp.Lines.Count); Dig[0]:=StrToInt(mmInp.Lines[0]);
end;
Min:=Dig[0];
procedure TfrmDM001.edtNumDigitChange(Sender: TOb- Max:=Dig[0];
ject); P:=Dig[0];
begin For I:=1 to mmInp.Lines.Count-1 do begin
if (length(edtNumDigit.Text)>0) and Dig[I]:=StrToInt(mmInp.Lines[I]);
(length(edtLost.Text)>0) then P:=P*Dig[I];
btnRun.Enabled:=true if Dig[I]<Min then
else Min:=Dig[I];
btnRun.Enabled:=false; if Dig[I]>Max then
end; Max:=Dig[I];
end;
For J:=Min downto 1 do begin
if Min mod j=0 then begin
Bul:=true;
procedure TfrmDM001.edtlostExit(Sender: TObject); For I:=0 to mmInp.Lines.Count-1 do begin
var if Dig[I] mod J<>0 then begin
i:integer; Bul:=false;
begin Break;
if (length(edtLost.Text)>0) then begin end;
For I:=1 to mmInp.Lines.Count-1 do begin end;
if StrToInt(edtLost.Text)>=StrToInt(mmInp. if Bul then begin Break;
Lines[i])
then
begin end;
MessageDlg(‘Остаток должен быть меньше end;
делителя’, mtError, [mbOK], 0); end;
edtLost.SetFocus; J:=Max;
end; While J<=P do begin
end; Bul:=true;
if StrToInt(edtLost.Text)>=StrToInt(mmInp. For I:=0 to mmInp.Lines.Count-1 do begin
Lines[0]) if J mod Dig[I]<>0 then begin
then Bul:=false;
begin Break;
MessageDlg(‘Остаток должен быть меньше end;
делителя’, mtError, [mbOK], 0); end;
edtLost.SetFocus; if Bul then begin
end; NOK:=J;
end; 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); 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;
14
+ ‘T(‘ + IntToStr(c1)+’)= ‘+IntToStr(T)+ chr(13) +
chr(10)+ chr(13) + chr(10); memo1.text := memo1.text+ ‘ Множество делителей ‘
procedure TForm1.Button1Click(Sender: TObject);
+ ‘D(‘ + IntToStr(c1)+’)= {‘;
function pow(a,x:longint):longint; for h:=1 to c1 do
var begin
t,i:longint; if c1 mod h=0 then
begin begin
t:=a; memo1.text := memo1.text + ‘ ‘ +
for i:=1 to x-1 do IntToStr(h)+’, ‘ ;
t:=t*a; end;
pow:=t; end;
end; {pow} var memo1.text := memo1.text +’}’+ chr(13) + chr(10)+
chr(13) + chr(10); memo1.text := memo1.text+ ‘ Сумма делителей ‘ +
numb, powers: array [1..100] of integer;
ch: integer; ‘S(‘ + IntToStr(c1)+’)= ‘;
c1: longint; sum:=0;
n: longint; for h:=1 to c1 do
n1: longint; begin
i: longint; if c1 mod h=0 then
h,k: longint; begin
sum: longint; sum:=sum+h;
T:longint; end;
begin memo1.text := ‘ ‘; end;
memo1.text := memo1.text +IntToStr(sum);
end; end;
ch := StrToInt(Edit1.Text);
if ch=0 then
MessageDlg(‘Число должно быть больше 0’, mtError,
[mbOK], 0)
else procedure TForm1.FormCreate(Sender: TObject);
begin c1:=ch; begin
memo1.text := ‘’;
end; procedure TForm1.N2Click(Sender: TObject);
n:= 1;
n1:= 0;
while ch <> 1 do begin
begin ShowMessage(‘МАИ, 3 факультет, 2010
i:= 2; год’+#13#10+’ДМДЗ308.03, гр 03-119, каф
while ch mod i <> 0 do 308,’+#13#10+’Студент: Злобин Д.В.,’ +#13#10+
Inc(i); ‘Преподаватель: к.т.н. Гридин.А.Н’);
Inc(n1); exit;
if n1 = 1 then end; procedure TForm1.N1Click(Sender: TObject);
begin
numb[n]:= i;
powers[n]:= 1; begin
end ShowMessage(‘Эта программа выполняет факторизацию
else if numb[n] = i then Inc(powers[n]) чисел, находит все делители числа, их сумму и
else количество’+ #13#10 +’Для этого введите число от 1 до
begin 1000000000 в поле и нажмите “Считать!’);
Inc(n); end; procedure TForm1.Edit1Exit(Sender: TObject);
numb[n]:= i;
powers[n]:= 1;
end; begin
ch:= ch div i; //if (StrToInt(Edit1.Text) <> 0) then
end; memo1.text := memo1.text+ ‘ ‘ + IntToStr(c1)+’ = begin
if (StrToInt(Edit1.Text) > 1000000000) or
(StrToInt(Edit1.Text) < 0) then
‘; begin
k:=1; ShowMessage(‘Число должно быть меньше
T:=1; 1000000000’);
for i:= 1 to n do Edit1.SetFocus;
begin end;
memo1.text := memo1.text+ ‘ ‘ + end;
IntToStr(numb[i])+’^’ + IntToStr(powers[i]); end; end.
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+ ‘ ‘ +’ * ‘+’ ‘; // NOD_NOK unit DM003Unit; interface uses
end;
end;
memo1.text := memo1.text+ chr(13) + chr(10)+
chr(13) + chr(10);
memo1.text := memo1.text + ‘ Количество делителей‘ Windows, Messages, SysUtils, Variants, Classes,
15
Graphics, Controls, Forms, NOD:=J;
Dialogs, StdCtrls; type Break;
end;
end;
TfrmNumer = class(TForm) end;
mmInp: TMemo; J:=Max;
lblInp: TLabel; While J<=P do begin
edtNOD: TEdit; Bul:=true;
edtNOK: TEdit; For I:=0 to mmInp.Lines.Count-1 do begin
btnResult: TButton; if J mod Dig[I]<>0 then begin
btnHelp: TButton; Bul:=false;
lblNOD: TLabel; Break;
lblNOK: TLabel; end;
btnToFile: TButton; end;
procedure mmInpKeyPress(Sender: TObject; var Key: if Bul then begin
Char); NOK:=J;
procedure btnResultClick(Sender: TObject); Break;
procedure mmInpExit(Sender: TObject); end;
procedure mmInpChange(Sender: TObject); J:=J+Max;
procedure btnHelpClick(Sender: TObject); end;
procedure btnExitClick(Sender: TObject); edtNOD.Text:=IntToStr(NOD);
procedure btninfClick(Sender: TObject); edtNOK.Text:=IntToStr(NOK);
procedure btnToFileClick(Sender: TObject); // if cbPrint.Checked then begin
private finally
{ Private declarations } Dig:=nil;
public end;
{ Public declarations } end else begin
end; var MessageDlg(‘Количество чисел должно быть не
больше 6’, mtError, [mbOK], 0);
end;
frmNumer: TfrmNumer; implementation uses CreateUnit, HelpUnit; {$R *.dfm} end; procedure TfrmNumer.mmInpExit(Sender: TObject);
var
I:integer;
begin
if (length(mmInp.Lines.Text)>0) and (mmInp.Lines.
Count>1) then begin
procedure TfrmNumer.mmInpKeyPress(Sender: TObject; For I:=0 to mmInp.Lines.Count-1 do begin
var Key: Char); if length(mmInp.Lines[I])>0 then begin
begin if StrToInt(mmInp.Lines[I])<1 then begin
if not (Key in [‘0’..’9’, #8,#13,#10]) then begin MessageDlg(‘Число должно быть не меньше 1’,
Key:=#0; mtError, [mbOK], 0);
Beep; mmInp.Lines[I]:=’1’;
end; mmInp.SetFocus;
end; procedure TfrmNumer.btnResultClick(Sender: TObject); break;
end;
if StrToInt(mmInp.Lines[I])>100000 then be-
Var gin
Dig: array of integer; MessageDlg(‘Число должно быть меньше
I, Max, Min, J, NOD, NOK: integer; 100000’, mtError, [mbOK], 0);
P: Int64; mmInp.Lines[I]:=’100000’;
Bul:Boolean; mmInp.SetFocus;
begin break;
NOD:=0; end;
NOK:=0; end else begin
if mmInp.Lines.Count-1<=6 then begin MessageDlg(‘Строка должна быть заполнена’,
Setlength(Dig,mmInp.Lines.Count); mtError, [mbOK], 0);
try mmInp.Lines[I]:=’1’;
Dig[0]:=StrToInt(mmInp.Lines[0]); mmInp.SetFocus;
Min:=Dig[0]; break;
Max:=Dig[0]; end
P:=Dig[0]; end;
For I:=1 to mmInp.Lines.Count-1 do begin end;
Dig[I]:=StrToInt(mmInp.Lines[I]); end; procedure TfrmNumer.mmInpChange(Sender: TObject);
P:=P*Dig[I];
if Dig[I]<Min then
Min:=Dig[I]; begin
if Dig[I]>Max then if (length(mmInp.Lines.Text)>0) and (mmInp.Lines.
Max:=Dig[I]; Count>1)then begin
end; btnToFile.Enabled:=True;
For J:=Min downto 1 do begin btnResult.Enabled:=True;
if Min mod j=0 then begin end else begin
Bul:=true; btnResult.Enabled:=False;
For I:=0 to mmInp.Lines.Count-1 do begin btnToFile.Enabled:=False;
if Dig[I] mod J<>0 then begin end;
Bul:=false; end; procedure TfrmNumer.btnHelpClick(Sender: TObject);
Break;
end;
end; begin
if Bul then begin ShowMessage(‘Эта программа находит НОК и НОД заданной
16
совокупности чисел’+ #13#10 + { Private declarations }
‘Для этого в соответсвующем поле введите числа и public
нажмите “Считать!”.’+ #13#10 + { Public declarations }
‘Также можно сохранить результаты в отдельном файле с function NOD(a:integer;b:integer):integer;
помощью кнопки “Печать”.’); end; var
end;
procedure TfrmNumer.btnExitClick(Sender: TObject);
begin frmSuperGorner: TfrmSuperGorner; implementation uses HelpUnit, CreateUnit, DM004Unit; {$R *.dfm}
((Sender as TButton).Owner as TForm).Close;
end; procedure TfrmNumer.btninfClick(Sender: TObject);
var
frmCreate: TfrmCreate;
begin function TfrmSuperGorner.NOD(a:integer;b:integer):i
frmCreate:=TfrmCreate.Create(Application); nteger;
try var
frmCreate.ShowModal; T:integer;
finally begin
frmCreate.Free; a:=ABS(a);
end; b:=ABS(b);
end; if a>b then begin
procedure TfrmNumer.btnToFileClick(Sender: TObject); T:=a;
var a:=b;
slText: TStringList; b:=T;
tStr: string; end;
i: Integer; WHILE b mod a<>0 do begin
begin T:=a;
slText:=TStringList.Create; a:=b mod a;
try b:=T;
tStr:=’×èñëà: ‘; end;
for i:=0 to mmInp.Lines.Count-1 do begin result:=a;
if i>0 then end;
tStr:=tStr+’, ‘; procedure TfrmSuperGorner.mmInpKeyPress(Sender: TOb-
tStr:=tStr+mmInp.Lines[i]; ject; var Key: Char);
end; begin
slText.Append(tStr); if not (Key in [‘0’..’9’, #8,#13,#10,’-’]) then
slText.Append(‘НОД=’+edtNOD.Text); begin
slText.Append(‘НОК=’+edtNOK.Text); Key:=#0;
slText.SaveToFile(‘DM003File.txt’); Beep;
finally end;
slText.Free; end; procedure TfrmSuperGorner.btnResultClick(Sender: TO-
end;
end; end. //SuperHorner unit DM005Unit; interface uses
bject);
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;
Windows, Messages, SysUtils, Variants, Classes, n:=StrToInt(edtPower.Text);
Graphics, Controls, Forms, n:=n+1;
Dialogs, StdCtrls, ComCtrls; type if n>mmInp.Lines.Count then begin
MessageDlg(‘Введите ‘+IntToStr(n-mmInp.Lines.
Count)+’ коэффицента(-ов) уравнения’, mtError,
TfrmSuperGorner = class(TForm) [mbOK], 0);
edtPower: TEdit; mmInp.SetFocus;
mmInp: TMemo; end else begin
mmResult: TMemo; try
btnResult: TButton; mmResult.Lines.BeginUpdate;
lblPower: TLabel; Screen.Cursor:=crAppStart;
lblInp: TLabel; if (length(mmInp.Lines[0])>0)and
lblResult: TLabel; (StrToInt(mmInp.Lines[0])<>0)then begin
btnHelp: TButton; for i:=1 to n do
btnPrint: TButton; a[i]:=StrToFloat(mmInp.Lines[i-1]);
edtTest: TEdit; for T:=n downto 2 do
lblTest: TLabel; if a[T]<>0 then
udPower: TUpDown; break;
procedure mmInpKeyPress(Sender: TObject; var Key: y:=Abs(a[T]);
Char); if T<2 then begin
procedure btnResultClick(Sender: TObject); mmResult.Lines.Append(‘0’+’
procedure btnExitClick(Sender: TObject); ‘+IntToStr(n-T));
procedure btnPrintClick(Sender: TObject); end else begin
procedure btnHelpClick(Sender: TObject); if T<n then
if T=n-1 then
mmResult.Lines.Append(‘0’)
private
17
else tStr: string;
mmResult.Lines.Append(‘0’+’ i:integer;
‘+IntToStr(n-T)); begin
p:=1; slText:=TStringList.Create;
While (p<=ABS(a[1])) and (n>1) do begin try
if trunc(a[1]) mod p=0 then begin for i:=0 to mmResult.Lines.Count-1 do
i:=1; slText.Append(mmResult.Lines[i]);
While (i<=y) and (n>1)do begin tStr:=TimeToStr(Time);
if (trunc(y) mod i=0)and ((i<>p) tStr:=tStr+’ ‘+DateToStr(Date);
or(p=1)) then begin slText.Append(tStr);
x:=-i; slText.SaveToFile(edtTest.Text);
for L:=1 to 2 do begin finally
result:=a[1]; slText.Free;
for j:=2 to n do begin end;
result:= result*x/p; end; procedure TfrmSuperGorner.btnHelpClick(Sender: TOb-
result:= result + a[j];
end;{forj}
if result=0 then begin ject); begin
R:=NOD(x,p);
x:=x div R;
M:=p div R; ShowMessage(‘Эта программа находит целочисленные
s:=1; if s=1 then begin решения алгебраического уравнения, используя схему
Горнера’+ #13#10 +
‘Для этого введите степень уравнения и коэффиценты по
if M>1 then убыванию степеней и нажмите “Считать”.’+ #13#10 +
mmResult.Lines.Append(IntTo ‘Также можно сохранить результаты в отдельном файле с
Str(x)+’/’+IntToStr(M)) помощью кнопки “Печать”.’);
else end;
mmResult.Lines.
Append(IntToStr(x));
end else begin
if M>1 then end.
mmResult.Lines.Append(IntTo
Str(x)+’/’+IntToStr(M)+’ ‘+IntToStr(s))
else //Expressor unit DM007Unit; interface uses
mmResult.Lines.
Append(IntToStr(x)+’ ‘+IntToStr(s));
end ;
end;
x:=(-1)*x;
end;{forl}
end;{if} Windows, Messages, SysUtils, Variants, Classes,
i:=i+1; Graphics, Controls, Forms,
end; Dialogs, StdCtrls; type
end;{if}
p:=p+1; end;{while}
TForm2 = class(TForm)
Edit1: TEdit;
end; end else begin Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
if length(mmInp.Lines[0])=0 then begin Button2: TButton;
MessageDlg(‘Введите коэффицент старшей Memo1: TMemo;
степени’, mtError, [mbOK], 0); Button1: TButton;
mmInp.SetFocus; procedure Edit1KeyPress(Sender: TObject; var Key:
end else begin Char);
MessageDlg(‘Коэффицент старшей степени procedure Edit2KeyPress(Sender: TObject; var Key:
должен быть отличен от нуля’, mtError, [mbOK], 0); Char);
mmInp.SetFocus; procedure Button2Click(Sender: TObject);
end; procedure Button1Click(Sender: TObject);
end; private
finally { Private declarations }
mmResult.Lines.EndUpdate; public
Screen.Cursor:=crDefault; { Public declarations }
end;{finally} end; var
if length(mmResult.Lines[0])=0 then
mmResult.Lines.Append(‘Íåò êîðíåé’);
end; Form2: TForm2; implementation {$R *.dfm}
end; procedure TfrmSuperGorner.btnExitClick(Sender: TOb-
ject);
begin
//frmSuperGorner.Close;
((Sender as TButton).Owner as TForm).Close; procedure TForm2.Edit2KeyPress(Sender: TObject; var
end; procedure TfrmSuperGorner.btnPrintClick(Sender: TOb- Key: Char);
begin
case Key of
ject); ‘0’..’9’: ;
var #8 : ; // <Backspace>
slText: TStringList; #13 : Button2.SetFocus; // <Enter>
18
mmInp: TMemo;
Memo1: TMemo;
else Key :=Chr(0); end; edtPower: TEdit;
end; procedure TForm2.Button2Click(Sender: TObject); Label2: TLabel;
Label3: TLabel;
procedure Memo1KeyPress(Sender: TObject; var Key:
Char);
procedure edtPowerKeyPress(Sender: TObject; var
Key: Char);
var procedure RunClick(Sender: TObject);
a,b,t:integer; procedure HelpClick(Sender: TObject);
begin a := StrToInt(Edit1.Text); private
{ Private declarations }
public
b := StrToInt(Edit2.Text); { Public declarations }
if b<=0 then end; var
begin
ShowMessage(‘Знаменатель должен быть больше 0’);
end Antiexpressor: TAntiexpressor; implementation {$R *.dfm} uses HelpUnit, CreateUnit; procedure TAntiexpressor.edtPowerKeyPress(Sender: TO-
else
begin memo1.text := ‘ [ ‘;
while (a mod b>0) do
begin
memo1.text := memo1.text + IntToStr(a div b)+ ‘,
‘;
a:=a mod b; bject; var Key: Char);
t:=b; begin case Key of
b:=a;
a:=t;
end; memo1.text := memo1.text + IntToStr(a div b)+ ‘ ]’; ‘0’..’9’: ;
#8 : ; // <Backspace>
#13 : Memo1.SetFocus; // <Enter>
end; else Key :=Chr(0);
end; procedure TForm2.Edit1KeyPress(Sender: TObject; var end; end; procedure TAntiexpressor.Memo1KeyPress(Sender: TOb-
Key: Char);
begin
ject; var Key: Char);
begin
case Key of if not (Key in [‘0’..’9’, #8, #13]) then begin
‘0’..’9’: ; Key:=#0;
#8 : ; // <Backspace> Beep;
#13 : Edit2.SetFocus; // <Enter> end;
end; procedure TAntiexpressor.RunClick(Sender: TObject);
else Key :=Chr(0); end; end;
var s: array [0..100] of integer;
a,b,t,
i, n, j:integer;
bul:boolean;
procedure TForm2.Button1Click(Sender: TObject); begin Memo1.Lines.Clear;
begin
ShowMessage(‘Эта программа преобразовывает обычные
дроби в цепные.’+ #13#10 + n:=StrToInt(edtPower.Text);
‘Для этого в соответсвующих полях введите числитель и
знаменатель.’ for i:=0 to n-1 do
+ #13#10 +’и нажмите “Считать!”.’); begin
end; end. // Antiexpressor unit DM008Unit; interface uses 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;
Windows, Messages, SysUtils, Variants, Classes, break;
Graphics, Controls, Forms, end
Dialogs, StdCtrls; type else
begin
bul:=true;
TAntiexpressor = class(TForm) a:=1;
Label1: TLabel; b:=s[n-1];
Help: TButton; for i:= n-1 downto 1 do
Run: TButton; 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