Помогите плз с програмкой. Нужно сделать калькулятор считающий в разных системах счисления. В десятично я сделал, а как реализовать в других понятия не имею. Подскажите как лучше и проще это сделать.
В чем именно у тебя затруднения? Как это оформить, или как производить операции в других системах счисления (имеются в виду именно алгоритмы)?
Мне как раз не ясно как реализовать, какими алгоритмами и как лучше. Или же работать в заданной системе, или переводить в десятичную, а потом в заданную. Но как это реализовать не знаю.
Погоди... Насколько я помню, на форуме уже поднимался этот вопрос. В любом случае тебе придется переводить данные в какую-то одну систему счисления (о том, как это сделать - здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=4535&view=findpost&p=38226), и работать только в ней...
А можно ли работать в в одной и той же системе счисления, не переходя в десятичную?
Прошу помощи в поиске ошибке в процедуре ToDec для калькулятора, чтобы переводила дробные значения какой-то сс в десятичную. Она ещё не доработана (не работает для чисел в сс>10),но хотелось бы попробывать сначало хотябы с дробными двоичными.
function stepen(a,n:integer):integer;
var
s,i:integer;
begin
for i:=1 to n do
s:=s*a;
stepen:=s;
end;
function ToDec(n:string; radix:longint):real;
var
l,d:real;
m,i:longint;
const
digit: string[16]='0123456789ABCDEF';
begin
l:= strtofloat(n);
if frac(l)>0 then
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;
d:=0;
for i:=1 to length(floattostr(frac(l))) do
if i>1 then d:=d+1/stepen(radix,(i-1));// ошибка возникает тут
todec:=int(m)+d;
end
else
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
end;
antonioSP, ошибка далеко не там, где тебе кажется:
function stepen(a,n:integer):integer;и деление на ноль не будет возникать
var s, i: integer;
begin
s := 1; // <--- Вот это добавь !!!
for i := 1 to n do s := s*a;
stepen:=s;
end;
А вообще, я бы сделал так:
function ToDec(n:string; radix:longint):real;
var
_int: longint;
_frac: real;
s: string;
i, p: byte;
const
digit: string[16]='0123456789ABCDEF';
begin
p := pos('.', n);
if p = 0 then s := n
else s := copy(n, 1, p - 1);
_int := 0; _frac := 0.0;
// В целой части удаляем ведущие нули
while s[1] = '0' do delete(s, 1, 1);
for i := 1 to length(s) do
_int := _int * radix + pos(n[i], digit) - 1;
if p < length(n) then begin
s := copy(n, p + 1, 255);
// В дробной части удалять можно НЕзначащие, завершающие нули
while s[length(s)] = '0' do delete(s, length(s), 1);
for i := 1 to length(s) do
_frac := _frac + 1 / stepen(radix, i);
end;
ToDec := _int + _frac;
end;
Спасибо тебе большое, правда функция не совсем корректно работает. Например если ввести 10 или 10.1 выдаёт один и тотже результат, лан буду сам разбираться.
Да, правильно. Не добавил еще одно условие:
function ToDec(n:string; radix:longint):real;
var
_int: longint;
_frac: real;
s: string;
i, p: byte;
const
digit: string[16]='0123456789ABCDEF';
begin
p := pos('.', n);
if p = 0 then s := n
else s := copy(n, 1, p - 1);
_int := 0; _frac := 0.0;
while s[1] = '0' do delete(s, 1, 1);
for i := 1 to length(s) do
_int := _int * radix + pos(n[i], digit) - 1;
if (p <> 0) and (p < length(n)) then begin // <--- Здесь !!!
s := copy(n, p + 1, 255);
while s[length(s)] = '0' do delete(s, length(s), 1);
for i := 1 to length(s) do
_frac := _frac + 1 / stepen(radix, i);
end;
ToDec := _int + _frac;
end;
Спасибо за помощь, но опять косячок. При вводе дробного значения например в 16-иричной сс с одним знаком после запятой, результат всегда получается *.0625, с двумя знаками после запятой *.06640625 и т.д. причём символ может быть любой не обязательно цифра.
function ToDec(n:string; radix:longint):real;
var
_int: longint;
_frac: real;
s: string;
i, p: byte;
const
digit: string[16]='0123456789ABCDEF';
begin
p := pos('.', n);
if p = 0 then s := n
else s := copy(n, 1, p - 1);
_int := 0; _frac := 0.0;
while s[1] = '0' do delete(s, 1, 1);
for i := 1 to length(s) do
_int := _int * radix + pos(n[i], digit) - 1;
if (p <> 0) and (p < length(n)) then begin
s := copy(n, p + 1, 255);
while s[length(s)] = '0' do delete(s, length(s), 1);
for i := 1 to length(s) do
_frac := _frac + pred(pos(upcase(s[i]), digit)) / stepen(radix, i); // <--- Тут ...
end;
ToDec := _int + _frac;
end;
Аргумент передаешь в градусах? А Delphi вообще-то принимает в радианах А Cos(60 радиан) как раз и равен -0.95
Делай так:
Const
GradToRad = Pi / 180;
...
X := Cos(60 * GradToRad);
...
Не знал что в Делфях в радианах. Спасибо тебе volvo ещё раз