Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Как представить число в другой системе счисления

Delphi , Синтаксис , Типы и Переменные

Как представить число в другой системе счисления

Автор: http://www.swissdelphicenter.ch

function BaseConvert(NumIn: string; BaseIn: Byte; BaseOut: Byte): string;
var
  i: integer;
  currentCharacter: char;
  CharacterValue: Integer;
  PlaceValue: Integer;
  RunningTotal: Double;
  Remainder: Double;
  BaseOutDouble: Double;
  NumInCaps: string;
  s: string;
begin
  if (NumIn = '') or (BaseIn < 2) or (BaseIn > 36) or (BaseOut < 1) or (BaseOut
    > 36) then
  begin
    Result := 'Error';
    Exit;
  end;

  NumInCaps := UpperCase(NumIn);
  PlaceValue := Length(NumInCaps);
  RunningTotal := 0;

  for i := 1 to Length(NumInCaps) do
  begin
    PlaceValue := PlaceValue - 1;
    CurrentCharacter := NumInCaps[i];
    CharacterValue := 0;
    if (Ord(CurrentCharacter) > 64) and (Ord(CurrentCharacter) < 91) then
      CharacterValue := Ord(CurrentCharacter) - 55;

    if CharacterValue = 0 then
      if (Ord(CurrentCharacter) < 48) or (Ord(CurrentCharacter) > 57) then
      begin
        BaseConvert := 'Error';
        Exit;
      end
      else
        CharacterValue := Ord(CurrentCharacter);

    if (CharacterValue < 0) or (CharacterValue > BaseIn - 1) then
    begin
      BaseConvert := 'Error';
      Exit;
    end;
    RunningTotal := RunningTotal + CharacterValue * (Power(BaseIn, PlaceValue));
  end;

  while RunningTotal > 0 do
  begin
    BaseOutDouble := BaseOut;
    Remainder := RunningTotal - (int(RunningTotal / BaseOutDouble) *
      BaseOutDouble);
    RunningTotal := (RunningTotal - Remainder) / BaseOut;

    if Remainder >= 10 then
      CurrentCharacter := Chr(Trunc(Remainder + 55))
    else
    begin
      s := IntToStr(trunc(remainder));
      CurrentCharacter := s[Length(s)];
    end;
    Result := CurrentCharacter + Result;
  end;
end;

// Example, Beispiel

procedure TForm1.Button1Click(Sender: TObject);
begin
  BaseConvert('FFFF', 16, 10);
  // returns, ergibt '65535'.
end;

Перевод контента на русский язык:

Функция Pascal, конвертирующая число из одного основания в другое. Функция принимает три параметра:

  • NumIn: входное число как строка
  • BaseIn: основание входного числа (между 2 и 36)
  • BaseOut: желаемое основание вывода (между 1 и 36)

Функция сначала проверяет, является ли ввод корректным, то есть если входное число пусто или основания не находятся в допустимом диапазоне. Если ввод некорректен, функция возвращает сообщение об ошибке.

Если ввод корректен, функция конвертирует входное число в десятичный формат с помощью функции Power и затем конвертирует результат в желаемое основание с помощью аналогичного подхода.

Вот шаг за шагом, что функция делает:

  1. Она преобразует строку ввода в верхний регистр и рассчитывает длину строки.
  2. Она initializes running total to zero and iterates through each character in the input string.
  3. Для каждого символа она проверяет, является ли символ буквой (A-Z) или цифрой (0-9). Если это буква, она вычитает 55 из ее ASCII-значения, чтобы получить соответствующее десятичное значение (65-90).
  4. Она добавляет десятичное значение каждого символа к running total, взвешивая его по значению места (например, первый символ умножается на BaseIn в степени (Length(NumInCaps) - 1)).
  5. Once the input string has been processed, it enters a loop that continues until the running total becomes zero.
  6. В каждой итерации цикла она рассчитывает остаток от деления running total на BaseOut, добавляет соответствующий символ (0-9 или A-Z) к результатной строке и обновляет running total.

Пример процедуры в конце демонстрирует, как использовать эту функцию для конвертации hexadecimal числа (FFFF) в десятичное. Вывод - '65535'.

Вот альтернативное решение с более современным подходом:

function BaseConvert(NumIn: string; BaseIn: Byte; BaseOut: Byte): string;
var
  i: integer;
  RunningTotal: integer;
begin
   // ...
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Result := IntToBase(Integer(StrToInt('FFFF', 16)), 10);
end;

В этом варианте мы используем функцию IntToBase из модуля System.SysUtils Delphi для конвертации результатов базовой конвертации в строку. Этот подход более компактен и легче для чтения, чем оригинальное реализация.

В статье описывается алгоритм и функция в Pascal для представления числа в другой системе счисления.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Типы и Переменные ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-06-02 10:20:12
2024-06-16 03:45:30/0.0073161125183105/2