- •Индивидуальное задание №1. Электронные компоненты настольного компьютера
- •Лабораторная работа №1. Подбор электронных компонентов
- •Лабораторная работа №2. Сборка настольного компьютера
- •Лабораторная работа №3. Установка операционной системы Microsoft Windows 7
- •Лабораторная работа №4. Введение в Microsoft Visual Studio
- •Введение
- •Создание оконной программы с помощью Visual Studio 2010
- •Создание консольного приложения с помощью Visual Studio 2010
- •Создание библиотеки классов с помощью Visual Studio 2010
- •Лабораторная №5. Создание приложения - калькулятор действительных чисел
- •Лабораторная №6. Создание приложения - калькулятор выражений
- •Литература
Лабораторная №6. Создание приложения - калькулятор выражений
Целью лабораторной работы заключается закрепление навыков создания оконного приложения, библиотеки классов и их взаимодействие, а также расширенное изучение возможностей языка программирования C#.
Задание:
Создать оконное приложение калькулятора выражения, в котором алгебраическое выражение задается строкой и вычисляется нажатием кнопки.
Краткое руководство к лабораторной работе
Данное оконное приложение было создано на основе калькулятора, рассмотренного в лабораторной работе №1, посредством добавления нового класса Expression, и создания нового приложения Windows Form. Стоит отметить, что в работе задействованные ранее созданные классы Number и Operation.
В текстовое окно будет вводиться численное выражение, а после нажатия кнопки «Расчет» будет производится расчет. Для разбиения выражения на отдельные составляющие необходимо создать новый класс Expression, в котором будут распознаваться символы, и будет производиться простой расчет.
Создаем форму главного окна приложения.
Создаем класс Expression.
namespace Numbers
{
/* Алгоритм разбора текстового алгебраического выражения
Пример: "2.6 + 2 - 1 * 3 / 2"
1. Удаляем все пробелы из строки
Пример: "2.6+2-1*3/2"
2. Организуется цикл перебора всех символов строки выражения
3. Выделяем текущий символ в строке
Пример: "2" и сохраняем в переменную числа
4. Набираем символы числа до тех пор, пока не обнаружится символ операции
Пример: "2.6"
5. При обнаружении символа операции сохраняем символ операции и
вызываем повтор разбора выражения, которой будет передаваться выражение
Пример: "2-1*3/2"
6. Операции продолжаются до тех пор пока не будет разобраны все символы
*/
// Класс для калькулятора выражений
public class Expression
{
// Переменная состояния
int state = 0;
// Переменная числа
string number = "";
// Переменная операции
string operation = "";
// Переменная вложенного разбора выражения
Expression expNext;
// Функция разбора выражения
public string Parse(string expression)
{
expression = expression.Replace(" ", "");
// Результат вычислений
string result = "";
// Состояние №0 - начальное состояние разбора строки выражения
// Состояние №1 - определение и выделение числа из строки
// Состояние №2 - определение и выделение оператора из строки
// Состояние №3 - расчет разобранного выражения
// Организуем цикл по символам строки выражения
for (int i = expression.Length-1; i >= 0; i--)
{
// Получение текущего символа строки expression
char c = expression[i];
// Состояние №0 или №1
if (state == 0 || state == 1)
{
if ((c >= '0' && c <= '9') || c == ',')
{
number = c + number; // Собираем число в отдельную переменную
state = 1; // Указываем новое состояние №1
}
else
state = 2; // Указываем новое состояние №2
}
// Состояние №2
if (state == 2)
{
if (c == '+' || c == '-' || c == '*' || c == '/')
{
operation = c.ToString(); // Сохраняем символ операции
state = 3; // Указываем новое состояние №3
}
}
// Состояние №3
if (state == 3)
{
if (i != 0)
{
expNext = new Expression();
// Рекурсивный разбор строки выражения
result = expNext.Parse(expression.Substring(0, i));
break;
}
}
}
if (state == 1)
result = number;
else if (state == 3)
{
OperationType operType = OperationType.Сложение;
switch (operation)
{
case "+":
operType = OperationType.Сложение;
break;
case "-":
operType = OperationType.Вычитание;
break;
case "*":
operType = OperationType.Умножение;
break;
case "/":
operType = OperationType.Деление;
break;
}
Operation oper = new Operation(number, result, operType);
// Расчет простого выражения
result = oper.Execute();
}
else
result = "Ошибка!";
return result;
}
}
}
Теперь необходимо написать обработчик нажатия кнопки «Расчет» на форме.
namespace Calculator2
{
public partial class Form1 : Form
{
// Обработчик события нажатия на кнопку «Расчет»
private void button1_Click(object sender, EventArgs e)
{
// Создаем экземпляр класса Expression
Expression exp = new Expression();
// Вызываем функцию Parse
textBox2.Text = exp.Parse(textBox1.Text);
}
}
}
Таким образом, был разработан калькулятор, распознающий выражение и производящий расчеты такие, как сложение, вычитание, умножение и деление. Разбор выражения, а соответственно и действия производятся по порядку слева направо.
