Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Globalization;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
- namespace calc
- {
- public class Variables
- {
- public static string perflag = "";
- }
- //Че такое перфлаг
- public partial class MainWindow : Window
- {
- private string opers = "+-/*%^AndOrLshRshXorMod";
- // названия операций
- private double result = 0.0;
- private int binres = 0;
- private string last_oper = "";
- private double memory = 0.0;
- private double angle = 0.0;
- private string binstr = "";
- private string binsync = "";
- // переменные для бинарных операций, я думаю
- private int prevnum = 10;
- // а это что?
- private int i = 0;
- private int ctr = 0;
- private int statcounter = 0;
- private double statsum = 0;
- private double statdev = 0;
- // переменные для статистики
- private String[] array;
- public MainWindow()
- {
- InitializeComponent();
- }
- private void MenuItem_Click(object sender, RoutedEventArgs e) //Меню
- {
- def.IsChecked = false;
- eng.IsChecked = false;
- prog.IsChecked = false;
- stat.IsChecked = false;
- // сначала задаём значения всех режимов как неотмеченные изначально
- MenuItem AnyMenuItem = (MenuItem)sender;
- AnyMenuItem.IsChecked = true;
- // потом создаём переменную anymenuitem, которая равна тому режиму, который мы выберем вручную
- // и устанавливаем её как true
- // изначально IsChecked= true стоит только на def, т.е. на стандартном режиме калькулятора
- // Поэтому, когда мы тыкаем сюда, то все флажки сбрасываются и устанавливается тот, который тыкнули мышкой
- }
- private void Menu2Item_Click(object sender, RoutedEventArgs e) //Меню
- {
- usl.IsChecked = false;
- preobr.IsChecked = false;
- date.IsChecked = false;
- ipoteka.IsChecked = false;
- lizing.IsChecked = false;
- econom1.IsChecked = false;
- econom2.IsChecked = false;
- MenuItem AnyMenuItem = (MenuItem)sender;
- AnyMenuItem.IsChecked = true;
- // то же самое, только для побочного меню
- }
- private void Checked(object sender, RoutedEventArgs e) //Выбор режима
- // Здесь скрипты управляют размером калькулятора
- {
- MenuItem AnyMenuItem = (MenuItem)sender;
- switch (AnyMenuItem.Name)
- // Здесь идёт выбор подходящего скрипта, исходя из названия вкладки, которую мы выбрали
- {
- case "def":
- break;
- case "eng":
- Application.Current.MainWindow.Width = Application.Current.MainWindow.Width * 2;
- // Здесь происходит трансформация нашего окна. Мы увеличиваем размер основного размера в 2 раза
- EngPanel.Visibility = Visibility.Visible;
- // Делаем инженерную панель видимой
- leftCol.Width = new GridLength(1, GridUnitType.Star);
- // GridUnitType.Star описывает то, как мы описываем размер
- // Можем описывать автоматически, можем в пикселях, а можем в пропорциях
- // Star (наш вариант) описывает пропорционально, поэтому инженерная панель будет такого же размера, как и обычная
- Pcnt.IsEnabled = false;
- // Это проценты. Они нам не нужны в инженерном
- break;
- case "prog":
- Application.Current.MainWindow.Width = Application.Current.MainWindow.Width * 2;
- Application.Current.MainWindow.Height = Application.Current.MainWindow.Height * 1.15;
- ProgPanel.Visibility = Visibility.Visible;
- BinaryPanel.Visibility = Visibility.Visible;
- // увеличиваем высоту и ширину окна, ничего необычного
- leftCol.Width = new GridLength(1, GridUnitType.Star);
- Pcnt.IsEnabled = false;
- Sqrt.IsEnabled = false;
- ObrX.IsEnabled = false;
- Comm.IsEnabled = false;
- // отключили функции, которые нам не нужны
- break;
- case "stat":
- Application.Current.MainWindow.Height = Application.Current.MainWindow.Height * 1.15;
- DefaultPanel.Visibility = Visibility.Collapsed;
- PrevField.Visibility = Visibility.Collapsed;
- data.Visibility = Visibility.Visible;
- statcount.Visibility = Visibility.Visible;
- StatPanel.Visibility = Visibility.Visible;
- leftCol.Width = new GridLength(1, GridUnitType.Auto);
- /*ВАЖНАЯ ХИТРОСТЬ!
- *Здесь сворачиваем основную панель и панель вывода
- А затем делаем видимыми кнопки и панель вывода статистического калькулятора
- Потом мутно
- (у неё не указан размер. Не auto, ни жесткий. Поэтому тут мутно)
- Почему-то когда убираешь изменение размера грида, оно вообще не работает
- */
- break;
- case "usl":
- break;
- case "preobr":
- Application.Current.MainWindow.Width = Application.Current.MainWindow.Width * 2;
- PreobrPanel.Visibility = Visibility.Visible;
- rightCol.Width = new GridLength(2, GridUnitType.Star);
- break;
- case "date":
- break;
- case "ipoteka":
- break;
- case "lizing":
- break;
- case "econom1":
- break;
- case "economo2":
- break;
- }
- }
- private void UnChecked(object sender, RoutedEventArgs e)
- {
- MenuItem AnyMenuItem = (MenuItem)sender;
- switch (AnyMenuItem.Name)
- {
- case "def":
- break;
- case "eng":
- Application.Current.MainWindow.Width = Application.Current.MainWindow.Width / 2;
- EngPanel.Visibility = Visibility.Collapsed;
- InvPanel.Visibility = Visibility.Collapsed;
- leftCol.Width = GridLength.Auto;
- Pcnt.IsEnabled = true;
- break;
- case "prog":
- Application.Current.MainWindow.Width = Application.Current.MainWindow.Width / 2;
- Application.Current.MainWindow.Height = Application.Current.MainWindow.Height / 1.15;
- ProgPanel.Visibility = Visibility.Collapsed;
- BinaryPanel.Visibility = Visibility.Collapsed;
- leftCol.Width = GridLength.Auto;
- Dec.IsChecked = true;
- Pcnt.IsEnabled = true;
- Sqrt.IsEnabled = true;
- ObrX.IsEnabled = true;
- Comm.IsEnabled = true;
- break;
- case "stat":
- Application.Current.MainWindow.Height = Application.Current.MainWindow.Height / 1.15;
- data.Visibility = Visibility.Collapsed;
- statcount.Visibility = Visibility.Collapsed;
- StatPanel.Visibility = Visibility.Collapsed;
- DefaultPanel.Visibility = Visibility.Visible;
- PrevField.Visibility = Visibility.Visible;
- break;
- case "usl":
- break;
- case "preobr":
- Application.Current.MainWindow.Width = Application.Current.MainWindow.Width / 2;
- PreobrPanel.Visibility = Visibility.Collapsed;
- rightCol.Width = GridLength.Auto;
- break;
- case "date":
- break;
- case "ipoteka":
- break;
- case "lizing":
- break;
- case "econom1":
- break;
- case "economo2":
- break;
- }
- // просто отменяем все те изменения, которые вносили при трансформации
- }
- private void BinaryClick(object sender, RoutedEventArgs e) //Обратботка нажатий на бинарную панель. Лучше и не скажешь
- {
- binstr = "";
- // очистили переменную
- Label num = (Label)sender;
- if (Convert.ToString(num.Content).Equals("0"))
- num.Content = "1";
- else
- num.Content = "0";
- // меняем содержимое бинарной панели. Проверяем если содержимое того, на что мы кликнули,
- // равно нулю. Если равно, то меняем на 1. Если не равно 0 (т.е. там 1), меняем на 0
- BinaryUpdate();
- }
- private void BinaryUpdate() //обновление бинарной панели
- {
- binstr = "";
- // очистили строку
- foreach (Label element in BinaryPanel.Children)
- {
- binstr += element.Content;
- }
- // добавляем в строку всё содержимые элементы в BinaryPanel
- int a = binstr.Length;
- int b = BinaryPanel.Children.Count;
- if (binstr.Contains('1'))
- {
- binstr = binstr.Remove(0, binstr.IndexOf('1'));
- if (Hex.IsChecked ?? true)
- /*
- * Оператор объединения с NULL ?? возвращает значение своего операнда слева,
- * если его значение не равно null.
- * В противном случае он вычисляет операнд справа и возвращает его результат.
- * Оператор ?? не выполняет оценку своего операнда справа,
- * если его операнд слева имеет значение, отличное от NULL.
- *
- * Теперь вопрос какую функцию это нужно здесь
- *
- */
- InField.Text = Convert.ToInt64(binstr, 2).ToString("X");
- // Вопрос. Почему идёт преобразование через точку. Сначала в стринг, потом в инт64?
- if (Dec.IsChecked ?? true)
- InField.Text = Convert.ToInt64(binstr, 2).ToString("D");
- if (Oct.IsChecked ?? true)
- InField.Text = Convert.ToString(Convert.ToInt64(binstr, 2), 8);
- if (Bin.IsChecked ?? true)
- InField.Text = binstr;
- }
- else
- InField.Text = "0";
- }
- private void BinarySync() //синхронизация кнопочного ввода и бинарной панели
- {
- binsync = "";
- if (prog.IsChecked)
- {
- if (Hex.IsChecked ?? true)
- binsync = Convert.ToString(Convert.ToInt64(InField.Text, 16), 2);
- // Создали переменную, в неё забиваем число, которые вывелось в строке вывода
- // И переводим его в двоичную систему
- if (Dec.IsChecked ?? true)
- binsync = Convert.ToString(Convert.ToInt64(InField.Text, 10), 2);
- if (Oct.IsChecked ?? true)
- binsync = Convert.ToString(Convert.ToInt64(InField.Text, 8), 2);
- if (Bin.IsChecked ?? true)
- binsync = InField.Text;
- i = binsync.Length;
- foreach (Char sym in binsync)
- {
- BinaryPanel.Children[BinaryPanel.Children.Count - i].SetValue(ContentProperty, sym);
- i--;
- // вылетает на максимуме символов
- }
- // А потом в панель забиваем те элементы посимвольно
- i = 0;
- }
- }
- private void NumChecked(object sender, RoutedEventArgs e) //Выбор системы счисления
- {
- RadioButton AnyRadioButton = (RadioButton)sender;
- switch (AnyRadioButton.Content)
- {
- case "Hex":
- A.IsEnabled = true;
- B.IsEnabled = true;
- C.IsEnabled = true;
- D.IsEnabled = true;
- E.IsEnabled = true;
- F.IsEnabled = true;
- InField.Text = Convert.ToString(Convert.ToInt64(InField.Text, prevnum), 16);
- break;
- /* Тут происходят преобразования в доступности кнопок калькутятора
- А еще перевод строки в нужную систему счисления
- КОРОЧЕ тут баг. Строка с предыдущими записями не переводится в нужную систему
- и не считается вообще при переводе с другую систему.
- Также при делении в 16-ричной системе счисления выдаёт ошибку
- */
- case "Dec":
- InField.Text = Convert.ToString(Convert.ToInt64(InField.Text, prevnum), 10);
- break;
- case "Oct":
- Nine.IsEnabled = false;
- Eight.IsEnabled = false;
- InField.Text = Convert.ToString(Convert.ToInt64(InField.Text, prevnum), 8);
- break;
- case "Bin":
- Nine.IsEnabled = false;
- Eight.IsEnabled = false;
- Seven.IsEnabled = false;
- Six.IsEnabled = false;
- Five.IsEnabled = false;
- Four.IsEnabled = false;
- Three.IsEnabled = false;
- Two.IsEnabled = false;
- InField.Text = Convert.ToString(Convert.ToInt64(InField.Text, prevnum), 2);
- break;
- }
- }
- private void NumUnchecked(object sender, RoutedEventArgs e)
- {
- RadioButton AnyRadioButton = (RadioButton)sender;
- switch (AnyRadioButton.Content)
- {
- case "Hex":
- A.IsEnabled = false;
- B.IsEnabled = false;
- C.IsEnabled = false;
- D.IsEnabled = false;
- E.IsEnabled = false;
- F.IsEnabled = false;
- prevnum = 16;
- break;
- case "Dec":
- prevnum = 10;
- break;
- case "Oct":
- Nine.IsEnabled = true;
- Eight.IsEnabled = true;
- prevnum = 8;
- break;
- case "Bin":
- Nine.IsEnabled = true;
- Eight.IsEnabled = true;
- Seven.IsEnabled = true;
- Six.IsEnabled = true;
- Five.IsEnabled = true;
- Four.IsEnabled = true;
- Three.IsEnabled = true;
- Two.IsEnabled = true;
- prevnum = 2;
- break;
- }
- }
- private void ByteChecked(object sender, RoutedEventArgs e) //Кол-во байт
- {
- RadioButton AnyRadioButton = (RadioButton)sender;
- switch (AnyRadioButton.Content)
- {
- case "8 байт":
- foreach (Label element in BinaryPanel.Children)
- {
- element.Visibility = Visibility.Visible;
- }
- break;
- case "4 байта":
- for (int i = 0; i < 32; i++)
- {
- BinaryPanel.Children[i].Visibility = Visibility.Hidden;
- BinaryPanel.Children[i].SetValue(ContentProperty, '0');
- BinaryUpdate();
- }
- break;
- // скрывает и обнуляет ненужные нули. Ничего интересного
- case "2 байта":
- for (int i = 0; i < 48; i++)
- {
- BinaryPanel.Children[i].Visibility = Visibility.Hidden;
- BinaryPanel.Children[i].SetValue(ContentProperty, '0');
- BinaryUpdate();
- }
- break;
- case "1 байт":
- for (int i = 0; i < 56; i++)
- {
- BinaryPanel.Children[i].Visibility = Visibility.Hidden;
- BinaryPanel.Children[i].SetValue(ContentProperty, '0');
- BinaryUpdate();
- }
- break;
- }
- }
- private void ByteUnchecked(object sender, RoutedEventArgs e)
- {
- foreach (Label element in BinaryPanel.Children)
- {
- element.Visibility = Visibility.Visible;
- }
- // Делает все объекты в BinaryPanel видимыми
- }
- public void Mem_click(object sender, RoutedEventArgs e) //Работа с памятью
- {
- Button but = (Button)sender;
- switch (but.Content)
- {
- case "MC":
- memory = 0.0;
- InField.Text = "0";
- break;
- // очистить число из памяти
- case "MR":
- InField.Text = Convert.ToString(memory);
- break;
- // вывести сохранённое число
- case "MS":
- memory = Convert.ToDouble(InField.Text);
- break;
- // сохранить число в памяти
- case "M+":
- memory += Convert.ToDouble(InField.Text);
- break;
- // добавить к числу в памяти
- case "M-":
- memory -= Convert.ToDouble(InField.Text);
- break;
- // вычесть от числа в памяти
- }
- }
- public void Number_click(object sender, RoutedEventArgs e) //Обработка нажатий на числа
- {
- Button but = (Button)sender;
- switch (but.Content)
- {
- case "0":
- if (InField.Text != "0")
- InField.Text += "0";
- break;
- // если число не ноль, то добавляем число
- default:
- if (InField.Text == "0")
- InField.Text = Convert.ToString(but.Content);
- // заменяем ноль другим числом
- else if (!(prog.IsChecked) && (result == Convert.ToDouble(InField.Text)) && (InField.Text != "0,"))
- InField.Text = Convert.ToString(but.Content);
- else if (prog.IsChecked && ((InField.Text.Length > 18 && (Dec.IsChecked ?? true))) || (InField.Text.Length > 64 && (Bin.IsChecked ?? true))) { }
- //ограничение кол-ва символов в прог.режиме
- else
- InField.Text += Convert.ToString(but.Content);
- // просто добавление чисел к строке вывода
- break;
- }
- BinarySync();
- }
- public void Oper_click(object sender, RoutedEventArgs e) //Обработка нажатий на операции
- {
- Button but = (Button)sender;
- if (last_oper == "ⁿ√x")
- // ласт_опер это последняя выполненная операция (последняя нажатое действие)
- {
- InField.Text = Convert.ToString(Math.Pow(Convert.ToDouble(PrevField.Text), 1.0 / Convert.ToDouble(InField.Text)));
- last_oper = "";
- PrevField.Text = "";
- return;
- }
- switch (but.Content)
- {
- case "⬅":
- if (InField.Text.Length > 1)
- InField.Text = InField.Text.Remove(InField.Text.Length - 1);
- else
- InField.Text = "0";
- break;
- case "CAD":
- InField.Text = "0";
- statcounter = 0;
- statsum = 0;
- data.Items.Clear();
- break;
- case "CE":
- InField.Text = "0";
- if (prog.IsChecked)
- foreach (Label element in BinaryPanel.Children)
- {
- element.Content = "0";
- }
- break;
- case "C":
- InField.Text = "0";
- PrevField.Text = "";
- result = 0.0;
- last_oper = "";
- if (prog.IsChecked)
- foreach (Label element in BinaryPanel.Children)
- {
- element.Content = "0";
- }
- break;
- case "±":
- InField.Text = Convert.ToString(-1 * Convert.ToDouble(InField.Text));
- break;
- case ",":
- if (InField.Text.Contains(',') == false)
- InField.Text += ",";
- break;
- case "+":
- if (def.IsChecked || prog.IsChecked)
- {
- Default_Solution(but);
- }
- else if (eng.IsChecked)
- {
- PrevField.Text += InField.Text + but.Content;
- InField.Text = "0";
- last_oper = "";
- }
- break;
- case "-":
- if (def.IsChecked || prog.IsChecked)
- {
- Default_Solution(but);
- }
- else if (eng.IsChecked)
- {
- PrevField.Text += InField.Text + but.Content;
- InField.Text = "0";
- }
- break;
- case "*":
- if (def.IsChecked || prog.IsChecked)
- {
- Default_Solution(but);
- }
- else if (eng.IsChecked)
- {
- PrevField.Text += InField.Text + but.Content;
- InField.Text = "0";
- last_oper = "";
- }
- break;
- case "/":
- if (def.IsChecked || prog.IsChecked)
- {
- Default_Solution(but);
- }
- else if (eng.IsChecked)
- {
- PrevField.Text += InField.Text + but.Content;
- InField.Text = "0";
- last_oper = "";
- }
- break;
- case "√":
- InField.Text = Convert.ToString(Math.Sqrt(Convert.ToDouble(InField.Text)));
- break;
- case "%":
- if (last_oper == "*")
- {
- result = Convert.ToDouble(InField.Text) * result / 100;
- }
- last_oper = "";
- PrevField.Text = "";
- InField.Text = Convert.ToString(result);
- break;
- case "1/x":
- InField.Text = Convert.ToString(1/Convert.ToDouble(InField.Text));
- break;
- case "=":
- if (def.IsChecked || prog.IsChecked)
- {
- Default_Solution(but);
- PrevField.Text = "";
- last_oper = "";
- InField.Text = Convert.ToString(result);
- // Вызывет метод обычного решения, а потом обнуляет
- // последнюю операцию и вывода
- // а это означает, что тут нет возможности повторить последнее действие
- // несколько раз, как в обычном калькуляторе
- }
- if (eng.IsChecked)
- {
- if (opers.Contains(PrevField.Text[PrevField.Text.Length-1]))
- PrevField.Text += InField.Text;
- // По идее, он должен перемещать в инженерном калькуляторе
- // перемещать число из текущего поля в поле предыдущей операции, но он выдает ошибку о выходе за пределы массивы
- InField.Text = Convert.ToString(Engineer.Solution(PrevField.Text));
- PrevField.Text = "";
- // если открыт инженерная версия, то будет выполнен другой метод выполнения
- }
- break;
- default:
- break;
- }
- }
- public void Eng_click(object sender, RoutedEventArgs e) //Обработка нажатий на инж.панель
- {
- Button but = (Button)sender;
- switch (but.Content)
- {
- // это всё математика, тут почти везде просто функции и перевод их результатов в строку
- case "Inv":
- if (InvPanel.IsVisible)
- InvPanel.Visibility = Visibility.Collapsed;
- else
- InvPanel.Visibility = Visibility.Visible;
- break;
- case "ln":
- InField.Text = Convert.ToString(Math.Log(Convert.ToDouble(InField.Text)));
- break;
- case "(":
- PrevField.Text += "(";
- break;
- case ")":
- PrevField.Text += InField.Text + ")";
- InField.Text = "";
- break;
- case "Int":
- InField.Text = Convert.ToString(Math.Truncate(Convert.ToDouble(InField.Text)));
- break;
- case "sinh":
- InField.Text = Convert.ToString(Math.Sinh(Convert.ToDouble(InField.Text)));
- break;
- case "sin":
- if (Degr.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
- if (Rads.IsChecked ?? true)
- angle = Convert.ToDouble(InField.Text);
- if (Grads.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
- InField.Text = Convert.ToString(Math.Sin(Convert.ToDouble(angle)));
- break;
- // Может работать перевод в синусах, но вообще радиобаттоны ничего не меняют
- case "x²":
- InField.Text = Convert.ToString(Math.Pow(Convert.ToDouble(InField.Text),2));
- break;
- case "n!":
- int res = 1;
- for (int i = Convert.ToInt32(InField.Text); i > 1; i--)
- res *= i;
- InField.Text = Convert.ToString(res);
- break;
- case "dms":
- double decdeg = Convert.ToDouble(InField.Text);
- double minsec = (decdeg - Math.Truncate(decdeg)) * 60;
- double sec = (minsec - Math.Truncate(minsec)) * 60;
- double degminsec = (Math.Truncate(sec) / 10000) + (Math.Truncate(minsec) / 100) + Math.Truncate(decdeg);
- InField.Text = Convert.ToString(degminsec);
- break;
- case "cosh":
- InField.Text = Convert.ToString(Math.Cosh(Convert.ToDouble(InField.Text)));
- break;
- case "cos":
- if (Degr.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
- if (Rads.IsChecked ?? true)
- angle = Convert.ToDouble(InField.Text);
- if (Grads.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
- InField.Text = Convert.ToString(Math.Cos(Convert.ToDouble(angle)));
- break;
- case "xⁿ":
- PrevField.Text += InField.Text+"^";
- InField.Text = "0";
- break;
- case "ⁿ√x":
- PrevField.Text += InField.Text;
- last_oper = "ⁿ√x";
- InField.Text = "0";
- break;
- case "π":
- InField.Text = Convert.ToString(Math.PI);
- break;
- case "tanh":
- InField.Text = Convert.ToString(Math.Tanh(Convert.ToDouble(InField.Text)));
- break;
- case "tan":
- if (Degr.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
- if (Rads.IsChecked ?? true)
- angle = Convert.ToDouble(InField.Text);
- if (Grads.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
- InField.Text = Convert.ToString(Math.Tan(Convert.ToDouble(angle)));
- break;
- case "x³":
- InField.Text = Convert.ToString(Math.Pow(Convert.ToDouble(InField.Text), 3));
- break;
- case "³√x":
- InField.Text = Convert.ToString(Math.Pow(Convert.ToDouble(InField.Text), 1.0/3.0));
- break;
- case "F-E":
- if (InField.Text.Contains('e'))
- InField.Text = Convert.ToString(Double.Parse(InField.Text.Replace('.', ','), NumberStyles.Float));
- else
- InField.Text = Convert.ToDouble(InField.Text).ToString("e", CultureInfo.InvariantCulture);
- break;
- case "Exp":
- InField.Text += ".e+0";
- break;
- case "Mod":
- PrevField.Text += InField.Text + "%";
- InField.Text = "0";
- break;
- case "log":
- InField.Text = Convert.ToString(Math.Log10(Convert.ToDouble(InField.Text)));
- break;
- case "10ⁿ":
- InField.Text = Convert.ToString(Math.Pow(10, Convert.ToDouble(InField.Text)));
- break;
- case "e^x":
- InField.Text = Convert.ToString(Math.Pow(Math.E, Convert.ToDouble(InField.Text)));
- break;
- case "Frac":
- InField.Text = Convert.ToString(Convert.ToDouble(InField.Text) % 1);
- break;
- case "sinh^-1":
- // Данного метода почему-то нет в Math. Должен возвращать угол, гиперболический синус которого равен указанному числу. Ниже заплатка в виде Asin.
- InField.Text = Convert.ToString(Math.Asin(Convert.ToDouble(InField.Text)));
- break;
- case "sin^-1":
- if (Degr.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
- if (Rads.IsChecked ?? true)
- angle = Convert.ToDouble(InField.Text);
- if (Grads.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
- InField.Text = Convert.ToString(Math.Asin(Convert.ToDouble(angle)));
- break;
- case "deg":
- degminsec = Convert.ToDouble(InField.Text);
- double decsec = (degminsec * 100 - Math.Truncate(degminsec * 100)) / .6;
- double degmin = (Math.Truncate(degminsec * 100) + decsec) / 100;
- double deg = Math.Truncate(degmin);
- decdeg = deg + (degmin - deg) / .6;
- InField.Text = Convert.ToString(decdeg);
- break;
- case "cosh^-1":
- // Данного метода почему-то нет в Math. Должен возвращать угол, гиперболический косинус которого равен указанному числу. Ниже заплатка в виде Acos.
- InField.Text = Convert.ToString(Math.Acos(Convert.ToDouble(InField.Text)));
- break;
- case "cos^-1":
- if (Degr.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
- if (Rads.IsChecked ?? true)
- angle = Convert.ToDouble(InField.Text);
- if (Grads.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
- InField.Text = Convert.ToString(Math.Acos(Convert.ToDouble(angle)));
- break;
- case "2*π":
- InField.Text = Convert.ToString(2 * Math.PI);
- break;
- case "tanh^-1":
- // Данного метода почему-то нет в Math. Должен возвращать угол, гиперболический тангенс которого равен указанному числу. Ниже заплатка в виде Atan.
- InField.Text = Convert.ToString(Math.Atan(Convert.ToDouble(InField.Text)));
- break;
- case "tan^-1":
- if (Degr.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
- if (Rads.IsChecked ?? true)
- angle = Convert.ToDouble(InField.Text);
- if (Grads.IsChecked ?? true)
- angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
- InField.Text = Convert.ToString(Math.Atan(Convert.ToDouble(angle)));
- break;
- }
- }
- public void Prog_click(object sender, RoutedEventArgs e) //Обработка нажатий на прог.панель
- {
- Button but = (Button)sender;
- if (Hex.IsChecked ?? true)
- result = Convert.ToDouble(Convert.ToInt64(InField.Text, 16).ToString("D"));
- if (Dec.IsChecked ?? true)
- result = Convert.ToDouble(InField.Text);
- if (Oct.IsChecked ?? true)
- result = Convert.ToDouble(Convert.ToInt64(InField.Text, 8).ToString("D"));
- if (Bin.IsChecked ?? true)
- result = Convert.ToDouble(Convert.ToInt64(InField.Text, 2).ToString("D"));
- switch (but.Content)
- {
- case "Mod":
- Default_Solution(but);
- BinarySync();
- break;
- case "(":
- ctr += 1;
- Skb.Content = "(=" + Convert.ToString(ctr);
- break;
- case ")":
- if (ctr <= 1)
- Skb.Content = "";
- else
- {
- ctr -= 1;
- Skb.Content = "(=" + Convert.ToString(ctr);
- }
- break;
- case "RoL":
- i = 0;
- array = new String[BinaryPanel.Children.Count];
- foreach (Label element in BinaryPanel.Children)
- {
- array[i++] = element.Content.ToString();
- }
- int n = array.Length;
- array = array.Skip(1).Concat(array.Take(1)).ToArray();
- i = 0;
- foreach (Label element in BinaryPanel.Children)
- {
- BinaryPanel.Children[i].SetValue(ContentProperty, array[i++]);
- }
- BinaryUpdate();
- break;
- case "RoR":
- array = new String[BinaryPanel.Children.Count];
- i = 0;
- foreach (Label element in BinaryPanel.Children)
- {
- array[i++] = element.Content.ToString();
- }
- n = array.Length;
- array = array.Skip(n - 1).Concat(array.Take(n - 1)).ToArray();
- i = 0;
- foreach (Label element in BinaryPanel.Children)
- {
- BinaryPanel.Children[i].SetValue(ContentProperty, array[i++]);
- }
- BinaryUpdate();
- break;
- case "Or":
- Default_Solution(but);
- BinarySync();
- break;
- case "Xor":
- Default_Solution(but);
- BinarySync();
- break;
- case "Lsh":
- Default_Solution(but);
- BinaryUpdate();
- break;
- case "Rsh":
- Default_Solution(but);
- BinaryUpdate();
- break;
- case "Not":
- InField.Text = Convert.ToString(~Convert.ToInt64(InField.Text));
- BinarySync();
- break;
- case "And":
- Default_Solution(but);
- BinarySync();
- break;
- case "A":
- InField.Text += "a";
- BinarySync();
- break;
- case "B":
- InField.Text += "b";
- BinarySync();
- break;
- case "C":
- InField.Text += "c";
- BinarySync();
- break;
- case "D":
- InField.Text += "d";
- BinarySync();
- break;
- case "E":
- InField.Text += "e";
- BinarySync();
- break;
- case "F":
- InField.Text += "f";
- BinarySync();
- break;
- default:
- break;
- }
- }
- public void Default_Solution(Button but) //Решение в обычном режиме и логические операции
- {
- if (last_oper == "")
- {
- result = Convert.ToDouble(InField.Text);
- last_oper = Convert.ToString(but.Content);
- PrevField.Text += InField.Text;
- InField.Text = "0";
- // это условие выполнится после того, как мы нажмём =
- // Это сохранит наше число в переменную резалт,
- // с которой потом будут происходить вычисления.
- // ну и заодно обнулит нам поле ввода, чтобы мы дальше вводили результаты
- }
- else
- {
- PrevField.Text += last_oper + InField.Text;
- switch (last_oper)
- {
- case "+":
- result += Convert.ToDouble(InField.Text);
- InField.Text = Convert.ToString(result);
- last_oper = Convert.ToString(but.Content);
- break;
- case "-":
- result -= Convert.ToDouble(InField.Text);
- InField.Text = Convert.ToString(result);
- last_oper = Convert.ToString(but.Content);
- break;
- case "*":
- result *= Convert.ToDouble(InField.Text);
- InField.Text = Convert.ToString(result);
- last_oper = Convert.ToString(but.Content);
- break;
- case "/":
- result /= Convert.ToDouble(InField.Text);
- InField.Text = Convert.ToString(result);
- last_oper = Convert.ToString(but.Content);
- break;
- case "%":
- result += Convert.ToDouble(InField.Text);
- InField.Text = Convert.ToString(result);
- last_oper = Convert.ToString(but.Content);
- break;
- case "1/x":
- result += Convert.ToDouble(InField.Text);
- InField.Text = Convert.ToString(result);
- last_oper = Convert.ToString(but.Content);
- break;
- case "Mod":
- result %= Convert.ToDouble(InField.Text);
- InField.Text = Convert.ToString(result);
- last_oper = Convert.ToString(but.Content);
- break;
- case "Or":
- binres = Convert.ToInt32(result);
- binres |= Convert.ToInt32(InField.Text);
- InField.Text = Convert.ToString(binres);
- result = Convert.ToDouble(binres);
- last_oper = Convert.ToString(but.Content);
- break;
- case "Xor":
- binres = Convert.ToInt32(result);
- binres ^= Convert.ToInt32(InField.Text);
- InField.Text = Convert.ToString(binres);
- result = Convert.ToDouble(binres);
- last_oper = Convert.ToString(but.Content);
- break;
- case "And":
- binres = Convert.ToInt32(result);
- binres &= Convert.ToInt32(InField.Text);
- InField.Text = Convert.ToString(binres);
- result = Convert.ToDouble(binres);
- last_oper = Convert.ToString(but.Content);
- break;
- case "Lsh":
- binres = Convert.ToInt32(result);
- binres <<= Convert.ToInt32(InField.Text);
- InField.Text = Convert.ToString(binres);
- result = Convert.ToDouble(binres);
- last_oper = Convert.ToString(but.Content);
- break;
- case "Rsh":
- binres = Convert.ToInt32(result);
- binres >>= Convert.ToInt32(InField.Text);
- InField.Text = Convert.ToString(binres);
- result = Convert.ToDouble(binres);
- last_oper = Convert.ToString(but.Content);
- break;
- }
- }
- }
- public void Stat_click(object sender, RoutedEventArgs e) //Обработка нажатий на стат.панель
- {
- Button but = (Button)sender;
- switch (but.Content)
- {
- case "ADD":
- data.Items.Add(InField.Text);
- data.SelectedIndex = data.Items.Count - 1;
- data.ScrollIntoView(data.SelectedItem);
- InField.Text = "0";
- statcounter++;
- statcount.Content = "Счёт=" + Convert.ToString(statcounter);
- break;
- case "ср.x":
- foreach(string item in data.Items)
- {
- statsum += Convert.ToInt32(item);
- }
- InField.Text = Convert.ToString(Convert.ToDouble(statsum) / data.Items.Count);
- statsum = 0;
- break;
- case "ср.x²":
- foreach (string item in data.Items)
- {
- statsum += Math.Pow(Convert.ToDouble(item),2);
- }
- InField.Text = Convert.ToString(statsum / data.Items.Count);
- statsum = 0;
- break;
- case "Σx":
- foreach (string item in data.Items)
- {
- statsum += Convert.ToInt32(item);
- }
- InField.Text = Convert.ToString(statsum);
- statsum = 0;
- break;
- case "Σx²":
- foreach (string item in data.Items)
- {
- statsum += Math.Pow(Convert.ToDouble(item),2);
- }
- InField.Text = Convert.ToString(statsum);
- statsum = 0;
- break;
- case "σₐ":
- foreach (string item in data.Items)
- {
- statsum += Convert.ToDouble(item);
- }
- statsum /= data.Items.Count;
- foreach (string item in data.Items)
- {
- statdev += Math.Pow((Convert.ToDouble(item)-statsum),2);
- }
- statdev = Math.Sqrt(statdev / data.Items.Count);
- InField.Text = Convert.ToString(statdev);
- statdev = 0;
- statsum = 0;
- break;
- case "σₐ₋₁":
- foreach (string item in data.Items)
- {
- statsum += Convert.ToDouble(item);
- }
- statsum /= data.Items.Count;
- foreach (string item in data.Items)
- {
- statdev += Math.Pow((Convert.ToDouble(item) - statsum), 2);
- }
- statdev = Math.Sqrt(statdev / (data.Items.Count-1));
- InField.Text = Convert.ToString(statdev);
- statdev = 0;
- statsum = 0;
- break;
- default:
- break;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement