RSS    

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

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

Задание

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

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

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




Листинг программы

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;

Страницы: 1, 2


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.