Строковый калькулятор

Автор работы: Пользователь скрыл имя, 25 Августа 2013 в 18:52, курсовая работа

Описание работы

Задачей курсовой работы является написание строкового калькулятора. Строковый калькулятор позволяет вычислять математические выражения, введенные пользователем в строку, например: (12-34)*5+19/4.
Строковый калькулятор поддерживает операции сложения (+), вычитания (-), умножения (*), деления (/) и возведения в степень (^).
В основе работы строкового калькулятора лежит преобразование выражения в обратную польскую запись и дальнейшее его вычисление.

Файлы: 1 файл

КУРСАЧ.docx

— 39.37 Кб (Скачать файл)

1. Постановка  задачи

Задачей курсовой работы является написание строкового калькулятора. Строковый калькулятор позволяет  вычислять математические выражения, введенные пользователем в строку, например: (12-34)*5+19/4.

Строковый калькулятор поддерживает операции сложения (+), вычитания (-), умножения (*), деления (/) и возведения в степень (^).

В основе работы строкового калькулятора лежит преобразование выражения в обратную польскую запись и дальнейшее его вычисление.

Т.о. основные задачи при написании программы:

- считать выражение введенное  пользователем;

- представить введенное  математическое выражение в виде  буквенного выражения (состоящего  из букв и знаков операций), при этом запоминая соответствие  между буквой и ее численным  значением;

- преобразовать полученное  буквенное выражение в обратную  польскую запись;

- вычислить полученное  выражение;

- в случае ошибок в  выражении, выводить пользователю  соответствующее сообщение.

 

2. Теоретические сведения

 

3. Структура программы

3.1 Укрупненная схема работы программы


                                                                  Начало



                                                     Ввод пользователем

                                                    выражения (expression)




                                                                                                   Да


                                                        expression = = ‘q’                                 Конец


 

                                                                             


                                                                            Нет


                                               Вычисление результата:

                                        result = convertAndCalc(expression)      


 


                                                                                                 Да

                                                           result = = NULL


 


                                                                          Нет


                                               Вывод результата (result)                  Вывод сообщения

                                                        на экран                                          об ошибке



 


                                              Считывание нового

                                           значения expression



 

4. Алгоритмы решения задачи

4.1 Схема функции преобразования выражения и вычисления значения (convertAndCalc)


                                                                 Начало



                                                          str, sym[], j , ch,                                                    

                                                     fNum, lNum, result


 

                                               


                                                       j = 0,  i = 0, ch = ‘a’

                                                      fNum = 0, lNum = -1,           

                                                             result = “”


 


 

                                                            i < str.length()

 


                                                                           Да


 

                                                               Проверка                 Да


                                                         недопустимости                                  result = NULL


                                                            символа str[i]                                              

                                                             

                                                                            Нет


 


 

                                       Нет                 Проверка

                                                        символа str[i] на


                                                          равенство + , - ,

                                                                * , / , ( , )

 

                                                                          Да


 


                                      Нет

                                                            lNum >= fNum



     lNum = i


                                                                          Да



                                       val = atof(str.substr(fNum, lNum - fNum + 1).c_str());    


 


         3                     2                                     1

 

 


        3                       2                                    1



                                                               sym[j].symb = ch;

                                                               sym[j].val = val;

                                                               ch++; j++;

                                                              




                                                               sym[j].symb = str[i];

                                                               sym[j].val = 0;

                                                                j++;

                                                               fNum = i + 1;



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5. Руководство пользователя

Программа «Строковый калькулятор» позволяет вычислять введенные  пользователем выражения.

Поддерживаемые операции:

- сложение (+)

- вычитание (-)

- умножение (*)

- деление (/)

- возведение в степень  (^).

Кроме того, пользователь может  использовать скобки '(' и ')' для указания порядка вычисления.

При запуске программы  пользователь видит сообщение, запрашивающее  ввести в строку выражение, которое  должно быть вычислено.

После того, как введено  выражение, программа выводит результат  или сообщение об ошибке, если введенное  выражение некорректно.

После получения результата, пользователь может ввести следующее  выражение. Для выхода из программы  необходимо ввести 'q' и нажать Enter.

 

6. Список литературы

 

7. Листинг программы

#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 << "|-----------------------------------------------------------------------|\n";

cout << "|       Enter the expressions, you wanted to calculate in string        |\n";

cout << "|-----------------------------------------------------------------------|\n";

// считываем введенную пользователем строку

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

Информация о работе Строковый калькулятор