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