Консультация № 66350
10.12.2006, 14:34
0.00 руб.
0 2 1
Здравствуйте Эксперты.
Дана строка (перевод в Integer не вызывает проблем). Строка находится в Edit.text
Она представляет собой число в двоичной СС. Нужно перевести число в ВОСЬМЕРИЧНУЮ (8) СС, при этом нельзя использовать промежуточный перевод в десятичную(10) СС.
помогите плиз.

Обсуждение

давно
Мастер-Эксперт
425
4118
10.12.2006, 17:58
общий
это ответ
Здравствуйте, Sarymian!
Перевод в десятичную систему только усложнит задачу. :)
1. Разбиваете строку на триады, причем начинаете разбивку с конца.
2. Если в последней разбивке до триады не хватает одной или двух позиций, то дополняете нулями до триады.
3. Можно составить массив соответствия двоичного числа восьмеричному:
ar: array[0..7];
ar[1]:=‘000‘;
ar[1]:=‘001‘;
ar[2]:=‘010‘;
ar[3]:=‘011‘;
ar[4]:=‘100‘;
ar[5]:=‘101‘;
ar[6]:=‘110‘;
ar[7]:=‘111‘;
4. Посылаете каждую триаду в функцию, в которой в цикле проходит поиск в массиве:
Function BinToOct(s: string): string;
Var
i: integer;
Begin
For i:=0 To 7 do
If s=ar[i] Then
Begin
Result:=IntToStr(i);
Break;
End;
End;
5. В главной процедуре теперь только остается конкатенировать возвращаемое из функции и, если нужно, перевести в числовой формат.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
12.12.2006, 09:07
общий
А я бы сделал так:<pre>const ar: array[‘0‘..‘1‘, ‘0‘..‘1‘, ‘0‘..‘1‘] of char = (((‘0‘, ‘1‘), (‘2‘, ‘3‘)), ((‘4‘, ‘5‘), (‘6‘, ‘7‘)));var q,s: string; i,j: integer;begin s := Edit1.Text; if (length(s) mod 3) <> 0 then s := ‘0‘ + s; if (length(s) mod 3) <> 0 then s := ‘0‘ + s; for i := length(s) downto 1 do begin j := i*3; q := q + ar[s[j-2], s[j-1], s[j]]; end;end;</pre>Триады не передаются функции а прямо преобразовываются в нужные символы через массив.
Форма ответа