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

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

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

 
 Ответить  Открыть новую тему 
> Системы счислений, Hex(доп. код) to Dec(прямой код)
сообщение
Сообщение #1


Новичок
*

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

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


Исходная информация: целое число , записанное в виде строки шестнадцатиричных цифр в дополнительном коде.
Задание: записать это число в прямом коде в виде строки десятичных цифр.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

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

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


Загляни сюда : FAQ : Системы счислений


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


Ну в системой счислений у меня проблем то как раз нет!
А вот как из дополнительного в прямой перевести?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

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

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


Все просто :

Дополнительный код получается из обратного путем арифметического прибавления единицы в конец.

Обратный код получается из прмого путем инверсии двоичных разрядов (1 -> 0, 0 -> 1)

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

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

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


Долго пыжился но написал
Код

uses crt;
var
  znak,ch:Char;
  s:string;
  x:longint;

Procedure Info;
begin
  Writeln('Перевести целое число из шестнадцатиричной системы счислений');
  Writeln('в дополнительном коде, в прямой код в виде строки десятичных');
  Writeln('цифр со знаком.');
end;

Function BinToInt(bin_s:string):longint;
var
  bin,mult:longint;
  i:integer;
begin
  mult:=1; bin:=0;
  for i:=length(bin_s) downto 1 do
  begin
    if bin_s[i]='1' then bin:=bin+mult;
    mult:=mult shl 1;
  end;
  BinToInt:=bin
end;

Function HexToBin(s:string):string;
var
  i:byte;
  s1,a:string;
begin
  s1:='';
  for i:=length(s) downto 1 do
  begin
    case Upcase(s[i]) of
      '0': a:='0000';
      '1': a:='0001';
      '2': a:='0010';
      '3': a:='0011';
      '4': a:='0100';
      '5': a:='0101';
      '6': a:='0110';
      '7': a:='0111';
      '8': a:='1000';
      '9': a:='1001';
      'A': a:='1010';
      'B': a:='1011';
      'C': a:='1100';
      'D': a:='1101';
      'E': a:='1110';
      'F': a:='1111';
    else Writeln('Vvedeno nevernoe chislo!!!');
    end;
    s1:=a+s1;
  end;
  HexToBin:=s1;
end;

Function DopToObr(s:string):string;
var
i,j:integer;
sa:string;
begin
  if s[1]='0' then znak:='+' else znak:='-';
  sa:='';
  for i:=length(s) downto 2 do
  begin
    sa:=s[i]+sa;
  end;               Writeln('Bin = ',znak,sa);
  for j:=length(sa) downto 1 do
  if sa[j]='0' then sa[j]:='1' else
  begin
    sa[j]:='0';
    Break;
  end;
  Writeln('Obr = ',znak,sa);
  DopToObr:=sa;
end;

Function ObrToPr(s:string):string;
var
  i:integer;
begin
  For i:=length(s) downto 1 do If s[i]='0' then s[i]:='1' else s[i]:='0';
  Writeln('Pr  = ',znak,s);
  ObrToPr:=s;
end;


begin
  repeat
    clrscr;
    Info;
    Write('Hex = ');Readln(s);
    s:=HexToBin(s);
    Writeln('Dop = ',s);
    s:=DopToObr(s);
    s:=ObrToPr(s);
    x:=BinToInt(s);
    Writeln('Dec = ',znak,x);
    write('Press q for exit or any key for continue...');
    ch:=ReadKey
  until upcase(ch)='Q';
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

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

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


Цитата(klem4 @ 15.01.2006 13:27) *

Все просто :

Дополнительный код получается из обратного путем арифметического прибавления единицы в конец.

Обратный код получается из прмого путем инверсии двоичных разрядов (1 -> 0, 0 -> 1)


немного не так
Обратный код получается из прямого путем инверсии двоичных разрядов абсолютной величины(1 -> 0, 0 -> 1)





У положительных чисел дополнительный код совпадает с прямым!

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


Perl. Just code it!
******

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

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


no1.gif

В самом низу


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

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

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


Я такое уже решила smile.gif вот ссылку на другие ресурсы - в мусор... это против правил... Зохотела-бы выложила бы свой код сюда.
это ты спрашивал или вы сговорились? smile.gif

