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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2010, 13:17   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию String[3] => Hex => Dec

Понимаю, что баян, но голова сегодня не варит совершенно.
Требуется перевести строку из трех символов в десятичное число. Символы в строке могут быть следующие: 0..F
Примечание: нельзя использовать функции, не находящиеся в system.

Начал рисовать, а потом спохватился, что неправильно.

Код:
Function GetNumber(S : String) : Integer;
Var
 N : Integer;
 Num : Byte;
Begin
 N := 1;
 Num := 1;
 Result := 0;
 While N <> 1000 Do
  Begin
   If S[Num] = '1' Then Result := Result + $1 * N;
   If S[Num] = '2' Then Result := Result + $2 * N;
   If S[Num] = '3' Then Result := Result + $3 * N;
   If S[Num] = '4' Then Result := Result + $4 * N;
   If S[Num] = '5' Then Result := Result + $5 * N;
   If S[Num] = '6' Then Result := Result + $6 * N;
   If S[Num] = '7' Then Result := Result + $7 * N;
   If S[Num] = '8' Then Result := Result + $8 * N;
   If S[Num] = '9' Then Result := Result + $9 * N;
   If S[Num] = 'A' Then Result := Result + $A * N;
   If S[Num] = 'B' Then Result := Result + $B * N;
   If S[Num] = 'C' Then Result := Result + $C * N;
   If S[Num] = 'D' Then Result := Result + $D * N;
   If S[Num] = 'E' Then Result := Result + $E * N;
   If S[Num] = 'F' Then Result := Result + $F * N;
   Inc(Num );
   N := N * 10;
  End;
End;
Прокатило бы для десятичной системы, а там шестнадццатиричная. Что подправить, чтобы сработало?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 21.03.2010, 14:25   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Старый добрый Паскаль )
Код:
var
  s: string;
  i, q: integer;
begin
  s := '01A';
  for i := 1 to 3 do if s[i] in ['A'..'F', 'a'..'f'] then begin
    s := '$' + s;
    break
  end;
  val(s, i, q);
  if q = 0 then write(i) else write('ne chislo');
  readln
end.
eoln вне форума Ответить с цитированием
Старый 21.03.2010, 14:36   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

eoln, Вы пытаетесь определить, шестнадцаричное ли число по наличию цифр от A до F
но это не так. по вашему $10 - это что, не шестнадцатеричное?
тогда уж проще
Код:
 s := '$' + s;
 Val(s, i, q);
а можно и так:
Код:
{строка  A..F должна иметь буквы в верхнем регистре! }
Function GetNumber(S : String) : Integer;
var i, One, N, Base : integer;
begin
  N := 0;
  Base := 1;
  for i:=length(s) downto 1 do begin
    if s[i]<'A' then
      One := ord(s[i])-ord('0')
    else
      One := ord(s[i])-ord('A') + 10;   
    N := N + One * Base;
    Base := Base * 16;
  end;
  GetNumber := N
end;

begin
 WriteLn('0x01 = ', GetNumber('01'));
 WriteLn('0x10 = ', GetNumber('10'));
 WriteLn('0xF10 = ', GetNumber('F10'));
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.03.2010, 14:53   #4
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Вот от строки (вчера на C++ как раз написал =) ):
Код:
function getValue(hex: char):integer;
begin
	if (Ord(hex) > 47) and (Ord(hex) < 57) then
		Result:= Ord(hex) - 48
	else if (Ord(hex) > 96) then
		Result:= Ord(hex) - 87
	else
		Result:= Ord(hex)-55;
end;
function HexToInt(hex: string): integer;
var
  i,r: Integer;
begin
  r:=0;
  for i := 1 to Length(hex) do
  begin
    r:=r*16+getValue(hex[i]);
  end;
  Result:=r;
end;
TwiX вне форума Ответить с цитированием
Старый 21.03.2010, 15:05   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Код:
s := '$' + s;
 Val(s, i, q);
Стоп, стоп, так Валя понимает шестнадцатиричные цифры?? О_о

Тогда беру эту

Всем спасибо!
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 21.03.2010, 17:07   #6
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
eoln, Вы пытаетесь определить, шестнадцаричное ли число по наличию цифр от A до F
но это не так. по вашему $10 - это что, не шестнадцатеричное?
тогда уж проще
Полностью согласен. Поторопился с примером, пытаясь показать, что val понимает 10 и 16 СС
eoln вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dec to Hex - пример использования Roof Общие вопросы Delphi 8 03.08.2008 19:40
HEX ->DEC 69_rus Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.06.2007 20:44