Jump to content
СофтФорум - всё о компьютерах и не только

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


Vit16
 Share

Recommended Posts

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

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.

Link to comment
Share on other sites

Держи:

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 системы счисления.

Link to comment
Share on other sites

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

Прога переводит из 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-ой в восьмеричную,че не так??? И мне еще + к этому,сказали чтоб она могла работать с дробными числами, а тут я совсем спекся

Link to comment
Share on other sites

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, как и было в программе.

Edited by Тролль
Link to comment
Share on other sites

  • 2 weeks later...

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

Link to comment
Share on other sites

  • 15 years later...

Я просто в шоке, почему тут всё так сложно   :)
Достаточно первое число сделать первым элементом массива, а остатки от деления записывать в следующие элементы. И так до тех пор, пока остаток не станет меньше основания системы счисления. И это верно не только для двоичных, а для всех позиционных систем счисления. Если есть дробная часть, то её переводить отдельно.
Алгоритм:
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й сс.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...