Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 8 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 03.09.2004
Откуда: Киев
Здравствуйте

Нужен алгоритм перевода из одной системы исчисления в другую. Зачем, Я не знаяю, но попросили узнать. Я в хексы еще калькулятором перевести могу, а вот как например из восьмиричной в десятиричную?

Спасибо.



Партнер
 

Member
Статус: Не в сети
Регистрация: 24.06.2003
Откуда: Питер
А ты подумай, что такое собственно систем счисления, как устроена запись числа цифрами ....
И сам всё поймёшь, это просто ;)

_________________
DOOM лучше всяких дум


 

Member
Статус: Не в сети
Регистрация: 04.02.2004
Откуда: Москва|СВАО
gloom_demon
gloom_demon писал(а):
Нужен алгоритм перевода из одной системы исчисления в другую. Зачем, Я не знаяю, но попросили узнать. Я в хексы еще калькулятором перевести могу, а вот как например из восьмиричной в десятиричную?

Думаю это поможет
http://algolist.manual.ru/maths/teornum/count_sys.php

_________________
Счастье - это когда тебя понимают.
Разыскиваю (куплю) оригинальный USB-kit для Chaintech 5AGM2 (подробности в Л.С.).


 

Member
Статус: Не в сети
Регистрация: 03.09.2004
Откуда: Киев
Ну хорошо - смотри если Я правильно понимаю то 9А в шестнадцатиричной это 10 да?

Тогда получиться что в пятнадцатиричной это тоже 10, а в восьмиричной 8В да?

Или Я путаю чего-то?


 

Member
Статус: Не в сети
Регистрация: 04.02.2004
Откуда: Москва|СВАО
gloom_demon
gloom_demon писал(а):
Ну хорошо - смотри если Я правильно понимаю то 9А в шестнадцатиричной это 10 да?
Тогда получиться что в пятнадцатиричной это тоже 10, а в восьмиричной 8В да?
Или Я путаю чего-то?

Ну я же дал ссылку где все детально разобранно - только прочтите внимательно, неужто там что-то непонятно?

_________________
Счастье - это когда тебя понимают.
Разыскиваю (куплю) оригинальный USB-kit для Chaintech 5AGM2 (подробности в Л.С.).


 

Member
Статус: Не в сети
Регистрация: 03.09.2004
Откуда: Киев
Ой, прости, пока писал не видел других постов и Твоей ссылки в частности, пошел читать, спасибо.


 

Member
Статус: Не в сети
Регистрация: 26.05.2005
Держи, на Паскале - в школе делал, осталось :)
Во всех программах используятся числа с дробной частью, если надо перевести целое число то дроб. часть=0, ex: HEX = 10A.0

Из Dec в любую систему:

program dec_any_s_s;
uses crt;
var
ost:real;
chis1,chis2:real;
chisdec,cel,drob:string[255];
i,j,osn,kz,code:integer;
itog,itog2,drob2:string[255];
icif,icif2,jst:string[3];
ich:char;
begin
clrscr;
write('CHISLO DEC= ');
readln(chisdec);
write('OSN(2..35)= ');
readln(osn);
write('Kol-vo znakov posle . (0-20)= ');
readln(kz);

for i:=1 to length(chisdec) do
begin
if copy(chisdec,i,1)='.' then
begin
cel:=copy(chisdec,1,i-1);
drob:=copy(chisdec,i+1,length(chisdec)-1);
end;
end;
{--------------------CEL(itog2)----------------------}
val(cel,chis1,code);

while chis1>=osn do
begin
chis2:=chis1;
chis1:=trunc(chis1/osn);
ost:=chis2-chis1*osn;

str(ost:1:0,icif);

j:=10;
str(j,jst);
for ich:='A' to 'Z' do
begin
if icif=jst then icif:=ich;
j:=j+1;
str(j,jst);
end;
itog:=itog+icif;
end;

str(chis1:1:0,icif2);

j:=10;
str(j,jst);
for ich:='A' to 'Z' do
begin
if icif2=jst then icif2:=ich;
j:=j+1;
str(j,jst);
end;

itog:=itog+icif2;

for i:=0 to length(itog)-1 do
begin
insert(copy(itog,length(itog)-i,1),itog2,i+1);
end;
itog:='';
icif:='';
{--------------------CEL(itog2)---------------------}
{--------------------DROB(itog)---------------------}
drob:='0.'+drob;
val(drob,chis1,code);

