//COS public static double Cos(double x, int n = 0, double precision = 1e-5) { var t = Power(-1, n) * Power(x, 2 * n) / MathSyst.Fack((uint)(2 * n)); if (MathSyst.Abs(t) < precision) { return(t); } return(t + Cos(x, n + 1, precision)); }
//SIN public static double Sin(double x, int n = 1, double precision = 1e-5) { var t = MathSyst.Power(-1, n - 1) * MathSyst.Power(x, 2 * n - 1) / MathSyst.Fack((uint)(2 * n - 1)); if (MathSyst.Abs(t) < precision) { return(t); } return(t + Sin(x, n + 1, precision)); }
static public double Lognat(double x, int n = 1, double znat = 1e-5) { double t = MathSyst.Power(-1, n + 1) * MathSyst.Power(x - 1, n) / n; long b = (long)t; if (MathSyst.Abs(t) < 1e-3) { return(t); } return(b + Lognat(x, n + 1, znat)); }
//Расчёт методом трапеций public static double TrapecMethod(double a, double b, int n) { double h = (b - a) / n; double sum = MathSyst.Func(a) + MathSyst.Func(b); for (int i = 0; i <= n - 1; i++) { sum += 2 * MathSyst.Func(a + i * h); } sum *= h / 2; return(sum); }
//Метод симпсона public static double SimpsonMethod(double a, double b, int n) { double h = (b - a) / n; double sum = MathSyst.Func(a) + MathSyst.Func(b); int k; for (int i = 0; i <= n - 1; i++) { k = 2 + 2 * (i % 2); sum += k * MathSyst.Func(a + i * h); } sum *= h / 3; return(sum); }
private void Button_Click(object sender, RoutedEventArgs e)//Взаимодействие с кнопками { string stroka = (string)((System.Windows.Controls.Button)e.OriginalSource).Content; if (sender == comma && onecomma == 0) //Работа с нулями { onecomma++; TextB.Text += stroka; //Запись одной запятой в строку } else if (TextB.Text == "0") //Обработка ввода 0 { TextB.Text = ""; } string text = TextB.Text; // Присваивание переменой текстовую строку if (slog == true) //Для смены второго знака на первый { TextB.Clear(); D2 = D; slog = false; } if (kol == 2)//Выполнение арифметических операций, если одинаковое действия { TextB.Clear(); kol = 1; } if (kol == 3 && shag == 1)//Выполнение арифметических операций, если разные действия { kol = 1; TextB.Clear(); shag--; } if (stroka == "C") //Очистка значения { TextB.Text = "0"; quantity = 0; onecomma = 0; kol = 0; g = 0; sqrtchisl = 0; shag = 0; doubleznak = 0; znachenie = 0; value = 0; step = 0; razndeistv = 0; ymno = 0; delenn = 0; entrance = false; slog = false; D = ""; D2 = ""; N1 = ""; N3 = ""; } else if (sender == pi) //Число PI { TextB.Clear(); TextB.Text += PI; } else if (sender == button_e) //Число E { TextB.Clear(); TextB.Text += E; } else if (sender == POWN || quantity == 1) //Возведение в степень { try { if (quantity == 1) { if (sender == MINUSorPLUS) //Постановка "+" или "-" перед числом { if (TextB.Text != "") //Текст не должен быть пустой и равным нулю { value = double.Parse(TextB.Text); TextB.Clear(); TextB.Text += MathSyst.MorP(value); } } else if (sender == back)//Удаление одного значение степени { TextB.Clear(); TextB.Text += MathSyst.Clear(text); } else if (stroka != "=" && stroka != ",")//Присвоение строке значения, пока не будет задействована клавиша "=" { TextB.Text += stroka; } } if (quantity == 0)//Запоминание числа, которого нужно возвести в степень { znachenie = Convert.ToDouble(TextB.Text); TextB.Clear(); quantity++; } else if (stroka == "=")//Возведение { step = Convert.ToDouble(TextB.Text); TextB.Clear(); if (step < 0)//Если степень отрицательная { step = -1 * step; double ex = 1.0 / MathSyst.Power(znachenie, step); TextB.Text += ex; } else//Положительная стпень { TextB.Text += MathSyst.Power(znachenie, step); } quantity = 0; } } catch { TextB.Text = "0"; } } else if (sender == cos) //Расчёт косинуса { if (TextB.Text == "") { TextB.Text = "0"; } int s = 1; znachenie = Convert.ToDouble(TextB.Text); double tabl_znach = MathSyst.Cos_Sin(znachenie, s); TextB.Clear(); if (znachenie == tabl_znach) { var grad = znachenie * PI / 180; TextB.Text += MathSyst.Cos(grad); } else { TextB.Text += tabl_znach; } } else if (sender == sin) //Расчёт синуса { if (TextB.Text == "") { TextB.Text = "0"; } int s = 0; znachenie = Convert.ToDouble(TextB.Text); double tabl_znach = MathSyst.Cos_Sin(znachenie, s); TextB.Clear(); if (znachenie == tabl_znach) { var grad = znachenie * PI / 180; TextB.Text += MathSyst.Sin(grad); } else { TextB.Text += tabl_znach; } } else if (sender == tg) //Расчёт тангенса { if (TextB.Text == "") { TextB.Text = "0"; } int s = 0; znachenie = Convert.ToDouble(TextB.Text); double tabl_znach = MathSyst.Cos_Sin(znachenie, s); TextB.Clear(); if (znachenie == tabl_znach) { var grad = znachenie * PI / 180; znach_sin = MathSyst.Sin(grad); } else { znach_sin = Convert.ToDouble(tabl_znach); } s = 1; tabl_znach = MathSyst.Cos_Sin(znachenie, s); TextB.Clear(); if (znachenie == tabl_znach) { var grad = znachenie * PI / 180; znach_cos = MathSyst.Cos(grad); } else { znach_cos = Convert.ToDouble(tabl_znach); } TextB.Text += znach_sin / znach_cos; if (znachenie == 45) { TextB.Text = "1"; } if (TextB.Text == "∞" || TextB.Text == "-∞") { TextB.Text = "Тангенс такого угла не существует"; } } else if (sender == Ostatok) //Деление на 100 { if (TextB.Text == "") { TextB.Text = "0"; } znachenie = Convert.ToDouble(TextB.Text) / 100; TextB.Clear(); TextB.Text += znachenie; } else if (sender == SQRT2) //Квадратный корень { try { znachenie = Convert.ToDouble(TextB.Text); TextB.Clear(); TextB.Text += MathSyst.SQRTkv(znachenie); } catch { TextB.Text = "0"; } } else if (sender == SQRT3) //Корень в третьей степени { try { znachenie = Convert.ToDouble(TextB.Text); TextB.Clear(); TextB.Text += MathSyst.SqrtN(3, znachenie); } catch { TextB.Text = "0"; } } else if (sender == SQRT4) //Корень в четвёртой степени { try { znachenie = Convert.ToDouble(TextB.Text); TextB.Clear(); TextB.Text += MathSyst.SQRTkv(znachenie); znachenie = Convert.ToDouble(TextB.Text); TextB.Clear(); TextB.Text += MathSyst.SQRTkv(znachenie); } catch { TextB.Text = "0"; } } else if (sender == SQRTN || sqrtchisl == 1) //Корень из N { try { if (sqrtchisl == 1) { if (sender == back)//Удаление одного значение степени { TextB.Clear(); TextB.Text += MathSyst.Clear(text); } else if (stroka != "=")//Присвоение строке значения, пока не будет задействована клавиша "=" { TextB.Text += stroka; } } if (sqrtchisl == 0)//Запоминание числа под корнем { znachenie = Convert.ToDouble(TextB.Text); TextB.Clear(); sqrtchisl++; } else if (stroka == "=")//Расчёт корня { step = Convert.ToInt32(TextB.Text); TextB.Clear(); TextB.Text += MathSyst.SqrtN(step, znachenie); sqrtchisl = 0; } } catch { TextB.Text = "0"; } } else if (sender == Facktorial) //Факториал { if (TextB.Text == "") { TextB.Text = "0"; } znachenie = Convert.ToDouble(TextB.Text); TextB.Clear(); TextB.Text += MathSyst.Fack(znachenie); } else if (sender == back) //Очистить последний ввод { TextB.Clear(); TextB.Text += MathSyst.Clear(text); } else if (sender == Delenie) //Деление на один { try { znachenie = double.Parse(TextB.Text); TextB.Clear(); TextB.Text += 1.0 / znachenie; } catch { TextB.Text = "Деление на ноль невозможно"; } } else if (sender == MINUSorPLUS) //Постановка "+" или "-" перед числом { if (TextB.Text != "") //Постановка "+" или "-" перед числом { znachenie = double.Parse(TextB.Text); TextB.Clear(); TextB.Text += MathSyst.MorP(znachenie); } else//если значение равно "0", то знак "-" не будет { TextB.Text = "0"; } } else if (sender == addition) //Сложение { if (doubleznak >= 1) { if (kol == 0)//Запоминание первого действия { if (text == "") { text = "0"; } D = "+"; //Первый знак TextB.Clear(); N1 = text; //Первое число kol++; } else if (entrance == true)//Расчёт значения, если первое "+", а второе "*" или "/" { if (text == "") { text = "0"; } double dn1, dn2, res = 0; dn1 = double.Parse(N1); if (ymno == 42) { D2 = "*"; } if (delenn == 47) { D2 = "/"; } if ((kol == 1 && D2 == "/") || (entrance == true && D2 == "/"))//Выполнения деления { kol = 0; if (razndeistv == 0)//Расчёт, если нет в памяти третьего числа { znachenie = double.Parse(N1) / double.Parse(text); } else//Расчёт по третьему числу { znachenie = double.Parse(N3) / double.Parse(text); } TextB.Clear(); TextB.Text += znachenie; if (text == "0") { TextB.Text = "Деление на ноль невозможно"; } D2 = ""; } else if ((kol == 1 && D2 == "*") || (entrance == true && D2 == "*"))//Выполнения умножения { kol = 0; if (razndeistv == 0)//Расчёт, если нет в памяти третьего числа { znachenie = double.Parse(N1) * double.Parse(text); } else//Расчёт по третьему числу { znachenie = double.Parse(N3) * double.Parse(text); } TextB.Clear(); TextB.Text += znachenie; D2 = ""; } if (razndeistv == 1)//Если дребуется выполнение разных действий { try { if (TextB.Text == "")//Если значение равно 0 { TextB.Text = text; if (D2 != null && D2 != "")//В отсуствии второго действия, выполнения первого { D = D2; } } if (TextB.Text == "" && D != "/")//Значение равно 0, при отсуствии деления { TextB.Text = "0"; } dn2 = double.Parse(TextB.Text); if (D == "-" || D == "*" || D == "+" || D == "/")//Расчёт действий { TextB.Clear(); if (D == "-") { res = dn1 - dn2; } else if (D == "*") { res = dn1 * dn2; } else if (D == "/") { res = dn1 / dn2; } else if (D == "+") { res = dn1 + dn2; } TextB.Text += res; } razndeistv = 0; } catch { TextB.Text = "Деление на ноль невозможно"; } } kol = 1; D = "+"; N1 = TextB.Text; //Запоминание slog = true; //Запись значения entrance = false; } else if (kol == 1)//Второе действие { if (text == "") { text = "0"; } D2 = "+"; //Второй знак if (D == D2) //Сравнение первого и второго действия { kol++; znachenie = double.Parse(N1) + double.Parse(text); TextB.Clear(); TextB.Text += znachenie; N1 = TextB.Text; //Запоминания результата первым значениям } else if (D != D2 && D2 == "+") //Выполнение первого действия, если второе действие - сложение { kol += 2; //Переход к записи следующего значения shag = 1; //Записать следующее многозначное число if (D == "*") //Если умножение { znachenie = double.Parse(N1) * double.Parse(text); } else if (D == "/")//Если деление { znachenie = double.Parse(N1) / double.Parse(text); } else if (D == "-")//Если разность { znachenie = double.Parse(N1) - double.Parse(text); } TextB.Clear(); TextB.Text += znachenie; if (D == "/" && text == "0") { TextB.Text = "Деление на ноль невозможно"; } D = "+"; //Изменения первого знака N1 = TextB.Text; //Запоминания результата первым значениям } } } onecomma = 0; doubleznak = 0; } else { if (D2 == "" || D2 == null) { D = "+"; } else { D2 = "+"; } } } else if (sender == minus) //Вычитание { if (doubleznak >= 1) { if (kol == 0)//Запоминание первого действия { if (text == "") { text = "0"; } D = "-"; //Первый знак TextB.Clear(); N1 = text; //Первое число kol++; } else if (entrance == true)//Расчёт значения, если первое "-", а второе "*" или "/" { if (text == "") { text = "0"; } double dn1, dn2, res = 0; if (ymno == 42) { D2 = "*"; } if (delenn == 47) { D2 = "/"; } dn1 = double.Parse(N1); if ((kol == 1 && D2 == "/") || (entrance == true && D2 == "/"))//Выполнения деления { kol = 0; if (razndeistv == 0)//Расчёт, если нет в памяти третьего числа { znachenie = double.Parse(N1) / double.Parse(text); } else//Расчёт по третьему числу { znachenie = double.Parse(N3) / double.Parse(text); } TextB.Clear(); TextB.Text += znachenie; if (text == "0") { TextB.Text = "Деление на ноль невозможно"; } D2 = ""; } else if ((kol == 1 && D2 == "*") || (entrance == true && D2 == "*"))//Выполнения умножения { kol = 0; if (razndeistv == 0)//Расчёт, если нет в памяти третьего числа { znachenie = double.Parse(N1) * double.Parse(text); } else//Расчёт по третьему числу { znachenie = double.Parse(N3) * double.Parse(text); } TextB.Clear(); TextB.Text += znachenie; D2 = ""; } if (razndeistv == 1)//Если дребуется выполнение разных действий { try { if (TextB.Text == "")//Если значение равно 0 { TextB.Text = text; if (D2 != null && D2 != "")//В отсуствии второго действия, выполнения первого { D = D2; } } if (TextB.Text == "" && D != "/")//Значение равно 0, при отсуствии деления { TextB.Text = "0"; } dn2 = double.Parse(TextB.Text); if (D == "-" || D == "*" || D == "+" || D == "/")//Расчёт действий { TextB.Clear(); if (D == "-") { res = dn1 - dn2; } else if (D == "*") { res = dn1 * dn2; } else if (D == "/") { res = dn1 / dn2; } else if (D == "+") { res = dn1 + dn2; } TextB.Text += res; } razndeistv = 0; } catch { TextB.Text = "Деление на ноль невозможно"; } } kol = 1; D = "-"; N1 = TextB.Text; //Запоминание slog = true; //Запись значения entrance = false; } else if (kol == 1)//Второе действие { if (text == "") { text = "0"; } D2 = "-"; //Второй знак if (D == D2) //Сравнение первого и второго действия { kol++; znachenie = double.Parse(N1) - double.Parse(text); TextB.Clear(); TextB.Text += znachenie; N1 = TextB.Text; //Запоминания результата первым значениям } else if (D != D2 && D2 == "-") //Выполнение первого действия, если второе действие - разность { kol += 2; //Переход к записи следующего значения shag = 1; //Записать следующее многозначное число if (D == "*") //Если умножение { znachenie = double.Parse(N1) * double.Parse(text); } else if (D == "/")//Если деление { znachenie = double.Parse(N1) / double.Parse(text); } else if (D == "+")//Если сложение { znachenie = double.Parse(N1) + double.Parse(text); } TextB.Clear(); TextB.Text += znachenie; if (D == "/" && text == "0") { TextB.Text = "Деление на ноль невозможно"; } D = "-"; //Изменения первого знака N1 = TextB.Text; //Запоминания результата первым значениям } } onecomma = 0; doubleznak = 0; } else { if (D2 == "" || D2 == null) { D = "-"; } else { D2 = "-"; } } } else if (sender == multiply) //Умножение { if (doubleznak >= 1) { if (kol == 0)//Запоминание первого действия { if (text == "") { text = "0"; } D = "*"; //Первый знак TextB.Clear(); N1 = text; //Первое число kol++; } else if (((D != D2) && g == 1) && (D == "+" || D2 == "+" || D == "-" || D2 == "-"))//Разные знаки, умножение трерьего числа с данным числом { znachenie = double.Parse(N3) * double.Parse(text); g = 0; kol = 2; TextB.Clear(); TextB.Text += znachenie; N3 = TextB.Text; entrance = true; D2 = "*"; } else if (entrance == true)//Расчёт значения, если первое "+", а второе "*" или "/" { D2 = "*"; ymno = 42; if (text == "") { text = "0"; } if ((kol == 1 && D2 == "/") || (entrance == true && D2 == "/"))//Выполнения деления { kol = 2; if (razndeistv == 0)//Расчёт, если нет в памяти третьего числа { znachenie = double.Parse(N1) / double.Parse(text); } else//Расчёт по третьему числу { znachenie = double.Parse(N3) / double.Parse(text); } TextB.Clear(); TextB.Text += znachenie; if (text == "0") { TextB.Text = "Деление на ноль невозможно"; } D2 = ""; } else if ((kol == 1 && D2 == "*") || (entrance == true && D2 == "*"))//Выполнения умножения { kol = 2; if (razndeistv == 0)//Расчёт, если нет в памяти третьего числа { znachenie = double.Parse(N1) * double.Parse(text); } else//Расчёт по третьему числу { znachenie = double.Parse(N3) * double.Parse(text); } TextB.Clear(); TextB.Text += znachenie; D2 = ""; } N3 = TextB.Text; } else if (kol == 1)//Второе действие { if (text == "") { text = "0"; } D2 = "*"; //Второй знак if (D == D2) //Если одинаковые знаки { kol++; znachenie = double.Parse(N1) * double.Parse(text); TextB.Clear(); TextB.Text += znachenie; N1 = TextB.Text; } else if (D != D2 && D == "/") { if (text != "0") { kol++; znachenie = double.Parse(N1) / double.Parse(text); TextB.Clear(); TextB.Text += znachenie; N1 = TextB.Text; D = "*"; } else if (text == "0") { TextB.Text = "Деление на ноль невозможно"; } } else if (D != D2)//Разные знаки { kol += 2; shag = 1; N3 = text;//Третье значение razndeistv = 1; } entrance = true;//Активация расчёта } onecomma = 0; g++; doubleznak = 0; } else { if (D2 == "" || D2 == null) { D = "*"; } else { D2 = "*"; } } } else if (sender == division) //Деление { if (doubleznak >= 1) { if (kol == 0)//Запоминание первого действия { if (text == "") { text = "0"; } D = "/"; //Первый знак TextB.Clear(); N1 = text; //Первое число kol++; } else if (((D != D2) && g == 1) && (D == "+" || D2 == "+" || D == "-" || D2 == "-"))//Разные знаки, умножение трерьего числа с данным числом { znachenie = double.Parse(N3) / double.Parse(text); g = 0; kol = 2; TextB.Clear(); TextB.Text += znachenie; N3 = TextB.Text; entrance = true; D2 = "/"; } else if (entrance == true)//Расчёт значения, если первое "+", а второе "*" или "/" { D2 = "*"; delenn = 47; if (text == "") { text = "0"; } if ((kol == 1 && D2 == "/") || (entrance == true && D2 == "/"))//Выполнения деления { kol = 2; if (razndeistv == 0)//Расчёт, если нет в памяти третьего числа { znachenie = double.Parse(N1) / double.Parse(text); } else//Расчёт по третьему числу { znachenie = double.Parse(N3) / double.Parse(text); } TextB.Clear(); TextB.Text += znachenie; if (text == "0") { TextB.Text = "Деление на ноль невозможно"; } D2 = ""; } else if ((kol == 1 && D2 == "*") || (entrance == true && D2 == "*"))//Выполнения умножения { kol = 2; if (razndeistv == 0)//Расчёт, если нет в памяти третьего числа { znachenie = double.Parse(N1) * double.Parse(text); } else//Расчёт по третьему числу { znachenie = double.Parse(N3) * double.Parse(text); } TextB.Clear(); TextB.Text += znachenie; D2 = ""; } N3 = TextB.Text; } else if (kol == 1) //Второе действие { D2 = "/"; //Второй знак if (D == D2) //Если одинаковые знаки { try { kol++; znachenie = double.Parse(N1) / double.Parse(text); TextB.Clear(); TextB.Text += znachenie; N1 = TextB.Text; } catch { TextB.Text = "Деление на ноль невозможно"; } } else if (D != D2 && D == "*") { kol++; znachenie = double.Parse(N1) * double.Parse(text); TextB.Clear(); TextB.Text += znachenie; N1 = TextB.Text; D = "*"; } else if (D != D2)//Разные знаки { kol += 2; shag = 1; N3 = text;//Третье значение razndeistv = 1; } entrance = true;//Активация расчёта } onecomma = 0; g++;//переменная для входа в условия деления умножения doubleznak = 0; } else { if (D2 == "" || D2 == null) { D = "/"; } else { D2 = "/"; } } } else if (sender == equally) //Расчёт всех значений { try { double dn1, dn2, res = 0; if (N1 == "")//Первое значине равно 0 { N1 = "0"; } dn1 = double.Parse(N1); try { if ((kol == 3 && D2 == "/" && D != "*" && D2 != "*" && D != "/") || (entrance == true && D2 == "/" && D != "*" && D2 != "*" && D != "/"))//Выполнение второго действия, если это деление { kol = 0; if (N3 == null) { N3 = "0"; } znachenie = double.Parse(N3) / double.Parse(text); TextB.Clear(); TextB.Text += znachenie; } else if ((kol == 3 && D2 == "*" && D != "/" && D2 != "/" && D != "*") || (entrance == true && D2 == "*" && D != "*" && D2 != "/" && D != "/"))//Выполнение второго действия, если это умножение { kol = 0; if (text == "")//Последнее значение равно 0 { text = "0"; } if (N3 == null) { N3 = "0"; } znachenie = double.Parse(N3) * double.Parse(text); TextB.Clear(); TextB.Text += znachenie; } if (TextB.Text == "")//Значение равно 0 { TextB.Text = text; if (D2 != null && D2 != "")//Изменение первого действия { D = D2; } } if (TextB.Text == "" && D != "/") { TextB.Text = "0"; } if ((D2 == "*" && D == "/") || (D2 == "/" && D == "*")) { D = D2; } dn2 = double.Parse(TextB.Text); if (D == "-" || D == "*" || D == "+" || D == "/")//Выполнение арифметических операций { TextB.Clear(); if (D == "-") { res = dn1 - dn2; } else if (D == "*") { res = dn1 * dn2; } else if (D == "/") { res = dn1 / dn2; } else if (D == "+") { res = dn1 + dn2; } TextB.Text += res; } //Возращение значений quantity = 0; onecomma = 0; g = 0; kol = 0; sqrtchisl = 0; shag = 0; doubleznak = 1; znachenie = 0; value = 0; step = 0; razndeistv = 0; ymno = 0; delenn = 0; entrance = false; slog = false; D = ""; D2 = ""; N1 = ""; N3 = ""; } catch { TextB.Text = "Деление на ноль невозможно"; } } catch { TextB.Text = TextB.Text; } } else if (sender == ln) //Натуральный логорифм { try { znachenie = double.Parse(TextB.Text); TextB.Clear(); TextB.Text += Math.Log(znachenie); } catch { TextB.Text = "Ошибка"; } } else if (sender == lg) //Десятичный логорифм { try { znachenie = double.Parse(TextB.Text); TextB.Clear(); TextB.Text += Math.Log10(znachenie); } catch { TextB.Text = "Ошибка"; } } else if (sender != comma) //Ввод на экран { TextB.Text += stroka; doubleznak++; } }