выкладываю модуль который умеет конвертировать числа любого исчисления в любое другое, используя длинную арифметику Biginteger (желаю чтоб этот модуль включили в сборку PascalABC). У кого есть желание пусть перегрузит под другие типы, лично я хотел иметь одну функцию для конвертации в любой тип но компилятор мне не позволил перегрузить функции с одинаковыми входными параметрами НО с разными на выходе, по этому экскюзьми…(на орфографию и коменты в нутри модуля сильно не заостряйтесь, небыло желания приводить их в порядок, так как втыкал в логику которая много раз не срасталась, но вроде все в порядке…)konvert.pas (32,7 КБ)
- Ну кинули бы сразу в Проекты.
- Для этого есть следующее:
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).
Лол, каждая строка закомментирована Очень советую изучить, как правильно код комментировать, ага. Вкратце - комментарий должен рассказывать, почему так сделано, а не как. И должен отсутствовать, если пояснять нечего. Над описанием функции стоит написать документирующий комментарий.
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. А вот без филтрации на картинках
НЕ вопрос чуваки, покажите лучший код с темже результатом, именно код а не готовые встроенные функции. мои функции распознают даже 1-ричную систему исчисления…))) я уверен сократить вам на много не удастся, фильтрация мусорит код. Код в студию, тогда и поговорим.
исходник кочайте под сообщением , а не на картинку использования смотрите, на картинке чисто пример чтоб скопировал и получил результат, а не парился.
Сообщение удалено. Причина: оскорбление пользователя. Если подобное повторится, приму меры.
“Чувак”, “буттон” - это понятно, что это. Я лишь к тому, что в нормальном коде принято их переименовывать в соответствии со смыслом. Иначе выходит следующее:
SomeFunction (textBox1.Value(), textBox3.Value(), spinBox31.Value(), doubleSpinBox47.Value(),...).
И как потом это читать? А как забавно будет потом баги выковыривать, когда вместо 6 где-нибудь 7 случайно написал… Лол, понимание, что так делать нельзя, ко мне еще в шестом классе школы на кружке информатики, когда познал еще свежий на тот момент Delphi 7
Оскорбление пользователя.
будьте добры подскажите обратный процесс вот этому коду 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 это есть.
Все это легко реализуемо через модулярную арифметику и полиномы. Желающие могут вкурить второй том Д.Кнута. Единственная небольшая проблема - представление цифр числа в n-ричной системе счисления - надо иметь n значков в алфавите.
Аааа, понял. Я то всё никак понять не мог, что такое речность, а оказалось, что это широко известная ричность системы.
Возможно, это какой-то украинизированный вариант.