2 Схемы алгоритмов
Прежде всего, при нажатии на кнопку «Закрыть» производится закрытие программы (рисунок 1).
Рисунок 1 – Схема алгоритма обработки нажатия на кнопку «Закрыть»
При нажатии на «Сброс» – исполняется алгоритм очистки всех строк текстовых полей и меток (рисунок 2).
Рисунок 2 – Схема алгоритма обработки нажатия на кнопку «Сброс»
При вводе любого символа алгоритм сбрасывает метки операции и ошибки и очищает результат. После чего определяется активное тестовое поле, а также прорабатываются исключения ввода некорректных символов. При попытке их ввода – выводится сообщение о соответствующей ошибке и ввод запрещается. Данный алгоритм представлен ниже (рисунки 3 и 4).
Рисунок 3 – Схема алгоритма отслеживания ввода символов в поля ввода
Рисунок 4 – Продолжение схемы алгоритма отслеживания ввода символов в поля ввода
Логическая функция Check() определяет длины введённых строк, проверяет их заполненности (сравнивая длины с нулём), а также определяет отдельные случаи введённых без числа минуса и разделителя, каждая ошибка выводится в соответствующей метке (рисунки 5 и 6).
Рисунок 5 – Схема алгоритма функции Check()
Рисунок 6 – Продолжение схемы алгоритма функции Check()
После ввода чисел при нажатии на кнопку операции запускается алгоритм, соответственно: сложения (рисунок 7), вычитания (рисунок 8), умножения (рисунок 9) или деления (рисунок 10). В каждом из них проверяется, что функция Check() вернула значение true (была выполнена без ошибок), введённые числа конвертируются в тип данных Double и результат вычисления выводится в поле результата.
Рисунок 7 – Схема алгоритма операции сложения
Рисунок 8 – Схема алгоритма операции вычитания
Рисунок 9 – Схема алгоритма операции умножения
Рисунок 10 – Схема алгоритма операции деления
Для операции деления (рисунок 8) перед выполнением вычисления производится проверка деления на 0 – если делитель равен 0, вычисление не производится и выводится соответствующая ошибка.
3 Текст программы
private: System::Void btnClose_Click(System::Object^ sender, System::EventArgs^ e) // Выполнение операций при нажатии на кнопку "Закрыть"
{
this->Close(); // Закрытие программы
}
private: System::Void btnReset_Click(System::Object^ sender, System::EventArgs^ e) // Выполнение операций при нажатии на "Сброс"
{
// Очистка (сброс) строк всех текстовых полей
this->lblOper->Text = L"";
this->txt1->Text = L"";
this->txt2->Text = L"";
this->txtResult->Text = L"";
this->lblErr->Text = L"";
}
private: System::Void txt_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
// Отслеживание нажатых клавиш в активной строке ввода
{
// При любом вводе - очистка (сброс) результата,
// названия операции и сообщения об ошибке
this->txtResult->Text = L"";
this->lblOper->Text = L"";
this->lblErr->Text = L"";
TextBox^ ActiveTextBox;
// Объявление переменной активного текстового поля
if (txt1->ContainsFocus == true) ActiveTextBox = txt1;
else if (txt2->ContainsFocus == true) ActiveTextBox = txt2;
// Присваивание значения активного текстового поля соответствующей
// переменной
if (!((e->KeyChar >= '0' && e->KeyChar <= '9') || (e->KeyChar == ',') || (e->KeyChar == '.') || (e->KeyChar == '-') || (e->KeyChar == '+') || (e->KeyChar == 8) || (e->KeyChar == 127)))
{
// Запрет использовать символы, кроме как разрешённые: цифры из
// набора 0-9, разделитель "," или ".", знак (+ или -), клавиши
// BackSpace и Delete
e->Handled = true; // Запрет ввода неразрешённых символов
this->lblErr->Text =
L"Ошибка:\nРазрешено вводить\nтолько числа";
// Вывод сообщения о некорректных символах
}
else if (((e->KeyChar == '.') || (e->KeyChar == ',')) && (ActiveTextBox->Text->Replace('.', ',')->Contains(",")))
{
// Поиск ввода разделителя "." или "," в строку, уже содержащую
// разделитель
e->Handled = true; // Запрет ввода символа
this->lblErr->Text =
L"Ошибка:\nВ числе не может быть\nбольше одного разделителя";
// Вывод сообщения о вводе более одного разделителя
}
else if (((e->KeyChar >= '0' && e->KeyChar <= '9') || (e->KeyChar == ',') || (e->KeyChar == '.')) && (ActiveTextBox->SelectionStart == 0) && ((ActiveTextBox->Text->Contains("-")) || (ActiveTextBox->Text->Contains("+"))))
{
e->Handled = true; // Запрет ввода символа
this->lblErr->Text = L"Ошибка:\nЗнак должен быть\nперед числом"; // Вывод сообщения о вводе цифр перед знаком
}
else if ((e->KeyChar == '-') || (e->KeyChar == '+'))
// Действия при вводе знака
{
if (ActiveTextBox->Text->Contains("-") ||
ActiveTextBox->Text->Contains("+"))
// Поиск ввода знака в строку, уже содержащую знак
{
e->Handled = true; // Запрет ввода символа
this->lblErr->Text =
L"Ошибка:\nВ числе не может быть\nбольше одного знака";
// Вывод сообщения о вводе более одного знака
}
else if ((ActiveTextBox->Text->Length != 0) &&
(ActiveTextBox->SelectionStart != 0))
//Проверка добавления знака в уже введенное число
{
e->Handled = true; // Запрет ввода символа
this->lblErr->Text =
L"Ошибка:\nЗнак должен\nстоять перед числом";
// Вывод сообщения о вводе знака внутри числа
}
else if ((ActiveTextBox->Text->Length == 0))
// Поиск ввода знака без числа (ввод при нулевой длине строки)
{
this->lblErr->Text =
L"\nВы ввели только\nзнак, введите число";
// Вывод предупреждения о необходимости ввести число
}
}
}
private: bool Check()
{
int ltxt1 = txt1->Text->Length;
int ltxt2 = txt2->Text->Length;
// Определение длин введённых строк
if ((ltxt1 == 0) || (ltxt2 == 0))
// Проверка строк на пустой ввод
{
if ((ltxt1 == 0) && (ltxt2 == 0))
{
this->lblErr->Text = L"Ошибка:\nВведите два числа";
// Сообщение об ошибке при обеих пустых строках
return false;
}
else if (ltxt1 == 0)
{
this->lblErr->Text = L"Ошибка:\nВведите первое число";
// Сообщение об ошибке при пустой первой строке
return false;
}
else
{
this->lblErr->Text = L"Ошибка:\nВведите второе число";
// Сообщение об ошибке при пустой второй строке
return false;
}
}
else if ((txt1->Text == "-") || (txt1->Text == "-.") ||
(txt1->Text == "-,"))
{
// Поиск ввода "-" без числа
this->lblErr->Text =
L"Ошибка:\nВы ввели только знак,\nвведите первое число";
// Вывод сообщения о необходимости ввести первое число
return false;
}
else if ((txt2->Text == "-") || (txt2->Text == "-.") ||
(txt2->Text == "-,"))
{
// Поиск ввода "-" без числа
this->lblErr->Text =
L"Ошибка:\nВы ввели только знак,\nвведите второе число";
// Вывод сообщения о необходимости ввести второе число
return false;
}
else if ((txt1->Text == ".") || (txt1->Text == ","))
{
// Поиск ввода разделителя без числа
this->lblErr->Text =
L"Ошибка:\nВы ввели только разделитель,\nвведите первое число";
// Вывод сообщения о необходимости ввести первое число
return false;
}
else if ((txt2->Text == ".") || (txt2->Text == ","))
{
// Поиск ввода разделителя без числа
this->lblErr->Text =
L"Ошибка:\nВы ввели только разделитель,\nвведите второе число";
// Вывод сообщения о необходимости ввести второе число
return false;
}
else return true;
}
private: System::Void btnAdd_Click(System::Object^ sender, System::EventArgs^ e) // Выполнение операций при нажатии на кнопку "Сложить"
{
// Объявление переменных вводимых чисел и результата
double i1, i2, i3;
this->lblOper->Text = L"Сложение"; // Вывод метки операции сложения
if (Check())
{
this->lblErr->Text = L"";
// Перевод введённых чисел в вещественный тип
i1 = Convert::ToDouble(txt1->Text->Replace('.', ','));
i2 = Convert::ToDouble(txt2->Text->Replace('.', ','));
i3 = i1 + i2; // Вычисление суммы
this->txt1->Text = Convert::ToString(i1);
this->txt2->Text = Convert::ToString(i2);
// Вывод считанных чисел в полях ввода
this->txtResult->Text = Convert::ToString(i3);
// Вывод суммы в текстовое поле "Результат"
}
}
private: System::Void btnSub_Click(System::Object^ sender, System::EventArgs^ e) // Выполнение операций при нажатии на кнопку "Вычесть"
{
// Объявление переменных вводимых чисел и результата
double i1, i2, i3;
this->lblOper->Text = L"Вычитание"; // Вывод метки операции вычитания
if (Check())
{
this->lblErr->Text = L"";
// Перевод введённых чисел в вещественный тип и замена
// разделителя "." на "," (если есть)
i1 = Convert::ToDouble(txt1->Text->Replace('.', ','));
i2 = Convert::ToDouble(txt2->Text->Replace('.', ','));
i3 = i1 - i2; // Вычисление разности
this->txt1->Text = Convert::ToString(i1);
this->txt2->Text = Convert::ToString(i2);
// Вывод считанных чисел в полях ввода
this->txtResult->Text = Convert::ToString(i3);
// Вывод разности в текстовое поле "Результат"
}
}
private: System::Void btnMul_Click(System::Object^ sender, System::EventArgs^ e) // Выполнение операций при нажатии на кнопку "Умножить"
{
// Объявление переменных вводимых чисел и результата
double i1, i2, i3;
this->lblOper->Text = L"Умножение"; // Вывод метки операции умножения
if (Check())
{
this->lblErr->Text = L"";
// Перевод введённых чисел в вещественный тип и замена
// разделителя "." на "," (если есть)
i1 = Convert::ToDouble(txt1->Text->Replace('.', ','));
i2 = Convert::ToDouble(txt2->Text->Replace('.', ','));
i3 = i1 * i2; // Вычисление произведения
this->txt1->Text = Convert::ToString(i1);
this->txt2->Text = Convert::ToString(i2);
// Вывод считанных чисел в полях ввода
this->txtResult->Text = Convert::ToString(i3);
// Вывод произведения в текстовое поле "Результат"
}
}
private: System::Void btnDiv_Click(System::Object^ sender, System::EventArgs^ e) { // Выполнение операций при нажатии на кнопку "Разделить"
// Объявление переменных вводимых чисел и результата
double i1, i2, i3;
this->lblOper->Text = L"Деление"; // Вывод метки операции деления
if (Check())
{
this->lblErr->Text = L"";
// Перевод введённых чисел в вещественный тип и замена
// разделителя "." на "," (если есть)
i1 = Convert::ToDouble(txt1->Text->Replace('.', ','));
i2 = Convert::ToDouble(txt2->Text->Replace('.', ','));
if (i2 == 0)
// Исключение некорректного делителя (не может быть равен 0)
{
this->txtResult->Text = L""; // Сброс результата
this->lblErr->Text = L"Ошибка:\nНельзя делить на 0";
// Сообщение об ошибке при делении на 0
}
else
{
this->lblErr->Text = L"";
i3 = i1 / i2; // Вычисление частного
this->txt1->Text = Convert::ToString(i1);
this->txt2->Text = Convert::ToString(i2);
// Вывод считанных чисел в полях ввода
this->txtResult->Text = Convert::ToString(i3);
// Вывод частного в текстовое поле "Результат"
}
}
}
