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

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);

// Вывод частного в текстовое поле "Результат"

}

}

}