2 Создание схемы алгоритма
Алгоритм начинает работать после нажатия на кнопку «Расчёт exp(x)», схема алгоритмов кнопки представлена на рисунках 1-6.
Рисунок 1 – Схема алгоритма функции btnSol_Click с использованием типа Double.
Ранее говорилось, что тип Double не может хранить больше, чем 15 цифр. Есть решение этой проблемы. В качестве типа переменной можно использовать Decimal. Схема алгоритма с использованием Decimal представлена ниже на рисунке 2.
Рисунок 2 – Схема алгоритма функции btnSol_Click.
Функция autoCh автоматически меняет точность в зависимости от введенного значения x, вызывается при нажатии кнопки «Расчёт exp(x)», схема алгоритма представлена на рисунке 3.
Рисунок 3 – Схема алгоритма функции autoCh.
Функция print считает значение экспоненты и выводит ее в текстовое поле вывода, схема алгоритма представлена на рисунке 4.
Рисунок 4 – Схема алгоритма функции print.
Функция btnClose вызывается нажатием на кнопку «Закрыть», схема алгоритма представлена на рисунке 5.
Рисунок 5 – Схема алгоритма функции btnClose_Click.
Функция radioButton*_CheckedChanged меняет значения переменных в зависимости от выбранного положения переключателя, схема алгоритма представлена на рисунке 6.
Рисунок 6 – Схема алгоритма функции radioButton_CheckedChanged
3 Текст программы
int button;
double eps;
double sum;
void Number(System::Windows::Forms::TextBox^ txt,
System::Windows::Forms::KeyPressEventArgs^ e) {
char key = e->KeyChar;
if (Char::IsDigit(e->KeyChar)) {
// Запрет на ввод более одного знака минуса.
if (key == ',' || key == '.')
e->Handled = true; // Запрет ввода
// Запрет ввода повторных нулей в начале числа.
if (e->KeyChar == (char)Keys::D0 ||
e->KeyChar == (char)Keys::NumPad0)
// Если нажата клавиша 0
if (txt->Text->Length >= 1)
// Если строка не пустая
if (txt->Text[0] == '0' &&
txt->SelectionStart < 2)
e->Handled = true;
// Запрет ввода
}
else if (!Char::IsDigit(key)) {
if (e->KeyChar != (char)Keys::Back)
if (e->KeyChar != '-' || txt->Text->IndexOf('-') !=
-1)
e->Handled = true;
if (e->KeyChar == '-' && txt->Text->IndexOf('-') == -1)
txt->SelectionStart = 0;
}
}
private: System::Void radioButton1_CheckedChanged(System::Object^ sender,
System::EventArgs^ e) {
eps = 0.1;
button = 1;
}
private: System::Void radioButton5_CheckedChanged(System::Object^ sender,
System::EventArgs^ e) {
eps = 0.00001;
button = 5;
}
private: System::Void txtEnter_KeyPress(System::Object^ sender,
System::Windows::Forms::KeyPressEventArgs^ e) {
Number(txtEnter, e);
}
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^
e) {
eps = 0.000001;
button = 6;
}
private: System::Void radioButton2_CheckedChanged(System::Object^ sender,
System::EventArgs^ e) {
eps = 0.01;
button = 2;
}
private: System::Void radioButton3_CheckedChanged(System::Object^ sender,
System::EventArgs^ e) {
eps = 0.001;
button = 3;
}
private: System::Void radioButton4_CheckedChanged(System::Object^ sender,
System::EventArgs^ e) {
eps = 0.0001;
button = 4;
}
private: System::Void radioButton6_CheckedChanged(System::Object^ sender,
System::EventArgs^ e) {
eps = 0.000001;
button = 6;
}
private: System::Void button1_Click(System::Object^ sender,
System::EventArgs^ e) {
this->Close();
}
void autoCh(int x) {
if (x > -17 && x <= -14 && eps != 0.000001) {
radioButton6->Checked = true;
}
if (x >= -13 && x <= -12 && (eps != 0.000001 &&
eps != 0.00001)) {
radioButton5->Checked = true;
}
if (x >= -11 && x <= -10 && (eps == 0.1 || eps == 0.01 ||
eps == 0.001)) {
radioButton4->Checked = true;
}
if (x >= -9 && x <= -8 && (eps == 0.1 || eps == 0.01)) {
radioButton3->Checked = true;
}
if (x >= -7 && x <= -5 && eps == 0.1) {
radioButton2->Checked = true;
}
}
void print(Decimal res, int x, int i) {
res = System::Math::Abs(res);
this->lblEntryValue->Text = x.ToString("0.############");
this->lblAc->Text = eps.ToString("0.##########");
this->lblNumP->Text = Convert::ToString(i);
eps *= 0.1;
Decimal mx = Decimal::Multiply((System::Math::Round(
Decimal::Divide(
(Decimal)System::Math::Exp((Double)x),
(Decimal)eps))), (Decimal)eps);
this->lblAcExp->Text = mx.ToString();
this->lblSum->Text = (Decimal::Round(res, button + 1)).ToString();
eps /= 0.1;
}
private: System::Void btnSol_Click(System::Object^ sender, System::EventArgs^
e) {
int х;
this->lbl`err->Text = L””;
try {
x = System::Convert::ToInt16(txtEnter->Text);
for (i = 1; i >= 0; i++)
{
cur = cur * x;
cur = cur / i;
res = res + cur;
if (System::Math::Abs(cur) <= (double)eps)
break;
}
print(res, x, i);
z = System::Convert::ToInt16(txtEnter->Text);
}
catch {
x = 1;
this->lblErr->Text = L"Число не входит в заданный диапозон!";
clear();
}
if (x > -17 && x <= 20) {
radioButton6->Checked = true;
eps = 0.00001;
button = 5;
}
}
private: System::Void btnClose_Click(System::Object^ sender, System::EventArgs^ e) {
this->Close();
}