Всё сдал! - помощь студентам онлайн Всё сдал! - помощь студентам онлайн

Реальная база готовых
студенческих работ

Узнайте стоимость индивидуальной работы!

Вы нашли то, что искали?

Вы нашли то, что искали?

Да, спасибо!

0%

Нет, пока не нашел

0%

Узнайте стоимость индивидуальной работы

это быстро и бесплатно

Получите скидку

Оформите заказ сейчас и получите скидку 100 руб.!


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

Тип Реферат
Предмет Информатика
Просмотров
1064
Размер файла
35 б
Поделиться

Ознакомительный фрагмент работы:

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

Задание

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

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

Сначала буквам присваивается значение – например: а=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

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

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

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

po_ch_num(ch:string;varznach:string):boolean; - ищет значение буквы в массиве mas. Если значение найдено то возвращается значение «Истина», в противном случае «Ложь». Функция используется для подстановки чисел в выражения. Аргументы: ch – буква, значение которой мы ищем, znach – найденное значение.

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

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

vivod; - вывод найденных значений в поле вывода memo3.

TForm1.Button1Click(Sender: TObject); - процедура нажатия на кнопку «Расчет».

TForm1.Button2Click(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 ((b[1]='-') and (a[1]<>'-')) then begin

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

end;

if ((a[1]='-') and (b[1]<>'-')) then begin

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

end;

bol:=false;

if ((b[1]='-') and (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 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 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 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

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

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

var

la,lb,i:integer;

begin

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

if a[1]='-' then begin

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

else sravnenie:=-1;

exit;

end;

if b[1]='-' then 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 ((b[1]='-') and (a[1]<>'-')) then begin

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

end;

if ((a[1]='-') and (b[1]<>'-')) then begin

zzz:=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;

bol:=true;

lev:='0'; prav:=a; pr:='0'; rab:=a;

if b<>'1' then

while (bol) do begin

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

if tmp[1]='-' then 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 rab:='-'+rab;

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(ch='-')) then 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[zz]='*')or(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 zn='*' then 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[zz]='+')or(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 zn='+' then 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[zz]='*')or(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 zn='*' then 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[zz]='+')or(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 zn='+' then 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].lin[1]+'='+mas[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.


Нет нужной работы в каталоге?

Сделайте индивидуальный заказ на нашем сервисе. Там эксперты помогают с учебой без посредников Разместите задание – сайт бесплатно отправит его исполнителя, и они предложат цены.

Цены ниже, чем в агентствах и у конкурентов

Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит

Бесплатные доработки и консультации

Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки

Гарантируем возврат

Если работа вас не устроит – мы вернем 100% суммы заказа

Техподдержка 7 дней в неделю

Наши менеджеры всегда на связи и оперативно решат любую проблему

Строгий отбор экспертов

К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»

1 000 +
Новых работ ежедневно
computer

Требуются доработки?
Они включены в стоимость работы

Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован

avatar
Математика
История
Экономика
icon
159599
рейтинг
icon
3275
работ сдано
icon
1404
отзывов
avatar
Математика
Физика
История
icon
156492
рейтинг
icon
6068
работ сдано
icon
2737
отзывов
avatar
Химия
Экономика
Биология
icon
105734
рейтинг
icon
2110
работ сдано
icon
1318
отзывов
avatar
Высшая математика
Информатика
Геодезия
icon
62710
рейтинг
icon
1046
работ сдано
icon
598
отзывов
Отзывы студентов о нашей работе
64 096 оценок star star star star star
среднее 4.9 из 5
РАНХиГС
Срок был очень сжатый, но Анна справилась даже раньше. Спасибо огромное!
star star star star star
СПБГТИ
Спасибо большое Маргарите. Очень отзывчивая девушка, на все замечания реагирует молниеносно)
star star star star star
СПбУТУиЭ
Спасибо огромное! Работу нужно было сдать срочно, максимум на следующий день. Ольга выполн...
star star star star star

Последние размещённые задания

Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн

Решение задач по предмету «Математика»

Решение задач, Математика

Срок сдачи к 29 дек.

1 минуту назад

Отчет с выполнением заданий

Решение задач, Отчет, бух учет

Срок сдачи к 25 дек.

4 минуты назад

Расчет параметров участка электроэнергетической системы

Решение задач, Электрические системы, электроника, электротехника

Срок сдачи к 8 янв.

4 минуты назад
4 минуты назад

Сделать курсач по методике

Курсовая, Электротехника

Срок сдачи к 26 дек.

5 минут назад

Психология безопасности труда

Реферат, Русский язык и культура речи

Срок сдачи к 29 дек.

7 минут назад

Сделать реферат и презентацию

Презентация, Биомеханика

Срок сдачи к 25 дек.

7 минут назад

написать курсовую работу по уголовному праву

Курсовая, Уголовное право

Срок сдачи к 25 дек.

7 минут назад

Начертить 12 чертежей

Чертеж, Начертательная геометрия

Срок сдачи к 9 янв.

8 минут назад

Феномен успеха и успешность в профессиональном развитии

Реферат, Психология

Срок сдачи к 28 дек.

9 минут назад

В файле прикреплен пример выполнения задания

Контрольная, Криминология

Срок сдачи к 27 дек.

9 минут назад

9-11 страниц. правовые основы военной реформы в ссср в 20-е гг

Реферат, История государства и права России

Срок сдачи к 26 дек.

10 минут назад

Выполнить реферат. История Англии. Е-01554

Реферат, Английский язык

Срок сдачи к 26 дек.

10 минут назад

Составить Проект массового взрыва

Контрольная, Взрывное дело, горное дело

Срок сдачи к 8 янв.

12 минут назад

Термодинамика

Решение задач, Термодинамика

Срок сдачи к 26 дек.

12 минут назад

Нужен реферат, объем 15-20 страниц

Реферат, Безопасность в техносфере

Срок сдачи к 5 янв.

12 минут назад

Выполнить реферат. История Англии. Е-01554

Реферат, История

Срок сдачи к 26 дек.

12 минут назад
planes planes
Закажи индивидуальную работу за 1 минуту!

Размещенные на сайт контрольные, курсовые и иные категории работ (далее — Работы) и их содержимое предназначены исключительно для ознакомления, без целей коммерческого использования. Все права в отношении Работ и их содержимого принадлежат их законным правообладателям. Любое их использование возможно лишь с согласия законных правообладателей. Администрация сайта не несет ответственности за возможный вред и/или убытки, возникшие в связи с использованием Работ и их содержимого.

«Всё сдал!» — безопасный онлайн-сервис с проверенными экспертами

Используя «Свежую базу РГСР», вы принимаете пользовательское соглашение
и политику обработки персональных данных
Сайт работает по московскому времени:

Вход
Регистрация или
Не нашли, что искали?

Заполните форму и узнайте цену на индивидуальную работу!

Файлы (при наличии)

    это быстро и бесплатно