Системы исчесления

Аватар пользователя
Diesel2
Сообщений: 4
Зарегистрирован: 10 дек 2009, 21:00

Системы исчесления

Сообщение Diesel2 » 12 дек 2009, 21:28

Есть задачка: Написать алгоритм перевода кода из двоичной системы исчисления в шестнадцатиричную и в восьмиричную, у меня получилось чтото такое, но есть ошибки, если есть мысли, посмотрите плз (при запуске паскаль выдает что квадратные скобки это синтаксическая ошибка м.б. у меня просто не та версия, в синтаксис которой они не входят?)

Код: Выбрать все

Const
 h_b: array[0..15,1..2] of string[4] =
 (('0','0000'),('1','0001'),('2','0010'),('3','0011'),
 ('4','0100'),('5','0101'),('6','0110'),('7','0111'),
 ('8','1000'),('9','1001'),('a','1010'),('b','1011'),
 ('c','1100'),('d','1101'),('e','1110'),('f','1111'));
type
 str8=string[8]; {16}
 str10=string[11]; {10}
 str32=string[32]; { 2}

procedure HexToBin(s: str8; var dv: str32);

Var x:byte;

begin
dv:='';
for x:=1 to 8 do

 if Ord('9')>=Ord(s[x])
 then dv:=dv + HexToBin[Ord(s[x])-Ord('0'),2
 else dv:=dv + HexToBin[Ord(s[x])-Ord('a')+10,2]; \\ Это ему не нравится
end;

procedure BinToHex(dv: str32; s: str8);

Var x,y,z:byte;

Begin
 s:='';
 for x:=32 downto 1 do
 begin
 if x mod 4 = 0 then begin y:=1; z:=0 end;
 if dv[x] = '1' then z:=z+y;
 y:=y*2;
 if x mod 4 = 1 then s:=HexToBin[z,1]+s;
end;
x:=1;
while (s[x]='0') and (x<8) do x:=x+1;
x:=x-1;
if x>0 then Delete(s,1,x);
end;

begin
 HexToBin(dv1,s1);
 writeln('16 pr = -', s1);
 HexToBin(s1, s10); if s10='' then s10:='2147483648';
 s10:='-'+s10;
 writeln('10 pr = ', s10); {otvet}
 readln;
End


Так надеюсь лучше)
Последний раз редактировалось Diesel2 29 ноя 2019, 21:18, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Системы исчесления

Сообщение qwertylol » 12 дек 2009, 21:38

Bo-первых тут что-то дофига понаписано, ведь задачка на вложенный цикл. A во-вторых посмотрите здесь как надо код оформлять, в этой помойке никто не будет копаться.
Последний раз редактировалось qwertylol 29 ноя 2019, 21:18, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Developer
Сообщений: 6978
Зарегистрирован: 05 сен 2006, 21:00

Системы исчесления

Сообщение Developer » 13 дек 2009, 09:06

Сравните:
1) скобки и парность скобок
- procedure HexToBin(s: str8; var dv: str32);
- HexToBin[Ord(s[x])-Ord('0'),2
2) типы аргументов в описании процедуры и типы при обращении к ней.
3) Это s:=HexToBin[z,1] программная отсебятина, так как HexToBin() - это процедура, квадратными скобками обозначается индекс в массиве, a переменной может присваиваться лишь возвращаемое значение при вызове функции.
Куча ошибок.
Наконец, как и в повествовательном предложении в конце программы на паскале следует ставить точку.
Последний раз редактировалось Developer 29 ноя 2019, 21:18, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
grigoriy
Сообщений: 11916
Зарегистрирован: 18 ноя 2009, 21:00

Системы исчесления

Сообщение grigoriy » 13 дек 2009, 13:19

B свое время, когда имел дело c Turbo Pascal, писал функции для первода 10->16.
Вытащил, стряхнул пыль, выкладываю.
Может Вам что-то отсюда покажется полезным.

Для байтового типа

function f10_16(num:byte):string;
const m:array[0..15] of char=('0','1','2','3','4','5','6','7', '8','9','A','B','C','D','E','F');
begin
if num=0
then f10_16:=' 0'
else f10_16:=m[(num and 240) div 16]+m[num and 15]
end;

Для двухбайтового типа

function f10_16(num:integer):string;
const m:array[0..15] of char=('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
var n1,n2,n3:byte;
s:string[3];
begin
s:=' ';
n1:=num div 256;
n2:=(num-256*n1) div 16;
n3:=num-256*n1-16*n2;
s[1]:=m[n1];
s[2]:=m[n2];
s[3]:=m[n3];
f10_16:=s
end;

Для типа integer<0 не проверял, меня интересовали положительные значения,так что отнеситесь критически к этому случаю.Можно преобразовывать модуль числа, a потом, если нужно s:='-'+s.
Последний раз редактировалось grigoriy 29 ноя 2019, 21:18, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Системы исчесления

Сообщение qwertylol » 13 дек 2009, 13:53

Тут из двоичной в восьмеричную и шестнадцатеричную, a $$8=2^3,\;16=2^4$$, поэтому задача ещё проще.
Последний раз редактировалось qwertylol 29 ноя 2019, 21:18, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 1 гость