for i:=1 to kz do
begin
chis1:=chis1*osn;
chis2:=int(chis1);

str(chis2:1:0,icif);
j:=10;
str(j,jst);

for ich:='A' to 'Z' do
begin
if icif=jst then icif:=ich;
j:=j+1;
str(j,jst);
end;
itog:=itog+icif;
chis1:=frac(chis1);
if chis1=0 then break;
end;
{--------------------DROB(itog)---------------------}

write('Eto chislo v ',osn,'-oj s.s.= ');
writeln(itog2+'.'+itog);
readln;
end.

Из любой системы в Dec:

program any_s_s_dec;
uses crt;
var
any:string[255];
cif,cif2:string[1];
cel,drob:string[255];
osn2,i,j,dcif,dcif2,code:integer;
dchis,dchis2,dchis3:real;
ich:char;
begin
clrscr;
write('CHISLO ANY= ');
readln(any);
write('OSN(2..35)= ');
readln(osn2);

for i:=1 to length(any) do
begin
if copy(any,i,1)='.' then
begin
cel:=copy(any,1,i-1);
drob:=copy(any,i+1,length(any)-1);
end;
end;

{------------------CEL(dchis)-----------------------}
for i:=1 to length(cel) do
begin
cif:=copy(cel,i,1);
cif[1]:=upcase(cif[1]);

j:=10;
for ich:='A' to 'Z' do
begin
if cif=ich then
begin
dcif:=j;
break;
end
else
begin
val(cif,dcif,code);
end;
j:=j+1;
end;

if osn2<=dcif then
begin
writeln('Neverno vvedeno osnovanie ili chislo!');
readln;
exit;
end;

dchis:=dchis+(dcif*exp((length(cel)-i)*ln(osn2)));
end;
{------------------CEL(dchis)-----------------------}

{------------------DROB(dchis2)---------------------}
for i:=1 to length(drob) do
begin
cif2:=copy(drob,i,1);
cif2[1]:=upcase(cif2[1]);

j:=10;
for ich:='A' to 'Z' do
begin
if cif2=ich then
begin
dcif2:=j;
break;
end
else
begin
val(cif2,dcif2,code);
end;
j:=j+1;
end;

if osn2<=dcif2 then
begin
writeln('Neverno vvedeno osnovanie ili chislo!');
readln;
exit;
end;

dchis2:=dchis2+(dcif2/(exp((i)*ln(osn2))));
end;
{------------------DROB(dchis2)---------------------}

dchis3:=dchis+dchis2;
writeln('V 10-oj s.s.: ',dchis3:1:length(drob));
readln;
end.

Если надо из восьм. в шестн., то оформляешь проги как функции в одной программе и переводишь сначала в дес., а затем в шестн.


 

Member
Статус: Не в сети
Регистрация: 17.11.2005
Откуда: Челябинск....
Писал прогу два года назад, если разберешься :)
{Программа переводит из одной системы счисления в другую
18.02.2004-25.02.2004}
{$N+}
program translator;
uses crt;
{-------------------------Константы------------------------------------------}
const scx=80;
inst='<F1> Помощь <F2> Перевод <Enter> Дальше';
inst1=' <Esc> Выход';
err0='Неверно введена исходная система счисления';
err1='Неверно введена искомая система счисленния';
err2='Неверно введено исходное число';
{-------------------------Типы-----------------------------------------------}
type num=array [1..512] of char;

chisl=record
ch:num;
l:integer;
end;
{-------------------------Переменные-----------------------------------------}
var fl,f,f1,f2,min,fl1:boolean;

ch,ch1:char;

i:word;

c1,c2,c3:chisl;

actwin,r,z,e,j,g,l,p,q,r3:longint;

buf,buf1:num;

des:extended;
{--------------------------Процедуры_и_Функции-------------------------------}
{Очистка окна итогов}
procedure clean;
var i,j:longint;
begin
for i:=15 to 23 do
begin
gotoxy (2,i);
for j:=1 to 78 do write (' ');
end;
end;

