Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы КСИТ1.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
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);

}

}

}

Таким образом, был разработан калькулятор, распознающий выражение и производящий расчеты такие, как сложение, вычитание, умножение и деление. Разбор выражения, а соответственно и действия производятся по порядку слева направо.