Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по Visual Studio C++ (Волков) - ОТЧЁТЫ с подробным кодом / Лабораторная работа №2 (Сложный калькулятор).docx
Скачиваний:
1
Добавлен:
04.09.2024
Размер:
1 Мб
Скачать
☆

3 Текст программы

double i1, i2, i3;

int OperCnt = 0;

int LastOper = 0;

int NumCnt = 0;

bool OperFlag = false;

private: double Calculate()

// Функция подсчёта для каждой операции (/ * - + соответственно)

{

if (LastOper == 1) i3 = i1 / i2;

else if (LastOper == 2) i3 = i1 * i2;

else if (LastOper == 3) i3 = i1 - i2;

else if (LastOper == 4) i3 = i1 + i2;

return (i3); // Возвращает результат подсчёта

}

private: System::Void button_Click(System::Object^ sender, System::EventArgs^ e)

// Обработчик нажатий на кнопки операций

{

String^ StrBtn = ((Button^)sender)->Text; // Строка текста кнопки

String^ StrTxt = txt->Text; // Введённая строка

String^ StrErr = ""; // Очистка строки ошибки

if (StrBtn == "sqrt") // Функция корня

{

if (OperCnt == 0) // Если операции не были нажаты

{

if (i1 >= 0) // При неотрицательном числе

{

i3 = Math::Sqrt(i1); // Вычисление корня из i1

this->txt->Text = Convert::ToString(i3); // Вывод

i1 = i3; // Запись результата в i1

}

else this->txt->Text = StrErr =

"Введите неотрицательное число!";

}

else // Если уже была нажата кнопка операции

{

if (i2 >= 0) // При неотрицательном числе

{

i3 = Math::Sqrt(i2); // Вычисление корня из i2

this->txt->Text = Convert::ToString(i3); // Вывод

i2 = i3; // Запись результата в i2

}

else this->txt->Text = StrErr =

"Введите неотрицательное число!";

}

}

else if (StrBtn == "%") // Функция процента

{

if (OperCnt == 0) // Если операции не были нажаты

{

i3 = (i1) / 100; // Вычисление 1 процента от i1

this->txt->Text = Convert::ToString(i3); // Вывод

i1 = i3; // Запись результата в i1

}

else // Если уже была нажата кнопка операции

{

i3 = ((i1 * i2) / 100); // Вычисление i2 процентов из i1

this->txt->Text = Convert::ToString(i3); // Вывод

i2 = i3; // Запись результата в i2

}

}

else if (StrBtn == "1/x")

{

i2 = Convert::ToDouble(txt->Text);

if (i2 == 0) // При попытке деления на ноль

{

this->txt->Text = StrErr = "Делить на 0 нельзя!";// Вывод ошибки

}

else

{

i3 = 1 / (i2); // Вычисление 1/x

this->txt->Text = Convert::ToString(i3); // Вывод

if (OperCnt == 0) i1 = i3;

else i2 = i3;

}

}

else if (StrBtn == "+/-") // Функция смены знака

{

if (!(StrTxt->Contains("!")))

{

if (StrTxt->Contains("-")) StrTxt = StrTxt->Replace("-", "");

// Удаление минуса, если он уже был в строке

else StrTxt = "-" + StrTxt; // Добавление минуса перед строкой

this->txt->Text = StrTxt; // Вывод строки

if (!((StrTxt == "-") || (StrTxt == "") || (StrTxt == ",")))

// Проверка исключений

{

if (OperCnt != 0) // Если уже была нажата кнопка операции

{

i2 = Convert::ToDouble(StrTxt); // Запись числа в i2

i3 = i2; // Запись в i3

}

else if (txt->Text != ",") // Если операции не были нажаты

{

i1 = Convert::ToDouble(StrTxt); // Запись числа в i1

i3 = i1; // Запись в i3

}

}

}

}

else

{

if (OperFlag == false) // Если операция не была уже нажата

{

OperCnt += 1; // Счётчик числа операций

if ((i2 == 0) && (LastOper == 1)) // Исключение деления на ноль

{

this->txt->Text = StrErr = "Делить на 0 нельзя!";

// Вывод ошибки

i1 = 0; // Обнуление делимого

}

else Calculate(); // Вычисление (обращение к функции Calculate)

if (StrBtn == "/") LastOper = 1;

// При делении - номер операции 1

else if (StrBtn == "*") LastOper = 2;

// При умножении - номер операции 2

else if (StrBtn == "-")

{

if (StrTxt == "")

{

this->txt->Text = "-";

// При пустой строке добавляет минус в строку

OperCnt = OperCnt - 1;

}

else LastOper = 3;

// При вычитании - номер операции 3

}

else if (StrBtn == "+") LastOper = 4;

// При сложении - номер операции 4

if ((StrErr->Length == 0) && (OperCnt >= 2))

// Если нет ошибки и операция была нажата как минимум 2 раза

{

this->txt->Text = Convert::ToString(i3);

// Вывод результата

i1 = i3; // Запись результата в i1

}

NumCnt = 0; // Обнуление счётчика введённых символов

OperFlag = true;

}

else if (StrBtn == "-")

// Добавляет возможность ввода дополнительного минуса (в строку, а не // операцию)

{

this->txt->Text = "-";

}

}

}

private: System::Void Num_button_Click(System::Object^ sender, System::EventArgs^ e) // Обработчик нажатий на цифровой блок

{

Char CharBtn = Convert::ToChar(((Button^)sender)->Text);

// Символ нажатой кнопки

String^ StrTxt = txt->Text; // Введённая строка

if (NumCnt == 0 && StrTxt != "-") this->txt->Text = "";

// Если не были введены цифры и строка не состоит из минуса - обнуляет строку

if (StrTxt->Contains("!")) this->txt->Text = "";

// Если была какая-либо ошибка - обнуляет строку

else if ((CharBtn == ',') && ((StrTxt == "") || (StrTxt == "0") || (NumCnt == 0))) this->txt->Text += CharBtn;

// Запятая в пустой строке

else if ((OperCnt != 0) && ((CharBtn != ',') || (CharBtn == ',' &&

!(StrTxt->Contains(","))))) // Если уже была нажата кнопка операции

{

this->txt->Text += CharBtn; // Добавление символа нажатой кнопки

i2 = Convert::ToDouble(txt->Text); // Ввод числа в i2

}

else if ((CharBtn != ',') || (CharBtn == ',' && !(StrTxt->Contains(","))))

// Если операции не были нажаты

{

this->txt->Text += CharBtn;

i1 = Convert::ToDouble(txt->Text); // Ввод числа в i1

}

NumCnt += 1; // Счётчик введённых знаков

OperFlag = false; // Отменяет флаг нажатой операции (операция не была нажата)

}

private: System::Void Control_button_Click(System::Object^ sender, System::EventArgs^ e) // Обработчик нажатий на контролирующие кнопки

{

String^ StrCtrlBtn = ((Button^)sender)->Text;

String^ StrTxt = txt->Text;

String^ StrErr = "";

if (StrCtrlBtn == "BackSpace")

{

if (StrTxt->Contains("!")) this->txt->Text = "";

// Если была ошибка - стирает строку

else if (StrTxt->Length > 0) // Если длина строки больше нуля

{

this->txt->Text = StrTxt->Remove(StrTxt->Length - 1);

// Удаляет по одному символу

StrTxt = txt->Text; // Перезапись строки

if (!((StrTxt == "") || (StrTxt == "-") || (StrTxt == ",")))

// Обработка исключений, чтобы они записывались в i1 или i2

// в зависимости от того, были ли нажаты операции

{

if (OperCnt != 0) i2 = Convert::ToDouble(txt->Text);

else i1 = Convert::ToDouble(txt->Text);

}

else

{

if (OperCnt != 0) i2 = 0;

else i1 = 0;

}

OperFlag = false;

}

}

else if (StrCtrlBtn == "CE")

{

this->txt->Text = ""; // Очистка поля ввода

}

else if (StrCtrlBtn == "C")

{

// Сброс поля ввода, всех значений и флагов

this->txt->Text = "";

OperCnt = 0;

LastOper = 0;

OperFlag = false;

i1 = 0;

i2 = 0;

i3 = 0;

}

else if ((StrCtrlBtn == "=") && (OperFlag == false))

{

i3 = i1; // Присвоение результату значения i1

if ((i2 == 0) && (LastOper == 1)) // Проверка деления на 0

{

StrErr = "Делить на 0 нельзя!";

this->txt->Text = StrErr;

i1 = 0;

}

else Calculate(); // Вычисление (обращение к функции Calculate())

if (StrErr->Length == 0) // Если нет ошибки

{

this->txt->Text = Convert::ToString(i3); // Вывод результата

i1 = i3; // Запись результата в i1

NumCnt = 0;

}

LastOper = 0; // Обнуление последней операции

}

}