Учебное пособие C#. Алгоритмы и структуры данных н. А. Тюкачев, В. Г. Хлебостроев издание третье, стереотипное 1 / 23


Download 1.85 Mb.
Pdf ko'rish
bet63/111
Sana19.11.2023
Hajmi1.85 Mb.
#1786905
TuriУчебное пособие
1   ...   59   60   61   62   63   64   65   66   ...   111
Bog'liq
C# Алгоритмы и структуры данных 2018 Тюкачев, Хлебостроев

4.5. П
РИМЕР ИНТЕРПРЕТАТОРА
 
Рассмотрим следующую задачу: в виде строки задано выражение, то 
есть конструкция из переменных, констант, бинарных операций и функций. 
Зная значения всех переменных, необходимо вычислить значение выраже-
ния. Бинарные операции обладают определенным приоритетом. Это означа-
ет, например, что операции умножения и деления должны выполняться 
раньше, чем операции сложения и вычитания. Для изменения порядка вы-
полнения операций в выражении могут использоваться скобки. При этом лю-
бое выражение можно представить в виде дерева. Например, выражение 
(
) (
)
2
1 ln
3
x
a
bx
+ − ⋅

будет представлено деревом, содержащим 7 узлов. 
21 / 23


114 
На практике такая задача возникает достаточно часто. Так, например, 
можно создать приложение, которое будет рисовать график функции, вве-
денной в виде строки (рис. 4.16). 
Рис. 4.16. График функции, заданной в виде строки 
Далее мы будем рассматривать несколько усложненную задачу, в кото-
рой строка ввода может быть не только выражением (оператором-
выражением), но и условным оператором. 
Для описания типа оператора будем использовать перечислимый тип: 
public enum OperatorType { expression, ifthen }; 
и рекурсивную структуру, определяющую операторы (листинг 4.26). 
Листинг 4.26. Классы для операторов 
public abstract class Operator 

public Node top; 
public OperatorType operatorType; 
public abstract void Run_Formula(); 

public class OperatorExpression : Operator 
22 / 23


115 

public int numVal; 
public OperatorExpression(int numVal, Node t) 
public override void Run_Formula() 

public class OperatorIf : Operator 

public Operator OperThen; 
public Operator OperElse; 
public OperatorIf(Node t,Operator op1, 
Operator op2) 
public override void Run_Formula() 

Диаграмма этих классов представлена на рис. 4.17. 
Рис. 4.17. Диаграмма классов для операторов 
Дополнительно введем несколько ограничений на вводимые выражения. 
1. 
Оператор-выражение должен иметь вид: 
<переменная> = <арифметическое_выражение>
2. 
Любая функция, входящая в выражение, может иметь только 
один параметр-значение. 
23 / 23


116 
3. 
Имена переменных могут состоять только из символов 'a'..'z', 
'A'..'Z', '_', '0'..'9'. 
4. 
Типы переменных, констант, функций и выражений могут 
быть или вещественными (double), или байт (byte), или 
логическими (bool), или целыми (int).
Для описания типов данных введем перечислимый тип: 
public enum TypeVal { tByte, tFloat, tBool, tInt } 
5. 
Каждый узел дерева выражения может быть или бинарной 
(унарной) операцией, или функцией, или переменной, или 
неименованной константой. 
Для описания типа узлов введем перечислимый тип: 
public enum TypeNode {VAL, CONST, FUNC, OPERATION }. 
Для описания узлов дерева введем пять классов: абстрактный класс 
Node
и четыре его потомка, отвечающих за константы, переменные, функ-
ции и операции. 

Download 1.85 Mb.

Do'stlaringiz bilan baham:
1   ...   59   60   61   62   63   64   65   66   ...   111




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling