Рефетека.ру / Информатика и програм-ие

Реферат: Операции многократной точности (операции с длинными числами)

Задание

Операции многократной точности (т.е. операции с длинными числами).

Конкретизация задания

Сначала буквам присваивается значение – например: а=23850934, причем все переменные – целые числа, которые по длине не должны превышать 300 знаков.
Потом пишется выражение, например f=(a+b)/c+(d+a). При этом деление – это целое от деления делимого на делитель. Операции сложения, вычитания, умножения – обычные арифметические операции, только это операции над длинными числами. Кроме сложения, вычитания, умножения и деления еще могут быть использованы скобки.

Формат ввода

Любую строку в поле ввода можно представить в виде

S={C,V}

Где S – константа либо вычисляемое значение. Если это – константа, то С – число в строковом виде, перед которым стоит символ «@», а если S надо найти то S=V, где V – выражение с переменными и числами. В строке не должно быть пробелов и все переменные состоят из одой буквы. Между строками в поле ввода не должно быть пустых строк. Вывод идет аналогично вводу. Пример ввода и вывода можно посмотреть на рисунке

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

Интерфейс программы – ее внешний вид является наглядным и удобным. В верхнем поле ввода пишутся известные величины и формулы, потом жмется кнопка «Расчитать» и в нижнем поле выводятся в алфавитном порядке все переменные. Программа написана в среде программирования Delphi 6.
Использовались только стандартные компоненты – TEdit и TButton. Итого на форме размещено поле ввода, поле вывода и кнопка – для запуска процесса расчета. Использование визуальных средств разработки на много ускорило процесс написания программы.

Структура хранения

Все длинные числа представляются в виде строки, каждый элемент которой – цифра. Если число отрицательное, то первым символом строки будет “-“. Чтобы считать по формуле используем структуру, описанную ниже

type dd= record lin:array[1..300] of string; dl:integer; end;

var mas:array[1..300] of dd;

В массиве mas хранится уравнение. Каждый элемент массива – отдельное уравнение. В lin хранятся отдельные элементы уравнения. Например mas[3].lin=(‘A’,’=’,’3’,’/’,’(‘,’B’,’-‘,’1’,’)’) соответствует уравнению
A=3/(B-1). В первом элементе (mas[i].lin[1]) всегда хранится буква, во втором (mas[i].lin[2]) символ “=”. Такая форма ведения уравнения нужна для удобства вычисления длинных формул. В dl хранится текущее число элементов в уравнении+1. Можно сказать – если dl=4, то в данном элементе хранится не формула, которую надо вычислить, а значение.

Количество строк введенных в поле ввода должно быть не более 300 – это задается размерностью массива mas.

Используемые процедуры и функции

zapolnenie; - заполнение массива mas из поля edt1. sum(a,b:string):string; - сумма чисел, хранящихся в a и b. minus(a,b:string):string; - разность чисел, хранящихся в a и b. minus=a-b umn(a:integer;var xx:string):string; - умножение числа хх на цифру а.
Используется в функции umnozen. umnozen(a,b:string):string; - произведение чисел, хранящихся в a и b. del2(str:string):string; - делит число str на 2. sravnenie(a,b:string):shortint; - сравнивает число a с числом b.
Возвращается результат:

. если а>b, то sravnenie =1

. если а9 then begin ost:=k div 10; k:=k mod 10; end; c[j]:=inttostr(k)[1]; j:=j-1; end; if ost>0 then begin tmp2:=inttostr(ost)+tmp2; c:=form1.sum(tmp2,c); end; if bol then c:='-'+c; sum:=c; end;

function Tform1.minus(a,b:string):string; var i,la,lb,vv,snos:integer; c,tmp:string; pom:boolean; begin if ((b[1]='-') and (a[1]'-')) then begin minus:=form1.sum(a,copy(b,2,300)); exit; end; if ((a[1]='-') and (b[1]'-')) then begin minus:=form1.sum(a,'-'+b); exit; end; if ((b[1]='-') and (a[1]='-')) then begin minus:=form1.minus(copy(b,2,300),copy(a,2,300)); exit; end; c:=a; pom:=false; la:=length(a); lb:=length(b); if lb>la then begin pom:=true; c:=b; b:=a; a:=c; la:=length(a); lb:=length(b); end; snos:=0; for i:=lb downto 1 do begin vv:=strtoint(a[la-lb+i])-strtoint(b[i])-snos; snos:=0; if vv1)) do c:=copy(c,2,300); if pom then c:='-'+c; minus:=c; end;

function umn(a:integer;var xx:string):string; var i,ost,tmp,dl:integer; str:string; begin ost:=0; str:=''; dl:=length(xx); for i:=dl downto 1 do begin tmp:=a*strtoint(xx[i])+ost; if tmp>9 then begin str:=inttostr((tmp mod 10))+str; ost:=tmp div 10; if i=1 then str:=inttostr(ost)+str; end else begin str:=inttostr(tmp)+str; ost:=0; end; end; umn:=str; end;

function umnozen(a,b:string):string; var k,i:integer; tmp,c,r:string; bol:boolean; begin bol:=false; if ((b[1]='-') and (a[1]'-')) then begin bol:=true; b:=copy(b,2,300); end; if ((a[1]='-') and (b[1]'-')) then begin bol:=true; a:=copy(a,2,300); end; if ((b[1]='-') and (a[1]='-')) then begin a:=copy(a,2,300); b:=copy(b,2,300) end; if ((a='0')or(b='0')) then begin umnozen:='0'; exit; end; k:=length(b); c:='0'; tmp:=''; for i:=k downto 1 do begin r:=umn(strtoint(b[i]),a); r:=r+tmp; tmp:=tmp+'0'; c:=form1.sum(c,r); end; if bol then c:='-'+c; umnozen:=c; end;

function sravnenie(a,b:string):shortint;
{ если а>b, то сравнение=1 если а

Рефетека ру refoteka@gmail.com