Advertisement
Guest User

Voldemort was right

a guest
Jan 25th, 2020
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 51.14 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using System.Windows;
  9. using System.Windows.Controls;
  10. using System.Windows.Data;
  11. using System.Windows.Documents;
  12. using System.Windows.Input;
  13. using System.Windows.Media;
  14. using System.Windows.Media.Imaging;
  15. using System.Windows.Navigation;
  16. using System.Windows.Shapes;
  17.  
  18. namespace calc
  19. {
  20.     public class Variables
  21.     {
  22.         public static string perflag = "";
  23.     }
  24.     //Че такое перфлаг
  25.  
  26.  
  27.     public partial class MainWindow : Window
  28.     {
  29.         private string opers = "+-/*%^AndOrLshRshXorMod";
  30.         //  названия операций
  31.         private double result = 0.0;
  32.         private int binres = 0;
  33.         private string last_oper = "";
  34.         private double memory = 0.0;
  35.         private double angle = 0.0;
  36.  
  37.         private string binstr = "";
  38.         private string binsync = "";
  39.         // переменные для бинарных операций, я думаю
  40.  
  41.         private int prevnum = 10;
  42.         // а это что?
  43.  
  44.         private int i = 0;
  45.         private int ctr = 0;
  46.  
  47.         private int statcounter = 0;
  48.         private double statsum = 0;
  49.         private double statdev = 0;
  50.         // переменные для статистики
  51.         private String[] array;
  52.  
  53.  
  54.         public MainWindow()
  55.         {
  56.             InitializeComponent();
  57.         }
  58.  
  59.         private void MenuItem_Click(object sender, RoutedEventArgs e)   //Меню
  60.         {
  61.             def.IsChecked = false;
  62.             eng.IsChecked = false;
  63.             prog.IsChecked = false;
  64.             stat.IsChecked = false;
  65.             // сначала задаём значения всех режимов как неотмеченные изначально
  66.             MenuItem AnyMenuItem = (MenuItem)sender;
  67.             AnyMenuItem.IsChecked = true;
  68.             // потом создаём переменную anymenuitem, которая равна тому режиму, который мы выберем вручную
  69.             // и устанавливаем её как true
  70.             // изначально IsChecked= true стоит только на def, т.е. на стандартном режиме калькулятора
  71.             // Поэтому, когда мы тыкаем сюда, то все флажки сбрасываются и устанавливается тот, который тыкнули мышкой
  72.         }
  73.  
  74.         private void Menu2Item_Click(object sender, RoutedEventArgs e)   //Меню
  75.         {
  76.             usl.IsChecked = false;
  77.             preobr.IsChecked = false;
  78.             date.IsChecked = false;
  79.             ipoteka.IsChecked = false;
  80.             lizing.IsChecked = false;
  81.             econom1.IsChecked = false;
  82.             econom2.IsChecked = false;
  83.             MenuItem AnyMenuItem = (MenuItem)sender;
  84.             AnyMenuItem.IsChecked = true;
  85.             // то же самое, только для побочного меню
  86.         }
  87.  
  88.         private void Checked(object sender, RoutedEventArgs e)      //Выбор режима
  89.             // Здесь скрипты управляют размером калькулятора
  90.         {
  91.             MenuItem AnyMenuItem = (MenuItem)sender;
  92.             switch (AnyMenuItem.Name)
  93.                 // Здесь идёт выбор подходящего скрипта, исходя из названия вкладки, которую мы выбрали
  94.             {
  95.                 case "def":
  96.                     break;
  97.                 case "eng":
  98.                     Application.Current.MainWindow.Width = Application.Current.MainWindow.Width * 2;
  99.                     // Здесь происходит трансформация нашего окна. Мы увеличиваем размер основного размера в 2 раза
  100.                     EngPanel.Visibility = Visibility.Visible;
  101.                     // Делаем инженерную панель видимой
  102.                     leftCol.Width = new GridLength(1, GridUnitType.Star);
  103.                     // GridUnitType.Star описывает то, как мы описываем размер
  104.                     // Можем описывать автоматически, можем в пикселях, а можем в пропорциях
  105.                     // Star (наш вариант) описывает пропорционально, поэтому инженерная панель будет такого же размера, как и обычная
  106.                     Pcnt.IsEnabled = false;
  107.                     // Это проценты. Они нам не нужны в инженерном
  108.                     break;
  109.                 case "prog":
  110.                     Application.Current.MainWindow.Width = Application.Current.MainWindow.Width * 2;
  111.                     Application.Current.MainWindow.Height = Application.Current.MainWindow.Height * 1.15;
  112.                     ProgPanel.Visibility = Visibility.Visible;
  113.                     BinaryPanel.Visibility = Visibility.Visible;
  114.                     // увеличиваем высоту и ширину окна, ничего необычного
  115.                     leftCol.Width = new GridLength(1, GridUnitType.Star);
  116.                     Pcnt.IsEnabled = false;
  117.                     Sqrt.IsEnabled = false;
  118.                     ObrX.IsEnabled = false;
  119.                     Comm.IsEnabled = false;
  120.                     // отключили функции, которые нам не нужны
  121.                     break;
  122.                 case "stat":
  123.                     Application.Current.MainWindow.Height = Application.Current.MainWindow.Height * 1.15;
  124.                     DefaultPanel.Visibility = Visibility.Collapsed;
  125.                     PrevField.Visibility = Visibility.Collapsed;
  126.                     data.Visibility = Visibility.Visible;
  127.                     statcount.Visibility = Visibility.Visible;
  128.                     StatPanel.Visibility = Visibility.Visible;
  129.                     leftCol.Width = new GridLength(1, GridUnitType.Auto);
  130.                    
  131.  
  132.                     /*ВАЖНАЯ ХИТРОСТЬ!
  133.                       *Здесь сворачиваем основную панель и панель вывода
  134.                       А затем делаем видимыми кнопки и панель вывода статистического калькулятора
  135.                       Потом мутно
  136.                       (у неё не указан размер. Не auto, ни жесткий. Поэтому тут мутно)
  137.                       Почему-то когда убираешь изменение размера грида, оно вообще не работает
  138.                       */
  139.  
  140.  
  141.                     break;
  142.                 case "usl":
  143.                     break;
  144.                 case "preobr":
  145.                     Application.Current.MainWindow.Width = Application.Current.MainWindow.Width * 2;
  146.                     PreobrPanel.Visibility = Visibility.Visible;
  147.                     rightCol.Width = new GridLength(2, GridUnitType.Star);
  148.                     break;
  149.                 case "date":
  150.                     break;
  151.                 case "ipoteka":
  152.                     break;
  153.                 case "lizing":
  154.                     break;
  155.                 case "econom1":
  156.                     break;
  157.                 case "economo2":
  158.                     break;
  159.  
  160.             }
  161.         }  
  162.         private void UnChecked(object sender, RoutedEventArgs e)
  163.         {
  164.             MenuItem AnyMenuItem = (MenuItem)sender;
  165.             switch (AnyMenuItem.Name)
  166.             {
  167.                 case "def":
  168.                     break;
  169.                 case "eng":
  170.                     Application.Current.MainWindow.Width = Application.Current.MainWindow.Width / 2;
  171.                     EngPanel.Visibility = Visibility.Collapsed;
  172.                     InvPanel.Visibility = Visibility.Collapsed;
  173.                     leftCol.Width = GridLength.Auto;
  174.                     Pcnt.IsEnabled = true;
  175.                     break;
  176.                 case "prog":
  177.                     Application.Current.MainWindow.Width = Application.Current.MainWindow.Width / 2;
  178.                     Application.Current.MainWindow.Height = Application.Current.MainWindow.Height / 1.15;
  179.                     ProgPanel.Visibility = Visibility.Collapsed;
  180.                     BinaryPanel.Visibility = Visibility.Collapsed;
  181.                     leftCol.Width = GridLength.Auto;
  182.                     Dec.IsChecked = true;
  183.                     Pcnt.IsEnabled = true;
  184.                     Sqrt.IsEnabled = true;
  185.                     ObrX.IsEnabled = true;
  186.                     Comm.IsEnabled = true;
  187.                     break;
  188.                 case "stat":
  189.                     Application.Current.MainWindow.Height = Application.Current.MainWindow.Height / 1.15;
  190.                     data.Visibility = Visibility.Collapsed;
  191.                     statcount.Visibility = Visibility.Collapsed;
  192.                     StatPanel.Visibility = Visibility.Collapsed;
  193.                     DefaultPanel.Visibility = Visibility.Visible;
  194.                     PrevField.Visibility = Visibility.Visible;
  195.                     break;
  196.                 case "usl":
  197.                     break;
  198.                 case "preobr":
  199.                     Application.Current.MainWindow.Width = Application.Current.MainWindow.Width / 2;
  200.                     PreobrPanel.Visibility = Visibility.Collapsed;
  201.                     rightCol.Width = GridLength.Auto;
  202.                     break;
  203.                 case "date":
  204.                     break;
  205.                 case "ipoteka":
  206.                     break;
  207.                 case "lizing":
  208.                     break;
  209.                 case "econom1":
  210.                     break;
  211.                 case "economo2":
  212.                     break;
  213.             }
  214.            
  215.             // просто отменяем все те изменения, которые вносили при трансформации
  216.  
  217.         }
  218.  
  219.         private void BinaryClick(object sender, RoutedEventArgs e)  //Обратботка нажатий на бинарную панель. Лучше и не скажешь
  220.         {
  221.             binstr = "";
  222.             // очистили переменную
  223.  
  224.             Label num = (Label)sender;
  225.             if (Convert.ToString(num.Content).Equals("0"))
  226.                 num.Content = "1";
  227.             else
  228.                 num.Content = "0";
  229.             // меняем содержимое бинарной панели. Проверяем если содержимое того, на что мы кликнули,
  230.             // равно нулю. Если равно, то меняем на 1. Если не равно 0 (т.е. там 1), меняем на 0
  231.  
  232.             BinaryUpdate();
  233.         }
  234.  
  235.         private void BinaryUpdate()     //обновление бинарной панели
  236.         {
  237.             binstr = "";
  238.             // очистили строку
  239.  
  240.             foreach (Label element in BinaryPanel.Children)
  241.             {
  242.                 binstr += element.Content;
  243.             }
  244.             // добавляем в строку всё содержимые элементы в BinaryPanel
  245.            
  246.             int a = binstr.Length;
  247.             int b = BinaryPanel.Children.Count;
  248.  
  249.             if (binstr.Contains('1'))
  250.             {
  251.                 binstr = binstr.Remove(0, binstr.IndexOf('1'));
  252.                 if (Hex.IsChecked ?? true)
  253.  
  254.                     /*
  255.                      * Оператор объединения с NULL ?? возвращает значение своего операнда слева,
  256.                      * если его значение не равно null.
  257.                      * В противном случае он вычисляет операнд справа и возвращает его результат.
  258.                      * Оператор ?? не выполняет оценку своего операнда справа,
  259.                      * если его операнд слева имеет значение, отличное от NULL.
  260.                      *
  261.                      * Теперь вопрос какую функцию это нужно здесь
  262.                      *
  263.                      */
  264.  
  265.                     InField.Text = Convert.ToInt64(binstr, 2).ToString("X");
  266.                 // Вопрос. Почему идёт преобразование через точку. Сначала в стринг, потом в инт64?
  267.  
  268.                 if (Dec.IsChecked ?? true)
  269.                     InField.Text = Convert.ToInt64(binstr, 2).ToString("D");
  270.                 if (Oct.IsChecked ?? true)
  271.                     InField.Text = Convert.ToString(Convert.ToInt64(binstr, 2), 8);
  272.                 if (Bin.IsChecked ?? true)
  273.                     InField.Text = binstr;
  274.             }
  275.             else
  276.                 InField.Text = "0";
  277.         }
  278.         private void BinarySync()       //синхронизация кнопочного ввода и бинарной панели
  279.         {
  280.             binsync = "";
  281.             if (prog.IsChecked)    
  282.             {
  283.                 if (Hex.IsChecked ?? true)
  284.                     binsync = Convert.ToString(Convert.ToInt64(InField.Text, 16), 2);
  285.                 // Создали переменную, в неё забиваем число, которые вывелось в строке вывода
  286.                 // И переводим его в двоичную систему
  287.                 if (Dec.IsChecked ?? true)
  288.                     binsync = Convert.ToString(Convert.ToInt64(InField.Text, 10), 2);
  289.                 if (Oct.IsChecked ?? true)
  290.                     binsync = Convert.ToString(Convert.ToInt64(InField.Text, 8), 2);
  291.  
  292.                 if (Bin.IsChecked ?? true)
  293.                     binsync = InField.Text;
  294.                 i = binsync.Length;
  295.                 foreach (Char sym in binsync)
  296.                 {
  297.                     BinaryPanel.Children[BinaryPanel.Children.Count - i].SetValue(ContentProperty, sym);
  298.                     i--;
  299.  
  300.                     // вылетает на максимуме символов
  301.                 }
  302.                 // А потом в панель забиваем те элементы посимвольно
  303.                 i = 0;
  304.             }
  305.         }
  306.  
  307.         private void NumChecked(object sender, RoutedEventArgs e)   //Выбор системы счисления
  308.         {
  309.             RadioButton AnyRadioButton = (RadioButton)sender;
  310.             switch (AnyRadioButton.Content)
  311.             {
  312.                 case "Hex":
  313.                     A.IsEnabled = true;
  314.                     B.IsEnabled = true;
  315.                     C.IsEnabled = true;
  316.                     D.IsEnabled = true;
  317.                     E.IsEnabled = true;
  318.                     F.IsEnabled = true;
  319.                     InField.Text = Convert.ToString(Convert.ToInt64(InField.Text, prevnum), 16);
  320.                     break;
  321.  
  322.                     /* Тут происходят преобразования в доступности кнопок калькутятора
  323.                        А еще перевод строки в нужную систему счисления
  324.  
  325.                     КОРОЧЕ тут баг. Строка с предыдущими записями не переводится в нужную систему
  326.                     и не считается вообще при переводе с другую систему.
  327.  
  328.                     Также при делении в 16-ричной системе счисления выдаёт ошибку
  329.                     */
  330.  
  331.                 case "Dec":
  332.                     InField.Text = Convert.ToString(Convert.ToInt64(InField.Text, prevnum), 10);
  333.                     break;
  334.                 case "Oct":
  335.                     Nine.IsEnabled = false;
  336.                     Eight.IsEnabled = false;
  337.                     InField.Text = Convert.ToString(Convert.ToInt64(InField.Text, prevnum), 8);
  338.                     break;
  339.                 case "Bin":
  340.                     Nine.IsEnabled = false;
  341.                     Eight.IsEnabled = false;
  342.                     Seven.IsEnabled = false;
  343.                     Six.IsEnabled = false;
  344.                     Five.IsEnabled = false;
  345.                     Four.IsEnabled = false;
  346.                     Three.IsEnabled = false;
  347.                     Two.IsEnabled = false;
  348.                     InField.Text = Convert.ToString(Convert.ToInt64(InField.Text, prevnum), 2);
  349.                     break;
  350.             }
  351.         }
  352.         private void NumUnchecked(object sender, RoutedEventArgs e)
  353.         {
  354.             RadioButton AnyRadioButton = (RadioButton)sender;
  355.             switch (AnyRadioButton.Content)
  356.             {
  357.                 case "Hex":
  358.                     A.IsEnabled = false;
  359.                     B.IsEnabled = false;
  360.                     C.IsEnabled = false;
  361.                     D.IsEnabled = false;
  362.                     E.IsEnabled = false;
  363.                     F.IsEnabled = false;
  364.                     prevnum = 16;
  365.                     break;
  366.                 case "Dec":
  367.                     prevnum = 10;
  368.                     break;
  369.                 case "Oct":
  370.                     Nine.IsEnabled = true;
  371.                     Eight.IsEnabled = true;
  372.                     prevnum = 8;
  373.                     break;
  374.                 case "Bin":
  375.                     Nine.IsEnabled = true;
  376.                     Eight.IsEnabled = true;
  377.                     Seven.IsEnabled = true;
  378.                     Six.IsEnabled = true;
  379.                     Five.IsEnabled = true;
  380.                     Four.IsEnabled = true;
  381.                     Three.IsEnabled = true;
  382.                     Two.IsEnabled = true;
  383.                     prevnum = 2;
  384.                     break;
  385.             }
  386.         }
  387.  
  388.         private void ByteChecked(object sender, RoutedEventArgs e)  //Кол-во байт
  389.         {
  390.             RadioButton AnyRadioButton = (RadioButton)sender;
  391.             switch (AnyRadioButton.Content)
  392.             {
  393.                 case "8 байт":
  394.                     foreach (Label element in BinaryPanel.Children)
  395.                     {
  396.                         element.Visibility = Visibility.Visible;
  397.                     }
  398.                     break;
  399.                 case "4 байта":
  400.                     for (int i = 0; i < 32; i++)
  401.                     {
  402.                         BinaryPanel.Children[i].Visibility = Visibility.Hidden;
  403.                         BinaryPanel.Children[i].SetValue(ContentProperty, '0');
  404.                         BinaryUpdate();
  405.                     }
  406.                     break;
  407.  
  408.                     // скрывает и обнуляет ненужные нули. Ничего интересного
  409.  
  410.                 case "2 байта":
  411.                     for (int i = 0; i < 48; i++)
  412.                     {
  413.                         BinaryPanel.Children[i].Visibility = Visibility.Hidden;
  414.                         BinaryPanel.Children[i].SetValue(ContentProperty, '0');
  415.                         BinaryUpdate();
  416.                     }
  417.                     break;
  418.                 case "1 байт":
  419.                     for (int i = 0; i < 56; i++)
  420.                     {
  421.                         BinaryPanel.Children[i].Visibility = Visibility.Hidden;
  422.                         BinaryPanel.Children[i].SetValue(ContentProperty, '0');
  423.                         BinaryUpdate();
  424.                     }
  425.                     break;
  426.             }
  427.         }
  428.         private void ByteUnchecked(object sender, RoutedEventArgs e)
  429.         {
  430.             foreach (Label element in BinaryPanel.Children)
  431.             {
  432.                 element.Visibility = Visibility.Visible;
  433.             }
  434.  
  435.             // Делает все объекты в BinaryPanel видимыми
  436.         }
  437.  
  438.         public void Mem_click(object sender, RoutedEventArgs e)     //Работа с памятью
  439.         {
  440.             Button but = (Button)sender;
  441.             switch (but.Content)
  442.             {
  443.                 case "MC":
  444.                     memory = 0.0;
  445.                     InField.Text = "0";
  446.                     break;
  447.                     // очистить число из памяти
  448.                 case "MR":
  449.                     InField.Text = Convert.ToString(memory);
  450.                     break;
  451.                     // вывести сохранённое число
  452.                 case "MS":
  453.                     memory = Convert.ToDouble(InField.Text);
  454.                     break;
  455.                     // сохранить число в памяти
  456.                 case "M+":
  457.                     memory += Convert.ToDouble(InField.Text);
  458.                     break;
  459.                     // добавить к числу в памяти
  460.                 case "M-":
  461.                     memory -= Convert.ToDouble(InField.Text);
  462.                     break;
  463.                     // вычесть от числа в памяти
  464.             }
  465.         }
  466.  
  467.         public void Number_click(object sender, RoutedEventArgs e)  //Обработка нажатий на числа
  468.         {
  469.             Button but = (Button)sender;
  470.             switch (but.Content)
  471.             {
  472.                 case "0":
  473.                     if (InField.Text != "0")
  474.                         InField.Text += "0";
  475.                     break;
  476.                     // если число не ноль, то добавляем число
  477.                 default:
  478.                     if (InField.Text == "0")
  479.                         InField.Text = Convert.ToString(but.Content);
  480.                     // заменяем ноль другим числом
  481.                     else if (!(prog.IsChecked) && (result == Convert.ToDouble(InField.Text)) && (InField.Text != "0,"))
  482.                         InField.Text = Convert.ToString(but.Content);
  483.                     else if (prog.IsChecked &&  ((InField.Text.Length > 18 && (Dec.IsChecked ?? true))) || (InField.Text.Length > 64 && (Bin.IsChecked ?? true))) { }  
  484.                     //ограничение кол-ва символов в прог.режиме
  485.                     else
  486.                         InField.Text += Convert.ToString(but.Content);
  487.                     // просто добавление чисел к строке вывода
  488.                     break;
  489.             }
  490.             BinarySync();
  491.         }
  492.  
  493.         public void Oper_click(object sender, RoutedEventArgs e)    //Обработка нажатий на операции
  494.         {
  495.             Button but = (Button)sender;
  496.             if (last_oper == "ⁿ√x")
  497.                 // ласт_опер это последняя выполненная операция (последняя нажатое действие)
  498.             {
  499.                 InField.Text = Convert.ToString(Math.Pow(Convert.ToDouble(PrevField.Text), 1.0 / Convert.ToDouble(InField.Text)));
  500.                 last_oper = "";
  501.                 PrevField.Text = "";
  502.                 return;
  503.             }
  504.             switch (but.Content)
  505.             {
  506.                 case "⬅":
  507.                     if (InField.Text.Length > 1)
  508.                         InField.Text = InField.Text.Remove(InField.Text.Length - 1);
  509.                     else
  510.                         InField.Text = "0";
  511.                     break;
  512.                 case "CAD":
  513.                     InField.Text = "0";
  514.                     statcounter = 0;
  515.                     statsum = 0;
  516.                     data.Items.Clear();
  517.                     break;
  518.                 case "CE":
  519.                     InField.Text = "0";
  520.                     if (prog.IsChecked)
  521.                         foreach (Label element in BinaryPanel.Children)
  522.                         {
  523.                             element.Content = "0";
  524.                         }
  525.                     break;
  526.                 case "C":
  527.                     InField.Text = "0";
  528.                     PrevField.Text = "";
  529.                     result = 0.0;
  530.                     last_oper = "";
  531.                     if (prog.IsChecked)
  532.                         foreach (Label element in BinaryPanel.Children)
  533.                         {
  534.                             element.Content = "0";
  535.                         }
  536.                     break;
  537.                 case "±":
  538.                         InField.Text = Convert.ToString(-1 * Convert.ToDouble(InField.Text));
  539.                     break;
  540.                 case ",":
  541.                     if (InField.Text.Contains(',') == false)
  542.                         InField.Text += ",";
  543.                     break;
  544.                 case "+":
  545.                     if (def.IsChecked || prog.IsChecked)
  546.                     {
  547.                         Default_Solution(but);
  548.                     }
  549.                     else if (eng.IsChecked)
  550.                     {
  551.                         PrevField.Text += InField.Text + but.Content;
  552.                         InField.Text = "0";
  553.                         last_oper = "";
  554.                     }
  555.                     break;
  556.                 case "-":
  557.                     if (def.IsChecked || prog.IsChecked)
  558.                     {
  559.                         Default_Solution(but);
  560.                     }
  561.                     else if (eng.IsChecked)
  562.                     {
  563.                         PrevField.Text += InField.Text + but.Content;
  564.                         InField.Text = "0";
  565.                     }
  566.                     break;
  567.                 case "*":
  568.                     if (def.IsChecked || prog.IsChecked)
  569.                     {
  570.                         Default_Solution(but);
  571.                     }
  572.                     else if (eng.IsChecked)
  573.                     {
  574.                         PrevField.Text += InField.Text + but.Content;
  575.                         InField.Text = "0";
  576.                         last_oper = "";
  577.                     }
  578.                     break;
  579.                 case "/":
  580.                     if (def.IsChecked || prog.IsChecked)
  581.                     {
  582.                         Default_Solution(but);
  583.                     }
  584.                     else if (eng.IsChecked)
  585.                     {
  586.                         PrevField.Text += InField.Text + but.Content;
  587.                         InField.Text = "0";
  588.                         last_oper = "";
  589.                     }
  590.                     break;
  591.                 case "√":
  592.                         InField.Text = Convert.ToString(Math.Sqrt(Convert.ToDouble(InField.Text)));
  593.                     break;
  594.                 case "%":
  595.                         if (last_oper == "*")
  596.                         {
  597.                             result = Convert.ToDouble(InField.Text) * result / 100;
  598.                         }
  599.                         last_oper = "";
  600.                         PrevField.Text = "";
  601.                         InField.Text = Convert.ToString(result);
  602.                     break;
  603.                 case "1/x":
  604.                         InField.Text = Convert.ToString(1/Convert.ToDouble(InField.Text));
  605.                     break;
  606.                 case "=":
  607.                     if (def.IsChecked || prog.IsChecked)
  608.                     {
  609.                         Default_Solution(but);
  610.                         PrevField.Text = "";
  611.                         last_oper = "";
  612.                         InField.Text = Convert.ToString(result);
  613.                         // Вызывет метод обычного решения, а потом обнуляет
  614.                         // последнюю операцию и вывода
  615.                         // а это означает, что тут нет возможности повторить последнее действие
  616.                         // несколько раз, как в обычном калькуляторе
  617.                     }
  618.                     if (eng.IsChecked)
  619.                     {
  620.                         if (opers.Contains(PrevField.Text[PrevField.Text.Length-1]))
  621.                             PrevField.Text += InField.Text;
  622.  
  623.                         // По идее, он должен перемещать в инженерном калькуляторе
  624.                         // перемещать число из текущего поля в поле предыдущей операции, но он выдает ошибку о выходе за пределы массивы
  625.  
  626.                         InField.Text = Convert.ToString(Engineer.Solution(PrevField.Text));
  627.                         PrevField.Text = "";
  628.                         // если открыт инженерная версия, то будет выполнен другой метод выполнения
  629.                     }
  630.                     break;
  631.                 default:
  632.                     break;
  633.             }
  634.         }
  635.  
  636.         public void Eng_click(object sender, RoutedEventArgs e)     //Обработка нажатий на инж.панель
  637.         {
  638.             Button but = (Button)sender;
  639.             switch (but.Content)
  640.             {
  641.                 // это всё математика, тут почти везде просто функции и перевод их результатов в строку
  642.  
  643.                 case "Inv":
  644.                     if (InvPanel.IsVisible)
  645.                         InvPanel.Visibility = Visibility.Collapsed;
  646.                     else
  647.                         InvPanel.Visibility = Visibility.Visible;
  648.                     break;
  649.                 case "ln":
  650.                     InField.Text = Convert.ToString(Math.Log(Convert.ToDouble(InField.Text)));
  651.                     break;
  652.                 case "(":
  653.                     PrevField.Text += "(";
  654.                     break;
  655.                 case ")":
  656.                     PrevField.Text += InField.Text + ")";
  657.                     InField.Text = "";
  658.                     break;
  659.                 case "Int":
  660.                     InField.Text = Convert.ToString(Math.Truncate(Convert.ToDouble(InField.Text)));
  661.                     break;
  662.                 case "sinh":
  663.                     InField.Text = Convert.ToString(Math.Sinh(Convert.ToDouble(InField.Text)));
  664.                     break;
  665.                 case "sin":
  666.                     if (Degr.IsChecked ?? true)
  667.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
  668.                     if (Rads.IsChecked ?? true)
  669.                         angle = Convert.ToDouble(InField.Text);
  670.                     if (Grads.IsChecked ?? true)
  671.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
  672.                     InField.Text = Convert.ToString(Math.Sin(Convert.ToDouble(angle)));
  673.                     break;
  674.  
  675.                     // Может работать перевод в синусах, но вообще радиобаттоны ничего не меняют
  676.  
  677.                 case "x²":
  678.                     InField.Text = Convert.ToString(Math.Pow(Convert.ToDouble(InField.Text),2));
  679.                     break;
  680.                 case "n!":
  681.                     int res = 1;
  682.                     for (int i = Convert.ToInt32(InField.Text); i > 1; i--)
  683.                         res *= i;
  684.                     InField.Text = Convert.ToString(res);
  685.                     break;
  686.                 case "dms":
  687.                     double decdeg = Convert.ToDouble(InField.Text);
  688.                     double minsec = (decdeg - Math.Truncate(decdeg)) * 60;
  689.                     double sec = (minsec - Math.Truncate(minsec)) * 60;
  690.                     double degminsec = (Math.Truncate(sec) / 10000) + (Math.Truncate(minsec) / 100) + Math.Truncate(decdeg);
  691.                     InField.Text = Convert.ToString(degminsec);
  692.                     break;
  693.                 case "cosh":
  694.                     InField.Text = Convert.ToString(Math.Cosh(Convert.ToDouble(InField.Text)));
  695.                     break;
  696.                 case "cos":
  697.                     if (Degr.IsChecked ?? true)
  698.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
  699.                     if (Rads.IsChecked ?? true)
  700.                         angle = Convert.ToDouble(InField.Text);
  701.                     if (Grads.IsChecked ?? true)
  702.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
  703.                     InField.Text = Convert.ToString(Math.Cos(Convert.ToDouble(angle)));
  704.                     break;
  705.                 case "xⁿ":
  706.                     PrevField.Text += InField.Text+"^";
  707.                     InField.Text = "0";
  708.                     break;
  709.                 case "ⁿ√x":
  710.                     PrevField.Text += InField.Text;
  711.                     last_oper = "ⁿ√x";
  712.                     InField.Text = "0";
  713.                     break;
  714.                 case "π":
  715.                     InField.Text = Convert.ToString(Math.PI);
  716.                     break;
  717.                 case "tanh":
  718.                     InField.Text = Convert.ToString(Math.Tanh(Convert.ToDouble(InField.Text)));
  719.                     break;
  720.                 case "tan":
  721.                     if (Degr.IsChecked ?? true)
  722.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
  723.                     if (Rads.IsChecked ?? true)
  724.                         angle = Convert.ToDouble(InField.Text);
  725.                     if (Grads.IsChecked ?? true)
  726.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
  727.                     InField.Text = Convert.ToString(Math.Tan(Convert.ToDouble(angle)));
  728.                     break;
  729.                 case "x³":
  730.                     InField.Text = Convert.ToString(Math.Pow(Convert.ToDouble(InField.Text), 3));
  731.                     break;
  732.                 case "³√x":
  733.                     InField.Text = Convert.ToString(Math.Pow(Convert.ToDouble(InField.Text), 1.0/3.0));
  734.                     break;
  735.                 case "F-E":
  736.                     if (InField.Text.Contains('e'))
  737.                         InField.Text = Convert.ToString(Double.Parse(InField.Text.Replace('.', ','), NumberStyles.Float));
  738.                     else
  739.                         InField.Text = Convert.ToDouble(InField.Text).ToString("e", CultureInfo.InvariantCulture);
  740.                     break;
  741.                 case "Exp":
  742.                     InField.Text += ".e+0";
  743.                     break;
  744.                 case "Mod":
  745.                     PrevField.Text += InField.Text + "%";
  746.                     InField.Text = "0";
  747.                     break;
  748.                 case "log":
  749.                     InField.Text = Convert.ToString(Math.Log10(Convert.ToDouble(InField.Text)));
  750.                     break;
  751.                 case "10ⁿ":
  752.                     InField.Text = Convert.ToString(Math.Pow(10, Convert.ToDouble(InField.Text)));
  753.                     break;
  754.                 case "e^x":
  755.                     InField.Text = Convert.ToString(Math.Pow(Math.E, Convert.ToDouble(InField.Text)));
  756.                     break;
  757.                 case "Frac":
  758.                     InField.Text = Convert.ToString(Convert.ToDouble(InField.Text) % 1);
  759.                     break;
  760.                 case "sinh^-1":
  761.                     // Данного метода почему-то нет в Math. Должен возвращать угол, гиперболический синус которого равен указанному числу. Ниже заплатка в виде Asin.
  762.                     InField.Text = Convert.ToString(Math.Asin(Convert.ToDouble(InField.Text)));
  763.                     break;
  764.                 case "sin^-1":
  765.                     if (Degr.IsChecked ?? true)
  766.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
  767.                     if (Rads.IsChecked ?? true)
  768.                         angle = Convert.ToDouble(InField.Text);
  769.                     if (Grads.IsChecked ?? true)
  770.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
  771.                     InField.Text = Convert.ToString(Math.Asin(Convert.ToDouble(angle)));
  772.                     break;
  773.                 case "deg":
  774.                     degminsec = Convert.ToDouble(InField.Text);
  775.                     double decsec = (degminsec * 100 - Math.Truncate(degminsec * 100)) / .6;
  776.                     double degmin = (Math.Truncate(degminsec * 100) + decsec) / 100;
  777.                     double deg = Math.Truncate(degmin);
  778.                     decdeg = deg + (degmin - deg) / .6;
  779.                     InField.Text = Convert.ToString(decdeg);
  780.                     break;
  781.                 case "cosh^-1":
  782.                     // Данного метода почему-то нет в Math. Должен возвращать угол, гиперболический косинус которого равен указанному числу. Ниже заплатка в виде Acos.
  783.                     InField.Text = Convert.ToString(Math.Acos(Convert.ToDouble(InField.Text)));
  784.                     break;
  785.                 case "cos^-1":
  786.                     if (Degr.IsChecked ?? true)
  787.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
  788.                     if (Rads.IsChecked ?? true)
  789.                         angle = Convert.ToDouble(InField.Text);
  790.                     if (Grads.IsChecked ?? true)
  791.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
  792.                     InField.Text = Convert.ToString(Math.Acos(Convert.ToDouble(angle)));
  793.                     break;
  794.                 case "2*π":
  795.                     InField.Text = Convert.ToString(2 * Math.PI);
  796.                     break;
  797.                 case "tanh^-1":
  798.                     // Данного метода почему-то нет в Math. Должен возвращать угол, гиперболический тангенс которого равен указанному числу. Ниже заплатка в виде Atan.
  799.                     InField.Text = Convert.ToString(Math.Atan(Convert.ToDouble(InField.Text)));
  800.                     break;
  801.                 case "tan^-1":
  802.                     if (Degr.IsChecked ?? true)
  803.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 180.0;
  804.                     if (Rads.IsChecked ?? true)
  805.                         angle = Convert.ToDouble(InField.Text);
  806.                     if (Grads.IsChecked ?? true)
  807.                         angle = Math.PI * Convert.ToDouble(InField.Text) / 200.0;
  808.                     InField.Text = Convert.ToString(Math.Atan(Convert.ToDouble(angle)));
  809.                     break;
  810.             }
  811.  
  812.         }
  813.  
  814.         public void Prog_click(object sender, RoutedEventArgs e)  //Обработка нажатий на прог.панель
  815.         {
  816.             Button but = (Button)sender;
  817.  
  818.             if (Hex.IsChecked ?? true)
  819.                 result = Convert.ToDouble(Convert.ToInt64(InField.Text, 16).ToString("D"));
  820.             if (Dec.IsChecked ?? true)
  821.                 result = Convert.ToDouble(InField.Text);
  822.             if (Oct.IsChecked ?? true)
  823.                 result = Convert.ToDouble(Convert.ToInt64(InField.Text, 8).ToString("D"));
  824.             if (Bin.IsChecked ?? true)
  825.                 result = Convert.ToDouble(Convert.ToInt64(InField.Text, 2).ToString("D"));
  826.  
  827.             switch (but.Content)
  828.             {
  829.                 case "Mod":
  830.                     Default_Solution(but);
  831.                     BinarySync();
  832.                     break;
  833.                 case "(":
  834.                     ctr += 1;
  835.                     Skb.Content = "(=" + Convert.ToString(ctr);
  836.                     break;
  837.                 case ")":
  838.                     if (ctr <= 1)
  839.                         Skb.Content = "";
  840.                     else
  841.                     {
  842.                         ctr -= 1;
  843.                         Skb.Content = "(=" + Convert.ToString(ctr);
  844.                     }
  845.                     break;
  846.                 case "RoL":
  847.                     i = 0;
  848.                     array = new String[BinaryPanel.Children.Count];
  849.                     foreach (Label element in BinaryPanel.Children)
  850.                     {
  851.                         array[i++] = element.Content.ToString();
  852.                     }
  853.                     int n = array.Length;
  854.                     array = array.Skip(1).Concat(array.Take(1)).ToArray();
  855.  
  856.                     i = 0;
  857.                     foreach (Label element in BinaryPanel.Children)
  858.                     {
  859.                         BinaryPanel.Children[i].SetValue(ContentProperty, array[i++]);
  860.                     }
  861.                     BinaryUpdate();
  862.                     break;
  863.                 case "RoR":
  864.                     array = new String[BinaryPanel.Children.Count];
  865.                     i = 0;
  866.                     foreach (Label element in BinaryPanel.Children)
  867.                     {
  868.                         array[i++] = element.Content.ToString();
  869.                     }
  870.                     n = array.Length;
  871.                     array = array.Skip(n - 1).Concat(array.Take(n - 1)).ToArray();
  872.  
  873.                     i = 0;
  874.                     foreach (Label element in BinaryPanel.Children)
  875.                     {
  876.                         BinaryPanel.Children[i].SetValue(ContentProperty, array[i++]);
  877.                     }
  878.                     BinaryUpdate();
  879.                     break;
  880.                 case "Or":
  881.                     Default_Solution(but);
  882.                     BinarySync();
  883.                     break;
  884.                 case "Xor":
  885.                     Default_Solution(but);
  886.                     BinarySync();
  887.                     break;
  888.                 case "Lsh":
  889.                     Default_Solution(but);
  890.                     BinaryUpdate();
  891.                     break;
  892.                 case "Rsh":
  893.                     Default_Solution(but);
  894.                     BinaryUpdate();
  895.                     break;
  896.                 case "Not":
  897.                     InField.Text = Convert.ToString(~Convert.ToInt64(InField.Text));
  898.                     BinarySync();
  899.                     break;
  900.                 case "And":
  901.                     Default_Solution(but);
  902.                     BinarySync();
  903.                     break;
  904.                 case "A":
  905.                     InField.Text += "a";
  906.                     BinarySync();
  907.                     break;
  908.                 case "B":
  909.                     InField.Text += "b";
  910.                     BinarySync();
  911.                     break;
  912.                 case "C":
  913.                     InField.Text += "c";
  914.                     BinarySync();
  915.                     break;
  916.                 case "D":
  917.                     InField.Text += "d";
  918.                     BinarySync();
  919.                     break;
  920.                 case "E":
  921.                     InField.Text += "e";
  922.                     BinarySync();
  923.                     break;
  924.                 case "F":
  925.                     InField.Text += "f";
  926.                     BinarySync();
  927.                     break;
  928.                 default:
  929.                     break;
  930.             }
  931.         }
  932.  
  933.         public void Default_Solution(Button but)    //Решение в обычном режиме и логические операции
  934.         {
  935.             if (last_oper == "")
  936.             {
  937.                 result = Convert.ToDouble(InField.Text);
  938.                 last_oper = Convert.ToString(but.Content);
  939.  
  940.                 PrevField.Text += InField.Text;
  941.                 InField.Text = "0";
  942.                 // это условие выполнится после того, как мы нажмём =
  943.                 // Это сохранит наше число в переменную резалт,
  944.                 // с которой потом будут происходить вычисления.
  945.                 // ну и заодно обнулит нам поле ввода, чтобы мы дальше вводили результаты
  946.             }
  947.             else
  948.             {
  949.                 PrevField.Text += last_oper + InField.Text;
  950.                 switch (last_oper)
  951.                 {
  952.                     case "+":
  953.                         result += Convert.ToDouble(InField.Text);
  954.                         InField.Text = Convert.ToString(result);
  955.                         last_oper = Convert.ToString(but.Content);
  956.                         break;
  957.                     case "-":
  958.                         result -= Convert.ToDouble(InField.Text);
  959.                         InField.Text = Convert.ToString(result);
  960.                         last_oper = Convert.ToString(but.Content);
  961.                         break;
  962.                     case "*":
  963.                         result *= Convert.ToDouble(InField.Text);
  964.                         InField.Text = Convert.ToString(result);
  965.                         last_oper = Convert.ToString(but.Content);
  966.                         break;
  967.                     case "/":
  968.                         result /= Convert.ToDouble(InField.Text);
  969.                         InField.Text = Convert.ToString(result);
  970.                         last_oper = Convert.ToString(but.Content);
  971.                         break;
  972.                     case "%":
  973.                         result += Convert.ToDouble(InField.Text);
  974.                         InField.Text = Convert.ToString(result);
  975.                         last_oper = Convert.ToString(but.Content);
  976.                         break;
  977.                     case "1/x":
  978.                         result += Convert.ToDouble(InField.Text);
  979.                         InField.Text = Convert.ToString(result);
  980.                         last_oper = Convert.ToString(but.Content);
  981.                         break;
  982.                     case "Mod":
  983.                         result %= Convert.ToDouble(InField.Text);
  984.                         InField.Text = Convert.ToString(result);
  985.                         last_oper = Convert.ToString(but.Content);
  986.                         break;
  987.                     case "Or":
  988.                         binres = Convert.ToInt32(result);
  989.                         binres |= Convert.ToInt32(InField.Text);
  990.                         InField.Text = Convert.ToString(binres);
  991.                         result = Convert.ToDouble(binres);
  992.                         last_oper = Convert.ToString(but.Content);
  993.                         break;
  994.                     case "Xor":
  995.                         binres = Convert.ToInt32(result);
  996.                         binres ^= Convert.ToInt32(InField.Text);
  997.                         InField.Text = Convert.ToString(binres);
  998.                         result = Convert.ToDouble(binres);
  999.                         last_oper = Convert.ToString(but.Content);
  1000.                         break;
  1001.                     case "And":
  1002.                         binres = Convert.ToInt32(result);
  1003.                         binres &= Convert.ToInt32(InField.Text);
  1004.                         InField.Text = Convert.ToString(binres);
  1005.                         result = Convert.ToDouble(binres);
  1006.                         last_oper = Convert.ToString(but.Content);
  1007.                         break;
  1008.                     case "Lsh":
  1009.                         binres = Convert.ToInt32(result);
  1010.                         binres <<= Convert.ToInt32(InField.Text);
  1011.                         InField.Text = Convert.ToString(binres);
  1012.                         result = Convert.ToDouble(binres);
  1013.                         last_oper = Convert.ToString(but.Content);
  1014.                         break;
  1015.                     case "Rsh":
  1016.                         binres = Convert.ToInt32(result);
  1017.                         binres >>= Convert.ToInt32(InField.Text);
  1018.                         InField.Text = Convert.ToString(binres);
  1019.                         result = Convert.ToDouble(binres);
  1020.                         last_oper = Convert.ToString(but.Content);
  1021.                         break;
  1022.                 }
  1023.             }
  1024.         }
  1025.  
  1026.         public void Stat_click(object sender, RoutedEventArgs e) //Обработка нажатий на стат.панель
  1027.         {
  1028.             Button but = (Button)sender;
  1029.  
  1030.             switch (but.Content)
  1031.             {
  1032.                 case "ADD":
  1033.                     data.Items.Add(InField.Text);
  1034.                     data.SelectedIndex = data.Items.Count - 1;
  1035.                     data.ScrollIntoView(data.SelectedItem);
  1036.                     InField.Text = "0";
  1037.                     statcounter++;
  1038.                     statcount.Content = "Счёт=" + Convert.ToString(statcounter);
  1039.                     break;
  1040.                 case "ср.x":
  1041.                     foreach(string item in data.Items)
  1042.                     {
  1043.                         statsum += Convert.ToInt32(item);
  1044.                     }
  1045.                     InField.Text = Convert.ToString(Convert.ToDouble(statsum) / data.Items.Count);
  1046.                     statsum = 0;
  1047.                     break;
  1048.                 case "ср.x²":
  1049.                     foreach (string item in data.Items)
  1050.                     {
  1051.                         statsum += Math.Pow(Convert.ToDouble(item),2);
  1052.                     }
  1053.                     InField.Text = Convert.ToString(statsum / data.Items.Count);
  1054.                     statsum = 0;
  1055.                     break;
  1056.                 case "Σx":
  1057.                     foreach (string item in data.Items)
  1058.                     {
  1059.                         statsum += Convert.ToInt32(item);
  1060.                     }
  1061.                     InField.Text = Convert.ToString(statsum);
  1062.                     statsum = 0;
  1063.                     break;
  1064.                 case "Σx²":
  1065.                     foreach (string item in data.Items)
  1066.                     {
  1067.                         statsum += Math.Pow(Convert.ToDouble(item),2);
  1068.                     }
  1069.                     InField.Text = Convert.ToString(statsum);
  1070.                     statsum = 0;
  1071.                     break;
  1072.                 case "σₐ":
  1073.                     foreach (string item in data.Items)
  1074.                     {
  1075.                         statsum += Convert.ToDouble(item);
  1076.                     }
  1077.                     statsum /= data.Items.Count;
  1078.                     foreach (string item in data.Items)
  1079.                     {
  1080.                         statdev += Math.Pow((Convert.ToDouble(item)-statsum),2);
  1081.                     }
  1082.                     statdev = Math.Sqrt(statdev / data.Items.Count);
  1083.                     InField.Text = Convert.ToString(statdev);
  1084.                     statdev = 0;
  1085.                     statsum = 0;
  1086.                     break;
  1087.                 case "σₐ₋₁":
  1088.                     foreach (string item in data.Items)
  1089.                     {
  1090.                         statsum += Convert.ToDouble(item);
  1091.                     }
  1092.                     statsum /= data.Items.Count;
  1093.                     foreach (string item in data.Items)
  1094.                     {
  1095.                         statdev += Math.Pow((Convert.ToDouble(item) - statsum), 2);
  1096.                     }
  1097.                     statdev = Math.Sqrt(statdev / (data.Items.Count-1));
  1098.                     InField.Text = Convert.ToString(statdev);
  1099.                     statdev = 0;
  1100.                     statsum = 0;
  1101.                     break;
  1102.                 default:
  1103.                     break;
  1104.             }
  1105.         }
  1106.        
  1107.     }
  1108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement