приложение для вычисления значения арифметического выражения

Тема в разделе "C/C++/C#", создана пользователем -, 19 ноя 2010.

  1. Гость

    Здравствуйте , подскажите пожалуйста как решить вот эту задачу :
    Создать приложение для вычисления значения арифметического выражения, которое может включать в себя действительные числа, а также круглые скобки и следующие операции: +, -, *, /, ^ (возведение в степень). Вычисления должны производиться с учетом скобок и приоритетов используемых операций. :D
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
  3. Гость

    Вот готовый код этой программы
    Код (C++):
    #include <iostream>
    #include <vector>
    #include <iomanip>
    using namespace std;
    double expression();
    double term();
    double power();
    double factor();
    double number();

    int main()
    {
    double n;



    cout << "Vedite zadachu ";

    n = expression();

    cout << setprecision(12) << "Rezyltat: " << n << endl;

    cin.get();
    cin.get();
    return 0;
    }

    double expression()
    {
    double result;
    char operation;

    result = term();

    while (true)
    {
    operation = cin.get();

    switch (operation)
    {
    case '+':
    result += term();
    break;
    case '-':
    result -= term();
    break;
    default:
    cin.putback(operation);
    return result;
    }
    }
    }

    double term()
    {
    double result;
    char operation;
    double temp;

    result = power();

    while (true)
    {
    operation =cin.get();

    switch (operation)
    {
    case '*':
    result *= power();
    break;
    case '/':
    temp = power();

    if (temp == 0.0)
    {
    cout << "Delenie na 0!" << endl;
    exit(-1);
    }

    result /= temp;
    break;
    default:
    cin.putback(operation);
    return result;
    }
    }
    }

    double power()
    {
    double result;
    char operation;
    vector < double > args;

    args.push_back(factor());

    while (true)
    {
    operation = cin.get();

    while (operation == ' ')
    operation = cin.get();

    if (operation == '^')
    args.push_back(factor());
    else
    {
    cin.putback(operation);
    break;
    }
    }

    for (int i = args.size() - 1; i > 0; i--)
    args[i - 1] = pow(args[i - 1], args[i]);

    return args[0];
    }

    double factor()
    {
    double result;
    char bracket;
    int sign = 1;

    bracket = std::cin.get();

    while (bracket == ' ')
    bracket = cin.get();

    switch (bracket)
    {
    case '-':
    sign = -1;
    case '+':
    bracket = cin.get();
    break;
    }

    while (bracket == ' ')
    bracket = cin.get();

    if (bracket == '(')
    {
    result = expression();
    bracket = std::cin.get();

    if (bracket != ')')
    {
    cout << "Skobki neverno stojat" << std::endl;
    exit(-1);
    }
    }
    else
    {
    cin.putback(bracket);
    result = number();
    }

    return sign * result;
    }

    double number()
    {
    double result = 0.0;
    char digit;
    double k = 10.0;
    int sign = 1;

    digit = cin.get();

    switch (digit)
    {
    case '-':
    sign = -1;
    break;
    default:
    if (digit != '+')
    cin.putback(digit);

    break;
    }

    while (true)
    {
    digit =cin.get();

    while (digit == ' ')
    digit = cin.get();

    if (digit >= '0' && digit <= '9')
    result = result * 10.0 + (digit - '0');
    else
    {
    cin.putback(digit);
    break;
    }
    }

    digit = cin.get();

    if (digit == '.')
    {
    while (true)
    {
    digit =cin.get();

    while (digit == ' ')
    digit = cin.get();

    if (digit >= '0' && digit <= '9')
    {
    result += (digit - '0') / k;
    k *= 10.0;
    }
    else
    {
    cin.putback(digit);
    break;
    }
    }
    }
    else
    cin.putback(digit);

    return sign * result;
    }

    можете пожалуйста объяснить зачем и что делают вот эти строчки :

    Код (C++):
    double expression();
    double term();
    double power();
    double factor();
    double number();
    Код (C++):
        n = expression();

    cout << setprecision(12)
    Код (C++):
            operation = cin.get();
    Код (C++):
    cin.putback(operation);
     
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Это прототипы функций... Т.к. все функции у тебя определены в самом низу, а main выше их всех, но в то же время все они вызываются в main, то что бы компилятор знал что функция такая действительно определена, только ниже и заводятся прототипы...
    Если же ты перенесешь все функции вверх (выше main) то необходимось в прототипах отпадает..


    Обычный вызов функции..
    Задание точность вывода

    Возвращает обратно во входной буфер символ....
    Тоесть как бы мы его не считывали cinом...
     
  5. acorn

    acorn PHP Developer
    Web Team

    Регистрация:
    29 авг 2004
    Сообщения:
    599
    Симпатии:
    3
    вроде как стеком обычно решают
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Да я и не спорю, возможно обычно стеком, я предложил просто как вариант, т.к. знаю что так решают тоже.
     
Загрузка...

Поделиться этой страницей