На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Реализация формул
    Может тема должна называться чуть не так , но извенитею
    и так подскажите пожалуйста как мне реализовать вычесление формулы , то есть например пользователь вводит ряд типа 2+5*(2+7) без никаких переменных и тд ...
    Я понимаю что вопрос довольно грамосткия для ответа , поэтому ,если можно, дайте ссылку на статью
      Цитата osa @
      пользователь вводит ряд типа 2+5*(2+7)
      Причем тут ряд?
      Поищи про алгоритм Рутисхаузера например (IMHO самый простой для реализации).
        Выделение лексем, далее построение дерева, а затем - подсчет.
          Это отлично организовывается с помощью бинарного дерева, если числа могут двух и более разрядными, и можно обойтись стеком, если числа могут быть только одноразрядными. Алгоритм хорошо описан в первом томе Д.Кнута.
            Или рекурсивно можно.
              Рекурсивно проще и быстрее программу написать. Что-то типа:
              ExpandedWrap disabled
                double eval(char *str)
                  {
                  return expr(&str);
                  }
                 
                // Пропуск пробелов
                skipblanks(char **str)
                  {
                  while (**str == ' ') ++*str;
                  }
                 
                // Вычисление суммы
                double expr(char **str)
                  {
                  double value = prod(str);
                  while (**str == '+' || **str == '-')
                    {
                    if (**str == '+' )
                      {
                      ++*str;
                      value += prod(str);
                      }
                    else if (**str == '-')
                      {
                      ++*str;
                      value -= prod(str);
                      }
                    }
                  return value;
                  }
                 
                // Вычисление произведения
                double expr(char **str)
                  {
                  double value = prim(str);
                  while (**str == '*' || **str == '/')
                    {
                    if (**str == '*' )
                      {
                      ++*str;
                      value *= prim(str);
                      }
                    else if (**str == '/')
                      {
                      ++*str;
                      value /= prim(str);
                      }
                    }
                  }
                 
                // Вычисление констант и выражений в скобках
                double prim(char **str)
                  {
                  if (isdigit(**str))
                    {
                    double value = *(*str)++ - '0';
                    while (isdigit(**str))
                      value = value * 10 + *(*str)++ - '0';
                    return value;
                    }
                  if (**str == '(')
                    {
                    ++*str;
                    double value = expr(str);
                    if (**str == ')')
                      ++*str
                    else
                      error();
                    return value;
                    }
                  error();
                  }
              Вообще, такая задача рассматривается в любой книге посвященной трансляции. Просто в качестве примера. Я тут на память написал побыстрому. В выражении могут применяться знаки +, -, *, / и скобки. Числа в выражении могут быть только целыми. И я тут не фильтрую пробелы, которые могут встретиться в строке.
                На сайте sources.ru есть готовый пример с применением рекурсии. Очень понятный.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


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