Конвертация чисел из любой системы исчисления в любую другую.

выкладываю модуль который умеет конвертировать числа любого исчисления в любое другое, используя длинную арифметику Biginteger (желаю чтоб этот модуль включили в сборку PascalABC). У кого есть желание пусть перегрузит под другие типы, лично я хотел иметь одну функцию для конвертации в любой тип но компилятор мне не позволил перегрузить функции с одинаковыми входными параметрами НО с разными на выходе, по этому экскюзьми…(на орфографию и коменты в нутри модуля сильно не заостряйтесь, небыло желания приводить их в порядок, так как втыкал в логику которая много раз не срасталась, но вроде все в порядке…)konvert.pas (32,7 КБ)

  1. Ну кинули бы сразу в Проекты.
  2. Для этого есть следующее:
begin
  System.Convert.ToInt32('2F',16).Print;
end.

Интересная библиотека.

Наверное, не надо. В проектах все представляли готовые продукты, а тут - модуль, претендующий на добавление в стандартный пакет. Обсуждение большое будет, никак не относящееся к “Проекты на PascalABC.NET”.

Совершенно грязный и “детский” с точки зрения PascalABС.NET код. И, конечно же, не работающий - надо делать собственный пример и думать, как. Обсуждать тут нечего особо. Включать такое в стандартный пакет с открытым кодом - просто позорище. Комментарии с точки зрения русского языка содержат массу ошибок. Конвертация “в любую другую” - слишком претензиозно, например, в систему счисления по основанию 26 я не вижу, как перевести. Как быть с нецелыми числами?

Для сравнения: вот код, написанный мной в качестве решения школьной задачки на ресурсе “Знания” и ни на что великое не претендующий. Он работает в относительно небольшом диапазоне чисел и не содержит контролей ()не школьный это уровень), но по крайней мере в пределах систем счисления по основаниям 2-16 работает и с нецелыми числами, а длина у него существенно меньше предлагаемого выше.

Summary
// PascalABC.NET 3.3.5, сборка 1644 от 23.03.2018
// Внимание! Если программа не работает, обновите версию!

function aToDec(n:string;k:integer):string;
// Перевод из системы по основанию k в десятичную
begin
  var s:='0123456789ABCDEF';
  Result:='';
  var PointPos:=Pos('.',n);
  if PointPos>0 then begin // есть дробная часть
    var sFracPart:=n[PointPos+1:];
    var r:=0.0;
    var p:=k;
    foreach var c in sFracPart do begin
      r+=(Pos(c,s)-1)/p;
      p*=k;
      end;
    Result:=r.ToString[2:]
    end
  else PointPos:=n.Length+1;
  var pa:=1;
  n:=n[:PointPos];
  var p:=0;
  foreach var c in n.Reverse do begin
    p+=pa*(Pos(c,s)-1);
    pa*=k
    end;
  Result:=p.ToString+Result
end;

function DecToa(n:string;k:integer):string;
// Перевод из десятичной системы в систему по основанию k
begin
  var s:='0123456789ABCDEF';
  Result:='';
  var PointPos:=Pos('.',n);
  var IntPart:integer;
  if PointPos>0 then begin // есть дробная часть
    var FracPart:=Frac(n.ToReal);
    var m:=0;
    while True do begin
      var r:=FracPart*k;
      Result+=s[Trunc(r)+1];
      FracPart:=Frac(r);
      m+=1;
      if (m=15) or (FracPart=0) then break
      end;
    IntPart:=n[:PointPos].ToInteger;
    end
  else IntPart:=n.ToInteger;
  if Result<>'' then Result:='.'+Result;
  while IntPart>0 do begin
    Result:=s[IntPart mod k+1]+Result;
    IntPart:=IntPart div k
    end;
  if Result='' then Result:='0';
  if Result[1]='.' then Result:='0'+Result
end;

function AtoB(s:string;A,B:integer):string;
// Перевод из системы по основанию A в систему по основанию B
begin
  if A=10 then Result:=DecToa(s,B)
  else
    if B=10 then Result:=aToDec(s,A)
    else Result:=DecToa(aToDec(s,A),B)
end;
    
begin
  var n:=ReadlnString('Какое число перевести?');
  var (a,b):=ReadInteger2('Исходное и результирующее основания:');
  Writeln(n,'(',a,') = ',AtoB(n,a,b),'(',b,')');
end.

И вот пример работы:

Какое число перевести? 134.53423
Исходное и результирующее основания: 12 8
134.53423(12) = 270.341173204573205(8)

Чет увидел button1_Click, и решил дальше не читать. Ко всему, зачем GUI? Лучший вариант исполнения - набор функций, причем без основной программы… Если уж язык поворачивается модулем это назвать.

Про велосипеды уже @Sun_Serega написал.

Почитал тут код konvert.pas. Забираю, пожалуй, обратно слова про GUI, с этим все корректно (хоть и оторвали бы руки в любом уважающем себя месте за button1).

Лол, каждая строка закомментирована :slight_smile: Очень советую изучить, как правильно код комментировать, ага. Вкратце - комментарий должен рассказывать, почему так сделано, а не как. И должен отсутствовать, если пояснять нечего. Над описанием функции стоит написать документирующий комментарий.

P.S. цЫЫЫЫЫЫЫЫЫЫЫфра!

Авторы “байсиклетов” и “перпетуумов” бессмертны. Несть числа их, и имя им - легион.

Авторскую версию особо не разбирал, но на контрольных примерах вроде работает. В чём ошибки, кроме нюанса с графической реализацией? Другое дело, что ещё на BP6 делали “mega” – 10 цифр + 26 букв = 36-ричную как string, но с базовыми математическими операндами, с выносом флага переполнения/ошибки и дробной части. Можно было и русские буквы подключить, но даже так было не очень удобно смешивать “нормальные” и “мегу”, за то иногда попадались осмысленные слова)

