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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2013, 18:39   #1
dimoncraft
Пользователь
 
Регистрация: 27.03.2013
Сообщений: 22
Восклицание Задача с решением примеров(с++)

Всем привет!
Ребят,есть задание:
написать программу,которая решает любые примеры(количество используемых чисел и знаков не ограничено ).
Например,я ввожу (2+2)^3=
он мне выводит ответ:64
Программа в консольном виде...

я сидел,раздумывал над алгоритмом решения задачи,вот что пришло в голову:
1)пример я буду вводить как строку
2)потом в цикле в этой строке я буду проверять что является числом,а что знаком и заносить их в соответствующие массивы(chisla , znaki)
3)дальше буду выполнять математические действия.


Но при шаге номер 2 у меня возник вопрос:
как можно определить число в строке?
т.е. например:
1)ввёл 23+3-6=
2) 2- это нулевой элемент массива chisla ,а 3 это первый элемент массива chisla. ВОТ в этом и вся проблема.Как сделать так,чтобы всё число записывалось в определённый элемент массива,а не по разрядам?!
Очень жду ваших советов!Заранее спасибо)
dimoncraft вне форума Ответить с цитированием
Старый 27.03.2013, 18:50   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Скобки не забыли? Они заметно усложняют жизнь, знаете ли.
Число можно читать посимвольно: "если очередной символ есть цифра, то текущее число умножить на 10 и прибавить соответствующее значение".
Другие замечания по поводу вычисления сложного выражения обсуждались в этой теме.
Abstraction вне форума Ответить с цитированием
Старый 27.03.2013, 19:00   #3
dimoncraft
Пользователь
 
Регистрация: 27.03.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Скобки не забыли? Они заметно усложняют жизнь, знаете ли.
Число можно читать посимвольно: "если очередной символ есть цифра, то текущее число умножить на 10 и прибавить соответствующее значение".
Другие замечания по поводу вычисления сложного выражения обсуждались в этой теме.
согласен с вами...
скобки и знаки типа умножить,делить,степень расставляют приоритет очерёдности выполнения действий,что я забыл учесть...
но хотелось бы видеть конкретные рекомендации по этим вопросам...
dimoncraft вне форума Ответить с цитированием
Старый 27.03.2013, 19:03   #4
koljsch
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 360
По умолчанию

Это первое, что нашел.
Код:
// Разбор арифметических выражений
#include <iostream>
using namespace std;
 
float number()
{
  int res = 0;
  for (;;)
  {
    char c = cin.get();
    if (c >= '0' && c <= '9')
      res = res * 10 + c - '0';
    else
    {
      cin.putback(c);
      return res;
    }
  }
}
 
float expr();
 
float skobki()
{
  char c = cin.get();
  if (c == '(')
  {
    float x = expr();
    cin.get();
    return x;
  }
  else
  {
    cin.putback(c);
    return number();
  }
}
 
float factor()
{
  float x = skobki();
  for (;;)
  {
    char c = cin.get();
    switch (c)
    {
    case '*':
      x *= skobki();
      break;
    case '/':
      x /= skobki();
      break;
    default:
      cin.putback(c);
      return x;
    }
  }
}
 
float expr()
{
  float x = factor();
  for (;;)
  {
    char c = cin.get();
    switch (c)
    {
    case '+':
      x += factor();
      break;
    case '-':
      x -= factor();
      break;
    default:
      cin.putback(c);
      return x;
    }
  }
}
 
 
int main()
{
  cout << "Введите выражение: ";
  float res = expr();
  cout << "Результат: " << res << endl;
}
Еще можно использовать парсер. Описание класса: http://rsdn.ru/article/files/Classes/tparser.xml
koljsch вне форума Ответить с цитированием
Старый 27.03.2013, 19:09   #5
koljsch
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 360
По умолчанию

Также вот это может помочь - синтаксический анализатор.
В гугле очень много ссылок. Учитесь пользоваться поиском))
Вложения
Тип файла: txt 1.txt (15.9 Кб, 134 просмотров)
koljsch вне форума Ответить с цитированием
Старый 27.03.2013, 19:16   #6
dimoncraft
Пользователь
 
Регистрация: 27.03.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от koljsch Посмотреть сообщение
Также вот это может помочь - синтаксический анализатор.
В гугле очень много ссылок. Учитесь пользоваться поиском))
спасибо огромное!очень помогли!
dimoncraft вне форума Ответить с цитированием
Старый 27.03.2013, 19:21   #7
koljsch
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 360
По умолчанию

Цитата:
Сообщение от dimoncraft Посмотреть сообщение
спасибо огромное!очень помогли!
Пожалуйста. Очень рад, что смог Вам помочь)) Пользуйтесь на здоровье!
koljsch вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Блок примеров C# sorcerer C# (си шарп) 0 30.05.2011 11:22
Задача в Excel - помoгите с решением yarikseo Microsoft Office Excel 4 24.01.2011 10:52
Добавление примеров LENA_M Microsoft Office Excel 8 02.05.2009 19:22
Помогите разобратся (генератор примеров) FAiver Общие вопросы Delphi 6 15.03.2008 11:51