0% нашли этот документ полезным (0 голосов)
14 просмотров12 страниц

5

Документ представляет собой отчет о разработке программы для перевода арифметических выражений в постфиксную форму и их вычисления с использованием стека. В нем описаны основные классы TStack и TArithm, их методы и алгоритмы, а также руководство пользователя и программиста. Основное внимание уделяется реализации алгоритмов преобразования и вычисления, а также обработке ошибок в арифметических выражениях.

Загружено:

gmngmjr
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате DOCX, PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
14 просмотров12 страниц

5

Документ представляет собой отчет о разработке программы для перевода арифметических выражений в постфиксную форму и их вычисления с использованием стека. В нем описаны основные классы TStack и TArithm, их методы и алгоритмы, а также руководство пользователя и программиста. Основное внимание уделяется реализации алгоритмов преобразования и вычисления, а также обработке ошибок в арифметических выражениях.

Загружено:

gmngmjr
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате DOCX, PDF, TXT или читать онлайн в Scribd
Вы находитесь на странице: 1/ 12

Министерство науки и высшего образования Российской Федерации

Федеральное государственное автономное образовательное

учреждение высшего образования «Национальный исследовательский

Нижегородский государственный университет им. Н. И. Лобачевского»

Институт информационных технологий, математики и механики

Прикладная математика и информатика

Отчёт

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


и вычисление результата по ней

Выполнил: студент группы 3822Б1ПМ3

Проверила: Шестакова Наталья Валерьевна

Нижний Новгород, 2022

Содержание:
1
1. Введение……………………………………………………………………………….. 3
2. Постановка задачи………………………………………………………………… 4
3. Руководство пользователя……………………………………………………. 6
4. Руководство программиста…………………………………………………… 8
5. Заключение……………………………………………………………………………. 12
6. Список литературы………………………………………………………………… 13
7. Приложение…………………………………………………………………………… 14

Введение

2
Стек: определение и принцип работы

Стек представляет собой абстрактную структуру данных, основанную на


принципе LIFO (Last In First Out). LIFO означает, что последний элемент,
добавленный в стек, будет первым при извлечении. Это подобно стопке
тарелок, в которой можно положить или убрать только верхнюю тарелку.
Принцип работы стека включает в себя две основные операции:

 Put (добавление): Элемент добавляется на вершину стека.


 Get (извлечение): Элемент извлекается с вершины стека.

Стек можно представить как вертикальный список, где доступ к элементам


возможен только с одного конца.

Постфиксная форма записи

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


выражения оператор находится между операндами (например, a + b). При
такой форме записи порядок действий определяется расстановкой скобок и
приоритетом операций. В постфиксной форме (или обратной польской
записи) оператор располагается после своих операндов (например, ab+).
Преимущества постфиксной формы записи включают простоту вычислений и
отсутствие необходимости в скобках для определения порядка операций.
Алгоритм преобразования инфиксного выражения в постфиксное использует
стек для временного хранения операторов до момента, когда они будут
добавлены в итоговое выражение.

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

3
Целью работы является разработка программы для обработки
арифметических выражений с использованием структуры данных стек. В
рамках этой задачи необходимо реализовать два класса: TStack и TArithm.
Класс TStack предназначен для реализации стека и выполнения основных
операций над ним, а класс TArithm – для обработки арифметических
выражений.

При вычислении результата произвольных арифметических выражений


возникают две основные задачи: проверка корректности введённого
выражения и выполнение операций в порядке, определяемом их
приоритетами и расстановкой скобок. Существует алгоритм, позволяющий
реализовать вычисление произвольного арифметического выражения за
один просмотр без хранения промежуточных результатов. Для реализации
данного алгоритма выражение должно быть представлено в постфиксной
форме.

Задачи по классу TStack:

 В качестве структуры хранения стека предлагается использовать


одномерный массив, размещаемый в динамической области памяти.
Для описания структуры хранения следует использовать следующие
переменные: double* arr (указатель на память, выделенную для
хранения стека) и int top (индекс элемента массива, в котором
хранится последнее добавленное значение стека).
 Реализовать методы Empty() и Full() для проверки стека на пустоту и
полноту соответственно.
 Реализовать методы Put() и Get() для добавления и извлечения
элементов из стека соответственно.
 Реализовать метод Top(), который будет возвращать верхний элемент
стека, но при этом не будет удалять его.

Задачи по классу TArithm:

 Реализовать метод GetPriority(), который будет возвращать приоритет


операции (важно для правильного преобразования исходного
выражения в постфиксную форму записи).
 Реализовать метод IsNumber(), который будет проверять, является ли
переданный символ числом.

4
 Добавить функциональность для вывода таблицы соответствия скобок
друг другу.
 Реализовать метод Postfix(), который будет взаимодействовать с полем
