Vit16 Posted January 10, 2006 Report Share Posted January 10, 2006 Здравствуйте, не могу составить программу для перевода из двоичной системы в восьмеричную.Помогите чем можите, плиззз или ссылочку дайте. А вот что я накуролесил: 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. Quote Link to comment Share on other sites More sharing options...
Darth Emil Posted January 10, 2006 Report Share Posted January 10, 2006 Держи: 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 системы счисления. Quote Link to comment Share on other sites More sharing options...
Vit16 Posted January 12, 2006 Author Report Share Posted January 12, 2006 Огромное спасибо за подсказку.Итак,вот что у меня получилось: Прога переводит из 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-ой в восьмеричную,че не так??? И мне еще + к этому,сказали чтоб она могла работать с дробными числами, а тут я совсем спекся Quote Link to comment Share on other sites More sharing options...
Тролль Posted January 12, 2006 Report Share Posted January 12, 2006 (edited) 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 January 12, 2006 by Тролль Quote Link to comment Share on other sites More sharing options...
Delphi Posted January 26, 2006 Report Share Posted January 26, 2006 " Для чисел с дробной частью можно сначала разделить строку на две части Si1 и Si2 - до запятой и после, преобразовать каждую " так можно сделать а потом лутче всего делить до тех пор пока не появится зависимость. Если последовательность чисел начала повторятся то перевод правельный Quote Link to comment Share on other sites More sharing options...
xskif Posted May 24, 2021 Report Share Posted May 24, 2021 Я просто в шоке, почему тут всё так сложно Достаточно первое число сделать первым элементом массива, а остатки от деления записывать в следующие элементы. И так до тех пор, пока остаток не станет меньше основания системы счисления. И это верно не только для двоичных, а для всех позиционных систем счисления. Если есть дробная часть, то её переводить отдельно. Алгоритм: 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й сс. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.