2. Создание схемы алгоритмов
При нажатии на кнопку «Закрыть» происходит алгоритм закрытия программы. Алгоритм работы функции представлен на рисунке 1.
Рисунок 1 – Схема алгоритма функции btnClose_Click
При нажатии на кнопку «Конвертировать» запускается функция Format, которая форматирует числа в текстовых полях формы. Алгоритм работы функции представлен на рисунке 2.
Рисунок 2 – Схема алгоритма функции Format
При нажатии на кнопку «Конвертировать», выполняется алгоритм, обрабатывающий входные текстовые поля. Вызывается функция CalcResult, которая подсчитывает результат конвертации, исходя из значений переключателя, и выводит результат в текстовые поля. Схема алгоритма представлена на рисунке 3.
Рисунок 3 – Схема алгоритма функции CalcResult
При нажатии на кнопку «Конвертировать», выполняется алгоритм button_Convert_Click, схема алгоритма представлена на рисунке 4.
Рисунок 4 – Схема алгоритма функции Button_Convert_Click
При изменении положения переключателя «Виды конвертации» вызывается функция RadioButton_CheckedChanged, которая меняет оформление формы в зависимости от выбранного положения переключателя. Схема алгоритма представлена на рисунке 5.
Рисунок 5 – Схема алгоритма функции RadioButton_CheckedChanged
Когда текстовое поле с курсом становится неактивно, вызывается функция txtCourse_Leave, которая считывает значение текстового поля и записывает его в соответствующую переменную (рисунок 6).
Рисунок 6 – Схема алгоритма функции txtCourse_Leave
3. Текст программы
private: System::Void button_Close_Click(System::Object^ sender,
System::EventArgs^ e) {
this->Close();
}
void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
//начальные значения при старте формы
this->lblCourseSign->Text = L"(руб / $):";
this->labelСourse->Text = L"Курс покупки";
}
private:
double rubToDollar; //глобальные переменные для курсов
double rubToEuro;
double dollarToRub;
double euroToRub;
//различные обработки при нажатии кнопок
void keyPress(System::Windows::Forms::TextBox^ txt, System::Windows::Forms::KeyPressEventArgs^ e) {
char key = e->KeyChar;
if (Char::IsDigit(e->KeyChar) || key == 8 || key == '.') {
try {
if (key == '.') {
for (int i = 0; i < txt->Text->Length; ++i) {
if (txt->Text[i] == '.') {
e->Handled = true;
}
}
int PointPos = 0;
if (txtAmount->Text != "" && txtAmount->Text[0] != '0') {
PointPos = 1;
}
if(txt->Text->IndexOf('.') == -1 && txt->Text->IndexOf('0') == -1
&& txt->SelectionStart == PointPos) {
txt->Text = txt->Text->Insert(PointPos, "0");
txt->SelectionStart = PointPos + 1;
txt->SelectionStart = txt->Text->Length;
}
}
if (txt->SelectionStart > txt->Text->IndexOf('.') + 2 && txt->Text->IndexOf('.') != -1) {
if (key != 8) {
e->Handled = true;
}
}
if (key == '0' && txt->Text->Length == 1 && txt->Text[0] == '0') {
e->Handled = true;
}
}
catch (System::FormatException^ r) {
if (txt->Text->Length == 1) {
e->Handled = true;
}
}
}
else {
e->Handled = true;
}
}
//форматирование копеек(центов) в текстбоксах
void Format(System::Windows::Forms::TextBox^ txt) {
if (txt->Text->Contains(".") &&
txt->Text->IndexOf('.') == txt->Text->Length - 2) {
txt->Text += "0";
}
else if (txt->Text->Contains(".")
&& txt->Text->IndexOf('.') == txt->Text->Length - 1) {
txt->Text += "00";
}
else if (!txt->Text->Contains(".") && txt->Text->Length == 0) {
txt->Text = "0.00";
}
else if (!txt->Text->Contains(".")) {
txt->Text += ".00";
}
}
private: System::Void txtAmount_KeyPress(System::Object^ sender,
System::Windows::Forms::KeyPressEventArgs^ e) {
keyPress(txtAmount, e);
}
private: System::Void txtCourse_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
keyPress(txtCourse, e);
}
//функция для подсчитывания результата и вывод в поля
void CalcResult(double a, double b, String^ MoneyUnit1, String^ MoneyUnit2, int type) {
Format(txtCourse);
Format(txtAmount2);
double res;
this->lblMoneyUnit1->Text = L""+ MoneyUnit1;
this->lblMoneyUnit2->Text = L""+ MoneyUnit2;
if (type == 1) {
res = a * (1 / b);
}
else {
res = a * b;
}
this->txtResult->Text = L"" + Math::Truncate(res * 100) / 100;
Format(txtResult);
}
//нажатие кнопки "конвертировать"
private: System::Void button_Convert_Click(System::Object^ sender, System::EventArgs^ e) {
bool flag = 1;
double a, b;
try {
a = System::Double::Parse(txtAmount->Text);
b = System::Double::Parse(txtCourse->Text);
}
catch (FormatException^ e) {
flag = 0;
}
if (flag) {
if (a > 0 && b > 0) {
this->txtAmount2->Text = Convert::ToString(a);
double res;
if (rb_RubToDollar->Checked) {
CalcResult(a, b, "руб.", "$", 1);
}
if (rb_DollarToRub->Checked){
Format(txtCourse);
CalcResult(a, b, "$", "руб.", 0);
}
if (rb_RubToEuro->Checked){
Format(txtCourse);
CalcResult(a, b, "руб.", "€", 1);
}
if (rb_EuroToRub->Checked){
Format(txtCourse);
CalcResult(a, b, "€", "руб.", 0);
}
}
else {
txtAmount2->Text = L"";
txtResult->Text = L"";
}
}
}
void RadioButton_CheckedChanged(double course, String^ sign, int type) {
if (!course == 0) {
this->txtCourse->Text = L"" + course;
Format(txtCourse);
}
else {
this->txtCourse->Text = L"";
}
this->txtAmount->Text = L"";
this->txtAmount2->Text = L"";
this->txtResult->Text = L"";
this->lblMoneyUnit1->Text = L"";
this->lblMoneyUnit2->Text = L"";
this->lblCourseSign->Text = L""+sign+":";
if (type)
this->labelСourse->Text = L"Курс покупки";
else
this->labelСourse->Text = L"Курс продажи";
}
private: System::Void rb_RubToDollar_CheckedChanged(System::Object^ sender, System::EventArgs^ e) {
RadioButton_CheckedChanged(rubToDollar, "(руб / $)", 1);
}
private: System::Void rb_DollarToRub_CheckedChanged(System::Object^ sender, System::EventArgs^ e) {
RadioButton_CheckedChanged(dollarToRub, "(руб / $)", 0);
}
private: System::Void rb_RubToEuro_CheckedChanged(System::Object^ sender, System::EventArgs^ e) {
RadioButton_CheckedChanged(rubToEuro, "(руб / €)", 1);
}
private: System::Void rb_EuroToRub_CheckedChanged(System::Object^ sender, System::EventArgs^ e) {
RadioButton_CheckedChanged(euroToRub, "(руб / €)", 0);
}
private: System::Void txtAmount_Leave(System::Object^ sender, System::EventArgs^ e) {
Format(txtAmount);
}
private: System::Void txtCourse_Leave(System::Object^ sender, System::EventArgs^ e) {
if (txtCourse->Text != L"") {
Format(txtCourse);
if (rb_RubToDollar->Checked) {
rubToDollar = Double::Parse(txtCourse->Text);
}
if (rb_DollarToRub->Checked) {
dollarToRub = Double::Parse(txtCourse->Text);
}
if (rb_RubToEuro->Checked) {
rubToEuro = Double::Parse(txtCourse->Text);
}
if (rb_EuroToRub->Checked) {
euroToRub = Double::Parse(txtCourse->Text);
}
}
}
};
}