Версия для печати темы
Форум «Всё о Паскале» _ Задачи _ задача на системы счисления
Автор: Flipper 17.10.2004 0:07
задание: написать программу на языке паскаль, чтобы она переводила число из четверичной системы счиления в шестнадцетиричную с.с.
вот собственно что надо..........
ПОЖАЛУЙСТО, HELP
Автор: Altair 17.10.2004 0:16
один из способов (простых) это перевести сначала в десятичную а затем в шестандуатиричную.
Простой, он из-за того, что все можно здесь найти уже решеным.
Вот 2 процедуры:
Код
{Одна переводит из любой системы счисления в
десятичную, вторая наоборот }
function FromDec(n, radix:longint):string; {перевод числа n из
radix c/c в 10-ую}
var
s: String;
const
digit: string[16]='0123456789ABCDEF';
begin
s:='';
repeat
s:=digit[(n mod radix)+1]+s;
n:=n div radix;
until n=0;
FromDec:=s;
end;
function ToDec(n:string; radix:longint):longint; {перевод числа n из
10-ной с/с в radix}
var
m, i: longint;
const
digit: string[16]='0123456789ABCDEF';
begin
m:=0;
while n[1]='0' do delete(n,1,1);
for i:=1 to length(n) do m:=m*radix+pos(n[i],digit)-1;
ToDec:=m;
end;
ЗЫ: Не держи зла на ближнего своего. Иешуа.
Автор: Flipper 17.10.2004 1:57
спасибо,
sorry, вспылил, был не прав.
Автор: Altair 17.10.2004 12:04
То-то же! :yes:
Автор: --Vika-- 18.10.2004 18:40
Привет, всем!
клево, нам тоже самое задали, зашла на ваш форум, хотела попросить помочь. а тут уже есть такое :D
только у меня другие с.с.
вот хотела спросить. а как задавать эту систему radix и где число вводить?
может мой вопрос покажется совсем глупым, но вот только с программированием у меня труба...
Автор: Atos 18.10.2004 18:48
Число - это n, а radix- это какая с/c
Например вызов FromDec(1210, 3) возвращает десятичное число, которое равно числу 1210 в троичной с/c
Автор: --Vika-- 18.10.2004 18:55
digit: string[16]='0123456789ABCDEF' а это для 16 с.с
значит везде в программе где radix и n. заменяешь на то что надо
ой спасибо, очень выручили что отреагировали на такой простой вопрос :yes:
Автор: Altair 18.10.2004 20:40
тут реагируютна все вопросы! так что заходите еще!
Сайт наш советуйте всем
Автор: FreeMan 18.10.2004 20:56
Цитата
Сайт наш советуйте всем
своим подругам :D
Автор: Altair 18.10.2004 21:07
Это прежде всего, девушкам тут особенно рады, и задания выполняются обычно за t->0 (время близкоек нулю, т.е. мгновенно)
Автор: GoodWind 18.10.2004 23:23
Цитата
девушкам тут особенно рады
угу.... очеень... особенно я :D
Зватит флеймить!
Автор: --Vika-- 19.10.2004 13:55
ребята, не получилось....еще мне сказали чтоб делала сама, типа кто это вам делал
а у кого паскаль есть, я себе скачивала, а у меня не запускается...
можете кто-нибудь проверить эту программу???
Автор: Altair 19.10.2004 14:00
Так, а задание дайте.
Автор: --Vika-- 19.10.2004 14:29
задание тоже самое
программа на паскале, перевод любого числа из 3 с.с в 16с.с
просто что то у меня не сработала
можете ее проверить?
Автор: APAL 19.10.2004 14:43
И у меня есть попутный вопрос - ведь наверняка должен быть алгоритм перевода чисел из любой системы в любую минуя десятичную?
Автор: volvo 19.10.2004 16:05
--Vika--
Только что проверил программу Oleg_Z. Все работает.
Видимо, ты неправильно используешь функции. Просто добавь к коду Oleg_Z
вот это:
Код
var decimal: longint;
const
x = '212212'; {это число в 3-ой системе счисления}
Begin
decimal := todec(x, 3);
writeln( 'x(16) = ', fromdec(decimal, 16) );
End.
Автор: Altair 19.10.2004 17:42
На нашем форум, все, что выложенно в ЧаВо, все работает!
volvo, прав, прогу надо написать еще, чтобы процедуры работали ;)
Автор: Amro 19.10.2004 23:59
Вот тута прогу одну нашёл, правда ещё сам не разобрался, но по-моему она переводит из любой системы счисления в любую другую ....... в общем универсальная она
Код
program perevod;
var
q,p,n,osnov,s,m,i:longint;
st:string;
ch:char;
mas:array[1..30] of byte;
function test(st:string; osnov:integer):boolean;
var n,i:integer; mn:set of char;
begin
test:=true;
mn:=[];
for i:=0 to osnov-1 do
if i<=9 then mn:=mn+[chr(i+48)]
else mn:=mn+[chr(i+55)];
n:=ord(st[0]);
for i:=1 to n do
if (st[i]<>',') and (not(st[i] in mn)) then
begin
writeln('Неправильная запись числа. Повторите ввод');
test:=false;
i:=n;
end;
end;
function chislo(ch:char):integer;
begin
if ord(ch) in [48..57] then chislo:=ord(ch)-48
else chislo:=ord(ch)-55;
end;
function simvol(n:byte):char;
begin
if n in [10..15] then simvol:=chr(n+55)
else simvol:=chr(n+48);
end;
begin
writeln ('Введите основание р');
readln(p);
writeln ('Введите число (для цифр после 9 писать ABC...)');
repeat
readln (st);
until test(st,p);
writeln ('В какую систему перевести?');
readln (q);
s:=0;
m:=1;
n:=ord(st[0]);
for i:=n downto 1 do
begin
s:=s+chislo(st[i])*m;
m:=m*p;
end;
m:=0;
repeat
inc(m);
mas[m]:=s mod q;
s:=s div q;
until s<=q-1;
inc(m);
mas[m]:=s;
for i:=m downto 1 do
write(simvol(mas[i]));
end.
Прикольная между прочим прога, вроде всё прально делает!!!!
Внимание всем, кто еще раз решит, что эта программа работает с любыми системами счисления!!! Программа корректно переводит числа из любой системы счисления с основанием 2 .. 16 в любую систему счисления с основанием 2 .. 16 !!! Не более того.НЕ считайте эту программу действительно универсальным переводчиком, и не ждите от нее корректной работы с другими системами счисления!!!
Автор: volvo 20.10.2004 0:07
Принцип остается тот же -
здесь...
Код
for i:=n downto 1 do
begin
s:=s+chislo(st[i])*m;
m:=m*p;
end;
вычисляется 10-ное число...
Автор: GoodWind 20.10.2004 0:25
Цитата(APAL @ 19.10.04 10:43)
И у меня есть попутный вопрос - ведь наверняка должен быть алгоритм перевода чисел из любой системы в любую минуя десятичную?
завтра ОМТ`шницу нашу спрошу
Автор: Dao 20.10.2004 0:31
Я мож и опоздал, но в том году писал прогу, которая переводит числа из десятичной системы счисления в шестнадцатеричную (а может и еще в какую-нить). Так, если кому пригодится
Код
uses crt;
var a : real;
z,k,q : integer;
s,m : string;
c : char;
begin
repeat
write ('Введите дробное число по основанию 10 : ');
readln(a);
write ('Введите новое основание : ');
readln(q);
write ('Введите количество знаков после запятой : ');
readln(z);
k:=0;
s:='0,';
m:='';
a:=a-trunc(a);
while (a>0)and(k<z) do
begin
k:=k+1;
a:=a*q;
str(trunc(a),m);
if q=16 then
begin
if m='10' then m:='A';
if m='11' then m:='B';
if m='12' then m:='C';
if m='13' then m:='D';
if m='14' then m:='E';
if m='15' then m:='F';
end;
s:=s+m;
a:=a-trunc(a);
end;
writeln ('Число по основанию ',q,' : ',s);
writeln('Будем считать еще? (Д/Н)');
writeln;
c:=readkey;
until (c='y')or(c='Y');
end.
Автор: Altair 20.10.2004 10:12
Опоздал во-первых, во-вторых слишком однобокая прога, всего 1 действтие... не оптимально... хотя молодец, задача решена, и это главное!
Автор: Dao 20.10.2004 22:19
Полностью с тобой согласен, но 5 у меня уже сотит, а это главное.
Автор: Altair 20.10.2004 22:32
Точно!
Автор: Vika 22.10.2004 13:15
Цитата(Oleg_Z @ 16.10.04 20:16)
function FromDec(n, radix:longint):string; {перевод числа n из
radix c/c в 10-ую}
n:=n div radix;
function ToDec(n:string; radix:longint):longint; {перевод числа n из
10-ной с/с в radix}
for i:=1 to length(n) do m:=m*radix+pos(n[i],digit)-1;
вот, перевод числа из любой с/с в 10. не делением, а умножение...
а у тебя делением, тоже и с другой, короче должно быть наоборот....
Автор: Altair 22.10.2004 19:30
Не понял, что тебе не нравиться?
Автор: aspu 26.09.2005 17:52
А вот я что-то не пойму та прога универсальная на запятую не ругается но с дробями работает неправильно как бы туда еще дроби запихнуть?
Автор: Jill 26.09.2005 18:20
ребята, а если ПРОСТО десятичное (и положительное, и отрицательное) в двоичное? что-то по полочкам не раскладывается совсем
проблема именно в ОТРИЦАТЕЛЬНЫХ числах (((
Автор: aspu 26.09.2005 19:38
У тебя не проблема При переводе между системами знак не меняется так что просто определяешь знак у исходного числа и добавляешь его к итоговому а вот с дробями это проблема
Автор: Jill 26.09.2005 19:43
как это?
Цитата(aspu @ 26.09.2005 15:38)
добавляешь его к итоговому
по-моему, там происходят изменения в старшем разряде, а не просто меняется знак
разве не так?
Автор: aspu 27.09.2005 12:48
A черт его знает в одних источниках одно написано в других другое. Вон виндовый калькулятор вообще при преобразовании туда-обратно фигню выдает какую-то. Полный бред вобщем
Автор: Jill 27.09.2005 14:29
Цитата(aspu @ 27.09.2005 8:48)
виндовый калькулятор вообще при преобразовании туда-обратно фигню выдает какую-то
калькулятор не обрабатывает отр. числа :-)
чтоб получить отр. необходимо перевести модуль числа, провести инверсию (поменять 0 на 1 и наоборот) и прибавить единицу (по-моему, можно в самом калькуляторе)
а вот как это сделать в pascal... :-(
Автор: aspu 27.09.2005 14:49
ну вот и меняй Переведи его в строковый вид и по порядку каждую цифирь меняй :rose:
Автор: Гость 25.09.2007 14:40
Помогите пожалуйста модифицировать программу перевода для больших целых чисел (>14 разрядов). Использую фукции Mod и т.п, которые только для целых.
Цитата
var a,b,cc,r:integer;
c,ab,dd:string;
Function sn (a, n: integer): integer;
Var i,s: integer;
Begin
sn := 0;
s := 1;
For i:=1 To n Do
s := s*a;
sn := s;
End;
Procedure make_to_ten (m: String; Var kk: String);
var
i, r : integer;
l : char;
Begin
i := 0;
r := 0;
while i<>length(m) Do
Begin
l := m[length(m)-i]; {отделяем цифру}
If ord(l)<=ord('9') Then
r := r + (ord(l) - ord('0')) * sn (a, i) {для чисел 0,1,..,9}
Else
r := r + (ord(l) - ord('a') + 10) * sn (a, i); {для латинских букв}
i := i + 1;
End;
str (r, kk);
End;
Function intg(d:String): integer;
Var code,res: integer;
Begin
val(d,res,code);
intg := res;
End;
begin
write('Исходная система счисления: ');
readln(a);
write('Итоговая система счисления: ');
readln(b);
write('Число: ');
readln( c );
ab := '';
If b=10 Then make_to_ten(c,ab) {переводим в десятичную СС}
Else
Begin
make_to_ten(c,dd); {переводим в десятичную СС}
cc := intg(dd); {переводим строковую информацию в целочисленную}
while cc>0 Do
Begin
r := cc Mod b; {берем остаток}
cc := cc Div b; {берем целое частное}
If r>=10 Then ab := chr(ord('a')+r-10)+ab
Else ab := chr(48+r)+ab;
End;
End;
writeln ('-----------------------');
writeln ('Итог: ',ab);
readln;
End.