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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Умножение длинных целых чисел в дополнительном коде, Ошибка
Федосеев Павел
сообщение 24.04.2012 18:46
Сообщение #21


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

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


olven, я немного поторопился, гворя о невозможности демонстрации умножения в столбик.
Вот изменения. Т.к. умножение производится байтами - оно получается как бы в 256-ричной системе.


Прикрепленные файлы
Прикрепленный файл  LongBin.pas ( 6.14 килобайт ) Кол-во скачиваний: 127
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
olven
сообщение 29.04.2012 18:28
Сообщение #22


Новичок
*

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

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


выводить нужно не совсем это.... нужно вообще показать как осущетвляется умножение в дополнительном коде пошагово.... сложение сдвиг... и так до конца
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 29.04.2012 20:07
Сообщение #23


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

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


Прикольно - ваш препод знает толк в извращениях.
К чему это я...
Например. у нас 4-х байтовое число. прои умножении указанным образом имеем 32 слагаемых (для отображения на экран), плюс обрамление... В общем на экране в 25 строк не поместится. Следующее задание - вывод результата в файл или пауза для ожидания нажатия на клавишу?

{сдвиг влево на один разряд}
PROCEDURE LongBin_SHL(VAR a : TArrayBin);
VAR
i,
CarryPrev,
CarryCurr : Integer;
BEGIN
CarryPrev:=0;{предыдущий байт при сдвиге не дал перенос}
CarryCurr:=0;{текущий байт при сдвиге не дал перенос}
for i:=1 to CLongLen do begin
CarryCurr:=(a[i] AND $80); {бит, который будет переноситься в следующий байт}
{$ifopt R+} {временно отключим контроль переполнения}
{$R-}
{$define ReqSet_OptR}
{$endif}
a[i]:=a[i] SHL 1;
{$ifdef ReqSet_OptR}
{$R+}
{$undef ReqSet_OptR}
{$endif}
if CarryPrev<>0 then a[i]:=(a[i] OR 1);
CarryPrev:=CarryCurr;
end;
END;
{Умножение по принципу сложение-сдвиг}
PROCEDURE LongBin_NewMul( a,
b : TArrayBin;
VAR Res : TArrayBin;
Log : BOOLEAN);
VAR
i, j : Integer;
Mask : Byte;
Zero : TArrayBin; {равно нулю - для вывода на экран}
BEGIN
if Log
then begin
LongBin_WriteB(a);
WriteLn;
WriteLn('x');
LongBin_WriteB(b);
WriteLn;
WriteLn('-------------------------------------');
end;

FillChar(Res, Sizeof(Res), 0);
Zero:=Res;
for i:=1 to CLongLen do begin {цикл по всем байтам числа b}
Mask:=1;
for j:=1 to 8 do begin {цикл по всем битам числа b}
if Log
then begin
if (Mask AND b[i])<>0 then
LongBin_WriteB(a)
else
LongBin_WriteB(Zero);
WriteLn;
end;
if (Mask AND b[i])<>0 then
LongBin_Add(Res, a, Res);
LongBin_SHL(a);
{$ifopt R+} {временно отключим контроль переполнения}
{$R-}
{$define ReqSet_OptR}
{$endif}
Mask:=Mask SHL 1;
{$ifdef ReqSet_OptR}
{$R+}
{$undef ReqSet_OptR}
{$endif}
end;
end;
if Log
then begin
WriteLn('-------------------------------------');
LongBin_WriteB(Res);
WriteLn;
end;
END;

Умножение я реализовал как википедии "http://en.wikipedia.org/wiki/Two's_complement" - с отсечением "лишних" разрядов.

Сообщение отредактировано: Федосеев Павел - 29.04.2012 20:37
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
olven
сообщение 29.04.2012 21:23
Сообщение #24


Новичок
*

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

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


она говорила лучше в файл записывать всё т.к. не умещается на экране как выи сказали. да скорее всего у меня просто руки кривые, препод не виноват. задача есть задача...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 29.04.2012 21:28
Сообщение #25


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

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


Нормальные руки.
Ну в файл-то легко отправить.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
olven
сообщение 29.04.2012 21:33
Сообщение #26


Новичок
*

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

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


да, отправлю думаю. только не поняла. какое количество раз оно показывает сложение и сдвиги.. у меня слишком много получилось что то
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 29.04.2012 21:37
Сообщение #27


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

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


Лог умножения, как видно из листинга примерно такой
111110001010
x
101010010101
-----------------
010101010101
010101010101
........всего 32 разряда, значит 32 слагаемых
-----------------
101010100101 - это результат

Итого 3+32+1+1=36 строк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
olven
сообщение 29.04.2012 21:42
Сообщение #28


Новичок
*

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

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


спасибо большое
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 29.04.2012 21:44
Сообщение #29


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

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


Знаешь, чтобы не переделывать всё, можно сделать перенаправление вывода с экрана в файл.

это в самом первом if Log
Assign(output, 'Log.txt');
rewrite(output);

а это в последних строках последнего if Log
Close(output)
Assign(output)
rewrite(output)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
olven
сообщение 29.04.2012 21:51
Сообщение #30


Новичок
*

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

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


так странно, он так не записывает. пустой файл

Добавлено через 3 мин.
я исправила, немного по другому, записывает=)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 29.04.2012 21:56
Сообщение #31


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

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


Сейчас проверил на TP7 и FPC2.4.2
Файл создаётся. Приаттачу свой вариант, но это не для преподавателя - я в нём просто тестировал процедурки.
----------------
Опоздал я с репликой!

Ну и хорошо, что работает!!!

Сообщение отредактировано: Федосеев Павел - 29.04.2012 21:57


Прикрепленные файлы
Прикрепленный файл  LongBin.pas ( 8.25 килобайт ) Кол-во скачиваний: 142
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
olven
сообщение 29.04.2012 22:08
Сообщение #32


Новичок
*

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

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


в файле запись сдигов всего лишь?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 29.04.2012 22:14
Сообщение #33


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

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


Да. Только лог умножения. Но если перенаправить вывод в теле основной программы. то можно получить и весь лог.

Вообще-то такое решение - костыль. Если по хорошему, то нужно было делать процедуры не вывода на экран и ввода с клавиатуры, а преобразования числа в строку и строки в число. А потом уже решать, что делать со строками - на экран или в файл.

Сообщение отредактировано: Федосеев Павел - 29.04.2012 22:16
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
olven
сообщение 29.04.2012 22:22
Сообщение #34


Новичок
*

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

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


понятно.. там вроде как и для длминных чисел не весь лог помещается
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 14.09.2025 13:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"