Консультация № 160347
12.02.2009, 23:54
0.00 руб.
0 6 2
Люди, пожалуйста помогите мне со следующей задачей:
Перевод вещественных чисел из 8 с.с. в 10с.с.
Заранее благодарю.

Обсуждение

Неизвестный
13.02.2009, 10:26
общий
это ответ
Здравствуйте, Шибалов Леонид Витальевич!
Вот в приложении код программы.
По-моему, все просто. Но если что не будет понятно, пишите в минифоруме - поясню
НО! в целях простоты не ограничивал длину ввода, а надо-бы (но будет сложнее). Сделать?

Приложение:
uses CRT;

function OctToDEC(src: String): LongInt;
var n: LongInt;
begin
n:= 0;
while src <> '' do begin
n := n*8 + (ord(src[1]) - 48);
delete(src, 1, 1);
end;
OctToDec := n
end;

var
S: String;
ch: Char;
BEGIN

Write('Введите число в восьмеричной системе счисления: ');
S := '';
repeat
ch:= ReadKey;
case ch of
'0'..'7': S := S + ch;
{можно ввести обработку клавиш типа bsckspace для редактирования}
#13,#27,' ': Break; {Выход из цикла по нажатию ENTER, Esc, пробел}
ELSE ch:=#7; {свисток}
end;
Write(ch);
until FALSE; {бесконечный цикл заканчивается с помощью Break}
if S = '' then S := '0'; {может оказаться пустой строка}
{ Тест S := '12324'; должно быть 5332 }
WriteLn;
WriteLn('Восьмеричное число ',S,' = десятичному ', OctToDec(s));
END.
Неизвестный
13.02.2009, 20:40
общий
Нет, спс, всё устраивавет, но немогли бы вы сделать комментарии к каждой строчки программы?просто честно говоря ничего непонимаю
Неизвестный
14.02.2009, 10:42
общий
это ответ

Здравствуйте, [b]Шибалов Леонид Витальевич[/b]!

Пример решения задачи с комментариями находится в приложении.
Перевод вещественного числа 8 с.с. в вещественное число 10 с.с. осуществляется в два этапа:
1. Перевод целой части;
2. Перевод дробной части.

В приведенном примере учтены следующие моменты:
- число может быть положительным или отрицательным;
- если число начинается с "." или "-.", то автоматически считается, что это "0." или "-0.";
- если число заканчивается на точку, то дробная часть не вычисляется.

Точность вычисления десятеричного числа ограничивается типом Real (в TP 7 длина 6 байт). Для увеличения точности, если потребуется, можно воспользоваться типом Double (8 байт) или Extended (10 байт).

Успехов!

Приложение:
program Q160347;

{ Функция проверки правильности ввода }
function CheckOctR(const oct: String): Boolean;
var
i: Byte;
p, res: Boolean;
begin
{ Результат }
res:= True;
{ Флаг точки }
p:= False;
{ Если число отрицательное }
if (oct[1] = '-') then
i:= 2
else
i:= 1;

{ Перебор всех символов }
while ((i <= Length(oct)) and res) do
begin
{ Встретилась точка }
if (oct[i] = '.') then
begin
{ Если уже была точка }
if (p) then
{ то результат "ЛОЖЬ" }
res:= False;
{ Запоминаем точку }
p:= True;
end
else
{ В восьмеричной с.с. цифры от 0 до 7 }
res:= oct[i] in ['0'..'7'];
Inc(i);
end;

CheckOctR:= res;
end;

{ Функция перевода вещественного числа }
{ из 8 в 10 с.с. }
function OctToReal(const oct: String): Real;
var
res, tmp: Real;
i, zero, lng: Byte;
begin
{ Результат }
res:= 0.0;
{ Код нуля }
zero:= Ord('0');
{ Длина введенной строки }
lng:= Length(oct);
{ Если число отрицательное }
if (oct[1] = '-') then
{ то начинаем со второго символа }
i:= 2
else
{ иначе - с первого }
i:= 1;


{ 1. Перевод целой части числа в 10 с.с. }
{ Перебираем символы до конца строки }
{ или до точки }
while ((i <= lng) and (oct[i] <> '.')) do
begin
res:= res*8.0;
res:= res + (Ord(oct[i]) - zero);
Inc(i);
end;


{ 2. Перевод дробной части числа в 8 с.с. }
{ Временная переменная, хранит 8^(-i) }
tmp:= 1.0/8.0;
{ Если еще не все число перебрали }
if (i <= Length(oct)) then
{ Переходим к следующему символу }
Inc(i);
{ Теперь перебираем до конца строки }
while (i <= Length(oct)) do
begin
res:= res + tmp*(Ord(oct[i]) - zero);
{ При делении 8^(-(i - 1)) на 8 получаем 8^(-i) }
tmp:= tmp/8.0;
Inc(i);
end;

{ Если было введено отрицательное число }
if (oct[1] = '-') then
{ то меняем знак результата }
res:= -res;

OctToReal:= res;
end;

var
anOct: String;
aReal: Real;
begin
{ Вводим вещественное число 8 с.с. }
Write('oct = '); ReadLn(anOct);
{ Проверяем правильность ввода }
if CheckOctR(anOct) then
{ преобразуем }
WriteLn('real = ', OctToReal(anOct))
else
{ иначе сообщаем об ошибке }
WriteLn('ERROR');

{ Ждем, когда пользователь нажмет [Enter] }
ReadLn;
end.
Неизвестный
14.02.2009, 10:51
общий
to Boriss:
не исключаю, что в математике что-то изменилось, но нам в школе почему-то вдалбливали, что вещественные числа могут иметь не только целые, но еще и дробные части...
Неизвестный
14.02.2009, 11:56
общий
Да уж, недосмотрел, виноват
Неизвестный
14.02.2009, 11:57
общий
Злой был на Мегафон, в котором вдруг безлимитный тариф за 700 рублей = 1,5 ГИГАбайта. Поматерился в офисе ихнем и разгоряченный стал писать
Форма ответа