На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> s := как мне ее отпарсить, чтобы на выходе получить три целочисленные переменные
    Всем программистам привет! Respect! Встал на проблеме, которую думал, что сделаю быстро и легко. Допустим есть такая строка:
    ExpandedWrap disabled
      s := "12.10.1998";

    как мне ее отпарсить, чтобы на выходе получить три целочисленные переменные, в одной из которых 12, во второй 10 и в третьей 1998. Желательно саму переменную s не испортить после преобразования. Стал делать, и понял что автоматизировать процесс не получается мне + кучу переменных. А на самом деле задача такая, есть некая функция, например
    ExpandedWrap disabled
      function(f : string; s : string) : boolean;
      begin
      end;
    которая принимает два строковых параметра в виде "xx.xx.xxxx" или "x.x.xxxx" или "xx.x.xxxx" или "x.xx.xxxxx" и возвращает труе, если первая более второй и фалсе соот - но наоборот. Подскажите как быть то?
      в Delphi есть функция StrToDate, но не помню, было ли подобное в Паскале.
      Однако если формат более-менее жесткий,и отличается только возможным количеством позиций под число, то никаких проблем разобрать его не составляет - просто идешь по строке - встретил точку - копируешь от начала или от прошлой точки до текущей, и переводишь в число
        я согласен с вами, но копирование портит строку, т е теряется хвост строки.

        Добавлено
        прошу прощения, что то я загнал, сейчас проверил на простом примере, действительно можно заюзать copy. Thank's. Незнание синтаксиса порождает огромные проблемы для меня :)

        Добавлено
        все равно получилось как то не программно :) , только для первого числа:
        ExpandedWrap disabled
          {===========================================================}
          {функция сравнивает два значения между собой}
          function equals(first : string; second : string) : boolean;
          var
              f_d, s_d : byte;
              f_m, s_m : byte;
              f_y, s_y : word;
              index : byte;
              tmpFirst, tmpSecond : string;
              code : integer;
              i : byte;
          begin
              tmpFirst := first;
              tmpSecond := second;
              index := pos('.', tmpFirst);
              val(copy(tmpFirst, 1, index - 1), f_d, code);
              if(code = 0) then
              begin
                  delete(tmpFirst, 1, index);
              end;
              index := pos('.', tmpFirst);
              val(copy(tmpFirst, 1, index - 1), f_m, code);
              if(code = 0) then
              begin
                  delete(tmpFirst, 1, index);
              end;
              val(tmpFirst, f_y, code);
           
           
          end;
          {===========================================================}

        для второго нужно будет тоже самой, и только тогда начинать проверку на больше меньше начиная с года. Может все таки как то можно поумнее сделать?

        Добавлено
        в итоге получил вот этот ужас:
        ExpandedWrap disabled
          {===========================================================}
          {функция сравнивает два значения между собой}
          function equals(first : string; second : string) : boolean;
          var
              f_d, s_d : byte;
              f_m, s_m : byte;
              f_y, s_y : word;
              index : byte;
              tmpFirst, tmpSecond : string;
              code : integer;
          begin
              tmpFirst := first;
              index := pos('.', tmpFirst);
              val(copy(tmpFirst, 1, index - 1), f_d, code);
              if(code = 0) then
              begin
                  delete(tmpFirst, 1, index);
              end;
              index := pos('.', tmpFirst);
              val(copy(tmpFirst, 1, index - 1), f_m, code);
              if(code = 0) then
              begin
                  delete(tmpFirst, 1, index);
              end;
              val(tmpFirst, f_y, code);
           
              tmpSecond := second;
              index := pos('.', tmpSecond);
              val(copy(tmpSecond, 1, index - 1), s_d, code);
              if(code = 0) then
              begin
                  delete(tmpSecond, 1, index);
              end;
              index := pos('.', tmpSecond);
              val(copy(tmpSecond, 1, index - 1), s_m, code);
              if(code = 0) then
              begin
                  delete(tmpSecond, 1, index);
              end;
              val(tmpSecond, s_y, code);
              {только теперь начинаем проверку}
              equals := false;
              if(f_y > s_y) then
              begin
                  equals := true;
              end
              else
              begin
                  if(f_y = s_y) then
                  begin
                      if(f_m > s_m) then
                      begin
                          equals := true;
                      end
                      else
                      begin
                          if(f_m = s_m) then
                          begin
                              if(f_d > s_d) then
                              begin
                                  equals := true;
                              end
                              else
                              begin
                                  equals := false;
                              end;
                          end;
                      end;
                  end;
                  equals := false;
              end;
          end;
          {===========================================================}

        может быть можно как то все более правильно сделать. Подскажите как быть то?
          ExpandedWrap disabled
            //возвращает -1, 0, 1 - вторая дата  в формате день.месяц.год меньше, равна, больше первой
            function CompareDateStrings(first, second: string): Integer;
             
              procedure ExtractDMY(s: string; var ar: array of Word);
              var
                LastPoint, i, index: byte;
                code: integer;
              begin
                LastPoint := 0;
                index := 0;
                for i := 1 to Length(s) + 1 do
                  if (i > Length(s)) or (s[i] = '.') then begin
                    //подразумевается сокращенная оценка условий  - в опциях компилятора Complete Boolean Eval - OFF
                    Val(Copy(s, LastPoint + 1, i - LastPoint - 1), ar[index], code);
                    Inc(index);
                    LastPoint := i;
                  end;
              end;
             
            var
              f_d, s_d: array[0..2] of Word;
              Compare: Longint;
            begin
              ExtractDMY(first, f_d);
              ExtractDMY(second, s_d);
              Compare := (s_d[2] - f_d[2]) * 512 + (s_d[1] - f_d[1]) * 32 + s_d[0] - f_d[0];
              if Compare = 0 then
                Result := 0
              else if Compare > 0 then
                Result := 1
              else
                Result := -1;
            end;
            хм, круто мне тут необходимо еще будет разбираться. Спасибо большое за помощь.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0438 ]   [ 15 queries used ]   [ Generated: 5.05.24, 09:13 GMT ]