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

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 - Верное равенство";

// Вывод комментария

}

}

}

}