@MagDest, а какая основная цель? Ведь кроме BIN, OCT, DEC и HEX в основном не применяют, разве что для криптования (например, я так делал защиту от ArtMoney/GameEngine)

буттон это пример использования по нажатии кнопки. можешь сделать так var Bi:Biginteger:=Parse(‘1234567890’); var r:integer:=16; var ss:string:=IntToR16(Bi,R); и она переведет в 16-ти речную систему, подставив символы ABCDEF. Или так var ss:string:=‘FAFFFFcd12345’; var R:integer:=16; var Bi:Biginteger:=RToInt(R,ss); и получишь 10-и речное число Biginteger. А, можешь из стринга в стриг RToR(s1,s1); твоя детская неожиданность отфильтруется в корректный вид, и без всяких exception. А вот без филтрации на картинках%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%B5%D1%801

НЕ вопрос чуваки, покажите лучший код с темже результатом, именно код а не готовые встроенные функции. мои функции распознают даже 1-ричную систему исчисления…))) я уверен сократить вам на много не удастся, фильтрация мусорит код. Код в студию, тогда и поговорим.

исходник кочайте под сообщением , а не на картинку использования смотрите, на картинке чисто пример чтоб скопировал и получил результат, а не парился.

выкладываю еще раз >>>>>>>>>>>>>>>> konvert.pas (32,7 КБ)

Сообщение удалено. Причина: оскорбление пользователя. Если подобное повторится, приму меры.

“Чувак”, “буттон” - это понятно, что это. Я лишь к тому, что в нормальном коде принято их переименовывать в соответствии со смыслом. Иначе выходит следующее:

SomeFunction (textBox1.Value(), textBox3.Value(), spinBox31.Value(), doubleSpinBox47.Value(),...).

И как потом это читать? :slight_smile: А как забавно будет потом баги выковыривать, когда вместо 6 где-нибудь 7 случайно написал… Лол, понимание, что так делать нельзя, ко мне еще в шестом классе школы на кружке информатики, когда познал еще свежий на тот момент Delphi 7 :slight_smile:

1 лайк

Оскорбление пользователя.

будьте добры подскажите обратный процесс вот этому коду var ss:string:=‘1010’; var aa:integer:= System.Convert.ToInt32(ss,2);

прикольный ваш пример System.Convert.ToInt32(‘2F’,16).Print; НО есть большое НО, где в документации PascalABC написано, на какой странице хелпа??? Возможно я бы и не стал свой пример писать, потому как мне просто необходима была конвертация чисел. Даже в VisualStudio конвертация, да и литералы есть, а тут литералы пробовал они не идут, в документации литералы вообще не нашел, так что выход принял такой, а за одно вдруг кому пригодится выложил модуль, вчера написанный…)) возможны ошибки в фильтрации порций числа, не большие, но вроде все пучком подогнал. Без фильтрации код рабочий на все 100% давно использую для своих целей, лет 10 назад написал еще в делфи. И не на что я не претендую, это примитивные вещи чтоб делать их великими. По комбинаторике я бы с кем нибудь посражался в плане алгоритмов, а тут ерунда. Писали бы хелп подробный вопросы отпадали бы сами собой. Хотя, мой модуль берет любое исчисление и не ограничивает фантазию программиста, может кому то и пригодится. Более того фильтрует неверно отображенные порции числа, по этому немного и широкий. Но если кто то может показать код который выдаст тот же результат с меньшим числом строк, я только за. интересно бы посмотреть на внутренности вашего примера, как там фильтрация устроена, и я думаю что этот код ограничен 2-х 8-ми и 16-ти речной системой исчисления, так как порции у других исчислений должны как то разделяться, если 16-ти речной это символы то выше исчисление может и не хватить символов на клавиатуре, что маловато для опытов. так что мой код актуален и еще как, была бы фантазия где его использовать.

До меня только сейчас дошло что ты еще зеленый, в 6-м классе Delphi7, я после армии ковырял еще Delphi4 …))))))))))))) и еще раз повторяю, пример в студию с таким же результатом фильтрации. Баги выуживают при разработке, а когда готовый продукт программа должна или сообщать об неправильном вводе или что то с этим делать.Более того, из десятичной формы в любую другую тебе баги выуживать не нужно, так как это Biginteger. А, если тебе нужны сообщения от конвертации в Biginteger, то ты лего можешь сделать фильтрацию сам даже изменив мой код, к примеру, там где условие проверки не соответствия речьности, но тогда тебе придется использовать какой то конкретный разделитель порций числа, что не интересно в принципе, у меня можно использовать и пробел и любой другой символ не входящий в исчисление. На самом деле последовательная фильтрация за один проход в строке не так уж проста, и наврятли получится последовательно за один проход ее сделать иначе, потому как подразумевается конвертация чисел любой длинны, и гонять их по массивам анализируя по нескольку раз не актуально. короче спрячь свою гордость куда подальше, но если найдешь ошибку в работе самого кода, я буду благодарен за подсказку.

Нигде, и правильно, потому что пространство имён System - это проделки .Net . А вот в документации .Net это есть.

1 лайк

Все это легко реализуемо через модулярную арифметику и полиномы. Желающие могут вкурить второй том Д.Кнута. Единственная небольшая проблема - представление цифр числа в n-ричной системе счисления - надо иметь n значков в алфавите.

Аааа, понял. Я то всё никак понять не мог, что такое речность, а оказалось, что это широко известная ричность системы. :smile:

1 лайк

Возможно, это какой-то украинизированный вариант.

1 лайк