буду рада если найдете ошибки

Цитата(klem4 @ 15.01.2006 15:09) *


значи там в конце надо исправить

-1
00000001 - это 1
11111110 - это инверсия
11111111 - это +1 к инверсии

-127
01111111 это 127
10000000 это его инверсия
10000001 затем +1

Цитата
вот ссылку на другие ресурсы - в мусор... это против правил... Зохотела-бы выложила бы свой код сюда.


пусть тогда сам делает smile.gif

Тоесть выложить свой шедевр (с) не соизволишь ?

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


Новичок
*

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

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


свой не буду уж...
его исправленный

были ошибки: {error 1}{error 2}{error 3}
1) У положительных чисел дополнительный код совпадает с прямым - у него не совпадает! (исправлено)
2) 80 = -128 из-за потери разряда получался -0 (исправлено)
аналогично 8000, ...
3) поскольку x:longint - 4 байта
то с числами длиннее не работает (так и осталось)
но возникает еще одна ошибка при выводе самого большого по абс.величине отрицательного
80000000 x<=0 и поэтому выводится "-" два раза (исправлено)

Код

uses crt;
var
  znak,ch:Char;
  s:string;
  x:longint;

Procedure Info;
begin
  Writeln('Перевести целое число из шестнадцатиричной системы счислений');
  Writeln('в дополнительном коде, в прямой код в виде строки десятичных');
  Writeln('цифр со знаком.');
end;

Function BinToInt(bin_s:string):longint;
var
  bin,mult:longint;
  i:integer;
begin
  mult:=1; bin:=0;
  for i:=length(bin_s) downto 1 do
  begin
    if bin_s[i]='1' then bin:=bin+mult;
    mult:=mult shl 1;
  end;
  BinToInt:=bin
end;

Function HexToBin(s:string):string;
var
  i:byte;
  s1,a:string;
begin
  s1:='';
  for i:=length(s) downto 1 do
  begin
    case Upcase(s[i]) of
      '0': a:='0000';
      '1': a:='0001';
      '2': a:='0010';
      '3': a:='0011';
      '4': a:='0100';
      '5': a:='0101';
      '6': a:='0110';
      '7': a:='0111';
      '8': a:='1000';
      '9': a:='1001';
      'A': a:='1010';
      'B': a:='1011';
      'C': a:='1100';
      'D': a:='1101';
      'E': a:='1110';
      'F': a:='1111';
    else Writeln('Vvedeno nevernoe chislo!!!');
    end;
    s1:=a+s1;
  end;
  HexToBin:=s1;
end;

Function DopToObr(s:string):string;
var
i,j:integer;
sa:string;
f:boolean;
begin
  if s[1]='0' then znak:='+' else znak:='-';
  sa:='';
  for i:=length(s) downto 1 do   {error 2}
  begin
    sa:=s[i]+sa;
  end;
  if znak='-' then {error 1}
  begin               {error 1}
    Writeln('Bin = ',znak,sa);

  j:=length(sa); f:=true;
  while (j>0) and f do
  begin
  if sa[j]='0' then sa[j]:='1' else
  begin
    sa[j]:='0';
    f:=false;
  end;
  dec(j);
  end;

  Writeln('Obr = ',znak,sa);
  end;  {error 1}
  DopToObr:=sa;
end;

Function ObrToPr(s:string):string;
var
  i:integer;
begin
  if znak='-' then {error 1}
    For i:=length(s) downto 1 do If s[i]='0' then s[i]:='1' else s[i]:='0';
  Writeln('Pr  = ',znak,s);
  ObrToPr:=s;
end;


begin
  repeat
    clrscr;
    Info;
    Write('Hex = ');Readln(s);
    s:=HexToBin(s);
    Writeln('Dop = ',s);
    s:=DopToObr(s);
    s:=ObrToPr(s);
    x:=BinToInt(s);
    Write('Dec = '); if x<0 then writeln(x) else writeln(znak,x); {error 3}
    write('Press q for exit or any key for continue...');
    ch:=ReadKey
  until upcase(ch)='Q';
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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