Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 сем / лаба 4.docx
Скачиваний:
0
Добавлен:
03.06.2025
Размер:
868 Кб
Скачать
☆

2 Схемы алгоритмов

Прежде всего, при нажатии на кнопку «Закрыть» производится закрытие программы (рисунок 1).

Рисунок 1 – Схема алгоритма обработки нажатия на кнопку «Закрыть»

На рисунках 2-5 показаны схемы алгоритмов нажатия кнопок: «Рубли в Доллары», «Евро в Рубли», «Рубли в Евро», «Доллары в Рубли».

Рисунок 2 – Схема алгоритма обработки нажатия кнопки «Рубли в Доллары»

Рисунок 3 – Схема алгоритма обработки нажатия кнопки «Евро в Рубли»

Рисунок 4 – Схема алгоритма обработки нажатия кнопки «Рубли в Евро»

Рисунок 5 – Схема алгоритма обработки нажатия кнопки «Доллары в Рубли»

При нажатии на кнопку «Конвертировать», выполняется алгоритм, схема алгоритма представлена на рисунке 6. В ней рассчитывается результат конвертирования и выводятся ошибки с помощью MessageBox.

Рисунок 6 – Схема алгоритма обработки нажатия кнопки «Конвертировать»

При вводе суммы для конвертации присутствуют исключения для ввода, указанные на схеме алгоритма на рисунке 7.

Рисунок 7 – Схема алгоритма ввода разрешенных символов при вводе суммы

Прежде всего, на рисунке 8 представлена схема алгоритма функции Form1_Load, которая при загрузке формы определяет десятичный разделитель из региональных настроек системы.

Рисунок 8 – Схема алгоритма функции обработчика загрузки формы (Form1_Load)

3 Текст программы

#pragma endregion

int x1; // Вспомогательная переменная (имеется ли запятая)

char ds; // Символ десятичного разделителя

// Переменные для хранения курсов обмена

double courseDollarToRub = -1;

double courseRubToDollar = -1;

double courseEuroToRub = -1;

double courseRubToEuro = -1;

private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {

NumberFormatInfo^ nfi = NumberFormatInfo::CurrentInfo;

ds = (char)nfi->NumberDecimalSeparator[0];

RubToDollar->Checked = true;

txtCourse->Text = "";

}

// Ограничение на ввод допустимых символов в поле суммы

private: System::Void txtCourse_KeyPress(System::Object^ sender,

System::Windows::Forms::KeyPressEventArgs^ e) {

// Разрешаем ввод только цифр, запятой, точки и клавиши Backspace

// Если нажатая клавиша не цифровая.

if (!Char::IsDigit(e->KeyChar))

// Запрет на ввод более одной запятой.

if (e->KeyChar != ',' ||

txtCourse->Text->IndexOf(',') != -1)

// Запрет на ввод более одного десятичного разделителя.

if (e->KeyChar != ds ||

txtCourse->Text->IndexOf(ds) != -1)

// Если нажатая клавиша не является клавишей

// BackSpace.

if (e->KeyChar != (char)Keys::Back)

e->Handled = true; // Запрет ввода

// Запрет ввода повторных нулей в начале числа.

if (e->KeyChar == (char)Keys::D0 ||

e->KeyChar == (char)Keys::NumPad0)

// Если нажата клавиша 0

if (txtCourse->Text->Length >= 1) // Если строка не пустая

if (txtCourse->Text[0] == '0' &&

txtCourse->SelectionStart < 2)

e->Handled = true; // Запрет ввода

// Замена десятичного разделителя в начале числа на "0,".

if (e->KeyChar == ds) {

// Если введен десятичный разделитель

x1 = 0;

if (txtCourse->Text != "" && txtCourse->Text[0] == ',') {

x1 = 1;

}

if (txtCourse->Text->IndexOf(ds) == -1 &&

txtCourse->SelectionStart == x1) {

// Если десятичный разделитель уже есть,

// то 0 вставлять не нужно.

txtCourse->Text = txtCourse->Text->Insert(x1, "0");

// Вставка 0

txtCourse->SelectionStart = x1 + 1;

// Текстовый курсор в конец

}

}

}