{Вывод помощи}
procedure help;
begin
gotoxy (2,15);
writeln ('Программа - переводчик из одной системы счисления в другую:');
gotoxy (2,16);
writeln ('* Переводит числа до 11-ти разрядов.');
gotoxy (2,17);
writeln ('* Исходная и итоговая система счисления >=2 <=36.');
gotoxy (2,18);
writeln ('* Если что-то введено неправильно, программа определит ошибку');
gotoxy (2,19);
writeln ('* Для перемещения используйте <Enter>');
gotoxy (2,20);
writeln ('* Для начала перевода нажмите <F2>');
end;

{Проверка ввода исходной системы счисления}
function num2tst(ch:num;l:integer):boolean;
var fl:boolean;
begin
fl:=true;
if l=0 then fl:=false;
if fl and (ch[1]='0') then fl:=false;
if fl and (ch[1]='1') and (l=1) then fl:=false;
if fl and (ch[1]='3') and (ch[2]>'6') and (l=2) then fl:=false;
if fl and (ch[1]>'3') and (l=2) then fl:=false;
num2tst:=fl;
end;

{Проверка ввода искомой системы счисления}
function num3tst(ch:num;l:integer):boolean;
var fl:boolean;
begin
fl:=true;
if l=0 then fl:=false;
if fl and (ch[1]='0') then fl:=false;
if fl and (ch[1]='3') and (ch[2]>'6') and (l=2) then fl:=false;
if fl and (ch[1]>'3') and (l=2) then fl:=false;
num3tst:=fl;
end;

{Вычисляет исХодную систему счисления}
function num2trn(ch:num;l:integer):integer;
var a:integer;
begin
if l=1 then a:=ord(ch[1])-48;
if l=2 then a:=(10*(ord(ch[1])-48))+ord(ch[2])-48;
num2trn:=a;
end;

{Вычисляет искомую сиситему счисления}
function num3trn(ch:num;l:integer):integer;
var a:integer;
begin
if l=1 then a:=ord(ch[1])-48;
if l=2 then a:=(10*(ord(ch[1])-48))+ord(ch[2])-48;
num3trn:=a;
end;

{Проверка правильности ввода исходного числа}
function num1tst(ch:num;l:integer;r:integer):boolean;
var
i,z:integer;
fl:boolean;
begin
fl:=true;
if l=0 then fl:=false;
z:=0;
for i:=1 to l do
begin

if (ch[i]>='0') and (ch[i]<='9') and ((ord(ch[i])-48) >r)
then fl:=false;
if (ch[i]>='A') and (ch[i]<='Z') and ((ord(ch[i])-54) >r)
then fl:=false;
end;
for i:=1 to l do
begin
if (ch[i]>='0') and (ch[i]<='9')
then inc(z);
if (ch[i]>='A') and (ch[i]<='Z')
then inc(z);
end;
if z=0 then fl:=false;
num1tst:=fl;
end;

{Функция переводит из n в десятичную}
function t10 (ch:num;l:integer;r:integer):extended;
var a,b,c:extended;
i,m,j:integer;
fl:boolean;
begin
a:=0;
m:=l+1;
fl:=false;
for i:=1 to l do
if ch[i]='.' then m:=i;
for i:=1 to l do
begin

if (ch[i]>='0') and (ch[i]<='9') then begin
b:=ord(ch[i])-48;
end;
if (ch[i]>='A') and (ch[i]<='Z') then begin
b:=ord(ch[i])-55;
end;
if (i>m) then begin
c:=1;
for j:=m to i-1 do c:=c/r;
a:=a+c*b;

end;
if (i<m) then begin
c:=1;
if i=m-1 then a:=a+b;
if i<m-1 then begin
for j:=m-2 downto i do
c:=c*r;
a:=a+c*b;
end;
end;
end;
t10:=a;
end;


{Возводит 10 в степень}
function f10(s:longint):longint;
var a,b:longint;
begin
b:=1;
for a:=1 to s do
begin
b:=b*10;
end;
f10:=b;
end;


{Выделяет целую часть числа}
function big(ch:extended):extended;
var
a,c:extended;
i:integer;
begin
a:=ch;
c:=0;
if a>=0.99 then begin
repeat
c:=c+1;
until a-c<1;
big:=c;
end
else big:=0;

