2 Схемы алгоритмов
Прежде всего, на рисунке 1 представлена схема алгоритма закрытия программы при нажатии на кнопку «Закрыть».
Рисунок 1 – Схема алгоритма функции обработки нажатия на кнопку «Закрыть» (btnClose_Click)
Далее –алгоритм обработки нажатия на кнопку «Сброс», который спрасывает значения всех полей ввода-вывода и комментарий (рисунок 2).
Рисунок 2 – Схема алгоритма функции обработки нажатия на кнопку «Сброс» (btnReset_Click)
При вводе пользователя – определяется активное тестовое поле, а также прорабатываются исключения ввода некорректных символов. При попытке их ввода – выводится сообщение о соответствующей ошибке и ввод запрещается. Данный алгоритм представлен ниже (рисунки 3 и 4).
Рисунок 3 – Схема алгоритма функции обработки ввода символов в тектовое поле (txt_KeyPress)
Рисунок 4 – Продолжение схемы алгоритма функции обработки ввода символов в тектовое поле (txt_KeyPress)
Для обработки пустого ввода и отдельных исключений ввода (разделитель, знак без числа) используется функция Check() (рисунки 5 и 6).
Рисунок 5 – Схема алгоритма функции Check()
Рисунок 6 – Продолжение схемы алгоритма функции Check()
При нажатии на кнопку «Решить» изначально проверяется результат проверки функцией Check(), затем записываются введённые значения (и повторно выводятся на экран в том виде, в каком они были записаны), и далее для вычисления корней сначала проверяется, равен ли нулю коэффициент а, затем – с нулём сравнивается значение дискриминанта и вычисляется результат в зависимости от этого значения (с соответствующим комментарием), при этом также проверяется, равен ли один из коэффициентов b и c нулю (если да – это неполное квадратное уравнение).
Если же коэффициент а равен нулю – проверяется коэффициент b, если он не нулевой – выводится корень линейного уравнения, в обратном случае – рассматривается верность равенства с=0.
Схема алгоритма данной функции представлена на рисунках 7 и 8.
Рисунок 7 – Схема алгоритма функции обработки нажатия на кнопку «Решить» (BtnResult_Click)
Рисунок 8 – Продолжение схемы алгоритма функции обработки нажатия на кнопку «Решить» (BtnResult_Click)
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->txt_A->Text = L"";
this->txt_B->Text = L"";
this->txt_C->Text = L"";
this->txt_X1->Text = L"";
this->txt_X2->Text = L"";
this->lblCom->Text = L"";
}
private: System::Void txt_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
// Отслеживание нажатых клавиш в активной строке ввода
{
// При любом вводе - очистка (сброс) результата и комментария,
// включение полей корней
this->txt_X1->Text = L"";
this->txt_X2->Text = L"";
this->lblCom->Text = L"";
TextBox^ ActiveTextBox;
// Объявление переменной активного текстового поля
if (txt_A->ContainsFocus == true) ActiveTextBox = txt_A;
else if (txt_B->ContainsFocus == true) ActiveTextBox = txt_B;
else (txt_C->ContainsFocus == true) ActiveTextBox = txt_C;
// Присваивание значения активного текстового поля соответствующему
// коэффициенту
if (!((e->KeyChar >= '0' && e->KeyChar <= '9') || (e->KeyChar == ',') || (e->KeyChar == '.') || (e->KeyChar == '-') || (e->KeyChar == 8) || (e->KeyChar == 127)))
{
// Запрет использовать символы, кроме как разрешённые: цифры из
// набора 0-9, разделитель "," или ".", знак (-), клавиши
// BackSpace и Delete
e->Handled = true; // Запрет ввода неразрешённых символов
this->lblCom->Text =
L"Ошибка:\nРазрешено вводить\nтолько числа";
// Вывод сообщения о некорректных символах
}
else if (((e->KeyChar == '.') || (e->KeyChar == ',')) && (ActiveTextBox->Text->Replace('.', ',')->Contains(",")))
{
// Поиск ввода разделителя "." или "," в строку, уже содержащую
// разделитель
e->Handled = true; // Запрет ввода символа
this->lblCom->Text =
L"Ошибка:\nВ числе не может быть\nбольше одного разделителя";
// Вывод сообщения о вводе более одного разделителя
}
else if (((e->KeyChar >= '0' && e->KeyChar <= '9') || (e->KeyChar == ',') || (e->KeyChar == '.')) && (ActiveTextBox->SelectionStart == 0) && (ActiveTextBox->Text->Contains("-")))
{
e->Handled = true; // Запрет ввода символа
this->lblCom->Text = L"Ошибка:\nЗнак должен быть\nперед числом"; // Вывод сообщения о вводе цифр перед знаком
}
else if (e->KeyChar == '-')
// Действия при вводе знака
{
if (ActiveTextBox->Text->Contains("-"))
// Поиск ввода знака в строку, уже содержащую знак
{
e->Handled = true; // Запрет ввода символа
this->lblCom->Text =
L"Ошибка:\nВ числе не может быть\nбольше одного знака";
// Вывод сообщения о вводе более одного знака
}
else if ((ActiveTextBox->Text->Length != 0) &&
(ActiveTextBox->SelectionStart != 0))
//Проверка добавления знака в уже введенное число
{
e->Handled = true; // Запрет ввода символа
this->lblCom->Text =
L"Ошибка:\nЗнак должен\nстоять перед числом";
// Вывод сообщения о вводе знака внутри числа
}
}
}
private: bool Check()
// Логическая функция проверки (отдельных случаев некорректного ввода)
{
int ltxtA = txt_A->Text->Length;
int ltxtB = txt_B->Text->Length;
int ltxtC = txt_C->Text->Length;
// Определение длин введённых строк
if ((ltxtA == 0) || (ltxtB == 0) || (ltxtC == 0))
// Проверка строк на пустой ввод
{
if ((ltxtA == 0) && (ltxtB == 0) && (ltxtC == 0))
{
this->lblCom->Text = L"Ошибка:\nВведите коэффициенты";
// Сообщение об ошибке при пустых строках
}
else if (ltxtA == 0)
{
this->lblCom->Text =
L"Ошибка:\nВведите первый коэффициент A";
// Сообщение об ошибке при пустой первой строке
}
else if (ltxtB == 0)
{
this->lblCom->Text =
L"Ошибка:\nВведите второй коэффициент B";
// Сообщение об ошибке при пустой второй строке
}
else if (ltxtC == 0)
{
this->lblCom->Text =
L"Ошибка:\nВведите третий коэффициент C";
// Сообщение об ошибке при пустой второй строке
}
return false;
}
if ((txt_A->Text == "-") || (txt_A->Text == "-.") ||
(txt_A->Text == "-,"))
{
// Поиск ввода "-" без числа
this->lblCom->Text =
L"Ошибка:\nВы ввели только знак,\nвведите первый коэффициент A";
// Вывод сообщения о необходимости ввести первое число
return false;
}
else if ((txt_B->Text == "-") || (txt_B->Text == "-.") ||
(txt_B->Text == "-,"))
{
// Поиск ввода "-" без числа
this->lblCom->Text =
L"Ошибка:\nВы ввели только знак,\nвведите второй коэффициент B";
// Вывод сообщения о необходимости ввести второе число
return false;
}
else if ((txt_C->Text == "-") || (txt_C->Text == "-.") ||
(txt_C->Text == "-,"))
{
// Поиск ввода "-" без числа
this->lblCom->Text =
L"Ошибка:\nВы ввели только знак,\nвведите третий коэффициент C";
// Вывод сообщения о необходимости ввести третье число
return false;
}
else if ((txt_A->Text == ".") || (txt_A->Text == ","))
{
// Поиск ввода разделителя без числа
this->lblCom->Text =
L"Ошибка:\nВы ввели только разделитель,\nвведите первый коэффициент";
// Вывод сообщения о необходимости ввести первое число
return false;
}
else if ((txt_B->Text == ".") || (txt_B->Text == ","))
{
// Поиск ввода разделителя без числа
this->lblCom->Text =
L"Ошибка:\nВы ввели только разделитель,\nвведите второй коэффициент";
// Вывод сообщения о необходимости ввести второе число
return false;
}
else if ((txt_C->Text == ".") || (txt_C->Text == ","))
{
// Поиск ввода разделителя без числа
this->lblCom->Text =
L"Ошибка:\nВы ввели только разделитель,\nвведите третий коэффициент";
// Вывод сообщения о необходимости ввести второе число
return false;
}
else return true;
}
private: System::Void BtnResult_Click(System::Object^ sender, System::EventArgs^ e) // Выполнение операций при нажатии на кнопку "Решить"
{
// Объявление переменных (коэффициенты a, b, c, дискриминант D, корни // x1 и x2)
double a = 0;
double b = 0;
double c = 0;
double D = 0;
double x1 = 0;
double x2 = 0;
if (Check() == true)
// Если выполняется функция проверки (вернула true)
{
// Перевод строк в вещественный тип
a = Convert::ToDouble(txt_A->Text->Replace('.', ','));
b = Convert::ToDouble(txt_B->Text->Replace('.', ','));
c = Convert::ToDouble(txt_C->Text->Replace('.', ','));
// Вывод прочитанных коэффициентов
this->txt_A->Text = Convert::ToString(a);
this->txt_B->Text = Convert::ToString(b);
this->txt_C->Text = Convert::ToString(c);
if (a != 0)
// Если коэффициент а не равен нулю (b и c могут быть равны 0)
{
D = b * b - 4 * a * c; // Вычисление дискриминанта
if (D > 0) // Если дискриминант больше нуля
{
// Вычисление корней квадратного уравнения
x1 = ((-1) * b - Math::Sqrt(D)) / (2 * a);
x2 = ((-1) * b + Math::Sqrt(D)) / (2 * a);
// Вывод корней в соответствующие поля
this->txt_X1->Text = Convert::ToString(x1);
this->txt_X2->Text = Convert::ToString(x2);
if (b == 0 || c == 0) this->lblCom->Text =
L"Неполное квадратное уравнение,\nдва корня";
else this->lblCom->Text =
L"Дискриминант > 0.\nУравнение имеет два корня.";
}
else if (D == 0) // Если дискриминант равен нулю
{
x1 = ((-1) * b) / (2 * a); // Вычисление корня
x2 = x1; // Приравнивание второго корня к первому
// Вывод корней
this->txt_X1->Text = Convert::ToString(x1);
this->txt_X2->Text = Convert::ToString(x2);
if (b==0 || c==0) this->lblCom->Text =
L"Неполное квадратное уравнение,\nдва одинаковых корня";
else this->lblCom->Text =
"Дискриминант = 0.\nУравнение имеет два\nодинаковых корня.";
}
else // Если дискриминант меньше нуля
{
// Очистка текстовых полей корней
this->txt_X1->Text = "";
this->txt_X2->Text = "";
if (b == 0 || c == 0) this->lblCom->Text =
"Неполное квадратное уравнение, не имеет действительных корней";
else this->lblCom->Text =
"Дискриминант < 0.\nУравнение не имеет\nдействительных корней.";
}
}
else // Если коэффициент а равен нулю
{
if (b != 0) // При b не равном нулю - линейное уравнение
{
x1 = ((-1) * c) / b;
// Вычисление корня линейного уравнения
this->txt_X1->Text = Convert::ToString(x1);
// Вывод результата (корня)
this->txt_X2->Text = "";
// Очистка поля второго корня
this->lblCom->Text =
L"Линейное уравнение –\nимеет один корень";
// Вывод комментария
}
else if (c!=0)
// Если а=b=0 - некорректное выражение (c = 0)
{
// Очистка полей корней
this->txt_X1->Text = "";
this->txt_X2->Text = "";
this->lblCom->Text = Convert::ToString(c) +
" = 0 - Неверное равенство"; // Вывод комментария
}
else // При a=b=c
{
// Очистка полей корней
this->txt_X1->Text = "";
this->txt_X2->Text = "";
this->lblCom->Text = "0 = 0 - Верное равенство";
// Вывод комментария
}
}
}
}