private: System::Void txtCourse_TextChanged(System::Object^ sender,

System::EventArgs^ e) {

double newCourse;

if (Double::TryParse(txtCourse->Text->Replace('.', ','),

newCourse) && newCourse > 0) {

// Сохранение курса в зависимости от выбранного направления обмена

if (DollarToRub->Checked) courseDollarToRub = newCourse;

if (RubToDollar->Checked) courseRubToDollar = newCourse;

if (EuroToRub->Checked) courseEuroToRub = newCourse;

if (RubToEuro->Checked) courseRubToEuro = newCourse;

}

}

private: System::Void txtCourse_TextChanged1(System::Object^ sender, System::EventArgs^ e) {

txtCourse->BackColor = System::Drawing::Color::White;

}

// Обработчики изменения направления обмена

private: System::Void DollarToRub_CheckedChanged(System::Object^ sender,

System::EventArgs^ e) {

if (DollarToRub->Checked) {

txtAmount2->Text = L"";

txtResult->Text = L"";

txtCourse->Text = (courseDollarToRub > 0)

? courseDollarToRub.ToString("F2") : "";

lblCourse->Text = L"Курс продажи";

lblCourseSign->Text = L"(руб./$)";

lblMoneyUnit1->Text = L"$";

lblMoneyUnit2->Text = L"руб.";

}

}

private: System::Void RubToDollar_CheckedChanged(System::Object^ sender,

System::EventArgs^ e) {

if (RubToDollar->Checked) {

txtAmount2->Text = L"";

txtResult->Text = L"";

txtCourse->Text = (courseRubToDollar > 0)

? courseRubToDollar.ToString("F2") : "";

lblCourse->Text = L"Курс покупки";

lblCourseSign->Text = L"(руб./$)";

lblMoneyUnit1->Text = L"руб.";

lblMoneyUnit2->Text = L"$";

}

}

private: System::Void EuroToRub_CheckedChanged(System::Object^ sender,

System::EventArgs^ e) {

if (EuroToRub->Checked) {

txtAmount2->Text = L"";

txtResult->Text = L"";

txtCourse->Text = (courseEuroToRub > 0)

? courseEuroToRub.ToString("F2") : "";

lblCourse->Text = L"Курс продажи";

lblCourseSign->Text = L"(руб./€)";

lblMoneyUnit1->Text = L"€";

lblMoneyUnit2->Text = L"руб.";

}

}

private: System::Void RubToEuro_CheckedChanged(System::Object^ sender,

System::EventArgs^ e) {

if (RubToEuro->Checked) {

txtAmount2->Text = L"";

txtResult->Text = L"";

txtCourse->Text = (courseRubToEuro > 0)

? courseRubToEuro.ToString("F2") : "";

lblCourse->Text = L"Курс покупки";

lblCourseSign->Text = L"(руб./€)";

lblMoneyUnit1->Text = L"руб.";

lblMoneyUnit2->Text = L"€";

}

}

// Конвертация суммы

