Численные методы Программа-калькулятор на Pascal
Задание
Разработать программу-калькулятор CalcKurs на языке программирования Pascal, реализующую следующие функции:
1. формирование заданного подмножества натурального ряда с помощью общего делителя;
2. факторизация числа с опциями;
3. нахождение НОД и НОК для заданной совокупности натурального ряда;
4. нахождение рациональных решений уравнения с целочисленными коэффициентами;
5. представление рациональной дроби в виде цепной;
6. представление цепной дроби в виде рациональной.
Оборудование и ПО:
Название Windows: Windows Seven (6.1.7600) Ultimate
Название процессора: Intel (R) Core (TM) 2 CPU 6300 @ 1.86GHz
Установлено памяти: 1 022,49 MB
Среда программирования: Turbo Pascal 7.0
Оглавление
1. Введение
Теория чисел - это одно из направлений математики, которое иногда называют "высшей арифметикой". Данная наука изучает натуральные числа и некоторые сходные с ними объекты, рассматривает различные свойства (делимость, разложимость, взаимосвязи и так далее), алгоритмы поиска чисел, а также определяет ряд достаточно интересных наборов натуральных чисел.
Так, к примеру, в рамках теории чисел рассматриваются вопросы делимости целых чисел друг на друга, алгоритм Евклида для поиска наибольшего общего делителя, поиск наименьшего общего кратного, малая и большая теоремы Ферма. В качестве самых известных рядов натуральных чисел можно привести ряд Фибоначчи, простые числа, совершенные и дружественные числа, степени и суперстепени натуральных чисел. [1]
Вне самой математики теория чисел имеет довольно мало приложений, и развивалась она не ради решения прикладных задач, а как искусство ради искусства, обладающее своей внутренней красотой, тонкостью и трудностью. Тем не менее теория чисел оказала большое влияние на математическую науку, поскольку некоторые разделы математики (в том числе и такие, которые впоследствии нашли применение в физике) были первоначально созданы для решения особенно сложных проблем теории чисел. [2]
Разработанная программа включает в себя набор из нескольких основных операций, которые могут понадобиться при решении более сложных задач.
Назначение программы CalcKurs.
Программа CalcKurs выполняет следующие функции:
1. формирование заданного подмножества натурального ряда с помощью общего делителя;
2. факторизация числа с опциями;
3. нахождение НОД и НОК для заданной совокупности натурального ряда;
4. нахождение рациональных решений уравнения с целочисленными коэффициентами;
5. представление рациональной дроби в виде цепной;
6. представление цепной дроби в виде рациональной.
2. Специальная часть
2.1 Интерфейс программы
3. Описание процедур
3.1 Procedure DelOstatok
Назначение.
Данная процедура формирует заданное подмножество натурального ряда с помощью общего делителя.
Алгоритм.
Ищется общий делитель совокупности делителей (общий делитель ищется с помощью нахождения наименьшего общего кратного делителей). На заданном множестве (кол-во цифр в числах) ищем первый элемент, который будет удовлетворять заданному условию (делится на НОК с остатком), запоминаем элемент и прерываем цикл.
Формируем подмножество с помощью прибавления к первому элементу делителя, суммируем количество элементов, пока элементы не станут больше заданной размерности.
Пример. Делитель=10, остаток=3, размерность=2 (от 10 до 99)
Количество элементов=9. Подмножество элементов={13, 23, 33, 43, 53, 63, 73, 83, 93}. Тесты.
1. Некорректные данные
2. Корректные данные
3.2 Procedure Factor
Назначение.
Данная процедура выполняет факторизацию (разложение на простые множители) числа с опциями.
Алгоритм.
Ищем для данного числа простой множитель с помощью решета Эратосфена [3]
Для нахождения всех простых чисел не больше заданного числа n, следуя методу Эратосфена, нужно выполнить следующие шаги:
Выписать подряд все целые числа от двух до n (2, 3, 4, …, n).
Пусть переменная p изначально равна двум - первому простому числу.
Вычеркнуть из списка все числа от 2p до n, делящиеся на p (то есть, числа 2p, 3p, 4p, …)
Найти первое не вычеркнутое число, большее чем p, и присвоить значению переменной p это число.
Повторять шаги 3 и 4 до тех пор, пока p не станет больше, чем n
Все не вычеркнутые числа в списке - простые числа)
и делим заданное число на данный множитель, потом ищем следующий простой множитель (если он повторяется, то возводим его в степень), и так до тех пор, пока число не станет равным единице. Записываем все простые множители.
Далее находим все делители числа и составляем из них множество. Вычисляем сумму делителей.
Пример.
Число=21
множество делителей=1 3 7 21, кол-во простых множителей=2
21=3 ^ 1 * 7 ^ 1
кол-во множителей=4, сумма множителей=32
Тесты.
1. Некорректные данные
2. Корректные данные
3.3 Procedure NodNok
Назначение.
Данная процедура находит НОД и НОК для заданной совокупности натурального ряда.
Алгоритм.
С помощью алгоритма Евклида (есть числа a,b и последовательность R1>R2>R3>…>RN, где каждое RK - это остаток от деления предпредыдущего числа на предыдущее, а предпоследнее делится на последнее нацело. Тогда НОД (a,b), наибольший общий делитель a и b, равен RN, последнему ненулевому члену этой последовательности) находим НОД [4] для первых двух чисел, "цепляем" следующее число для нахождения следующего НОД, и так до тех пор, пока совокупность чисел не закончится.
Для нахождения НОК первых двух чисел используем следующий алгоритм: разлагаем данные числа на простые множители и к одному из таких разложений приписываем множители недостающие у него против разложений остальных данных чисел [5], и аналогично нахождению НОД "цепляем" следующее число.
Пример.
Числа: 21 и 12
НОД (12,21) =3
НОК (12,21) =84
Тесты.
1. Некорректные данные
2. Корректные данные
3.4 Procedure SuperGorner
Назначение.
Данная процедура находит рациональные решения уравнения с целочисленными коэффициентами.
Алгоритм.
Рациональные корни уравнения ищутся с помощью расширенной схемы (метода) Горнера [6] (раскладываем свободный член и коэффициент перед старшей степенью на все возможные множители и делим все множители свободного члена на все множители коэффициента перед старшей степенью (добавляем также знак “-”); подставляем полученные значения в уравнение, если уравнение получается равным нулю, то это значение - корень данного уравнения).
Пример. Уравнение: 6x3-11x2+6x-1=0
Возможные корни: +1, +1/2, +1/3, +1/6
Корни уравнения: 1/3, 1/2, 1
Тесты.
1. Некорректные данные
2. Корректные данные
3.5 Procedure Express
Назначение.
Данная процедура переводит рациональную дробь в цепную [7].
Алгоритм.
Делим числитель на знаменатель, запоминаем его целое значение (a div b, где а - числитель, b - знаменатель), находим остаток от деления числителя на знаменатель (a mod b), присваиваем числителю значение остатка, меняем местами числитель и знаменатель, и так делаем до тех пор, пока (a mod b) не станет равен нулю.
Пример.
Рациональная дробь: 123/47
Цепная дробь: [2,1,1,1,1,1,1,3]
Тесты.
1. Некорректные данные
2. Корректные данные
3.6 Procedure AntiExp
Назначение.
Данная процедура переводит цепную дробь в рациональную.
Алгоритм.
Умножаем последний элемент цепной дроби с предпоследним и прибавляем к полученному значению единицу, это будет значением числителя, значением знаменателя будет последний элемент цепной дроби, меняем их местами, теперь последним элементом цепной дроби будет полученный знаменатель; так делаем, пока не закончатся элементы цепной дроби.
Пример. Цепная дробь: [2,3,4,5]. Рациональная дробь: 157/68
Тесты.
1. Некорректные данные
2. Корректные данные
4. Заключение
Разработана программа CalcKurs, выполняющая следующие функции:
1. формирование заданного подмножества натурального ряда с помощью общего делителя;
2. факторизация числа с опциями;
3. нахождение НОД и НОК для заданной совокупности натурального ряда;
4. нахождение рациональных решений уравнения с целочисленными коэффициентами;
5. представление рациональной дроби в виде цепной;
6. представление цепной дроби в виде рациональной.
К минусам программы можно отнести невысокую размерность чисел, которые участвуют в вычислениях (-2147483648. .2147483647), некоторые алгоритмы можно сделать более оптимальными.
К плюсам можно отнести простоту в пользовании программой, её малую требовательность к ресурсам компьютера, программа исполняет основополагающие алгоритмы теории чисел. Она может помочь в изучении данного раздела математики.
Список использованных источников
1.http://ru. wikipedia.org/wiki/Теория_чисел
2.http://www.krugosvet.ru/enc/nauka_i_tehnika/matematika/CHISEL_TEORIYA.html
3.http://ru. wikipedia.org/wiki/Решето_Эратосфена
4.http://ru. wikipedia.org/wiki/Наибольший_общий_делитель
5.http://ru. wikipedia.org/wiki/Наименьшее_общее_кратное
6.http://ru. wikipedia.org/wiki/Метод_Горнера
7.http://dic. academic.ru/dic. nsf/es/39322/непрерывная
Приложение
Листинг программы
program kurs;
uses crt;
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}
{----------------------------------------}
procedure DelOstatok;
var
dd: array [1.200] of integer;
R: integer; {размерность чисел}
i: longint; {делитель}
k: longint; {остаток}
D,a,b: longint; {элементы заданного множества}
SUM: longint; {кол-во эл-ов, удовл условию}
S,T: byte;
q: char;
e,j,l,n: integer;
maxa,minj,maxj: longint;
begin
repeat
begin
writeln ('введите ко-во чисел для нахождения НОК делителей');
readln (n);
writeln ('введите ',n,' чисел: ');
readln (dd [1]);
maxa: =dd [1] ;
for i: =2 to n do
begin
readln (dd [i]);
if dd [i] >maxa then maxa: =dd [i] ;
end;
i: =1; while (dd [i] <>0) and (i<=n) do inc (i);
if i<>n+1 then writeln ('НОК не сущ-ет')
else begin
e: =1;
for i: =2 to maxa do
begin
maxj: =0;
for l: =1 to n do
begin
j: =0;
while (dd [l] mod i=0) do
begin
dd [l]: =dd [l] div i;
inc (j);
end;
if (j>maxj) then maxj: =j;
end;
if (maxj<>0) then for l: =1 to maxj do e: =e*i;
end;
writeln ('НОК делителей=',e);
end;
end;
i: =e;
write ('введите остаток=');
readln (k);
if ( (i<=0) or (k<0)) then {проверка
{вывод эл-ов на экран}
end; writeln;
end;
writeln ('Повторить? (Y/N) ');
q: =ReadKey;
until q in ['N','n'] ;
clrscr;
end; {DelOstatok}
{----------------------------------------}
procedure Factor;
var
numb, powers: array [1. .100] of longint;
c: longint;
n: longint;
n1,H: longint;
i: longint;
k,t: longint;
q: char;
begin
repeat
write ('Введите число=');
readln (c);
if c<=0 then {проверка на корр числа}
begin
writeln ('число должно быть>0');
readln;
exit;
end
else
{вывод мн-ва делителей}
begin
write ('мн-во делителей: D (num) =');
for H: = 1 to c do
if c mod H=0 then
write (H,' ');
end;
{конец вывода делителей}
n: = 1;
n1: = 0;
while c <> 1 do
begin
i: = 2;
while c 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; {while}
c: = c div i; {деление числа на простой множитель}
end; {while}
{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}
writeln;
writeln ('кол-во простых множителей: ',n);
write ('num = ');
k: =1;
t: =1;
writeln ('НОД=',k);
if k=1 then writeln ('числа взаимно простые');
end;
begin
i: =1; while (b [i] <>0) and (i<=n) do inc (i);
if i<>n+1 then writeln ('НОК не сущ-ет')
else begin
d: =1;
for i: =2 to maxa do
begin
maxj: =0;
for l: =1 to n do
begin
j: =0;
while (b [l] mod i=0) do
begin
b [l]: =b [l] div i;
inc (j);
end;
if (j>maxj) then maxj: =j;
end;
if (maxj<>0) then for l: =1 to maxj do d: =d*i;
end;
writeln ('НОК=',d);
end;
end;
end;
writeln ('Повторить? (Y/N) ');
q: =ReadKey;
until q in ['N','n'] ;
clrscr;
end; {NodNok}
{----------------------------------------}
procedure SuperGorner;
type
vector= array [1. .11] of integer;
rvector=array [1. .100] of real;
var
sum,suma: real;
i,k,j,b,c,a,n: integer;
vec: vector;
vecb: rvector;
veca: rvector;
q: char;
BEGIN
Writeln ('Введите степень уравнения (max = 10) ');
Readln (n);
if n<=0 then writeln (‘степень не может быть<=0’)
else begin
Inc (n);
writeln ('введите его коэффициенты: ');
for i: = 1 to n do
read (vec [i]);
while vec [i] =0 do
Begin
i: =i-1;
writeln ('ответ: 0');
End;
k: =1;
b: =vec [i] ;
for j: =1 to abs (b) do
begin
if (b mod j) =0 then
begin
vecb [k]: =j;
k: =k+1;
procedure AntiExp;
var s: array [1. .100] of integer;
a,b, i,n,t: integer;
q: char;
begin
repeat
writeln ('введите кол-во эл-ов цепной дроби=');
read (n);
if n<=0 then writeln (‘кол-во эл-ов не может быть<=0’)
else begin
writeln ('введите значения этих эл-ов=');
for i: =1 to n do
read (s [i]);
a: =1; b: =s [n] ;
for i: = n downto 2 do
begin
t: =s [i-1] *b+a;
a: =b;
b: =t;
end;
writeln;
writeln (b,'/',a);
end;
writeln ('Повторить? (Y/N) ');
q: =ReadKey;
until q in ['N','n'] ;
clrscr;
end; {AntiExp}
{----------------------------------------}
var
k: integer;
q: char;
begin
writeln ('Дискретная математика');
writeln ('Курсовая работа, группа 03-119, каф308');
writeln ('выполнил: Тузов И.И. ');
writeln ('руководитель: Гридин А.Н. ');
writeln;
writeln ('Калькулятор с функциями, описанными ниже');
writeln;
Writeln ('Нажмите Enter');
readln;
clrscr;
repeat
writeln ('Какую выполнить операцию? ');
writeln;
writeln ('1-вычисление мн-ва N-значных чисел с заданным делителем и остатком ');
writeln ('2-факторизация числа');
writeln ('3-нахождение НОД и НОК чисел');
writeln ('4-нахождение рационльных корней уравнения с целочисл коэфф');
writeln ('5-перевод рациональной дроби в цепную');
writeln ('6-перевод цепной дроби в рациональную');
read (k);
делителя и остатка на отриц-сть}
begin
write ('делитель или остаток не могут быть<0 ');
end
else
begin
if i>k then {проверка на делитель>остатка}
begin
write ('введите размерность=');
readln (R);
if R<=0 then
begin
writeln ('некорректная размерность ');
readln;
end
else begin
if R=1 then
begin a: =1; b: =9; end
else begin
a: =pow (10, (R-1)); {инициализация верх и нижн границ}
b: =pow (10,R);
b: =b-1;
end;
end;
if b<i then {проверка на делимое>делителя}
writeln ('делиоме не может быть < делителя ')
else
begin
SUM: =0; {обнуление сумы кол-ва эл-ов}
for D: = a to b do
begin
if (D mod i) =k then {проверка эл-ов на условие}
begin
SUM: =SUM+1;
end;
end;
writeln;
writeln ('кол-во эл-ов с делителем=', i: 3, ' и остатком=', k: 3, ' равно', SUM: 6);
end; {b
end {if i>k}
else
write ('остаток не может быть > делителя ');
end; {if otriz}
{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}
write ('вывести значения на экран? (1-да\0-нет) ');
readln (S);
if S=1 then
if SUM=0 then
writeln ('нет эл-ов, удовл. условию')
else
begin
for D: = a to b do
if (D mod i) =k then
begin
write (' ',D: 4);
{вычисление кол-ва делителей и их мн-ва}
for i: = 1 to n do
begin
write (numb [i], ' ^ ', powers [i]);
k: =k* ( (pow (numb [i],powers [i] +1) - 1) div (numb [i] - 1));
t: =t* (powers [i] +1); {кол-во делителей}
if i <> n then write (' * ');
end;
writeln;
writeln ('кол-во множителей: tau (num) =',t);
writeln ('сумма множителей: sigma (num) =',k);
writeln ('Повторить? (Y/N) ');
q: =ReadKey;
until q in ['N','n'] ;
clrscr;
end; {Factor}
{----------------------------------------}
procedure NodNok;
type TArray=array [1.200] of integer;
var a,b: TArray;
i,l,j,maxa,minj,maxj: longint;
k,d: longint;
n: integer;
q: char;
begin
repeat
clrscr;
writeln ('введите ко-во чисел для нахождения НОД и НОК');
readln (n);
writeln ('введите ',n,' чисел: ');
if n<=0 then writeln (‘кол-во чисел не может быть<=0’)
else begin
readln (a [1]);
b [1]: =a [1] ;
maxa: =a [1] ;
for i: =2 to n do
begin
readln (a [i]);
b [i]: =a [i] ;
if a [i] >maxa then maxa: =a [i] ;
end;
i: =1;
while (a [i] =0) and (i<=n) do inc (i);
if i=n+1 then writeln ('НОД - любое число')
else begin
for j: =1 to n do if a [j] =0 then a [j]: =a [i] ;
k: =1;
for i: =2 to maxa do
begin
minj: =1000;
for l: =1 to n do
begin
j: =0;
while (a [l] mod i=0) do
begin
a [l]: =a [l] div i;
inc (j);
end;
if (j
end;
if (minj<>0) then for l: =1 to minj do k: =k*i;
end;
vecb [k]: =-j;
k: =k+1;
end;
end;
a: =1;
for j: =1 to abs (vec [1]) do
begin
if (vec [1] mod j) =0 then
begin
veca [a]: =j;
a: =a+1;
{ veca [a]: =-j;
a: =a+1; }
End;
end;
b: =a;
for j: =1 to k-1 do
Begin
for a: =1 to b-1 do
Begin
Begin
c: =i;
sum: =0;
for i: =1 to c do
Begin
sum: =sum+vec [i] *pow1 (vecb [j] /veca [a],c-i);
if (sum<0.00001) and (sum>-0.00001) then
if vec [a] =1 then writeln ('ответ: ',round (vecb [j]))
else writeln ('ответ: ',round (vecb [j]), '/',round (veca [a]));
end;
End;
End;
End; end;
readln;
end; {SuperGorner}
{----------------------------------------}
procedure Express;
var
a,b,t: integer;
q: char;
begin
repeat
writeln ('введите числитель=');
readln (a);
writeln ('введите знаменатель=');
readln (b);
if b=0 then writeln (‘знаменатель не может быть=0’)
else begin
write (' [');
while (a mod b>0) do
begin
write (a div b,',');
a: =a mod b;
t: =b;
b: =a;
a: =t;
end;
write (a div b, '] ');
end;
writeln (‘Повторить? (Y/N) ');
q: =ReadKey;
until q in ['N','n'] ;
clrscr;
end; {Express}
{----------------------------------------}
case k of
1: DelOstatok;
2: Factor;
3: NodNok;
4: SuperGorner;
5: Express;
6: AntiExp;
else
writeln ('нет операции');
end; {case}
writeln ('Повторить выполнение калькулятора? (Y/N) ');
q: =ReadKey;
until q in ['N','n'] ;
clrscr;
readln;
end. {prog}

Нравится материал? Поддержи автора!
Ещё документы из категории информатика:
Чтобы скачать документ, порекомендуйте, пожалуйста, его своим друзьям в любой соц. сети.
После чего кнопка «СКАЧАТЬ» станет доступной!
Кнопочки находятся чуть ниже. Спасибо!
Кнопки:
Скачать документ