|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Перевод чисел из одной системы счисления в другую
Дорогие форумчане, объясните пожалуйста мне значение каждой строчки:
Код:
var Form1: TForm1; implementation {$R *.dfm} const Symb:array[0..15] of char='0123456789ABCDEF'; function StrToIntM(s:string;M:word):int64; var i:integer; begin s:='0'+Trim(s); Result:=0;i:=1; while (i <= Length(s)) and (s[i] in [Symb[0]..Symb[M-1]]) do inc(i); if i > Length(s) then for i:=1 to length(s) do case s[i] of '0'..'9':Result:=Result*M + ord(s[i])-48; 'A'..'F':Result:=Result*M + ord(s[i])-55; 'a'..'f':Result:=Result*M + ord(s[i])-87; end //case else Result:=-1; end; function IntToStrM(x:int64;M:word):string; begin Result:=''; repeat Result:=Symb[x-M*(x div M)]+Result; x:=x div M; until x <= 0 ; end; procedure TForm1.Edit1Change(Sender: TObject); var x:int64; begin if Edit1.Focused then x:=StrToIntM(Edit1.Text,2) else if Edit2.Focused then x:=StrToIntM(Edit2.Text,8) else if Edit3.Focused then x:=StrToIntM(Edit3.Text,10) else if Edit4.Focused then x:=StrToIntM(Edit4.Text,16); if x < 0 then Beep; if not Edit1.Focused then if x >= 0 then Edit1.Text:=IntToStrM(x,2) else Edit1.Text:=''; if not Edit2.Focused then if x >= 0 then Edit2.Text:=IntToStrM(x,8) else Edit2.Text:=''; if not Edit3.Focused then if x>= 0 then Edit3.Text:=IntToStrM(x,10) else Edit3.Text:=''; if not Edit4.Focused then if x>=0 then Edit4.Text:=IntToStrM(x,16) else Edit4.Text:=''; end; |
#2
|
||||
|
||||
Строка 3 — пустая строка;
Строка 5 — пустая строка; Строка 9 — пустая строка; Строка 27 — пустая строка; Строка 36-39 — пустая строка; Строка 50 — пустая строка. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
Цитата:
|
#4
|
|||
|
|||
ну а если в общем понимаешь сам язык, зачем спрашиваешь?
Не проще просто почитать про сам алгоритм? Например тут: https://ru.wikipedia.org/wiki/%D0%9F... .D0.B8.D1.8E |
#5
|
||||
|
||||
Цитата:
Код:
function StrToIntM(s:string;M:word):int64; Код:
if i > Length(s) then // если после того как увеличили i, оно больше длины слова s, то... Код:
do inc(i) значит 2>4 это не правильно, поэтому цикл не запускаеться а значение резальт присваивается значение -1 Код:
else // иначе Result:=-1; // резальт = -1 Код:
for i:=1 to length(s) do // то нужно выполнить цикл от единицы до кол-ва символов слова S case s[i] of // тут выясняется какие символы в слове S '0'..'9':Result:=Result*M + ord(s[i])-48; // тут выясняется какие символы в слове S 'A'..'F':Result:=Result*M + ord(s[i])-55; // тут выясняется какие символы в слове S 'a'..'f':Result:=Result*M + ord(s[i])-87; // тут выясняется какие символы в слове S end //case Код:
'0'..'9':Result:=Result*M + ord(s[i])-48; // тут выясняется какие символы в слове S s[i]=1 ord(s[i])=1 резальт = 0*10(т.к. переводим в десятичную систему, или надо на 2? т.к. переводим из двоичной?)+(1-48)=-47 резальт = -47*10+(0-48)=-518 резальт = -518*10+(1-48)=-5227 резаль = -5227*10+(0-48)=-52318 какая-то фигня получается |
#6
|
|||
|
|||
Ну давай смотреть.
Функция: Код:
function StrToIntM(s:string;M:word):int64; var i:integer; begin s:='0'+Trim(s); Result:=0;i:=1; while (i <= Length(s)) and (s[i] in [Symb[0]..Symb[M-1]]) do inc(i); if i > Length(s) then for i:=1 to length(s) do case s[i] of '0'..'9':Result:=Result*M + ord(s[i])-48; 'A'..'F':Result:=Result*M + ord(s[i])-55; 'a'..'f':Result:=Result*M + ord(s[i])-87; end //case else Result:=-1; end; Сама функция переводит из какой-то системы (опр. 2-ым параметром) в десятичную. сначала очищаем от пробелов и добавляем '0' спереди. Т.е имеем ('01010',2) Дальше, выясняем, на какой позиции строки у нас есть символ, не входящий в список разрешенных (это цикл While - в условии проверяется вхождение символа в диапазон, верхняя граница которого вычисляется в зависимости от системы исчисления). Дальше есть if. Если у нас все-таки встретились какие-то неправильные символы, то возвращаем -1 и выходим (это Else If'а). А вот если мы считаем, что все ОК, то приступаем к переводу. Сам перевод достаточно прост. Сдвигаем текущий результат на разряд влево (путем умнодения на основание системы исчисления) и прибавляем текущее значение (три варианта, бо как цифры и буквы разного регистра находятся в разных местах ASCII таблицы, а там просто идет вычисление через код символа). Ну вот примерно так. Теорию перевода я тебе уже дал. Вторую функцию и сам сможешь разобрать, там еще проще. |