using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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;
using LiveCharts;
using LiveCharts.Defaults;
using LiveCharts.Wpf;
namespace numbersystem
{
///
/// Логика взаимодействия для MainWindow.xaml
///
public partial class MainWindow : Window
{
private numbersystemContext _context;
public MainWindow()
{
InitializeComponent();
_context = new numbersystemContext();
str.Focus();
Load();
Diagram();
DataContext = this;
dia.Series = SeriesCollection;
}
// заполнение истории
private void Load()
{
historyGrid.ItemsSource = _context.history.OrderByDescending(I => I.id).ToList();
}
SeriesCollection SeriesCollection { get; set; }
// заполнение диаграммы
private void Diagram()
{
int binCount = _context.history.Where(i => i.notation == "2").Count();
int octCount = _context.history.Where(i => i.notation == "8").Count();
int hexCount = _context.history.Where(i => i.notation == "16").Count();
SeriesCollection = new SeriesCollection
{
new PieSeries
{
Title = "Двоичная",
Values = new ChartValues { new ObservableValue(binCount) },
DataLabels = true,
Fill = System.Windows.Media.Brushes.Lavender
},
new PieSeries
{
Title = "Восьмеричная",
Values = new ChartValues { new ObservableValue(octCount) },
DataLabels = true,
Fill = System.Windows.Media.Brushes.MediumPurple
},
new PieSeries
{
Title = "Шестнадцатеричная",
Values = new ChartValues { new ObservableValue(hexCount) },
DataLabels = true,
Fill = System.Windows.Media.Brushes.Indigo
}
};
}
// выбор системы счисления
int ss = 0;
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox comboBox = (ComboBox)sender;
ComboBoxItem selectedItem = (ComboBoxItem)comboBox.SelectedItem;
if (Convert.ToString(selectedItem.Content) == "Двоичная")
ss = 2;
else if (Convert.ToString(selectedItem.Content) == "Восьмеричная")
ss = 8;
else if (Convert.ToString(selectedItem.Content) == "Шестнадцатиричная")
ss = 16;
str.Focus();
}
string expression; // переменная для выражения
int res; // переменная для результата
// ввод цифр, букв и знаков операций
private void str_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
// при нажатии на цифры или буквы
if(Int32.TryParse(e.Text, out int n)
|| e.Text == "a" || e.Text == "b" || e.Text == "c" || e.Text == "d" || e.Text == "e" || e.Text == "f")
{
str.Text += e.Text;
}
// при нажатии на знаки операций
if(e.Text == "+" || e.Text == "-" || e.Text == "/" || e.Text == "*" || e.Text == "%")
{
if (str.Text != "")
{
if (str.Text[str.Text.Length - 1] != ' ')
{
str.Text += " ";
str.Text += e.Text;
str.Text += " ";
}
}
}
// при нажатии на "равно"
if(e.Text == "=")
{
if (str.Text != "")
{
if (str.Text[str.Text.Length - 1] != ' ')
{
if (ss == 0)
{
MessageBox.Show("Не выбрана система счисления");
return;
}
// записываем выражение в переменную
expression = str.Text;
// разбиваем строку на массив
string[] arr = expression.Split(' ');
try
{
// перебираем массив и считаем высокоприоритетные операции
for (int i = 0; i < arr.Length; i++)
{
// умножение
if (arr[i] == "*")
{
if (arr[i - 1] == "_")
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 2], ss) * Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 2] = "_";
arr[i + 1] = "_";
}
else
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 1], ss) * Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 1] = "_";
arr[i + 1] = "_";
}
}
// деление
else if (arr[i] == "/")
{
if (arr[i - 1] == "_")
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 2], ss) / Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 2] = "_";
arr[i + 1] = "_";
}
else
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 1], ss) / Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 1] = "_";
arr[i + 1] = "_";
}
}
// остаток от деления
else if (arr[i] == "%")
{
if (arr[i - 1] == "_")
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 2], ss) % Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 2] = "_";
arr[i + 1] = "_";
}
else
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 1], ss) % Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 1] = "_";
arr[i + 1] = "_";
}
}
}
// узнаем размер будущего массива
int l = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] != "_")
{
l++;
}
}
// записать в новый массив результат предыдущего шага
string[] arr2 = new string[l];
int j = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] != "_")
{
arr2[j] = arr[i];
j++;
}
}
// первое число массива присваиваем переменной
res = Convert.ToInt32(arr2[0], ss);
// перебираем массив и считаем остальные операции
for (int i = 1; i < arr2.Length; i++)
{
// сложение
if (arr2[i] == "+")
{
res += Convert.ToInt32(arr2[i + 1], ss);
}
// вычитание
else if (arr2[i] == "-")
{
res -= Convert.ToInt32(arr2[i + 1], ss);
}
}
// выводим результат
str.Text = Convert.ToString(res, ss);
// добавляем вычисление в бд
history record = new history()
{
inquiry = expression,
result = Convert.ToString(res, ss),
notation = Convert.ToString(ss)
};
_context.history.Add(record);
_context.SaveChanges();
Load();
Diagram();
dia.Series = SeriesCollection;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
}
}
// кнопки стереть
private void str_KeyDown(object sender, KeyEventArgs e)
{
if(e.Key == Key.Delete)
{
str.Text = "";
}
if(e.Key == Key.Back)
{
if (str.Text.Length > 0)
{
if (str.Text[str.Text.Length - 1] == ' ') //если последний символ это знак операции
{
for(int i = 0; i < 3; i++)
str.Text = str.Text.Substring(0, str.Text.Length - 1);
}
else
{
str.Text = str.Text.Substring(0, str.Text.Length - 1);
}
}
}
}
// для теста
public string TestNS(int ss, string inquiry)
{
string result = "";
if (inquiry != "")
{
if (inquiry[inquiry.Length - 1] != ' ')
{
if (ss == 0)
{
return result;
}
// записываем выражение в переменную
expression = inquiry;
// разбиваем строку на массив
string[] arr = expression.Split(' ');
// перебираем массив и считаем высокоприоритетные операции
for (int i = 0; i < arr.Length; i++)
{
// умножение
if (arr[i] == "*")
{
if (arr[i - 1] == "_")
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 2], ss) * Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 2] = "_";
arr[i + 1] = "_";
}
else
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 1], ss) * Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 1] = "_";
arr[i + 1] = "_";
}
}
// деление
else if (arr[i] == "/")
{
if (arr[i - 1] == "_")
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 2], ss) / Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 2] = "_";
arr[i + 1] = "_";
}
else
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 1], ss) / Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 1] = "_";
arr[i + 1] = "_";
}
}
// остаток от деления
else if (arr[i] == "%")
{
if (arr[i - 1] == "_")
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 2], ss) % Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 2] = "_";
arr[i + 1] = "_";
}
else
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 1], ss) % Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 1] = "_";
arr[i + 1] = "_";
}
}
}
// узнаем размер будущего массива
int l = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] != "_")
{
l++;
}
}
// записать в новый массив результат предыдущего шага
string[] arr2 = new string[l];
int j = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] != "_")
{
arr2[j] = arr[i];
j++;
}
}
// первое число массива присваиваем переменной
int rest = Convert.ToInt32(arr2[0], ss);
// перебираем массив и считаем остальные операции
for (int i = 1; i < arr2.Length; i++)
{
// сложение
if (arr2[i] == "+")
{
rest += Convert.ToInt32(arr2[i + 1], ss);
}
// вычитание
else if (arr2[i] == "-")
{
rest -= Convert.ToInt32(arr2[i + 1], ss);
}
}
// выводим результат
result = Convert.ToString(rest, ss);
return result;
}
}
return result;
}
// при нажатии на кнопки
private void ca_Click(object sender, RoutedEventArgs e)
{
str.Text = "";
str.Focus();
}
private void zero_Click(object sender, RoutedEventArgs e)
{
str.Text += '0';
str.Focus();
}
private void erase_Click(object sender, RoutedEventArgs e)
{
if (str.Text.Length > 0)
{
if (str.Text[str.Text.Length - 1] == ' ') //если последний символ это знак операции
{
for (int i = 0; i < 3; i++)
str.Text = str.Text.Substring(0, str.Text.Length - 1);
}
else
{
str.Text = str.Text.Substring(0, str.Text.Length - 1);
}
}
str.Focus();
}
private void one_Click(object sender, RoutedEventArgs e)
{
str.Text += '1';
str.Focus();
}
private void two_Click(object sender, RoutedEventArgs e)
{
str.Text += '2';
str.Focus();
}
private void three_Click(object sender, RoutedEventArgs e)
{
str.Text += '3';
str.Focus();
}
private void four_Click(object sender, RoutedEventArgs e)
{
str.Text += '4';
str.Focus();
}
private void five_Click(object sender, RoutedEventArgs e)
{
str.Text += '5';
str.Focus();
}
private void six_Click(object sender, RoutedEventArgs e)
{
str.Text += '6';
str.Focus();
}
private void seven_Click(object sender, RoutedEventArgs e)
{
str.Text += '7';
str.Focus();
}
private void eight_Click(object sender, RoutedEventArgs e)
{
str.Text += '8';
str.Focus();
}
private void nine_Click(object sender, RoutedEventArgs e)
{
str.Text += '9';
str.Focus();
}
private void a_Click(object sender, RoutedEventArgs e)
{
str.Text += 'a';
str.Focus();
}
private void b_Click(object sender, RoutedEventArgs e)
{
str.Text += 'b';
str.Focus();
}
private void c_Click(object sender, RoutedEventArgs e)
{
str.Text += 'c';
str.Focus();
}
private void d_Click(object sender, RoutedEventArgs e)
{
str.Text += 'd';
str.Focus();
}
private void e_Click(object sender, RoutedEventArgs e)
{
str.Text += 'e';
str.Focus();
}
private void f_Click(object sender, RoutedEventArgs e)
{
str.Text += 'f';
str.Focus();
}
private void plus_Click(object sender, RoutedEventArgs e)
{
if (str.Text != "")
{
if (str.Text[str.Text.Length - 1] != ' ')
{
str.Text += " + ";
}
}
str.Focus();
}
private void minus_Click(object sender, RoutedEventArgs e)
{
if (str.Text != "")
{
if (str.Text[str.Text.Length - 1] != ' ')
{
str.Text += " - ";
}
}
str.Focus();
}
private void multiply_Click(object sender, RoutedEventArgs e)
{
if (str.Text != "")
{
if (str.Text[str.Text.Length - 1] != ' ')
{
str.Text += " * ";
}
}
str.Focus();
}
private void division_Click(object sender, RoutedEventArgs e)
{
if (str.Text != "")
{
if (str.Text[str.Text.Length - 1] != ' ')
{
str.Text += " / ";
}
}
str.Focus();
}
private void remains_Click(object sender, RoutedEventArgs e)
{
if (str.Text != "")
{
if (str.Text[str.Text.Length - 1] != ' ')
{
str.Text += " % ";
}
}
str.Focus();
}
private void equal_Click(object sender, RoutedEventArgs e)
{
if (str.Text != "")
{
if (str.Text[str.Text.Length - 1] != ' ')
{
if (ss == 0)
{
MessageBox.Show("Не выбрана система счисления");
return;
}
// записываем выражение в переменную
expression = str.Text;
// разбиваем строку на массив
string[] arr = expression.Split(' ');
try
{
// перебираем массив и считаем высокоприоритетные операции
for (int i = 0; i < arr.Length; i++)
{
// умножение
if (arr[i] == "*")
{
if (arr[i - 1] == "_")
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 2], ss) * Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 2] = "_";
arr[i + 1] = "_";
}
else
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 1], ss) * Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 1] = "_";
arr[i + 1] = "_";
}
}
// деление
else if (arr[i] == "/")
{
if (arr[i - 1] == "_")
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 2], ss) / Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 2] = "_";
arr[i + 1] = "_";
}
else
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 1], ss) / Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 1] = "_";
arr[i + 1] = "_";
}
}
// остаток от деления
else if (arr[i] == "%")
{
if (arr[i - 1] == "_")
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 2], ss) % Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 2] = "_";
arr[i + 1] = "_";
}
else
{
arr[i] = Convert.ToString(Convert.ToInt32(arr[i - 1], ss) % Convert.ToInt32(arr[i + 1], ss), ss);
arr[i - 1] = "_";
arr[i + 1] = "_";
}
}
}
// узнаем размер будущего массива
int l = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] != "_")
{
l++;
}
}
// записать в новый массив результат предыдущего шага
string[] arr2 = new string[l];
int j = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] != "_")
{
arr2[j] = arr[i];
j++;
}
}
// первое число массива присваиваем переменной
res = Convert.ToInt32(arr2[0], ss);
// перебираем массив и считаем остальные операции
for (int i = 1; i < arr2.Length; i++)
{
// сложение
if (arr2[i] == "+")
{
res += Convert.ToInt32(arr2[i + 1], ss);
}
// вычитание
else if (arr2[i] == "-")
{
res -= Convert.ToInt32(arr2[i + 1], ss);
}
}
// выводим результат
str.Text = Convert.ToString(res, ss);
// добавляем вычисление в бд
history record = new history()
{
inquiry = expression,
result = Convert.ToString(res, ss),
notation = Convert.ToString(ss)
};
_context.history.Add(record);
_context.SaveChanges();
Load();
Diagram();
dia.Series = SeriesCollection;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
str.Focus();
}
}
}