Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2009, 16:44   #1
~AngelOK~
 
Регистрация: 20.10.2008
Сообщений: 8
По умолчанию Перевод в различные системы исчисления

Помогите, пожалуйста! Нужно написать программу в Delphi, чтоб переводила в разные системы исчисления: то есть, от двоичной до шестнадцатеричной.

Я тут пробовала через цикл делать, то есть у нас имеется исходное число (Ch), основание системы (Os), они вводятся либо с клавы, либо там через выпадающий список, ну это неважно. R - это остатки от деления (ведь чтобы перевести в разные системы, нужно деление).
Я пробовала так:

St:=''; (St - это то, что должно у нас получиться в итоге)
Repeat
R:= Ch mod Os; (берем остаток от деления)
Ch:=Ch div Os (исходное число изменяется для следующего деления)
Str (R, Sr); (переводим остаток в строку)
St:=Sr+St; (к строке добавляем остаток)
until Ch>Os (пока число больше основания)

А что дальше, не знаю...
Не смотрите на мою дату рождения))Мне меньше на два года))
~AngelOK~ вне форума Ответить с цитированием
Старый 11.10.2009, 16:57   #2
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

Код:
//Определяет какая цифра соответствует числу.
function IntToDigit(aNum : Byte) : String;
const
  SelfName : String = 'IntToDigit.';
begin
  case aNum of
    0..9 : Result := IntToStr(aNum);
    10   : Result := 'A';
    11   : Result := 'B';
    12   : Result := 'C';
    13   : Result := 'D';
    14   : Result := 'E';
    15   : Result := 'F';
  else
    Raise Exception.Create(SelfName + ' Числу не сопоставлена цифра!');
  end;
end;
 
//Определяет какое число соответствует цифре.
function DigitToInt(aDigit : AnsiChar; aBase : Byte) : Byte;
const
  SelfName : String = 'DigitToInt.';
begin
  if aBase < 2 then
    Raise Exception.Create(SelfName + ' Основание системы счисления должно быть >= 2!')
  ;
  case aDigit of
    '0'..'9' : Result := StrToInt(aDigit);
    'A', 'a' : Result := 10;
    'B', 'b' : Result := 11;
    'C', 'c' : Result := 12;
    'D', 'd' : Result := 13;
    'E', 'e' : Result := 14;
    'F', 'f' : Result := 15;
  else
    Raise Exception.Create(SelfName + ' Неизвестный символ в представлении числа!');
  end;
  if Result > aBase - 1 then
    Raise Exception.Create(SelfName + ' В данной системе счисления нет такой цифры!')
  ;
end;
 
//По записи числа в системе счисления с онованием aBase, определяет само это число.
function XcimalStrToNumber(aStrXcimal : String; aBase : Byte) : Extended;
const
  SelfName : String = 'XcimalStrToNumber.';
var
  i, j      : Integer;
  StrInt    : String;
  StrFrac   : String;
  Pos1      : Integer;
 
  IntPart    : Extended;
  FracPart   : Extended;
begin
  if Length(aStrXcimal) = 0 then
    Raise Exception.Create(SelfName + ' Не задано число!')
  ;
 
  //Ищем десятичную точку. Она у нас обозначается знаком запятая: ','.
  Pos1 := Pos(',', aStrXcimal);
 
  //Определяем подстроку с записью целой части числа
  //и подстроку с записью дробной части.
  if Pos1 = 0 then begin
    //Значит число состоит только из целой части.
    StrInt := aStrXcimal;
    StrFrac := '';
  end else begin
    //Число имеет целую и дробную части.
    StrInt := LeftStr(aStrXcimal, Pos1 - 1);
    StrFrac := Copy(aStrXcimal, Pos1 + 1, Length(aStrXcimal) - Pos1);
  end;
 
  //Определяем значение целой части числа.
  IntPart := 0;
  for i := 1 to Length(StrInt) do begin
    //Порядок разряда = позиции разряда при отсчёте от нуля в направлении справа налево.
    j := Length(StrInt) - i;
    IntPart := IntPart + DigitToInt(StrInt[i], aBase) * Power(aBase, j);
  end;
 
  //Определяем значение дробной части числа.
  //В начале вычисляем значение аналогично тому, как это сделано для целой части:
  FracPart := 0;
  for i := 1 to Length(StrFrac) do begin
    j := Length(StrFrac) - i;
    FracPart := FracPart + DigitToInt(StrFrac[i], aBase) * Power(aBase, j);
  end;
  //Теперь учитываем экспоненциальную часть:
  FracPart := FracPart / Power(aBase, Length(StrFrac));
 
  //Получаем число, которое соответствует записи aStrXcimal
  //в системе счисления с основанием aBase.
  Result := IntPart + FracPart;
 
end;
 
//Преобразует запись числа в системе счисления с основанием aSrcBase в запись
//этого же числа в системе счисления с онованием aTrgBase.
//Преобразование производится с точностью до aTrgPrecision цифр после запятой
//в результирующем представлении числа.
function XcimalStrToYcimalStr (
  aSrcBase : Byte;
  aSrcNumStr : String;
  aTrgBase : Byte;
  aTrgPrecision : Byte
) : String;
var
  //Число соответствующее записи aSrcNumStr в системе счисления с основанием aSrcBase.
  SrcNum : Extended;
  //Целая часть, выделенная из числа SrcNum.
  IntPart : Int64;
  //Дробная часть, выделенная из числа SrcNum.
  FracPart : Extended;
  //Представление целой части числа SrcNum в системе счисления с основанием aTrgBase.
  StrInt : String;
  //Представление дробной части числа SrcNum в системе счисления с основанием aTrgBase.
  StrFrac : String;
  //Счетчик.
  i : Integer;
  //Для промежуточных вычислений.
  TempNum : Extended;
begin
 
  //Исходное число.
  SrcNum := XcimalStrToNumber(aSrcNumStr, aSrcBase);
 
  // Получаем целую и дробную части числа.
  IntPart := Trunc(SrcNum);
  FracPart := Frac(SrcNum);
 
  //Переводим целую часть.
  StrInt := '';
  repeat
    StrInt := IntToDigit(IntPart mod aTrgBase) + StrInt;
    IntPart := IntPart div aTrgBase;
  until IntPart = 0;
 
  // Если дробная часть = 0, то перевод закончен.
  if FracPart = 0 then begin
    Result := StrInt;
    exit;
  end;
 
  //Переводим дробную часть. Точность - до aTrgPrecision цифр после запятой.
  StrFrac := '';
  for i := 1 to aTrgPrecision do begin
    TempNum := FracPart * aTrgBase;
    StrFrac := StrFrac + IntToDigit(Trunc(TempNum));
    FracPart := Frac(TempNum);
    //Если дробная часть = 0, то перевод закончен.
    if FracPart = 0 then Break;
  end;
 
  Result := StrInt + ',' + StrFrac;
 
end;
end.
copyright Mawrat
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод из одной системы исчисления в другую. Svop Помощь студентам 7 20.12.2010 19:00
Перевод числа в различные системы счисления ...Оленька... Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 14.12.2008 16:08
перевод системы исчисления (16 ->10) adwaer Помощь студентам 5 15.06.2008 20:29
Перевод чисел в различные С.С. Omedus Общие вопросы Delphi 5 05.11.2007 14:06