end;
{функция переводит из десятичной в n}
function
trans(var ch:extended;var buf,buf1:num;var r:longint;var l:longint):longint;
var a,b,c,g:extended;
i,j,k:longint;
begin
a:=big(ch);
if a>=1 then begin
j:=0;
repeat
b:=big(a/r);
c:=a-b*r;
i:=round(c);
inc(j);
if (i>=0) and (i<=9) then buf[j]:=chr(i+48);
if (i>=10) then buf[j]:=chr(i+55);
a:=b;
until a<r;
inc(j);
i:=round(a);
if (i>=0) and (i<=9) then buf[j]:=chr(i+48);
if (i>=10) then buf[j]:=chr(i+55);
l:=j;
end
else l:=0;
a:=ch-big(ch);
b:=a;
if a>0 then begin
j:=0;
for k:=1 to 5 do
begin
a:=a*r;
inc(j);
if a>=1 then begin
i:=trunc(a);
if (i>=0) and (i<=9) then buf1[j]:=chr(i+48);
if (i>=10) then buf1[j]:=chr(i+55);
a:=a-i;
end
else buf1[j]:='0';
end;
trans:=j;
end
else trans:=0;
end;
{===========================Программа========================================}
begin
fl:=false;
textmode (CO80);
{Отрисовка псевдографического интерфейса}
textcolor (10);

for i:=1 to scx+1 do write (chr(219));
gotoxy (80,2);
write (chr(219));
for i:=1 to scx do write (chr(219));
gotoxy (2,2);
textcolor (15);
write (' ');
write (' *** Переводчик чисел из одной системы счисления в другую *** ');
textcolor (15);
gotoxy (1,25);
write (inst,inst1);
textcolor (2);

gotoxy (1,4);
write (chr(201));

for i:=1 to scx-2 do write (chr(205));
gotoxy (2,24);
for i:=1 to scx-2 do write (chr(205));

gotoxy (1,24);
write (chr(200));

gotoxy (80,4);
write (chr(187));

gotoxy (80,24);
write (chr(188));

for i:=5 to 23 do
begin
gotoxy (1,i);
write (chr(186));
gotoxy (80,i);
write (chr(186));
end;
c1.l:=0;
c2.l:=0;
c3.l:=0;
gotoxy (1,7);
write (chr(199));
for i:=1 to 28 do write (chr(196));
gotoxy (1,10);
write (chr(199));
for i:=1 to 28 do write (chr(196));
gotoxy (1,13);
write (chr(204));
for i:=1 to 78 do write (chr(205));
write (chr(185));
gotoxy (30,4);
write (chr(203));
for i:=1 to 8 do begin gotoxy (30,i+4); write (chr(186)); end;
gotoxy (30,13);
write (chr(202));
gotoxy (30,7);
write (chr(182));
gotoxy (30,10);
write (chr(182));
gotoxy (31,5);
textcolor (15);
write (chr(17),' Введите исходное число (До 11-ти символов)');
gotoxy (31,8);
write (chr(17),' Введите исходную систему счисления');
gotoxy (31,11);
write (chr(17),' Введите систему счисления искомого числа');
gotoxy (2,14);
write ('Результат ',chr(25));
{Конец отрисовки интерфейса}
actwin:=0;
gotoxy (3,6);


{Начало главного цикла программы}
z:=0;
repeat
fl1:=true;
if c1.l>=1 then
for i:=1 to c1.l do
if c1.ch[i]='.' then fl1:=false;

ch:=readkey;
textcolor (15);
{Обработка нажатия клавиши <Esc>}
if ord(ch)=27 then fl:=true;
{Обработка нажатия клавиши <Enter>}
if ord(ch)=13 then begin
if actwin=2 then actwin:=0 else inc(actwin);
if actwin=0 then gotoxy (c1.l+3,6);
if actwin=1 then gotoxy (c2.l+3,9);
if actwin=2 then gotoxy (c3.l+3,12);
end;
{Обработка нажатия клавиш <0> .. <9>}
if ((ch>='0') and (ch<='9')) then begin
case actwin of
0: if (c1.l<=13) and (z<11) then begin
write (ch);
c1.ch[c1.l+1]:=ch;
inc (c1.l);
inc (z);
end;
1: if c2.l<2 then begin
write (ch);
c2.ch[c2.l+1]:=ch;
inc (c2.l);
end;
2: if c3.l<2 then begin
write (ch);
c3.ch[c3.l+1]:=ch;
inc (c3.l);
end;
end; {End case}

