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

  • Автор темы Guest
  • Дата начала
G

Guest

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

Guest

#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);
 

DarkKnight

Well-known member
01.08.2010
653
0
#4
можете пожалуйста объяснить зачем и что делают вот эти строчки :

C++:
double expression();
double term();
double power();
double factor();
double number();
Это прототипы функций... Т.к. все функции у тебя определены в самом низу, а main выше их всех, но в то же время все они вызываются в main, то что бы компилятор знал что функция такая действительно определена, только ниже и заводятся прототипы...
Если же ты перенесешь все функции вверх (выше main) то необходимось в прототипах отпадает..


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

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