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

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

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

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


Новичок
*

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

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


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


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

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

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


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


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


Новичок
*

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

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


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


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

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

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


Все просто :

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

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

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


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Morfey85
сообщение 15.01.2006 14:56
Сообщение #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 
 К началу страницы 
+ Ответить 
Pola
сообщение 15.01.2006 15:03
Сообщение #6


Новичок
*

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

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


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

Все просто :

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

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


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





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

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


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

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

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


no1.gif

В самом низу


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Pola
сообщение 15.01.2006 15:21
Сообщение #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 - 15.01.2006 15:41
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Pola
сообщение 20.01.2006 14:06
Сообщение #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

 



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