Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Как обойти 10 систему при переводе?

Автор: Atomyc 28.11.2007 17:29

Help, I need somebody,
Help, not just anybody,
Help, you know I need someone, help.

А точнее по русски: Помогите пожалуйста, задача такая,Нужно перевести дробные числа из двоичной системы в шеснадцатиричную.я Я кое как написал прогу,работает,всё считает правильно, а училка говорит что это мараз через 10 переводить,и надо было по другому делать,я у неё спрашиваю,ну объясните мне тогда как?!Она мне сказала что я должен это сам знать.

Подскажите алгоритм перевода минуя 10-ю систему,и помоги переделать прогу.

uses crt;
var
n, int_part, fraq_part: string;
s: longint;
q: real;
_result: real;
h, r, eps, i: integer;
x, p: real;
otv, rev: string;
begin
clrscr;
Writeln ('Vvedite chislo v 2-oi sisteme');
readln(n);
int_part := copy(n, 1, pos('.', n) - 1); {отделяем целую часть двоичного числа}
fraq_part := copy(n, pos('.', n) + 1, 255); {отделяем дробную часть числа}

_result := 0.0;

s := 1;
while int_part <> '' do begin
_result := _result + (ord(int_part[length(int_part)]) - ord('0')) * s;
delete(int_part, length(int_part), 1);
s := s * 2;
end;

writeln(_result:10:5);

q := 1 / 2;
while fraq_part <> '' do begin
_result := _result + (ord(fraq_part[1]) - ord('0')) * q;
delete(fraq_part, 1, 1);
q := q / 2;
end;

writeln('Promezhytochi rezyltat =',_result:10:5);
x:=_result;
h:= trunc(x); {находим целую часть}
p:= x-h; {находим дробную часть}
repeat
r:= h mod 16; {сохраняем остаток}
h:= h div 16; {оставляем только целую часть}
if r<10 then otv:= otv + chr (r+48) {код цифры в ascii таблице равен самой цифре +48}
else otv:= otv+chr (r+55); {шаг до буквы А от 10 = 55}
until h<=0;
for i:=1 to length(otv) do rev:= rev+otv[length(otv)-i+1]; {записываем остатки задом наперёд}
otv:= rev;
eps:=0; {точность дробной части}
otv:= otv+'.';
repeat
r:= trunc (p*16); {берём целую часть}
p:= p*16-r; {оставляем только дробную}
if r<10 then otv:= otv+chr (r+48)
else otv:= otv+chr (r+55);
inc (eps);
until (p=0) or (eps>10);
writeln ('Chislo v 16 sisteme = ',otv);
Readln;
end.


Автор: volvo 28.11.2007 17:48

Ну, уж с переводом 2 -> 16 не должно быть никаких проблем... Просто напросто дополняешь целую часть нулями слева, пока ее длина не станет кратна 4-м, с дробной частью - то же самое, но нули добавлять справа... И потом разбиваешь на тетрады и переводишь каждую тетраду в 16-ричную цифру...

Т.е., '0001' становится 1, '0101' - будет 5, и так далее... Просто объяви массив тетрад:

const
hex: array[1 .. 2, 0 .. $F] = (
('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'), { <--- 16-ричные цифры }
('0000', '0001', '0010', ... ) { <--- Соответствующие им тетрады }
);

и пробегай в цикле по hex[2, i] пока не найдешь совпадение... Тогда hex[1, i] и будет очередной 16-ричной цифрой...

Автор: Atomyc 28.11.2007 18:29

вроде звучит просто,попробую щас сделать,спс.