Учебное пособие C#. Алгоритмы и структуры данных н. А. Тюкачев, В. Г. Хлебостроев издание третье, стереотипное 1 / 23
Download 1.85 Mb. Pdf ko'rish
|
C# Алгоритмы и структуры данных 2018 Тюкачев, Хлебостроев
- Bu sahifa navigatsiya:
- Листинг 4.26. Классы для операторов
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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling