IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Деление двух длинных чисел, как реализовать с помощью объектов в Delphi?
сообщение
Сообщение #21


Гость






Это - не метод объекта, просто процедура, описанная в Interface - части модуля (чтобы иметь к ней доступ извне), так же, как и та, что присутствует в HugeObj ...

{ A := n! }
procedure Fact(Var A: TObj; n: LongInt);
var T: TObj; i: LongInt;
begin
T.Init;

{
Вот это, конечно не очень красиво, надо бы как-то сделать
инициализацию TObj обычным числом... Но работает...
}
T.X^[1] := 1;
T.X^[0] := 1;

for i := 2 to n do begin
A.MulLongShort(T, i);
T.X^ := A.X^;
end;
end;



Цитата
В HugeObj для того, чтобы можно было выводить результат в memo (ввиде текста) Алена дала мне функцию Function HugeToStr: String. В dlinna наверно тоже что-то такое нужно добавить?
А можно, я за нее? rolleyes.gif

Опять же, аналогично тому, что делается в WriteLong, только вывод - не в файл, а в строку...
{ А вот это - уже метод объекта, не забывай его описание добавить в Type TObj }
Function TObj.HugeToStr: String;
var ls,s:string;
i:integer;
begin
result := '';
str(_osn div 10, ls);
result := result + IntToStr(X^[X^[0]]);
for i:=X^[0]-1 downto 1 do
begin
str(X^[i],s);
while length(s)<length(ls) do s:='0'+s;
result := result + s;
end;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Спасибо!!!
Цитата
А можно, я за нее?

Конечно smile.gif

Я правильно дабовила?
type
Tlong=array[0 .. _maxdig]of integer;
Plong=^Tlong;

TObj = object
Constructor Init;
Destructor Done;

Function HugeToStr: String; // вот тут?

procedure ReadLong(var f:text);
procedure WriteLong(var f:text);

...

private
X: PLong;
end;

procedure Fact(Var A: TObj; n: LongInt); // и вот тут?


Все компилируется, но при работе выдает ошибку "Нарушение прав доступа в адресе 00402fc8 в модуле 'uchebnik.exe'. Напишите из адреса 00000000'." и выделяет эту строку (модуль HugeObj я удалила из проекта):
procedure TForm12.Button2Click(Sender: TObject);
var n: longint;
per: TObj;
begin
if edit4.text='' then
begin
MessageBeep(MB_ICONHAND);
ShowMessage('Не заданы значения!');
end
else
begin
memo1.Text:='';
n:=StrToInt(edit4.Text);
if n>524 then ShowMessage('Невозможно вычислить для данного числа! Приносим свои извинения.')
else
begin
Fact(per, n);
memo1.Text:=per.HugeToStr; //эту
end;
end;
end;


Я опять сделала что-то неправильно?

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Гость






Цитата
Я опять сделала что-то неправильно?
yes2.gif Забыла инициализировать переменную Per...

Добавлено через 1 мин.
begin
per.Init;
Fact(per, n);

memo1.Text := per.HugeToStr;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Цитата
Забыла инициализировать переменную Per...

wink.gif unsure.gif

Сделала процедуру с делением. Воть:
procedure TForm12.Button3Click(Sender: TObject);
var m,n: longint;
f1,f2,ost,raz: TObj;
begin
if (edit5.text='') or (edit6.text='') then
begin
MessageBeep(MB_ICONHAND);
ShowMessage('Не заданы значения!');
end
else
begin
memo2.Text:='';
m:=StrToInt(edit5.Text);
n:=StrToInt(edit6.Text);
f1.Init; f2.Init; ost.Init; raz.Init;
fact(f1, m);
fact(f2, m-n);
raz.DivLongTwo(f1,f2,ost);
memo2.text:=raz.HugeToStr;
end;
end;


Только если просто считать факториалы от 0 или 1 опять будет "access violation at address 0046ECE in module ... Read of address 02C0FFFC" и выделится эта строка в модуле dlinna

Function TObj.HugeToStr: String;
var ls,s:string;
i:integer;
begin
result := '';
str(_osn div 10, ls);
result := result + IntToStr(X^[X^[0]]);
for i:=X^[0]-1 downto 1 do
begin
str(X^[i],s); //эта
while length(s)<length(ls) do s:='0'+s;
result := result + s;
end;
end;

а если делить их друг на дружку будет считать неправильно(((

Мне надо прописать эти варианты (if n=0 then ...) или можно сделать по-другому?





 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Гость






Добавить строку в Fact:
{ A := n! }
procedure Fact(Var A: TObj; n: LongInt);
var T: TObj; i: LongInt;
begin
T.Init;
T.X^[1] := 1;
T.X^[0] := 1;

for i := 2 to n do begin
A.MulLongShort(T, i);
T.X^ := A.X^;
end;
A.X^ := T.X^; // <-- Вот эту !!!

end;

(просто когда цикл не выполняется ни разу, переменная A остается, в смысле - оставалась, неизменной, а это плохо)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


volvo, спасибо тебе огромное!!! give_rose.gif wub.gif give_rose.gif


Я наконец-то доделала свою программу! Ура yahoo!.gif


p.s. специфика русского человека - делать все в последний момент (завтра мне сдавать эту работу))))

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 17:02
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name