Учебная работа. Реферат: Операции многократной точности операции с длинными числами

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (8 оценок, среднее: 4,75 из 5)
Загрузка...
Контрольные рефераты

Учебная работа. Реферат: Операции многократной точности операции с длинными числами

Задание

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

наполнение схематизированной когнитивной картины какого-нибудь предмета личными признаками за счет что оказывается вероятным движение от одной схемы к иной наиболее хорошей для решения определенных з задания

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

формат ввода

Всякую строчку в поле ввода можно представить в виде

S={C,V}

Где S – константа или вычисляемое идет аналогично вводу. Пример ввода и вывода можно поглядеть на рисунке

интерфейс программки.

Интерфейс программки – ее наружный вид является приятным и комфортным. В верхнем поле ввода пишутся известные величины и формулы, позже жмется клавиша «Расчитать» и в нижнем поле выводятся в алфавитном порядке все переменные. программка написана в среде программирования 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]) постоянно хранится буковка, во 2-м (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

· если а<b, то sravnenie =-1

· если а<b, то sravnenie =0

delen
(a,b:string):string; — личное от деления a на b. Берется целая часть.

po
_
ch
_
num
(ch:string;varznach:string):boolean; — отыскивает

sislo
(ch:char):boolean; — инспектирует – является ли знак ch цифрой. Если да – то ворачивается «Правда». Функция употребляется для определения константа либо выражения соответствует данной буковке.

poisk
(z:integer); — процедура для вычисления значения выражения. Она опирается на все прошлые процедуры и функции. Z – номер вычисляемого значения в массиве mas. Метод ее работы такой: считаем количество открывающихся скобок и если они есть, то начинаем считать с самой вложенной, позже идет умножение и деление, позже сумма и разность. Опосля каждой операции длина уравнения миниатюризируется и воззвание идет снова к процедуре poisk с этим же параметром z.

vivod
; — вывод отысканных значений в поле вывода memo3.

TForm
1.
Button
1
Click
(Sender: TObject); — процедура нажатия на клавишу «Расчет».

TForm
1.
Button
2
Click
(Sender: TObject); — процедура нажатия на клавишу «Задание».

Все функции употребляют глобальную переменную mas и все процедуры и функции меж собой тесновато соединены.

Разглядим метод работы процедуры umnozen


Ввод a,b

Bol=false










unit Unit1;

interface

uses

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

StdCtrls, Grids;

type

dd= record

lin:array[1..300] of string;

dl:integer;

end;

TForm1 = class(TForm)

Button1: TButton;

Memo1: TMemo;

Label1: TLabel;

Label3: TLabel;

Memo3: TMemo;

Button2: TButton;

procedure Button1Click(Sender: TObject);

function minus(a,b:string):string;

function sum(a,b:string):string;

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

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

vs1:integer;{elementov v zn}

y:integer; {elementov v mas}

implementation

{$R *.DFM}

procedure
zapolnenie;

var

tmp:string;

j,nn,ll:integer;

chislo:boolean;

begin

y:=0;

for ll:=0 to form1.Memo1.Lines.Count do begin

tmp:=form1.Memo1.Lines[ll];

y:=y+1;

mas[y].dl:=1;

nn:=0;

chislo:=false;

tmp:=ansiuppercase(tmp);

for j:=1 to length(tmp) do begin

if tmp[1]=’@’ then begin

mas[y].lin[3]:=copy(tmp,4,300);

mas[y].lin[1]:=tmp[2];

mas[y].lin[2]:=tmp[3];

mas[y].dl:=4;

break;

end

else begin

mas[y].lin[mas[y].dl]:=copy(tmp,nn+1,j-nn);

mas[y].dl:=mas[y].dl+1;

nn:=j;

end;

end;

end;

end;

function
TForm1.sum(a,b:string):string;

var

tmp,c,tmp2:string;

i,k,ost,j:integer;

bol:boolean;

begin

if ((bactiveXand (a[1]<>’-‘)) then begin

sum:=form1.minus(a,copy(b,2,300)); exit;

end;

if ((aactiveXand (b[1]<>’-‘)) then begin

sum:=form1.minus(b,copy(a,2,300)); exit;

end;

bol:=false;

if ((bactiveXand (a[1]=’-‘)) then begin

bol:=true; a:=copy(a,2,300); b:=copy(b,2,300)

end;

if length(b)>length(a) then begin

tmp:=b; b:=a; a:=tmp;

end;

ost:=0;

if length(b)<>length(a) then b:=’0’+b;

c:=a;

j:=length(a);

tmp2:=»;

for i:=length(b) downto 1 do begin

tmp2:=tmp2+’0′;

k:=strtoint(c[j])+strtoint(b[i]);

k:=k+ost;

ost:=0;

if k>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 cactiveXc;

sum:=c;

end;

function
Tform1.minus(a,b:string):string;

var

i,la,lb,vv,snos:integer;

c,tmp:string;

pom:boolean;

begin

if ((bactiveXand (a[1]<>’-‘)) then begin

minus:=form1.sum(a,copy(b,2,300)); exit;

end;

if ((aactiveXand (b[1]<>’-‘)) then begin

minus:=form1.sum(aactiveXb); 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 vv<0 then begin

snos:=1; vv:=vv+10;

end;

c[la-lb+i]:=inttostr(vv)[1];

end;

if snos=1 then begin

tmp:=»;

for i:=1 to lb do tmp:=tmp+’0′;

tmp:=’1’+tmp;

c:=minus(c,tmp);

end;

while ((c[1]=’0′)and(length(c)>1)) do c:=copy(c,2,300);

if pom then cactiveXc;

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 ((bactiveXand (a[1]<>’-‘)) then begin

bol:=true; b:=copy(b,2,300);

end;

if ((aactiveXand (b[1]<>’-‘)) then begin

bol:=true; a:=copy(a,2,300);

end;

if ((bactiveXand (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 cactiveXc;

umnozen:=c;

end;

function
sravnenie(a,b:string):shortint;

{ если а>b, то сопоставление=1

если а<b, то сопоставление=-1

если а<b, то сопоставление=0}

var

la,lb,i:integer;

begin

la:=length(a); lb:=length(b);

if aactiveXthen begin

if b[1]=’-‘ then sravnenie:=sravnenie(b,a)

else sravnenie:=-1;

exit;

end;

if bactiveXthen begin

if a[1]=’-‘ then sravnenie:=sravnenie(b,a)

else sravnenie:=1;

exit;

end;

if lb>la then sravnenie:=-1;

if lb<la then sravnenie:=1;;

if la=lb then begin

for i:=1 to la do begin

if a[i]>b[i] then begin

sravnenie:=1;

exit;

end;

if a[i]<b[i] then begin

sravnenie:=-1;

exit;

end;

end;

sravnenie:=0;

end;

end;

function
del2(str:string):string;

var

ost,i:integer;

dr:string;

begin

ost:=0;

dr:=»;

for i:=1 to length(str) do begin

dr:=dr+inttostr((strtoint(str[i])+ost*10) div 2);

ost:=((strtoint(str[i])+ost*10) mod 2);

end;

if dr[1]=’0′ then dr:=copy(dr,2,300);

del2:=dr;

end;

function
delen(a,b:string):string;

{delen=round(a/b)}

var

bol,zzz:boolean;

pr,tmp,lev,prav,rab:string;

begin

if b=’0′ then begin

showmessage(‘Íà íîëü äåëèòü íåëüçÿ!’);

delen:=»;

exit;

end;

zzz:=false;

if ((bactiveXand (a[1]<>’-‘)) then begin

zzz:=true; b:=copy(b,2,300);

end;

if ((aactiveXand (b[1]<>’-‘)) then begin

zzz:=true; a:=copy(a,2,300);

end;

if ((bactiveXand (a[1]=’-‘)) then begin

a:=copy(a,2,300); b:=copy(b,2,300)

end;

bol:=true;

lev:=’0′; prav:=a; pr:=’0′; rab:=a;

if b<>’1′ then

while (bol) do begin

tmp:=form1.minus(a,pr);

if tmpactiveXthen tmp:=copy(tmp,2,300);

if (sravnenie(tmp,del2(b))<>1) then break;//bol:=false;

tmp:=form1.minus(prav,lev); rab:=»;

rab:=form1.sum(lev,del2(tmp));

pr:=umnozen(b,rab);

if sravnenie(a,pr)=1 then begin

lev:=rab;

end

else begin

prav:=rab;

end;

end;

if zzz then rabactiveXrab;

delen:=rab;

if ((rab=’-‘)or(rab=»))then delen:=’0’;

end;

function
po_ch_num(ch:string;var znach:string):boolean;

var

bol:boolean;

i:integer;

begin

bol:=false;

for i:=1 to y do begin

if ((mas[i].dl=4)and(mas[i].lin[1]=ch)) then begin

bol:=true;

znach:=mas[i].lin[3];

end;

end;

po_ch_num:=bol;

end;

function
sislo(ch:char):boolean;

begin

if ((ch>=’0′)and(ch<=’9′)or(chactiveXthen sislo:=true

else sislo:=false;

end;

procedure
poisk(z:integer);

var

i,k,j,m,k2,zz:integer;

tmp:string;

zn:char;

begin

{snachala ubiraem skobki, potom *, potom /, potom +, potom -}

k:=0;

for i:=1 to mas[z].dl-1 do

if mas[z].lin[i]='(‘ then k:=k+1;

if k>0 then begin

k2:=0;

for i:=1 to mas[z].dl-1 do begin

if mas[z].lin[i]='(‘ then k2:=k2+1;

if k2=k then begin

if mas[z].lin[i+2]=’)’ then begin

mas[z].lin[i]:=mas[z].lin[i+1];

for m:=i+1 to mas[z].dl-2 do mas[z].lin[m]:=mas[z].lin[m+2];

mas[z].dl:=mas[z].dl-2;

poisk(z);

exit;

end

else begin

zz:=i+1;

while mas[z].lin[zz]<>’)’ do begin

if ((mas[z].lin[zzactiveXor(mas[z].lin[zz]=’/’)) then begin

if po_ch_num(mas[z].lin[zz-1],tmp) then mas[z].lin[zz-1]:=tmp;

if po_ch_num(mas[z].lin[zz+1],tmp) then mas[z].lin[zz+1]:=tmp;

if (((sislo(mas[z].lin[zz-1][1])))and(sislo(mas[z].lin[zz+1][1]))) then begin

zn:=mas[z].lin[zz][1];

if znactiveXthen mas[z].lin[zz-1]:=umnozen(mas[z].lin[zz-1],mas[z].lin[zz+1])

else mas[z].lin[zz-1]:=delen(mas[z].lin[zz-1],mas[z].lin[zz+1]);

for m:=zz to mas[z].dl-2 do mas[z].lin[m]:=mas[z].lin[m+2];

mas[z].dl:=mas[z].dl-2;

poisk(z);

exit;

end;

end;

zz:=zz+1;

end;

//////// {snachala / i *, potom + i -}

zz:=i+1;

while mas[z].lin[zz]<>’)’ do begin

if ((mas[z].lin[zzactiveXor(mas[z].lin[zz]=’-‘)) then begin

if po_ch_num(mas[z].lin[zz-1],tmp) then mas[z].lin[zz-1]:=tmp;

if po_ch_num(mas[z].lin[zz+1],tmp) then mas[z].lin[zz+1]:=tmp;

if ((sislo(mas[z].lin[zz-1][1]))and(sislo(mas[z].lin[zz+1][1]))) then begin

zn:=mas[z].lin[zz][1];

if znactiveXthen mas[z].lin[zz-1]:=form1.sum(mas[z].lin[zz-1],mas[z].lin[zz+1])

else mas[z].lin[zz-1]:=form1.minus(mas[z].lin[zz-1],mas[z].lin[zz+1]);

for m:=zz to mas[z].dl-2 do mas[z].lin[m]:=mas[z].lin[m+2];

mas[z].dl:=mas[z].dl-2;

poisk(z);

exit;

end;

end;

zz:=zz+1;

end;

////////

end;

end;

end;

end

else begin {esli skobok net}

for zz:=1 to mas[z].dl-1 do begin if ((mas[z].lin[zzactiveXor(mas[z].lin[zz]=’/’)) then begin

if po_ch_num(mas[z].lin[zz-1],tmp) then mas[z].lin[zz-1]:=tmp;

if po_ch_num(mas[z].lin[zz+1],tmp) then mas[z].lin[zz+1]:=tmp;

if ((sislo(mas[z].lin[zz-1][1]))and(sislo(mas[z].lin[zz+1][1]))) then begin

zn:=mas[z].lin[zz][1];

if znactiveXthen mas[z].lin[zz-1]:=umnozen(mas[z].lin[zz-1],mas[z].lin[zz+1])

else mas[z].lin[zz-1]:=delen(mas[z].lin[zz-1],mas[z].lin[zz+1]);

for m:=zz to mas[z].dl-2 do mas[z].lin[m]:=mas[z].lin[m+2];

mas[z].dl:=mas[z].dl-2;

poisk(z);

exit;

end;

end;

end;

for zz:=1 to mas[z].dl-1 do begin

////////

if ((mas[z].lin[zzactiveXor(mas[z].lin[zz]=’-‘)) then begin

if po_ch_num(mas[z].lin[zz-1],tmp) then mas[z].lin[zz-1]:=tmp;

if po_ch_num(mas[z].lin[zz+1],tmp) then mas[z].lin[zz+1]:=tmp;

if ((sislo(mas[z].lin[zz-1][1]))and(sislo(mas[z].lin[zz+1][1]))) then begin

zn:=mas[z].lin[zz][1];

if znactiveXthen mas[z].lin[zz-1]:=form1.sum(mas[z].lin[zz-1],mas[z].lin[zz+1])

else mas[z].lin[zz-1]:=form1.minus(mas[z].lin[zz-1],mas[z].lin[zz+1]);

for m:=zz to mas[z].dl-2 do mas[z].lin[m]:=mas[z].lin[m+2];

mas[z].dl:=mas[z].dl-2;

poisk(z);

exit;

end;

end;

///////

end;

end;

end;

procedure
vivod;

var

i:integer;

begin

form1.Memo3.Clear;

for i:=1 to y do

if mas[i].dl=4 then begin

form1.Memo3.Lines.Add(mas[i].linactiveXmas[i].lin[3]);

end;

end;

procedure
TForm1.Button1Click(Sender: TObject);

var

i,j:integer;

begin

zapolnenie;

for j:=1 to y do

for i:=1 to y do poisk(i);

vivod;

end;

procedure
TForm1.Button2Click(Sender: TObject);

begin

messagedlg(‘Îïåðàöèè ìíîãîêðàòíîé òî÷íîñòè’,mtinformation,[mbok],0);

end;

end.

]]>