string infix (строка с арифметическим выражением в инфиксной форме)
и возвращать строку с арифметическим выражением в постфиксной
форме записи.
 Реализовать метод Calc(), который будет вычислять и возвращать
результат арифметического выражения в постфиксной форме,
используя стек.
 Создать механизм отслеживания ошибок (тип и количество) в
арифметическом выражении, таких как деление на ноль,
несоответствие числа операций числу операндов и несоответствие
скобок друг другу.

Общие требования:

 Для постфиксной формы записи попытка вычислить выражение,


содержащее унарные операции, приведет к ошибке в связи с
несоответствием количества операндов количеству операций. При
выполнении данной лабораторной работы будем предполагать, что
унарные операции отсутствуют.
 В таблице соответствия скобок должно быть указано, для каких скобок
отсутствуют парные им. Для идентификации скобок будут
использованы их порядковые номера в выражении.
 В качестве допустимых арифметических операций можно
рассматривать только символы + (сложение), - (вычитание), *
(умножение), / (деление).

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

5
Для создания объекта класса TStack необходимо вызвать его конструктор и
присвоить объекту имя.

В параметрах ничего не указывается, так как максимальный размер стека


зафиксирован константой MAX, равной 100.

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


возвращающий true, если стек пуст, и false в противном случае.

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


возвращающий true, если стек заполнен, и false в противном случае.

Для того чтобы поместить элемент в стек используется метод Put(double

num), принимающий вещественное число.

Для того чтобы извлечь элемент из стека используется метод Get().

Как вы видим, элементы выводятся на экран в порядке, обратном порядку


добавления их в стек.

Также, существует метод Top(), который возвращает верхний элемент стека

без его удаления.

Для создания объекта класса TArithm необходимо вызвать его конструктор и


присвоить объекту имя, в параметрах необходимо передать строку,

содержащую арифметическое выражение.

В классе TArithm существуют приватные методы, которые будут описаны


далее в разделе «Руководство программиста». Для пользователя же
доступно лишь два метода:
6
Input() – запрашивает ввод арифметического выражения в виде строки через
консоль.

Output() – выводит на экран выражение в инфиксной и постфиксной формах


записи, таблица соответствия скобок друг другу. Затем, если нет ошибок,
выводится результат вычисления. Если ошибки есть, на экран выводится
соответствующее сообщение с названием типа ошибки.

Случай 1)

Случай 2)

Руководство программиста

Описание структуры данных.

7
 Класс Стек TStack. Имеет два приватных поля: double* arr (указатель на
память, выделенную для хранения стека) и int top (индекс элемента
массива, в котором хранится последнее добавленное значение стека).
 Класс Арифметическое выражение TArithm. Имеет несколько
приватных полей и методов: string infix (строка, содержащая
арифметическое выражение в инфиксной форме), string postfix (строка,
содержащая арифметическое выражение в постфиксной форме),
double res (переменная для хранения результата вычислений
арифметического выражения), int mist_null (счётчик ошибок,
связанных с делением на ноль в арифметическом выражении), int
mist_imbalance (счётчик ошибок, связанных с несоответствием числа
операций числу операндов), int mist_braces (счётчик ошибок,
связанных с несоответствием скобок в арифметическом выражении).

Описание алгоритмов.

TStack:

 Конструктор инициализации. Полю top присваивается значение -1.


 Деструктор. С помощью delete[] arr освобождается память.
 bool Empty(). Возвращается true, если top == -1, иначе возвращается
false.
 bool Full(). Возвращается true, если top == MAX-1 (MAX – константа,
равная 100), иначе возвращается false
 void Put(double num). Если стек не заполнен !Full(), то перемещается
указатель вершины стека, элемент записывается в соответствующую
позицию динамического массива. Иначе, выводится сообщение о
заполненности стека.
 double Get(). Если стек не пуст !Empty(), то возвращается значение из
динамического массива по индексу вершины стека, а указатель
вершины стека перемещается на предыдущий элемент.
 double Top(). Если стек не пуст !Empty(), то возвращается значение из
динамического массива по индексу вершины стека.

TArithm:

8
 Конструктор инициализации. Принимает строку. Счетчики ошибок
(mist_braces, mist_null, mist_imbalance) становятся равными нулю. В
поле infix сохраняется переданный параметр. Полю postfix
присваивается результат работы метода Postfix(), полю res
присваивается результат работы метода Calc().
 int GetPriority(double i). Инициализируется переменная 'p' (приоритет)
значением 0. С помощью if переданный символ 'i' проверяется на
соответствие определенным арифметическим операторам (+, -, *, /).
Если операция является сложением или вычитанием, приоритет
устанавливается в 1. Если операция умножения или деления,
приоритет устанавливается в 2. Возвращается переменная p. Следует
отметить, что переменная ‘i’ типа данных double сравнивается с
переменной типа данных char, используя код соответствующего
символа в таблице ASCII.
 bool IsNumber(char i). С помощью if выполняется проверка, равен ли
