Основы языка C#

advertisement
Основы языка C#
Литература
http://www.intuit.ru/department/se/tppobj/3/1.html
http://www.microsoft.com/Rus/Msdnaa/Curricula/ (поиск: C#)
Обзор C#-1.zip
Обзор C#-2.zip
Язык C#
Задание 1
Есть иерархия классов:
Human  Student  AdvancedStudent
и
Human  Parent  CoolParent.
У класса Human есть поля-свойства имя, возраст, пол.
У класса Student есть поле-свойство отчество.
У класса AdvancedStudent – поле средняя оценка.
У класса Parent есть поле-свойство количество детей.
У класса CoolParent есть поле-свойство количество денег.
Реализовать:
1. Данную иерархию классов
2. Функцию, которая принимает объект Human и анализирует его класс, после
чего создает соответствующий класс из параллельной иерархии:
a. По классу Student – класс Parent. При этом имя родителя берется из
отчества студента (если пол мужской, отрезается «ович», если
женский – «овна», остаток – имя родителя)
b. По классу Parent – класс Student. При этом имя делается таким же,
как у родителя, а отчество делается добавлением «ович» к имени
c. По классу AdvancedStudent – класс CoolParent. Выполняется пункт a. и
в количество денег записывается 10^средняя_оценка
d. По классу CoolParent – класс AdvancedStudent. Выполняется пункт b. и
в требуемую среднюю оценку записывается соответствующий
логарифм.
Задание 2
Реализовать класс, обеспечивающий разбор арифметического выражения
посредством преобразования в обратную польскую запись.
Преобразование выражения в обратную польскую запись
Как
правило,
арифметические
выражения
удобно
преобразовывать
в
обратную польскую запись (ОПЗ), чтобы избавиться от скобок, содержащихся в
выражении.
Выражения,
преобразованные
последовательно, слева направо.
в
ОПЗ,
можно
вычислять
Для преобразования выражения в ОПЗ понадобится стек для переменных
типа string, т.к. исходное выражение мы получаем в виде строки.
Рассматриваем поочередно каждый символ (или множество символов,
которые образуют число):
1.
Если этот символ - число (или переменная), то просто помещаем его в
выходную строку.
2.
Если символ - знак операции (+, -, *, / ), то проверяем приоритет данной
операции.
a.
Операции умножения и деления имеют наивысший приоритет (допустим
он равен 3).
b.
Операции сложения и вычитания имеют меньший приоритет (равен 2).
c.
Наименьший приоритет (равен 1) имеет открывающая скобка.
Получив один из этих символов, мы должны проверить стек:
1)
Если стек пуст, или находящиеся в нем символы (а находится в нем
могут только знаки операций и открывающая скобка) имеют меньший
приоритет, чем приоритет текущего символа, то помещаем текущий
символ в стек.
2)
Если символ, находящийся на вершине стека имеет приоритет, больший
или равный приоритету текущего символа, то извлекаем символы из
стека в выходную строку до тех пор, пока выполняется это условие;
затем переходим к пункту 1).
3.
Если текущий символ - открывающая скобка, то помещаем ее в стек.
4.
Если текущий символ - закрывающая скобка, то извлекаем символы из стека
в выходную строку до тех пор, пока не встретим в стеке открывающую скобку
(т.е. символ с приоритетом, равным 1), которую следует просто уничтожить.
Закрывающая скобка также уничтожается.
5.
Если вся входная строка разобрана, а в стеке еще остаются знаки операций,
извлекаем их из стека в выходную строку.
Рассмотрим алгоритм на примере простейшего выражения:
Дано выражение:
10+(15-5)*2
Состояние
выходной строки
Символ Действие
после
совершенного
действия
10
10 '10' - переменная. Помещаем ее в выходную
строку
+
(
15
-
5
'+' - знак операции. Помещаем его в стек
10
(поскольку стек пуст, приоритеты можно не
проверять)
10
'(' - открывающая скобка. Помещаем в стек.
'15' - переменная. Помещаем ее в выходную 10 15
строку
'-' - знак операции, который имеет
приоритет 2. Проверяем стек: на вершине
10 15
находится символ '(', приоритет которого
равен 1. Следовательно мы должны просто
поместить текущий символ '-' в стек.
'5' - переменная. Помещаем ее в выходную 10 15 5
строку
)
')' - закрывающая скобка. Извлекаем из
стека в выходную строку все символы, пока 10 15 5 не встретим открывающую скобку. Затем
уничтожаем обе скобки.
*
'*' - знак операции, который имеет
приоритет 3. Проверяем стек: на вершине
находится символ '+', приоритет которого
равен 2, т.е. меньший, чем приоритет
текущего символа '*'. Следовательно мы
должны просто поместить текущий символ
'*' в стек.
10 15 5 -
Состояние стека
после
совершенного
действия
пуст
+
+ (
+ (
+ ( -
+ ( +
+ *
'2' - переменная. Помещаем ее в выходную 10 15 5 - 2
+ *
строку
null Окончание разбора
10 15 5 - 2 * + пуст
2
Алгоритм вычисления выражения, записанного в ОПЗ
Для реализации этого алгоритма используется стек для чисел (или для
переменных, если они встречаются в исходном выражении). Алгоритм очень
прост. В качестве входной строки мы теперь рассматриваем выражение,
записанное в ОПЗ:
1. Если очередной символ входной строки - число, то кладем его в стек.
2. Если очередной символ - знак операции, то извлекаем из стека два верхних
числа, используем их в качестве операндов для этой операции, затем кладем
результат обратно в стек.
Когда вся входная строка будет разобрана в стеке должно остаться одно
число, которое и будет результатом данного выражения.
Рассмотрим этот алгоритм на примере выражения:
7 5 2 - 4 * +
Символ Действие
Состояние стека после
совершенного действия
7
7
'7' - число. Помещаем его в стек.
5
'5' - число. Помещаем его в стек.
7 5
2
'2' - число. Помещаем его в стек.
7 5 2
4
'-' - знак операции. Извлекаем из стека 2 верхних
7 3
числа ( 5 и 2 ) и совершаем операцию 5 - 2 = 3,
результат которой помещаем в стек
7 3 4
'4' - число. Помещаем его в стек.
*
'*' - знак операции. Извлекаем из стека 2 верхних
7 12
числа ( 3 и 4 ) и совершаем операцию 3 * 4 = 12,
результат которой помещаем в стек
+
'+' - знак операции. Извлекаем из стека 2 верхних
19
числа ( 7 и 12 ) и совершаем операцию 7 + 12 =
19, результат которой помещаем в стек
Download