private: System::Void button_Convert_Click(System::Object^ sender,

System::EventArgs^ e) {

// Проверяем, заполнены ли поля

bool isEmpty = false;

if (txtCourse->Text->Trim() == "") {

txtCourse->BackColor = System::Drawing::Color::Pink;

isEmpty = true;

}

else {

txtCourse->BackColor = System::Drawing::Color::White;

}

if (txtAmount->Text->Trim() == "") {

txtAmount->BackColor = System::Drawing::Color::Pink;

isEmpty = true;

}

else {

txtAmount->BackColor = System::Drawing::Color::White;

}

// Если есть пустые поля, показываем сообщение и выходим

if (isEmpty) {

MessageBox::Show(L"Заполните все поля перед конвертацией.",

L"АРМ оператора обменного пункта",

MessageBoxButtons::OK,MessageBoxIcon::Warning);

return;

}

// Проверяем, что поле не пустое

try {

// Преобразуем в число

double value = Convert::ToDouble(txtAmount->Text->

Replace('.', ','));

// Преобразуем обратно в строку с двумя знаками после запятой

txtAmount->Text = value.ToString("F2");

// Устанавливаем курсор в конец

txtAmount->SelectionStart = txtAmount->Text->Length;

}

catch (Exception^) {

// Игнорируем ошибку, если ввод некорректный

}

// Конвертация и округление до 2 знаков после запятой

// Конвертация и отбрасывание лишних знаков после запятой

double newCourse = Convert::ToDouble(txtCourse->Text);

newCourse = Math::Floor(newCourse * 100) / 100; // Отбрасываем лишние знаки

// Отображаем результат в текстовом поле

txtCourse->Text = newCourse.ToString("F2");

// Устанавливаем курсор в конец текста

txtCourse->SelectionStart = txtCourse->Text->Length;

double amount = Convert::ToDouble(txtAmount->Text->Replace('.', ','));

double course = Convert::ToDouble(txtCourse->Text->Replace('.', ','));

double result;

if (RubToDollar->Checked || RubToEuro->Checked) {

result = amount / course;

}

else {

result = amount * course;

}

// Отбрасываем лишние знаки после запятой

result = Math::Floor(result * 100) / 100;

if (result >= 0.01) {

txtResult->Text = result.ToString("F2");

txtAmount2->Text = amount.ToString("F2");

}

else {

MessageBox::Show(L"Сумма для конвертации слишком мала или 0.",

L"АРМ оператора обменного пункта",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation);

txtResult->Text = "";

txtAmount2->Text = "";

}

}

private: System::Void txtAmount_TextChanged(System::Object^ sender,

System::EventArgs^ e) {

txtAmount->BackColor = System::Drawing::Color::White;

}

private: System::Void txtAmount_KeyPress_1(System::Object^ sender,

System::Windows::Forms::

KeyPressEventArgs^ e) {

// Если нажатая клавиша не цифровая.

if (!Char::IsDigit(e->KeyChar))

// Запрет на ввод более одной запятой.

if (e->KeyChar != ',' ||

txtAmount->Text->IndexOf(',') != -1)

// Запрет на ввод более одного десятичного разделителя.

if (e->KeyChar != ds ||

txtAmount->Text->IndexOf(ds) != -1)

// Если нажатая клавиша не является клавишей

// BackSpace.

if (e->KeyChar != (char)Keys::Back)

e->Handled = true; // Запрет ввода

// Запрет ввода повторных нулей в начале числа.

if (e->KeyChar == (char)Keys::D0 ||

e->KeyChar == (char)Keys::NumPad0)

// Если нажата клавиша 0

if (txtAmount->Text->Length >= 1) // Если строка не пустая

if (txtAmount->Text[0] == '0' &&

txtAmount->SelectionStart < 2)

e->Handled = true; // Запрет ввода

// Замена десятичного разделителя в начале числа на "0,".

if (e->KeyChar == ds) {

// Если введен десятичный разделитель

x1 = 0;

if (txtAmount->Text != "" && txtAmount->Text[0] == ',') {

x1 = 1;

}

if (txtAmount->Text->IndexOf(ds) == -1 &&

txtAmount->SelectionStart == x1) {

// Если десятичный разделитель уже есть,

// то 0 вставлять не нужно.

txtAmount->Text = txtAmount->Text->Insert(x1, "0");

// Вставка 0

txtAmount->SelectionStart = x1 + 1;

// Текстовый курсор в конец

}

}

}

private: System::Void btnClose_Click(System::Object^ sender,

System::EventArgs^ e) {

this->Close();

}

};

}

Соседние файлы в папке 2 сем