end; {end if}
{Обработка нажатия клавиш <a> .. <z>}
if ((ch>='a') and (ch<='z')) and (actwin=0) and (z<11) then begin
if c1.l<=13 then
begin
write (chr(ord(ch)-32));
c1.ch[c1.l+1]:=chr(ord(ch)-32);
inc (c1.l);
inc (z);
end;
end;
{Обработка нажатия клавиш <A> .. <Z>}
if ((ch>='A') and (ch<='Z')) and (actwin=0) then begin
if c1.l<=13 then
begin
write (ch);
c1.ch[c1.l+1]:=ch;
inc (c1.l);
inc (z);
end;
end;
{Обработка нажатия клавиш <.> и <,>}
if ((ch='.') or (ch=',')) and (c1.l>0) and
(c1.l<13) and (actwin=0) and fl1 then
begin
if not ((c1.l=1) and (c1.ch[1]='-')) then begin
write ('.');
inc(c1.l);
c1.ch[c1.l]:='.'; end;
end;
{Обработка нажатия клавиши <Backspace>}
if (ord (ch)=8) then case actwin of
0: begin
if c1.l >= 1 then
begin
dec(c1.l);
gotoxy (c1.l+3,6);
write (' ');
gotoxy (c1.l+3,6);
if ((c1.ch[c1.l+1]>='0') and (c1.ch[c1.l+1]<='9')) or
((c1.ch[c1.l+1]>='A') and (c1.ch[c1.l+1]<='Z')) then dec(z);
end;
end;
1: begin
if c2.l >= 1 then
begin
dec(c2.l);
{if ((c1.ch[c2.l+1]>'0') and (c1.ch[c2.l+1]<'9')) or
((c1.ch[c2.l+1]>'A') and (c1.ch[c2.l+1]>'Z')) then dec(z);}
gotoxy (c2.l+3,9);
write (' ');
gotoxy (c2.l+3,9)
end;
end;
2: begin
if c3.l >= 1 then
begin
dec(c3.l);
gotoxy (c3.l+3,12);
write (' ');
gotoxy (c3.l+3,12);
end;
end;
end; {End case}
{Обработка нажатия кловиши "-"}
if (ch='-') and (actwin=0) and (c1.l=0) then
begin
write (ch);
inc(c1.l);
c1.ch[1]:='-';
end;
{Вывод помощи и информации}
if (ord(ch)=59) then begin
clean;
help;
if actwin=0 then gotoxy (c1.l+3,6);
if actwin=1 then gotoxy (c2.l+3,9);
if actwin=2 then gotoxy (c3.l+3,12);
end;
{Обработка нажатия клавиши F2, проверка вверности ввода,
Вывод информации об ошибках, вывод результататов }
if (ord(ch)=60) then begin
clean;
e:=0;
f:=num2tst(c2.ch,c2.l);
{Проверка верности ввода исх. системы}
f1:=num3tst(c3.ch,c3.l);
{Провека верности ввода иск. системы}
r:=num2trn(c2.ch,c2.l);
{Перевод значения исх. сист. в integer}
f2:=num1tst(c1.ch,c1.l,r);
{Проверка верности ввода исходного числа}
r3:=num3trn(c3.ch,c3.l);
if not f then begin
gotoxy (2,15);
inc(e);
write (err0);
end;
if not f1 then begin
gotoxy (2,15+e);
inc(e);
write (err1);
end;
if not f2 then begin
gotoxy (2,15+e);
inc(e);
write (err2);
end;
{Перевод в другую систему счисления}
if f and f1 and f2 then
begin
if c1.ch[1]='-' then min:=true
else min:=false;
if min then
begin
for j:=2 to c1.l do
begin
buf[j-1]:=c1.ch[j];
end;
dec(c1.l);
for j:=1 to c1.l do
begin
c1.ch[j]:=buf[j];
end;
end;

des:=t10(c1.ch,c1.l,r);
gotoxy (2,15);
if min then write ('-');
end;

p:=trans(des,buf,buf1,r3,q);
if q<>0 then
for j:=q downto 1 do
begin
write (buf[j]);
end
else write ('0');
if p<>0 then write ('.');
if p<>0 then begin
for j:=1 to p do
begin
write(buf1[j]);
end;
end;

if actwin=0 then gotoxy (c1.l+3,6);
if actwin=1 then gotoxy (c2.l+3,9);
if actwin=2 then gotoxy (c3.l+3,12);
end;
until fl;

end.
Добавлено спустя 1 минуту, 34 секунды
Мля пипец, куда все пробелы делись? Структуры программы не видно :(


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 8 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan