Генератор цветов Уроки C++ Уроки Windows forms Учебники по программированию Уроки HTML Уроки CSS Готовые задания Исходники Полезные программы
регистрация доменов

Дешёвые домены


Уроки Windows Forms C++/C#




Решение кубического уравнения в Windovs Forms MVS C++

После того, как вы хорошо разобрались с кодом и оформлением программы для решения квадратного уравнения можно приступить к решению кубического уравнения. У него, конечно, так же могут комплексные корни. В "уроках по C++" уже рассматривалось его решение, поэтому теперь нужно только всё аккуратно оформить и поставить на свои места. В это проекте так же будет реализована "защита от дурака" – можно будет вводить только цифры и знак, разделяющий целую и дробную часть числа. Есть и другой вариант защиты, он рассматривается в "этом уроке", но будет полностью обнулять результат ввода. Есть программы, в которых актуально именно это или нечто похожее – например неправильный ввод пароля и т.д. В данном проекте понадобятся: 12 "label", 4 "textBox" и одна кнопка "button". Оформить форму программы нужно по подобию "предыдущей", ” изменяя размер шрифта некоторых "label", если хотите:



template <class Value>
int sign(Value Val) {
if (Val == 0.) return 0;
if (Val > 0.) return 1;
else return -1;
}




Код программы:


C++


#pragma endregion
String^ TorZ;
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
this->Text = "Решение Кубического Уравнения";
button1->Text = "Решить";
label1->Text = "X";
label2->Text = "3";
label3->Text = "+";
label4->Text = "X";
label5->Text = "2";
label6->Text = "+";
label7->Text = "X +";
label8->Text = "= 0";
label9->Text = "Введите коэфициенты";
label10->Text = "";
label11->Text = "";
label12->Text = "";
TorZ = Globalization::NumberFormatInfo::CurrentInfo->NumberDecimalSeparator;
}

private: System::Void textBox1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
bool TZFound = false;
if (Char::IsDigit(e->KeyChar) == true) return;
if (e->KeyChar == (char)Keys::Back) return;
if (textBox1->Text->IndexOf(TorZ) != -1)
TZFound = true;
if (TZFound == true) { e->Handled = true; return; }
if (e->KeyChar.ToString() == TorZ) return;
e->Handled = true;
}

private: System::Void textBox2_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
bool TZFound = false;
if (Char::IsDigit(e->KeyChar) == true) return;
if (e->KeyChar == (char)Keys::Back) return;
if (textBox2->Text->IndexOf(TorZ) != -1)
TZFound = true;
if (TZFound == true) { e->Handled = true; return; }
if (e->KeyChar.ToString() == TorZ) return;
e->Handled = true;
}

private: System::Void textBox3_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
bool TZFound = false;
if (Char::IsDigit(e->KeyChar) == true) return;
if (e->KeyChar == (char)Keys::Back) return;
if (textBox3->Text->IndexOf(TorZ) != -1)
TZFound = true;
if (TZFound == true) { e->Handled = true; return; }
if (e->KeyChar.ToString() == TorZ) return;
e->Handled = true;
}

private: System::Void textBox4_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
bool TZFound = false;
if (Char::IsDigit(e->KeyChar) == true) return;
if (e->KeyChar == (char)Keys::Back) return;
if (textBox4->Text->IndexOf(TorZ) != -1)
TZFound = true;
if (TZFound == true) { e->Handled = true; return; } if (e->KeyChar.ToString() == TorZ) return;
e->Handled = true;
}

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Single d, h, g, f;

Single D = Single::TryParse(textBox1->Text,
System::Globalization::NumberStyles::Number,
System::Globalization::NumberFormatInfo::CurrentInfo, d);
Single H = Single::TryParse(textBox2->Text,
System::Globalization::NumberStyles::Number,
System::Globalization::NumberFormatInfo::CurrentInfo, h);
Single G = Single::TryParse(textBox3->Text,
System::Globalization::NumberStyles::Number,
System::Globalization::NumberFormatInfo::CurrentInfo, g);
Single F = Single::TryParse(textBox4->Text,
System::Globalization::NumberStyles::Number,
System::Globalization::NumberFormatInfo::CurrentInfo, f);

long double Q, R, A, B, x1, x2, x3, t, a, b, c, m, k, k1;
a=h/d; b=g/d; c=f/d;
const float pi = 3.14;
Q=(pow(a, 2)-3*b)/9;
R=(2*pow(a, 3)-9*a*b+27*c)/54;
if(pow(R, 2) {
t=acos(R/sqrt(pow(Q,3)))/3;
x1=-2*sqrt(Q)*cos(t)-a/3;
x2=-2*sqrt(Q)*cos(t+(2*pi/3))-a/3;
x3=-2*sqrt(Q)*cos(t-(2*pi/3))-a/3;
label10->Text = String::Format("x1 = {0:F2}", x1);
label11->Text = String::Format("x2 = {0:F2}", x2);
label12->Text = String::Format("x3 = {0:F2}", x3);
}
else
{
A=-sign(R)*pow((long double)(fabs(R)+sqrt(pow(R, 2)-pow(Q, 3))), (long double)1/3);
B = sign(A) == 0 ? 0 : Q/A;
x1=(A+B)-a/3;
m=-(A+B)/2-a/3;
k=pow(3,0.5)*(A-B)/2;
if (k<0)
{
k1=-1*k;
label10->Text = String::Format("x1 = {0:F2}", x1);
label11->Text = String::Format("x2 = {0:F2} - {1:F1}*i", m ,k1);
label12->Text = String::Format("x3 = {0:F2} + {1:F1}*i", m, k1);
}
else
{
label10->Text = String::Format("x1 = {0:F2}", x1);
label11->Text = String::Format("x2 = {0:F2} + {1:F1}*i", m ,k);
label12->Text = String::Format("x3 = {0:F2} - {1:F1}*i", m, k);
}
}

};
}




Результат:


Следующий урок >>