Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > перевод в десятичную систему исчисления


Автор: navi 9.4.2008, 22:01
здравствуйте! помогите please c переводом из системы исчисления по основанию b<9 в десятичную. smile помогите очень нужно.
смjтрел в темах именно такой вопрос не нашёл...
ах да:
входные данные: само число и основание  b. 

Автор: volvo877 10.4.2008, 00:03
Если число, которое надо перевести в 10 с/с задано именно числом, а не строкой (бред, конечно, но задачи бывают разные), то вот так:
Код
function todec(n, radix: longint): longint;
var
  mult, s: longint;
begin
  mult := 1; s := 0;
  while n > 0 do begin
    s := s + mult * (n mod 10);
    n := n div 10;
    mult := mult * radix;
  end;
  todec := s;
end;


begin
  writeln(todec(751, 8));
end.

751(8) -> 489(10)

Автор: navi 10.4.2008, 00:13
Цитата(volvo877 @  10.4.2008,  00:03 Найти цитируемый пост)
Если число, которое надо перевести в 10 с/с задано именно числом

извиняюсь за неточность число вводится строкой.

Автор: volvo877 10.4.2008, 00:55
Цитата(navi @  9.4.2008,  23:13 Найти цитируемый пост)
число вводится строкой.

Тогда все проще:

Код
function todec(n: string; radix: longint): longint;
var
  s, i: longint;
const
  digit: string[16] = '0123456789ABCDEF';
begin
  s := 0;
  while (n[1] = '0') and (length(n) > 1) do delete(n, 1, 1);
  for i := 1 to length(n) do s := s * radix + pos(n[i], digit) - 1;

  todec := s;
end;


begin
  writeln(todec('751', 8));
end.

Автор: 6pika4u 18.5.2008, 13:21
Ребят,а как сделать обратную здачу?

Автор: Dobermann 18.5.2008, 15:53
Цитата

Ребят,а как сделать обратную здачу?

Нетрудно.... =)
Код

var a: array[1..20] of 0..1;
n,k,kol: integer;
begin
  writeln('>'); readln(n);
  kol:=0;
  while n>0 do
    begin
      kol:=kol+1; a[kol]:=n mod 2; n:=n div 2;
    end;
  writeln('2-я запись: ');
  for k:=kol downto 1 do write(a[k]);
  readln
end.

Автор: Agentum 10.12.2008, 12:08
Ребят,как перевести числа из систем счисления с основанием от 2 до 35 в десятичную?напишите пожалуйста алгоритм.

Автор: volvo877 10.12.2008, 12:28
Цитата(Agentum @  10.12.2008,  11:08 Найти цитируемый пост)
как перевести числа из систем счисления с основанием от 2 до 35 в десятичную?
digit в программе из 4-го поста заменить на
Код
  digit: string[36] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

Автор: Agentum 10.12.2008, 17:31
Спасибо.А как сделать перевод букв из нижнего регистра в верхний и выполнить проверку на правильность ввода числа в данной системе счисления?

Автор: volvo877 10.12.2008, 18:33
Цитата(Agentum @  10.12.2008,  16:31 Найти цитируемый пост)
как сделать перевод букв из нижнего регистра в верхний
Есть функция UpCase.

Цитата(Agentum @  10.12.2008,  16:31 Найти цитируемый пост)
выполнить проверку на правильность ввода числа в данной системе счисления
Что-то вроде этого:
Код
function isCorrect(s: string; radix: longint): boolean;
var i, p: integer;
begin
  isCorrect := false;
  for i := 1 to length(s) do begin
    p := pos(s[i], digit);
    if (p = 0) or (p > radix) then exit; { возвращаем false }
  end;
  isCorrect := true;
end;

(s - строка, в которой содержится запись числа, radix - система счисления)

Автор: Agentum 10.12.2008, 21:12
А функция апкейс случайно не требует модуля wincrt?

Автор: volvo877 10.12.2008, 21:23
Цитата(Agentum @  10.12.2008,  20:12 Найти цитируемый пост)
А функция апкейс случайно не требует модуля wincrt? 
Нет, не требует... Она содержится в модуле system, ничего подключать не надо...

Автор: Agentum 10.12.2008, 21:30
И еще...вот в проверке.как мне проверить,если в числе есть буква(ну например буква B,означающая 11),а система счисления например 11,где не может быть буквы В?

Автор: volvo877 10.12.2008, 22:57
Я уже написал выше, смотри внимательнее... Функция IsCorrect проверяет наличие запрещенных для данной системы счисления символов...

Автор: Agentum 11.12.2008, 13:31
И еще один глупый вопрос...если вводят число с минусом как его удалить,а затем поставить на место после перевода? 

Автор: Agentum 11.12.2008, 16:13
Блин еще вопрос.Как правильно обратиться к функции upcase?напишите пожалуйста правильно для данной программы.

Автор: Agentum 11.12.2008, 18:36
Все,спасибо.Разобрался с апкейс.только еще один вопрос...проверка правильности ввода числа не совсем работает:(она не проверяет число на лишние буквы...

Автор: Montr 12.12.2008, 12:17
Попробуй заменить
Цитата

  digit: string[36] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

на
Цитата

  digit: string[16] = '0123456789ABCDEF';

Автор: volvo877 12.12.2008, 13:07
Montr, очень умный, да? Я специально заменил на полную строку, чтобы можно было работать с системами счисления до 36...

Agentum, мне надоело заниматься телепатией: это у тебя не работает, то у тебя не работает... Все работает. Есть проблемы - приводи программу полностью и показывай при каких данных есть ошибка! Все.

Автор: Agentum 12.12.2008, 16:41
Хорошо,извини пожалуйста,спешу просто.Сегодня выложу код и покажу,что она делает неправильно(ну или я напортачил)

Автор: Agentum 13.12.2008, 15:48
Так...с проверками я разобрался.Возник вопрос при переводе чисел с точкой...как переделать функцию,чтобы она переводила дробные части чисел,то есть часть строки после точки?

Автор: volvo877 13.12.2008, 17:17
Цитата(Agentum @  13.12.2008,  14:48 Найти цитируемый пост)
Возник вопрос при переводе чисел с точкой...как переделать функцию,чтобы она переводила дробные части чисел,то есть часть строки после точки? 
У меня в профиле зайди по второй ссылке из списка "Любимые места в сети", там есть решение этой задачи...

Автор: Agentum 13.12.2008, 18:02
По второй ссылке нет ничего.:(

Автор: Agentum 13.12.2008, 18:27
Вот нашел по первой ссылке
2. перевод X radix-> X 10

Код
function to_dec(n: string; radix: longint): real;
var
 _int, stepen: longint;
 _frac: real;
  s: string;
 i, p: byte;
begin
 p := pos('.', n);
 if p = 0 then s := n
 else s := copy(n, 1, p - 1);
 {
  В вышеприведенных строках в строку s записывается либо целая часть числа,
  либо все число, если у него нет дробной части
 }
  _int := todec(s, radix); { Переводим целую часть в 10 систему счисления }
 _frac := 0.0;
  {
  Если есть вещественная часть - то выполняем ее перевод
  в систему с основанием radix
 }
 if (p <> 0) and (p < length(n)) then begin
   s := copy(n, p + 1, 255); { Копируем в s только дробную часть, безо всяких точек }
   { Удаляем лишние ведомые нули (справа) }
  while s[length(s)] = '0' do delete(s, length(s), 1);
   {
   по алгоритму нужно последовательно умножать цифры на числа,
   являющиеся обратными соответствующей степени системы счисления
  }
  stepen := 1; { Здесь будет храниться текущая степень системы счисления }
  for i := 1 to length(s) do begin
   stepen := stepen * radix;
    {
    собственно, алгоритм -умножаем цифру на обратное число
    и добавляем в аккумулятор
   }
   _frac := _frac + pred(pos(upcase(s[i]), digit)) / stepen;
  end;
  end;
 { собираем из двух частей результат: }
 to_dec := _int + _frac;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)