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; // Обнуление последней операции
}
}
