Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Перевод из двоичной системы в восьмеричную


Рекомендуемые сообщения

Здравствуйте, не могу составить программу для перевода из двоичной системы в восьмеричную.Помогите чем можите, плиззз или ссылочку дайте. А вот что я накуролесил:

Program systemcoder;

Uses crt;

Var

a:string;

i:byte;

begin

ClrScr;

write('Введите число: ');

readln(a);

writeln;

for i:=1 to length(a) do

begin

if a='001' then write('1');

if a='010' then write('2');

if a='011' then write('3');

if a='100' then write('4');

if a='101' then write('5');

if a='110' then write('6');

if a='111' then write('7');

if a='1000' then write('8');

if a='1001' then write('9');

end;

writeln(a);

readkey; end.

Ссылка на комментарий
Поделиться на другие сайты

Держи:

Program Perevod;Vari,j,b:byte;c:word;sc:array [1..16] of byte;vs:array [1..16] of char; Begin For i:=1 to 16 do sc[i]:=0; i:=0; Repeat inc(i); sc[i]:=c mod b; c:=c div b Until c<1; For j:=1 to 16 do Case sc[j] of 0..9:vs[j]:=chr(sc[j]+48); 10..15:vs[j]:=chr(sc[j]+87) End; For j:=i downto 1 do write(vs[j]); Writeln; End.

Это фрагмент моей курсовой. Переводит из 10 в 2,8,16 системы счисления.

Ссылка на комментарий
Поделиться на другие сайты

Огромное спасибо за подсказку.Итак,вот что у меня получилось:

Прога переводит из 10в2в8:

Program Siste;

Uses Crt;

var

i:byte;

c,bin_d:string;

n1,n2:longint;

n:integer;

BcO:string; { В целое восьмеричное }

bin:string; { для перевода из 2 в 8}

begin

clrscr;

write ('Введите число n=');

readln(n1);

n2:=n1;

bin_d:='';

while n1>0 do

begin

str(n1 mod 2,c);

bin_d:=c+bin_d;

n1:=n1 div 2;

end;

BcO:='';

bin_d:='00'+bin_d;

writeln('Двоичная система ',bin_d);

for i:=1 to round(length(bin_d)/3) do

begin

bin:=copy(bin_d,1,3);

if bin='000' then BcO:=BcO+'0';

if bin='001' then BcO:=BcO+'1';

if bin='010' then BcO:=BcO+'2';

if bin='011' then BcO:=BcO+'3';

if bin='100' then BcO:=BcO+'4';

if bin='101' then BcO:=BcO+'5';

if bin='110' then BcO:=BcO+'6';

if bin='111' then BcO:=BcO+'7';

delete(bin_d,1,3);

end;

writeln('Восьмиричная система ',BcO);

readkey;

end.

Но прога не правильно переводит из 2-ой в восьмеричную,че не так??? И мне еще + к этому,сказали чтоб она могла работать с дробными числами, а тут я совсем спекся

Ссылка на комментарий
Поделиться на другие сайты

Vit16:

Что-то у тебя очень запутанное...

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

var

I:Integer; C:Char; Si,So:String; St:String[3];

const

S:array['0'..'7'] of String[3]=('000','001','010','011','100','101','110','111');

begin

ReadLn(Si);

while Length(Si) mod 3 <> 0 do Si:='0'+Si; { доп. строку влево до длины, кратной 3 }

So:='';

for I:=1 to Length(Si) div 3 do

begin

St:=Copy(Si,3*I-2,3); { 3*I-2 дает числа 1,4,7... - нач. позиции троек дв. цифр }

for C:='0' to '7' do if St=S[C] then So:=So+C

end;

Writeln(So);

end.

Для чисел с дробной частью можно сначала разделить строку на две части Si1 и Si2 - до запятой и после, преобразовать каждую (только для дробной части строка должна дополняться до кратного трем количества позиций вправо, а не влево, т.е. вместо while Length(Si1) mod 3 <> 0 do Si1:='0'+Si1; будет while Length(Si2) mod 3 <> 0 do Si2:=Si2+'0'; )

и собрать части и запятую вместе. Надеюсь, справишься.

P.S. Подправил комментарий - в нем было написано 3+I-2, а должно было быть и есть сейчас 3*I-2, как и было в программе.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

" Для чисел с дробной частью можно сначала разделить строку на две части Si1 и Si2 - до запятой и после, преобразовать каждую " так можно сделать а потом лутче всего делить до тех пор пока не появится зависимость. Если последовательность чисел начала повторятся то перевод правельный

Ссылка на комментарий
Поделиться на другие сайты

  • 15 лет спустя...

Я просто в шоке, почему тут всё так сложно   :)
Достаточно первое число сделать первым элементом массива, а остатки от деления записывать в следующие элементы. И так до тех пор, пока остаток не станет меньше основания системы счисления. И это верно не только для двоичных, а для всех позиционных систем счисления. Если есть дробная часть, то её переводить отдельно.
Алгоритм:
1)Делим нужное число на основание
2) Делим остаток 1 на основание..
3)Делим остаток 2 на основание..
....
N)Остаток N< основания - записываем число снизу вверх
Вот пример реализации на JS: https://tvoyapecarnya.ru/informaics/sistemy-ischisleniya/pozitsionnyesistemyschisleniya/dvoichnaya-sistema-ischisleniya/kak-perevodit-v-dvoichnuyu-sistemu
Чтобы перевести из любой сс в десятичную надо воспользоваться степенным рядом, либо таблицей тетрад и триад для 8 и 16й сс.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...