Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.10.2016, 10:39
Аватар для mrJo
mrJo mrJo вне форума
Прохожий
 
Регистрация: 22.10.2016
Сообщения: 3
Версия Delphi: Delphi 07
Репутация: 10
По умолчанию Перевод чисел из одной системы счисления в другую

Дорогие форумчане, объясните пожалуйста мне значение каждой строчки:

Код:
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  
Старый 25.10.2016, 13:34
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Строка 3 — пустая строка;
Строка 5 — пустая строка;
Строка 9 — пустая строка;
Строка 27 — пустая строка;
Строка 36-39 — пустая строка;
Строка 50 — пустая строка.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо M.A.D.M.A.N. за это полезное сообщение:
ApxaHGe1 (25.10.2016), ShamanVV (28.10.2016)
  #3  
Старый 25.10.2016, 14:39
Аватар для mrJo
mrJo mrJo вне форума
Прохожий
 
Регистрация: 22.10.2016
Сообщения: 3
Версия Delphi: Delphi 07
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Строка 3 — пустая строка;
Строка 5 — пустая строка;
Строка 9 — пустая строка;
Строка 27 — пустая строка;
Строка 36-39 — пустая строка;
Строка 50 — пустая строка.
очень остроумно, в таком случае 39 - не пустая строка, там записана процедура
Ответить с цитированием
  #4  
Старый 25.10.2016, 20:57
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ну а если в общем понимаешь сам язык, зачем спрашиваешь?
Не проще просто почитать про сам алгоритм? Например тут: https://ru.wikipedia.org/wiki/%D0%9F... .D0.B8.D1.8E
Ответить с цитированием
  #5  
Старый 27.10.2016, 19:14
Аватар для mrJo
mrJo mrJo вне форума
Прохожий
 
Регистрация: 22.10.2016
Сообщения: 3
Версия Delphi: Delphi 07
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
ну а если в общем понимаешь сам язык, зачем спрашиваешь?
Не проще просто почитать про сам алгоритм? Например тут: https://ru.wikipedia.org/wiki/%D0%9F... .D0.B8.D1.8E
сложно разобраться самому, на примере будет легче

Код:
function StrToIntM(s:string;M:word):int64;
возьмем для примера число 1010(2),
Код:
if i > Length(s) then // если после того как увеличили i, оно больше длины слова s, то...
первый i будет равен = 2 т.к.
Код:
do inc(i)
Length(s)=4
значит 2>4 это не правильно, поэтому цикл не запускаеться а значение резальт присваивается значение -1
Код:
else // иначе
Result:=-1; // резальт = -1
когда i будет равен 5, то запуститься цикл от единицы до 4
Код:
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
case = if
Код:
'0'..'9':Result:=Result*M + ord(s[i])-48; // тут выясняется какие символы в слове S
i=1
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  
Старый 27.10.2016, 23:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну давай смотреть.
Функция:
Код:
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;
вход - ('1010',2), те. 1010 в двоичной системе.
Сама функция переводит из какой-то системы (опр. 2-ым параметром) в десятичную.

сначала очищаем от пробелов и добавляем '0' спереди. Т.е имеем ('01010',2)
Дальше, выясняем, на какой позиции строки у нас есть символ, не входящий в список разрешенных (это цикл While - в условии проверяется вхождение символа в диапазон, верхняя граница которого вычисляется в зависимости от системы исчисления).
Дальше есть if. Если у нас все-таки встретились какие-то неправильные символы, то возвращаем -1 и выходим (это Else If'а). А вот если мы считаем, что все ОК, то приступаем к переводу.
Сам перевод достаточно прост. Сдвигаем текущий результат на разряд влево (путем умнодения на основание системы исчисления) и прибавляем текущее значение (три варианта, бо как цифры и буквы разного регистра находятся в разных местах ASCII таблицы, а там просто идет вычисление через код символа).

Ну вот примерно так. Теорию перевода я тебе уже дал. Вторую функцию и сам сможешь разобрать, там еще проще.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter