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

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

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

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

Далее – схема алгоритма обработчика нажатия на кнопку закрытия программы btnClose_Click, который выполняет закрытие (рисунок 2).

Рисунок 2 – Схема алгоритма функции обработчика нажатия на кнопку «Закрыть» (btnClose_Click)

Затем, на рисунке 3 представлена схема алгоритма функции txt_KeyPress, которая определяет активное текстовое поле ввода и не даёт ввести запрещённые символы, определяя некорректный ввод пользователя.

Рисунок 3 – Схема алгоритма функции обработки ввода txt_KeyPress

Для определения направления конвертации через кнопки используется обработчик ConvertWay_RBtn_Click (рисунок 4), который конкретно определяет тип конвертации (также изменяя подписи результатов) и работает с записанными в памяти значениями курса.

Рисунок 4 – Схема алгоритма функции обработчика выбора кнопок направления конвертации (ConvertWay_RBtn_Click)

На рисунке 5 представлена схема функции вычисления непосредственно результата конвертации валюты (resultBtn_Click) в зависимости от выбранного направления (типа) конвертации (при нажатии на кнопку «Конвертировать»). Данный алгоритм также выводит окна с соответствующими сообщениями об ошибках в случае некорректного ввода (пустой ввод, нулевой курс) при помощи MessageBox. В итоге результат конвертации форматируется согласно заданию и выводится в поля вывода.

Рисунок 5 – Схема алгоритма функции нажатия на кнопку «Конвертировать» (resultBtn_Click)

Наконец, на рисунке 6 представлена схема алгоритма обработчика выхода из формы ввода курса, функция которой заключается в записи (в память) введённого пользователем значения курса для каждого направления конвертации.

Рисунок 6 – Схема алгоритма функции покидания поля ввода курса (ExRateTxt_Leave)

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

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

{

// Определение десятичного разделителя (точки или запятой)

// из региональных настроек.

NumberFormatInfo^ nfi = NumberFormatInfo::CurrentInfo;

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

}

private: System::Void btnClose_Click(System::Object^ sender, System::EventArgs^ e) // Обработка нажатия на кнопку "Закрыть"

{

this->Close(); // Закрытие программы

}

private: System::Void txt_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)

{

// При любом вводе - очистка (сброс) результата

Result1Txt->Text = L"";

Result2Txt->Text = L"";

TextBox^ ActiveTextBox;

// Объявление переменной активного текстового поля

if (InTxt->ContainsFocus == true) ActiveTextBox = InTxt;

else ActiveTextBox = ExRateTxt;

// Присваивание значения активного текстового поля

// соответствующей переменной

if (!Char::IsDigit(e->KeyChar)) // Если нажатая клавиша не цифровая.

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

if (e->KeyChar != ds || ActiveTextBox->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 (ActiveTextBox->Text->Length > 0) // Если строка не пустая

if (ActiveTextBox->Text[0] == '0'

&& ActiveTextBox->SelectionStart < 2)

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

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

if (e->KeyChar == ds) // Если введен десятичный разделитель

{

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

ActiveTextBox->SelectionStart == 0)

{

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

ActiveTextBox->Text = ActiveTextBox->Text->Insert(0, "0"); // Вставка 0

ActiveTextBox->SelectionStart = 1;

// Сдвиг текстового курсора

}

}

}

private: System::Void ConvertWay_RBtn_Click(System::Object^ sender, System::EventArgs^ e) // Обработка нажатий на кнопки направления конвертации

{

// Очистка (сброс) предыдущего результата и курса обмена

Result1Txt->Text = "";

Result2Txt->Text = "";

ExRateTxt->Text = "";

// Вставка записанного в память значения курса в поле курса обмена

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

if ((DolToRub_RBtn->Checked) && (ExRate1 != 0)) ExRateTxt->Text = (ExRate1).ToString("F2");

if ((RubToDol_RBtn->Checked) && (ExRate2 != 0)) ExRateTxt->Text = (ExRate2).ToString("F2");

if ((EurToRub_RBtn->Checked) && (ExRate3 != 0)) ExRateTxt->Text = (ExRate3).ToString("F2");

if ((RubToEur_RBtn->Checked) && (ExRate4 != 0)) ExRateTxt->Text = (ExRate4).ToString("F2");

if ((DolToRub_RBtn->Checked) || (RubToDol_RBtn->Checked))

// Если нажаты кнопки конвертации с курсом доллара

{

ExRateLbl->Text = "(руб./$):"; // Смена надписи

if (DolToRub_RBtn->Checked) // Доллары в рубли

{

// Смена надписей результатов

Result1Lbl->Text = "$";

Result2Lbl->Text = "руб.";

ConvertType = 1; // Первый "тип" конвертации (в рубли)

}

else // Рубли в доллары

{

// Смена надписей результатов

Result1Lbl->Text = "руб.";

Result2Lbl->Text = "$";

ConvertType = 2; // Второй "тип" конвертации (из рублей)

}

}

else // Если нажаты кнопки конвертации с курсом евро

{

ExRateLbl->Text = "(руб./€):"; // Смена надписи

if (EurToRub_RBtn->Checked) // Евро в рубли

{

// Смена надписей результатов

Result1Lbl->Text = "€";

Result2Lbl->Text = "руб.";

ConvertType = 1; // Первый "тип" конвертации (в рубли)

}

else // Рубли в евро

{

// Смена надписей результатов

Result1Lbl->Text = "руб.";

Result2Lbl->Text = "€";

ConvertType = 2; // Второй "тип" конвертации (из рублей)

}

}

}

private: System::Void resultBtn_Click(System::Object^ sender, System::EventArgs^ e) // Обработка нажатия на кнопку "Конвертировать"

{

double ExchangeResult = 0; // Объявление переменной результата

if ((ExRateTxt->Text != "") && (InTxt->Text != ""))

// Если поля ввода не пустые

{

In = Convert::ToDouble(InTxt->Text->Replace(ds, ','));

// Ввод суммы для конвертации

ExRate = Convert::ToDouble(ExRateTxt->Text->Replace(ds, ',')); // Ввод курса обмена

if (ExRate != 0) // Если курс не равен 0

{

if (ConvertType == 1) ExchangeResult = In * ExRate;

// Вычисление при конвертации в рубли

else ExchangeResult = In / ExRate;

// Вычисление при конвертации из рублей

ExRateTxt->Text = (Math::Truncate(ExRate * 100)

/ 100).ToString("F2");

InTxt->Text = (Math::Truncate(In * 100)

/ 100).ToString("F2");

Result1Txt->Text = (Math::Truncate(In * 100)

/ 100).ToString("F2"); // Вывод изначальной суммы строкой

ExchangeResult = Math::Truncate(ExchangeResult * 100)

/ 100; // Округление результата до сотых в пользу банка

if (ExchangeResult > 0) Result2Txt->Text = ExchangeResult.ToString("F2");

// Вывод результата, если он больше нуля

else

{

Result1Txt->Text = "";

DialogResult = MessageBox::Show(this,

"Сумма для конвертации ниже минимальной.",

"АРМ оператора обменного пункта", MessageBoxButtons::OK, MessageBoxIcon::Exclamation, MessageBoxDefaultButton::Button1);

}

}

else // При курсе обмена равном 0 - выводится окно MessageBox

DialogResult = MessageBox::Show(this,

"Курс обмена не может быть равен 0.",

"АРМ оператора обменного пункта", MessageBoxButtons::OK, MessageBoxIcon::Exclamation, MessageBoxDefaultButton::Button1);

}

else // Если не введены значения хотя бы в одно из полей

{

String^ MessageStr; // Объявление переменной строки сообщения

// Строка сообщения в зависимости от того,

// не введены значения в оба поля или в одно из полей:

if ((ExRateTxt->Text == "") && (InTxt->Text == "")) MessageStr = "Пожалуйста, введите значение суммы для конвертации и курс обмена.";

else if (ExRateTxt->Text == "") MessageStr =

"Пожалуйста, введите значение текущего курса обмена.";

else MessageStr =

"Пожалуйста, введите значение суммы для конвертации.";

// Выводится окно MessageBox с соответствующим сообщением

DialogResult = MessageBox::Show(this, MessageStr,

"АРМ оператора обменного пункта", MessageBoxButtons::OK, MessageBoxIcon::Exclamation, MessageBoxDefaultButton::Button1);

}

}

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

// Функция обработчика покидания окна ввода курса обмена

{

if (InTxt->Text != "")

{

In = Convert::ToDouble(InTxt->Text->Replace(ds, ','));

// Ввод суммы для конвертации

InTxt->Text = (Math::Truncate(In * 100) / 100).ToString("F2");

}

// При не пустом поле курса - в память записывается

// значение последнего введённого курса

if (ExRateTxt->Text->Length > 0)

{

ExRate = Convert::ToDouble(ExRateTxt->Text->Replace(ds, ',')); // Ввод курса обмена

ExRate = Math::Truncate(ExRate * 100) / 100;

ExRateTxt->Text = (ExRate).ToString("F2");

LastExRate = ExRate;

}

else LastExRate = 0.00;

// Присваивание 4-м переменным значения последнего введённого курса

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

if (DolToRub_RBtn->Checked) ExRate1 = LastExRate;

if (RubToDol_RBtn->Checked) ExRate2 = LastExRate;

if (EurToRub_RBtn->Checked) ExRate3 = LastExRate;

if (RubToEur_RBtn->Checked) ExRate4 = LastExRate;

}