Завдання p>
Операції багаторазової точності (тобто операції з довгими числами). p>
Конкретизація завдання p>
Спочатку буквах присвоюється значення - наприклад: а = 23850934, причому всізмінні - цілі числа, які по довжині не повинні перевищувати 300 знаків.
Потім пишеться вираз, наприклад f = (a + b)/c + (d + a). При цьому розподіл - цеціле від ділення ділимо на дільник. Операції додавання, віднімання,множення - звичайні арифметичні операції, тільки це операції наддовгими числами. Крім додавання, віднімання, множення і ділення ще можутьбути використані дужки. p>
Формат вводу p>
Будь-яку рядок у полі введення можна представити у вигляді p>
S = (C, V) p>
Де S - константа або обчислюване значення. Якщо це - константа, то С --число в строковому вигляді, перед яким стоїть символ «@», а якщо S треба знайтито S = V, де V - вираз із змінними і числами. У рядку не повинно бутипрогалин і всі змінні складаються з одою літери. Між рядками в полевведення не повинно бути порожніх рядків. Висновок йде аналогічно вводу. Прикладвведення та виведення можна подивитися на малюнку p>
Інтерфейс програми. p>
Інтерфейс програми - її зовнішній вигляд є наочним і зручним. Уверхньому полі введення пишуться відомі величини і формули, потім тулитьсякнопка «Розрахувати» і в нижньому полі виводяться в алфавітному порядку всізмінні. Програма написана в середовищі програмування Delphi 6.
Використовувалися тільки стандартні компоненти - TEdit і TButton. Разом наформі розміщено поле введення, поле виводу і кнопка - для запуску процесурозрахунку. Використання візуальних засобів розробки на багато прискорилопроцес написання програми. p>
Структура зберігання p>
Всі довгі числа представляються у вигляді рядка, кожний елемент якої --цифра. Якщо число від'ємне, то першим символом рядка "-". Щобрахувати за формулою використовуємо структуру, описану нижче p>
type dd = record lin: array [1 .. 300] of string; dl: integer; end; p>
var mas: array [1 .. 300] of dd; p>
У масиві 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, то в даному елементі зберігається неформула, яку треба вирахувати, а значення. p>
Кількість рядків введених в поле введення повинно бути не більше 300 - цезадається розмірністю масиву mas. p>
Використовувані процедури та функції p>
zapolnenie; - заповнення масиву mas з поля edt1.sum (a, b: string): string; - сума чисел, що зберігаються в a і b.minus (a, b: string): string; - різниця чисел, що зберігаються в a і b. minus = a-bumn (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.
Повертається результат: p>
. якщо а> b, то sravnenie = 1 p>
. якщо А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; p>
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; p>
function umn (a: integer; var xx: string): string;var i, ost, tmp, dl: integer; str: string;beginost: = 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; p>
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; p>
function sravnenie (a, b: string): shortint;
(Якщо а> b, то порівняння = 1 якщо а p>