символ одному из десяти цифровых символов от '0' до '9'. Если символ
соответствует одной из цифр, метод возвращает true, иначе false.
 string Postfix(). Создается пустая строка Postfix для хранения
постфиксной формы, а также объект стека. Инициализируются
счетчики left_brace и right_brace для левых и правых скобок
соответственно, а также счетчики num_counter для чисел и op_counter
операторов. Затем с помощью цикла for осуществляется проход по
каждому символу в инфиксной форме:
o Если символ – число (проверяется с помощью метода
IsNumber()), он добавляется к строке Postfix, счетчик чисел
num_counter увеличивается.
o Иначе, если символ - закрывающая скобка, то счётчик правых
скобок right_brace увеличивается на единицу и с помощью цикла
while извлекаются элементы из стека в строку Postfix, пока не
встретится открывающая скобка или пока стек не станет пустым
(проверяется с помощью метода Empty()). Сама же левая скобка
удаляется из стека.
o Иначе, если символ - открывающая скобка, она добавляется в
стек, а счётчик left_brace увеличивается на единицу.
o Иначе (подразумевается, что символ является оператором)
счётчик операторов op_counter увеличивается на единицу и с

9
помощью цикла while извлекаются операторы из стека с таким
же или более высоким приоритетом и добавляются в строку
Postfix. Затем текущий оператор добавляется в стек.
С помощью цикла while и метода Empty() выполняется извлечение
оставшихся операторов из стека и добавление их в строку Postfix.
Проверяется сбалансированность скобок и соответствие числа
операторов числу операндов. Если есть дисбаланс или несоответствие
– счетчик соответствующих ошибок увеличивается на единицу. Затем,
если в выражении есть скобки – вызывается метод Braces(). В конце
метода возвращается строка Postfix.
 double Calc(). Создается стек Stack для хранения операндов и
промежуточных результатов. С помощью цикла for осуществляется
проход по каждому символу в постфиксной форме:
o Если символ – число (проверяется с помощью метода
IsNumber()), оно добавляется в стек.
o Иначе (подразумевается, что символ является оператором +, -, *
или /), извлекаются два операнда из стека (метод Get() класса
TStack).
o В зависимости от оператора выполняется соответствующая
операция (+, -, *, /). Стоит отметить, что если операция является
делением, а второй оператор равен нулю, то возвращается ноль
и счётчик ошибок mist_null увеличивается на единицу.
o Результат операции помещается в стек.
После цикла for результат всех вычислений извлекается из стека и
возвращается.
 void Braces(). Выражение просматривается посимвольно слева
направо. Все символы, кроме скобок, игнорируются (т.е. просто
производится переход к просмотру следующего символа). Выводится
заголовок таблицы для отображения пар скобок. Инициализируется
переменная counter для отслеживания номера текущей пары скобок.
Создается стек Stack для хранения номеров пар открывающих скобок. С
помощью цикла for осуществляется проход по каждому символу в
инфиксной форме:
o Если символ - открывающая скобка, counter увеличивается на
единицу, и ее номер помещается в стек (метод Put() класса
TStack).

10
o Если символ - закрывающая скобка, увеличивается counter, и с
помощью оператора if проверяется, есть ли соответствующая
открывающая скобка в стеке (метод Empty() класса TStack). Если
есть, выводятся индексы пары скобок. Иначе, выводится
информация о непарной закрывающей скобке, и счетчик ошибок
mist_braces увеличивается.
С помощью цикла while и метода Empty класса TStack проверяется если
в стеке остались открывающие скобки, выводится информация о
непарных скобках, и счетчик ошибок mist_braces увеличивается.
 void Output(). Выводится исходное арифметическое выражение.
Выводится постфиксная форма этого выражения. Проверяется наличие
ошибок. Если ошибок нет, выводится результат вычислений. Иначе, на
экран выводятся все типы найденных ошибок.

Описание структуры программы.

 TStack.h, TStack.cpp – класс, реализующий операции над стеком.


 TArithm.h, TArithm.cpp – класс, реализующий обработку
арифметических выражений, перевод их в постфиксную форму записи,
вычисление результата выражения по ней, вывод таблицы
соответствия скобок и найденные типо ошибок.
 Source.cpp – исполнительный файл, запускающий программу
тестирования

Заключение

Мною реализован класс TStack, используемый для хранения данных в ходе


выполнения операций над арифметическими выражениями. Реализован
11
класс TArithm и алгоритм, который преобразует арифметическое выражение
из инфиксной формы записи в постфиксную, а затем вычисляет результат
арифметического выражения в постфиксной форме. Предусмотрена
обработка ошибок, таких как деление на ноль, несоответствие числа
операций числу операндов и ошибки со скобками. Методы Braces() и
Output() выявляют эти ошибки и сообщают о них.

12

Вам также может понравиться