Помощь - Поиск - Пользователи - Календарь
Полная версия: Двоично-десятичная форма
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Вероника
Помогите пожалуйста!
Я даже толком не поняла задание но оно звучит так:
Исходная информация: натуральное число записано в виде строки десятичных цифр(можно предполагать, что оно размещается в формате longint).
Задание: перевести это число в двоично-десятичную форму и вывести в виде строки(каждый соответствует двум десятичным цифрам).
Подскажите пожалуйста я буду вам очень благодарна! Заранее спасибо! huh.gif
virt
двоично десятичная форма это когда в байт записывают две десятичные цифры ::
биты 0..3 -- одна цифра
биты 4..7 -- вторая
klem4
Вероника, такие задачи уже решались, пользуйтесь поиском, + загляните в FAQ Системы счисления : http://forum.pascal.net.ru/index.php?showtopic=4535
Вероника
Это очень хорошо что вы мне объяснили что такое двоично-десятичная с\с но вы бы не могли сказать что - нибудь по моей задаче! Volvo мне всегда отвечал на мой вопрос конкретным ответом! Подскажите мне пожалуйста я не понимаю этот паскаль!
volvo
Вероника, не совсем понятно, что именно тебе нужно получить... Как вариант могу привести функцию, получающую число (LongInt), и возвращающую визуальное представление BCD-числа, т.е. то, как выглядят сами биты этого двоично-десятичного числа:

function get_bcd_visual(n: longint): string;
const
quart: array['0' .. '9'] of string[4] =
('0000', '0001', '0010', '0011', '0100',
'0101', '0110', '0111', '1000', '1001');
delim: array[boolean] of string = ('', ' ');
var
s: string;
b: boolean;
begin
s := ''; b := true;
while n > 0 do begin
s := quart[chr(48 + (n mod 10))] + delim[b] + s;
n := n div 10; b := not b;
end;
if not b then s := quart['0'] + s;
get_bcd_visual := s;
end;

begin
writeln( get_bcd_visual(12345) );
end.

Если нужно получить само BCD-число, то непонятно, как будет определяться правильность работы программы, т.к. упакованное число 23, например, будет выглядеть как символ с кодом 35, т.е. "#"
Вероника
Спасибо котик буду надеяться что это именно то что мне нужно! Спасибо ты меня так выручаешь! Завтро сдам задачу и обязательно скажу так это или нет!
Вероника
Помогите решить задачу всё на ту же тему но усложнённую!
Исход. информация: Строка символов.
Задача: проверить может ли эта строка быть проинтерпретирована как натуральное число, записанное в двоично-десятичной форме и если может, вывести это число(можно предполагать что оно размещается в формате longint)
Заранее благодарю!!!
volvo
Еще раз повторяю вопрос: КАК именно задана строка? Приведи пример исходной строки, когда ответ на вопрос будет положительный, и когда - отрицательный?
Вероника
sad.gif sad.gif sad.gif я не знаю примера это задание дано на листочке без объяснения! sad.gif
Может у тебя как и в прошлый раз есть какие-то предположения unsure.gif
Вероника
Так что Котик без примера не как???
Вероника
Привет ещё раз котик помнишь ту задачу которую ты мне помог сделать я её сдала и хотела тебя за неё поблагодарить и прошу тебя помоч мне её дорешать!!!
Вобщем надо то число которое получилось в двоично-десятичной с\с перевести в 16-ричную записать код ASCII который соответствует этому числу и записать символ который соответствует этому коду!!!
Пример 1234=0001010 00110100 т.е 12=0001010=...(в 16 ричной)=это число соответствует коду ASCII а этот код=какой-то символ. Тоже самое с 34.
Вобщем в конце должно получиться 2 символа.
Прости что так загрузила но вроде всё объяснила как смогла.
volvo
{ Это - та функция, которую я делал раньше }
function get_bcd_visual(n: longint): string;
const
quart: array['0' .. '9'] of string[4] =
('0000', '0001', '0010', '0011', '0100',
'0101', '0110', '0111', '1000', '1001');
delim: array[boolean] of string = ('', ' ');
var
s: string;
b: boolean;
begin
s := ''; b := true;
while n > 0 do begin
s := quart[chr(48 + (n mod 10))] + {delim[b] +} s;
n := n div 10; b := not b;
end;
if not b then s := quart['0'] + s;
get_bcd_visual := s;
end;

{ А вот это - то, что ты просила в предыдущем посте: }
function get_bcd(s: string): string;
const
h_b: array[0 .. $F] of string[4] =
('0000', '0001', '0010', '0011',
'0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011',
'1100', '1101', '1110', '1111');
var
T, st: string;
i, count, code: byte;
begin
st := '';
while (length(s) mod 8) <> 0 do s := '0' + s;
repeat
code := 0;
for count := 1 to 2 do begin
T := copy(s, 1, 4); delete(s, 1, 4);
for i := 0 to $F do
if h_b[i] = T then inc(code, i * (16 + (1 - Count)*15));
end;
st := st + chr(code);
until s = '';
get_bcd := st;
end;

begin
writeln( get_bcd(get_bcd_visual(1234)) );
end.

Но опять же, учти, что в результате преобразования, например числа "1234" по тому алгоритму, что ты привела, получатся непечатаемые символы, и ты просто можешь чего-то не увидеть на экране, хотя сам результат преобразования будет правильным...
Вероника
Котя я тебя обажаю ты лучший Спасибо тебе большое!!!
Вероника
Вот вопросик ещё в 1- ой программе было delim[b] а во второй {delim[b]}-как коментарий! Как же правильно???
volvo
Если ты используешь ТОЛЬКО первую подпрограмму(get_visual_bcd), то раскомментируй delim[b] (она предназначена для более красивого представления результата, конкретнее - для вставки пробела после каждого восьмого символа строки).

Если же ты попытаешься использовать delim[b] и передать результат в функцию get_bcd (как и было сделано в посте №12), то получишь неизвестно что, т.к. строка будет содержать пробелы, которых там по алгоритму быть не должно... Поэтому при использовании get_bcd я и закомментировал этот кусок...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.