Тема: “Вычисление выражений, вводимых с клавиатуры”
В этой работе рассматривается одна из интереснейших и труднейших тем программирования: разбор выражений. В программировании известны различные подходы к решению этой задачи. В этой работе рассматривается рекурсивно-нисходящий алгоритм разбора выражений. Вычисление выражения выполняется с помощью шаблонного класса, при этом подразумевается, что выражение - числовое, вычисляемое по законам алгебры.
Основой для построения числового выражения служат следующие элементы: числа, операции (+, -, *, /, ^ - возведение в степень, %, =), скобки, переменные. Имена переменных рассматриваются как одиночные латинские буквы, регистр не имеет значения. В приведенной ниже версии реализованы минимальные возможности по обработке ошибок для того, чтобы не перегружать программу.
Пример: Шаблонный класс для вычисления значения выражения, вводимого с клавиатуры
Нижеследующая программа является консольным приложением Windows.
#define _USE_MATH_DEFINES
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <cmath>
using namespace std;
#define NUMVARS 26 // размер массива для хранения значений переменных
template <class PType> class CParser //анализатор
{
//типы элементов выражения:
enum types {DELIMITER = 1, VARIABLE, NUMBER};
//разделитель, переменная, число
// элементы данных класса:
char* exp_ptr; // Указатель на выражение
char token[80]; // Элемент выражения
char tok_type; // Тип элемента
//функции:
int isdelim(char c); // проверяет, является ли элемент разделителем
void get_token(); /* выбирает из строки очередной элемент выражения, помещает его в строку token и определяет его тип */
void putback();//возврат в выражении на 1 элемент назад:
void eval_exp1(PType &result); // присваивание
void eval_exp2(PType &result); // Сложение и вычитание
void eval_exp3(PType &result); // Умножение, деление, остаток от деления
void eval_exp4(PType &result); // Возведение в степень
void eval_exp5(PType &result); // Унарный плюс или минус
void eval_exp6(PType &result); // Обработка выражения в скобках
void atom (PType &result); // Значение числа
void serror(int error); // вывод сообщения об ошибке
PType find_var(char* s); // возвращает значение переменной