Автор работы: Пользователь скрыл имя, 25 Августа 2013 в 18:52, курсовая работа
Задачей курсовой работы является написание строкового калькулятора. Строковый калькулятор позволяет вычислять математические выражения, введенные пользователем в строку, например: (12-34)*5+19/4.
Строковый калькулятор поддерживает операции сложения (+), вычитания (-), умножения (*), деления (/) и возведения в степень (^).
В основе работы строкового калькулятора лежит преобразование выражения в обратную польскую запись и дальнейшее его вычисление.
Задачей курсовой работы является
написание строкового калькулятора.
Строковый калькулятор
Строковый калькулятор поддерживает операции сложения (+), вычитания (-), умножения (*), деления (/) и возведения в степень (^).
В основе работы строкового калькулятора лежит преобразование выражения в обратную польскую запись и дальнейшее его вычисление.
Т.о. основные задачи при написании программы:
- считать выражение введенное пользователем;
- представить введенное
математическое выражение в
- преобразовать полученное
буквенное выражение в
- вычислить полученное выражение;
- в случае ошибок в
выражении, выводить
Вычисление результата:
result = convertAndCalc(expression)
lNum = i
3
2
3
2
Программа «Строковый калькулятор» позволяет вычислять введенные пользователем выражения.
Поддерживаемые операции:
- сложение (+)
- вычитание (-)
- умножение (*)
- деление (/)
- возведение в степень (^).
Кроме того, пользователь может использовать скобки '(' и ')' для указания порядка вычисления.
При запуске программы пользователь видит сообщение, запрашивающее ввести в строку выражение, которое должно быть вычислено.
После того, как введено выражение, программа выводит результат или сообщение об ошибке, если введенное выражение некорректно.
После получения результата, пользователь может ввести следующее выражение. Для выхода из программы необходимо ввести 'q' и нажать Enter.
#include "iostream"
#include "conio.h"
#include "stdlib.h"
#include "string"
#include "math.h"
using namespace std;
// структура, в которой будет храниться соответствие между символами в выражении и
// их численными значениями
struct Symbol {
char symb;
double val;
};
// прототипы используемых функций
int priorOfSymbol(char symbol);
double convertAndCalc(string str);
string convertToPoland(string str);
double calcResult(string str,Symbol *sym,int n);
bool isOperation(char ch);
int main () {
string expression; // выражение введенное пользователем
double result; // результат вычислений
cout << "|----------------------------
cout << "| Enter the expressions, you wanted to calculate in string |\n";
cout << "|----------------------------
// считываем введенную пользователем строку
cin >> expression;
// программа работает до тех пор, пока пользователь не введет “q”
while (expression != "q") {
// вычисляем значение введенного выражения
result = convertAndCalc(expression);
// если выражение допустимое – выводим результат
if(result != NULL)
cout << "Result: " << result << "\n";
// в противном случае выводим сообщение об ошибке
else {
cout << "Error in expression";
cout << "\n";
}
// считываем следующее выражение
cin >> expression;
}
return 0;
}
// функция проверки, является ли символ в строке символом операции
bool isOperation(char ch)
{
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^')
return true;
else
return false;
}
// функция определения приоритета символа. Используется в функции преобразования выражения в обратную польскую запись
int priorOfSymbol(char symbol) {
int priorit;
switch (symbol)
{
case '*':
case '/':
priorit = 4;
break;
case '-':
case '+':
priorit = 3;
break;
case '^':
priorit = 5;
break;
case '(':
priorit = 1;
break;
case ')':
priorit = 2;
break;
default:
priorit = 6;
break;
}
return priorit;
}
//----------------------------
// функция преобразования выражения в обратную польскую запись
//----------------------------
string convertToPoland(string str)
{
string poland = ""; // строка результата
string stck = ""; // строка, используемая в качества стека
int priorStack = 0; // приоритет символа в стеке
int prior = 0; // приоритет символа в строке
for (int k = 0; k < str.length(); k++)
{
char chS = str[k]; // считываем символ из строки
prior = priorOfSymbol(chS); // определяем его приоритет
// если приоритет символа больше, чем приоритет последнего символа в стеке, добавляем этот символ в стек
if (prior > priorStack)
{
stck += chS;
priorStack = prior;
}
// в противном случае
else
{
// если символ – закрывающая скобка
if (prior == 2)
{
// до тех пор пока не найдена открывающая скобка
while (priorStack != 1)
{
// заносим символы из стека в строку результата
poland += stck.substr(stck.length() - 1, 1);
stck = stck.substr(0, stck.length() - 1);