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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2010, 09:59   #1
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию Чтение из строки параметры чисел (парсер)

Вот сделал такие вот функции:

Код:
function StrIsNumbers(C : Char) : boolean;
begin
 Result := False;

case c of
   '0' : result := true;
   '1' : result := true;
   '2' : result := true;
   '3' : result := true;
   '4' : result := true;
   '5' : result := true;
   '6' : result := true;
   '7' : result := true;
   '8' : result := true;
   '9' : result := true;
  end;

end;

Код:
function Read_Parametr_Str(Str : string; parametr : Word): string;
var
 I, I2 : word;
 _string : string;
 Wr : Word;

begin
 Wr := 0;

  for I:=1 to Length(Str) do
      begin

        if StrIsNumbers(Str[I]) then
           begin

             if Str[I-1] = ' ' then
                begin
                  Wr := Wr + 1;

                    for I2:=I to Length(Str) do
                       begin

                         if  (Str[I2] = ' ') and (Wr = parametr) then
                             begin
                               Result :=  _string;
                               Exit;
                             end;


                      if Wr = parametr then
                         begin
                          _string := _string + Str[I2];
                           Result :=  _string;
                         end;

                       end;


                end;

          end;

      end;

end;
StrIsNumbers(с : char) - проверяет является ли числом символ?
Read_Parametr_Str(Str : string; parametr : word) - читает из строки str
параметр parametr допустим первый 1.

Вопрос такой можно ли написать по проще этого и по лучше???
VintProg вне форума Ответить с цитированием
Старый 04.06.2010, 10:09   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

function StrIsNumbers(C : Char) : boolean; Посмотри на коды цифр, они расположены рядом. Можно просто проверять удовлетворяет ли данный символ определенному диапазону.
Нет инициализации результата. Что если на входе будет пустая строка? Цикл не выполнится и что я получу в результате? В лучшем случае ошибку, а в худшем, какую-нибудь белиберду и прога будет дальше работать не правильно. Далее, аналогично, что будет если я задам отрицательный параметр или параметр, которого нет в строке? Допустим в строке три слова, а я хочу 128-е?
Далее полное отсутствие комментариев. К чему это приводит? Да вот хотя бы ко всему тому, что я уже написал выше. А в результате отлаживать такой код потом будет очень тяжело.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 04.06.2010, 10:14   #3
bitSoft
Programming...
Форумчанин
 
Аватар для bitSoft
 
Регистрация: 13.03.2010
Сообщений: 198
По умолчанию

Код:
function StrIsNumbers(C : Char) : boolean;
begin
 Result := C in ['0'..'9'];
end;
Код:
With TProgrammersForum.Create do  AddNewTopic('Title','Content...');
bitSoft вне форума Ответить с цитированием
Старый 04.06.2010, 10:14   #4
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Ладно я поработаю над этим, как советует профессионал Utkin .
VintProg вне форума Ответить с цитированием
Старый 04.06.2010, 10:16   #5
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

procedure Explode(Delimeter:string;SourceStri ng:string;DestList:TStrings);
var DPos, I:Integer;
Line:string;
begin
for I:=0 to Length(SourceString) do
begin
DPos:=AnsiPos(Delimeter,SourceStrin g);
if DPos=0 then
begin
DestList.Add(TrimLeft(TrimRight(Sou rceString)));
break;
end;
Line:=Copy(SourceString,0,DPos-1);
if Trim(Line)<>'' then DestList.Add(TrimLeft(TrimRight(Lin e)));
SourceString:=Copy(SourceString,DPo s+1,length(SourceString));
end;
end;
Функция написана для других целей но и тебе может помочь.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 04.06.2010, 10:16   #6
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Код:
C in ['0'..'9'];
Вот про это я не знал.
VintProg вне форума Ответить с цитированием
Старый 04.06.2010, 10:21   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от VintProg Посмотреть сообщение
Код:
C in ['0'..'9'];
Вот про это я не знал.
Срочно ищем в гугле Дельфи множества
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 04.06.2010, 10:25   #8
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Блин, в голову не приходит как написать парсер правильно.
VintProg вне форума Ответить с цитированием
Старый 04.06.2010, 10:32   #9
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Напиши сначала алгоритм парсера своего.
Если речь идет о той строке что ты выкладывал в другой ветке то.
По логике надо идти по пути...
Тебя не интересует что в строке до первого пробела. Т.к. там буквы.
AnsiPos(' ',твоя строка).
Выкидываешь то что до этой позиции нафиг.
Потом у тебя 2 цифры разделенных пробелом.
Опять же AnsiPos(' ', остаток твоей строки).
То что до позиции это одино число то что после второе.
Все.
И да trim не забывай.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 04.06.2010, 11:24   #10
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

А так:
Код:
function Read_Parametr_Str(Str : string; parametr : Word): string;
var
 I, I2 : word;
 _string : string;
 Wr : Word;

begin
 Wr := 0;

if parametr <= 0 then
   exit;

  for I:=1 to Length(Str) do
      begin

        if StrIsNumbers(Str[I]) then
           begin

             if (Str[I-1] = ' ') or (Str[I-1] = '')  then
                begin
                  Wr := Wr + 1;

                    for I2:=I to Length(Str) do
                       begin

                         if  (Str[I2] = ' ') and (Wr = parametr) then
                             begin
                               Result :=  _string;
                               Exit;
                             end;


                      if Wr = parametr then
                         begin
                          _string := _string + Str[I2];
                           Result :=  _string;
                         end;

                       end;


                end;

          end;

      end;

end;

Последний раз редактировалось VintProg; 04.06.2010 в 11:29.
VintProg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Параметры из ком. строки MalCer Общие вопросы Delphi 6 15.02.2010 18:05
параметры командной строки. nazavrik Общие вопросы C/C++ 4 20.11.2009 20:15
Параметры коммандной строки BaronTreep Общие вопросы Delphi 4 30.05.2009 21:27
Параметры из командной строки ProGg Паскаль, Turbo Pascal, PascalABC.NET 5 13.02.2009 00:17