На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Найти закрывающуюся скобку
    Приветствую.

    Необходимо искать в строке открывающиеся и закрывающиеся скобки. Наткнулся на UnicodeCategory в МСДНе. Можно ли с помощью него искать пару открывающейся кавычке?

    Спасибо.
      Цитата SunDevil @
      искать в строке

      String.IndexOf()
        Цитата SunDevil @
        Наткнулся на UnicodeCategory в МСДНе. Можно ли с помощью него искать пару открывающейся кавычке?


        По этому вопросу не знаю, но я в старые добрые времена (еще на С) искал обыкновенным циклом :tong:, как то так:

        ExpandedWrap disabled
          int o=-1;
          int z=-2;
          for(int i=1;i<=s.length;++i)
          {
              if(s[i]=='(') ++o;
              if(s[i]==')') ++z;
           
              if(z==o)
              {
                  ...нашол!...
              }
          }
        Сообщение отредактировано: Лилой -
          Цитата Лилой @
          ExpandedWrap disabled
            int o=-1; int z=-2;

          Что за магические начальные значения ? :)
            Цитата IL_Agent @
            Что за магические начальные значения ? :)

            Кол-во открытых и закрытых скобок.
            А вот чего инициализирует -1, а не нулем, действительно непонятно.
            Возможно из-за каких-то дальнейших особенностей алгоритма.
              Цитата
              А вот чего инициализирует -1, а не нулем, действительно непонятно.

              Да тут много чего не понятно =) С учетом что скобки - это все таки количество открывающих скобок должно быть равно количеству закрывающих, непонятно почему o и z инициализируются разными значениями.
                Цитата int0 @
                Да тут много чего не понятно =) С учетом что скобки - это все таки количество открывающих скобок должно быть равно количеству закрывающих, непонятно почему o и z инициализируются разными значениями.


                Потому разными, что в цикле есть строка их сравнения:
                ExpandedWrap disabled
                  if(z==o)


                Но, все же, извините, я протупил с первичным кодом, надо было как-то так:

                ExpandedWrap disabled
                  int o=-1;
                  int z=-2;
                  for(int i=1;i<=s.length;++i)
                  {
                      if(s[i]=='(') ++o;
                      if(s[i]==')') ++z;
                   
                      if((z+1)==o)
                      {
                          ...нашол!...
                      }
                  }


                А вобще-то надо сделать так, что-бы o != z перед началом цикла. Я такой "способ" привел, может быть вы другой знаете :)

                Eсли хотите, я пороюсь в старых кодах и приведу вам полный алгоритм (он рекурсивен)

                Добавлено
                Не нашел, так что сам заново написал:

                ExpandedWrap disabled
                          public float ParseMath(string formula)
                          {
                              int o = -1;
                              int z = -2;
                              int pos_o = 0;
                   
                              for (int i = 1; i < formula.Length; ++i)
                              {
                                  if (formula[i] == '(')
                                  {
                                      ++o;
                                      pos_o = i;
                                  }
                   
                                  if (formula[i] == ')') ++z;
                   
                                  if ((z + 1) == o)
                                  {
                                      ParseMath(formula.Substring(pos_o, i - pos_o));
                                  }
                              }
                   
                          }


                Такой алгоритм я использовал для разбиения "по скобкам" но он совершенно не подходит для вычисления. Если тебе нужно именно это, то попробуй
                обратную запись формулы или же алгоритм,
                в основе которого используеться теория деревьев.
                Сообщение отредактировано: Лилой -
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0721 ]   [ 16 queries used ]   [ Generated: 19.08.25, 06:13 GMT ]