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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2010, 20:57   #1
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию Вывод текста в мемо "ступеньками"

Всем доброго времени суток. Нухно загрузить примерно такой текст: ((acbbd(100,000100,000100010))) в мемо, причём с отступами, т.е.: (парсер мои отступы "убил" пришлось заменить точками)

(
.(
..acbbd
..........(
...........100
................,
.................000100
...........................,
............................0001000 10
................................... .......)
................................... ........)
................................... .........)

Предварительно переведя все числа в десятичную систему счисления. Но текст после перевода и выводится вот так, в выделенном месте видно, что отступ не правильный.

(
..(
...2763
........(

..........4
...........,
............34
...............)
................)
.................)

Это для грамматики ((acb(100,100010))).

Вот процедура добавления в мемо:

Код:
procedure TTxtGenerator.AddWord(AWord: string);
var
  I: integer;
  strIndention: string;
begin
  strIndention := '';
  with frmMain.memOutput do
  begin
    if Lines.Count <> 0 then
    begin
      for I := 0 to Length(Lines[Lines.Count - 1]) do
        strIndention := strIndention + ' ';
    end;
    Lines.Add(strIndention + AWord);
  end;
end;
И ещё почему-то у меня число acbdbddd при переводе в десятичную сс превращается в: -1396851235

Вот процедуры перевода, не пойму что не так:

Код:
function TTxtGenerator.BinToDec(AWord: string): string;
var
  I, J: integer;
  intDegree: integer;
  intResult: integer;
begin
  intResult := 0;
  for I := Length(AWord) - 1 downto 1 do
  begin
    if AWord[i] = '1' then
    begin
      intDegree := 1;
      for J := 1 to length(AWord) - i do
        intDegree := intDegree * 2;
    end else
      intDegree := 0;
      intResult := intResult + intDegree;
  end;
  if AWord[length(AWord)] = '1' then
    Inc(intResult);
  Result := IntToStr(intResult);
end;

function TTxtGenerator.HexToDec(AWord: string): string;
var
  I: integer;
  strBinWord: string;
begin
  for I := 1 to Length(AWord) do
  begin
    case AWord[I] of
      'a': strBinWord := strBinWord + '1010';
      'b': strBinWord := strBinWord + '1011';
      'c': strBinWord := strBinWord + '1100';
      'd': strBinWord := strBinWord + '1101';
    end;
  end;
  Result := BinToDec(strBinWord);
end;
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли

Последний раз редактировалось Marsel737; 03.05.2010 в 21:01.
Marsel737 вне форума Ответить с цитированием
Старый 03.05.2010, 21:06   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Result := IntToStr(intResult);
Inttostr понятия не имеет о первых (незначащих) нулях

000100 =100

2763=002763
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 03.05.2010, 21:11   #3
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

evg_m, это не то, там двоичное число переводится в десятичное, т.е. примерно так:

Код:
Result := IntToStr(128);
Нулей там быть не может
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 03.05.2010, 22:16   #4
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Цитата:
Сообщение от Marsel737 Посмотреть сообщение
И ещё почему-то у меня число acbdbddd при переводе в десятичную сс превращается в: -1396851235
ACBDBDDD = 1010110010111101101111011101...
Недумаю что integer потянет такую цыфру, так же недумаю что и Int64 потянет... Хотя могу ошибаться на счет Int64.
W0LF вне форума Ответить с цитированием
Старый 03.05.2010, 22:30   #5
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

W0LF, а почему же не потянет?

Для перевода в десятичную:

1010110010111101101111011101 = 2^27 + 2^25 + 2^23 + 2^22 + ..., при том что 2^27 = 134217728, а размерность типа integer: -2147483648..2147483647
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 03.05.2010, 22:43   #6
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Я перепутал... перевел Hex в Bin))
А в Dec = 181132253 - integer потянет... почему у вас СС это минусовое число я без понятия... Гдето закралась ошибка...
W0LF вне форума Ответить с цитированием
Старый 03.05.2010, 23:03   #7
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Код:
function HexToInt(s: string): Longword;
 var
   b: Byte;
   c: Char;
 begin
   Result := 0;
   s := UpperCase(s);
   for b := 1 to Length(s) do
   begin
     Result := Result * 16;
     c := s[b];
     case c of
       '0'..'9': Inc(Result, Ord(c) - Ord('0'));
       'A'..'F': Inc(Result, Ord(c) - Ord('A') + 10);
       else
         raise EConvertError.Create('No Hex-Number');
     end;
   end;
 end;
Перевело acbdbddd в 2898116061

И BinToInt:
Код:
 function BinToInt(Value: string): Integer;
 var
   i, iValueSize: Integer;
 begin
   Result := 0;
   iValueSize := Length(Value);
   for i := iValueSize downto 1 do
     if Value[i] = '1' then Result := Result + (1 shl (iValueSize - i));
 end;
P.S.: сорри за 2 сообщения, забыл, что писал последний я)
W0LF вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
настроить при открытии Excel 2003 в окошке "Тип файлов" вывод пункта "Все файлы (*.*)" по умолчанию? Unior Microsoft Office Excel 2 01.03.2009 02:42
Оператор амперсанд "&" или число внутри текста dotvz Microsoft Office Excel 2 02.04.2008 14:33