Ver código fonte

Закончил все функции с матрицами, добавил возможность писать отрицательные числа, пофиксил баг с изначальной матрицей

Никита Кашлач 3 anos atrás
pai
commit
6be46b4c55
2 arquivos alterados com 214 adições e 23 exclusões
  1. 72 0
      MatrixXAMLOnly/MainWindow.xaml
  2. 142 23
      MatrixXAMLOnly/MainWindow.xaml.cs

+ 72 - 0
MatrixXAMLOnly/MainWindow.xaml

@@ -685,6 +685,78 @@
                 <Button x:Name="BtnRowTranspositionReplaceCalculate" Grid.Column="2" Content="Вычислить" Click="BtnRowTranspositionReplaceCalculate_Click"/>
             </Grid>
         </Grid> <!-- RowTranspositionReplace -->
+
+        <!-- Inverse -->
+        <Grid x:Name="GridContentInverse" Grid.RowSpan="3" Visibility="Collapsed">
+            <Grid.RowDefinitions>
+                <RowDefinition/>
+                <RowDefinition Height="4*"/>
+                <RowDefinition/>
+            </Grid.RowDefinitions>
+
+            <!-- UpperBody -->
+            <Grid Grid.Row="0">
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition Width="0.1*"/>
+                    <ColumnDefinition/>
+                </Grid.ColumnDefinitions>
+
+                <Grid Grid.Column="1">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition/>
+                        <ColumnDefinition/>
+                        <ColumnDefinition/>
+                    </Grid.ColumnDefinitions>
+
+                    <StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
+                        <TextBlock Text="Количество строк: "/>
+                        <TextBox x:Name="TextBoxInverseRowCount" Style="{StaticResource NonMatrix}" MaxLength="1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
+                    </StackPanel>
+
+                    <StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
+                        <TextBlock Text="Количество столбцов: "/>
+                        <TextBox x:Name="TextBoxInverseColumnCount" Style="{StaticResource NonMatrix}" MaxLength="1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
+                    </StackPanel>
+
+                    <Button x:Name="BtnInverseCreateMatrix" Grid.Column="2" Content="Построить матрицу" Click="BtnInverseCreateMatrix_Click"/>
+                </Grid>
+            </Grid>
+
+            <!-- MidlleBody -->
+            <Grid Grid.Row="1">
+                <Border Grid.ColumnSpan="3" BorderBrush="Black" BorderThickness="0 1 0 1">
+                    <Grid>
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition/>
+                            <ColumnDefinition Width="0.5*"/>
+                            <ColumnDefinition/>
+                        </Grid.ColumnDefinitions>
+
+                        <Grid x:Name="GridInverseMatrix" Grid.Column="0">
+
+                        </Grid>
+
+                        <TextBlock Text="=> A−1" Grid.Column="1" Style="{StaticResource OperationSign}" TextWrapping="Wrap"/>
+
+                        <Grid x:Name="GridInverseResult" Grid.Column="2">
+
+                        </Grid>
+                    </Grid>
+                </Border>
+            </Grid>
+
+            <!-- BottomBody -->
+            <Grid Grid.Row="2">
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition Width="2*"/>
+                    <ColumnDefinition/>
+                    <ColumnDefinition/>
+                </Grid.ColumnDefinitions>
+
+                <Button x:Name="BtnInverseeDiagramm" Grid.Column="1" Content="Диаграмма"/>
+                <Button x:Name="BtnInverseCalculate" Grid.Column="2" Content="Вычислить" Click="BtnInverseCalculate_Click"/>
+            </Grid>
+        </Grid> <!-- Inverse -->
         
     </Grid>
 </Window>

+ 142 - 23
MatrixXAMLOnly/MainWindow.xaml.cs

@@ -10,6 +10,9 @@ using Matrix;
 
 namespace MatrixXAMLOnly
 {
+    // TODO: Перепроверить все поля на валидацию
+    // TODO: Создание диаграмм
+
     /// <summary>
     /// Interaction logic for MainWindow.xaml
     /// </summary>
@@ -19,8 +22,8 @@ namespace MatrixXAMLOnly
         {
             InitializeComponent();
 
-            BtnAddition.Content = "Сложение матрицы";
-            BtnDifference.Content = "Вычитание матрицы";
+            BtnAddition.Content = "Сложение матриц";
+            BtnDifference.Content = "Вычитание матриц";
             BtnMultiplicationOnScalar.Content = "Умножение матрицы \nна скаляр";
             BtnTransposition.Content = "Транспонирование матрицы";
             BtnMultiplicationOnTransposed.Content = "Умножение матрицы на её \nтранспонированную матрицу";
@@ -28,6 +31,7 @@ namespace MatrixXAMLOnly
             BtnRowsTranspositionReplace.Content = "Перестановка строк согласно \nвектору транспозиции";
             BtnInverse.Content = "Обратная матрицы";
 
+            BtnAddition.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
         }
 
         private void BtnHamburgerMenu_Click(object sender, RoutedEventArgs e)
@@ -120,7 +124,7 @@ namespace MatrixXAMLOnly
                 e.Key != Key.NumPad6 && e.Key != Key.D6 &&
                 e.Key != Key.NumPad7 && e.Key != Key.D7 &&
                 e.Key != Key.NumPad8 && e.Key != Key.D8 &&
-                e.Key != Key.NumPad9 && e.Key != Key.D9)
+                e.Key != Key.NumPad9 && e.Key != Key.D9 && e.Key != Key.OemMinus && e.Key != Key.Subtract)
             {
                 e.Handled = true;
             }
@@ -170,18 +174,23 @@ namespace MatrixXAMLOnly
             
         }
 
-
         #region HumburgerMenuItems
         private void BtnAddition_Click(object sender, RoutedEventArgs e)
         {
+            this.Title = "Калькулятор: матрицы - Сложение матриц";
+
             GridContentAddition.Visibility = Visibility.Visible;
             GridContentDifference.Visibility = Visibility.Collapsed;
             GridContentMultiplication.Visibility = Visibility.Collapsed;
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
-            // GridContentInverse;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Collapsed;
+            GridContentInverse.Visibility = Visibility.Collapsed;
+
+            GridAdditionFrstTerm.Children.Clear();
+            GridAdditionScndTerm.Children.Clear();
+            GridAdditionResult.Children.Clear();
 
             GridAdditionFrstTerm.Children.Add(CreateMatrix(5, 5, false));
             GridAdditionScndTerm.Children.Add(CreateMatrix(5, 5, false));
@@ -190,14 +199,20 @@ namespace MatrixXAMLOnly
 
         private void BtnDifference_Click(object sender, RoutedEventArgs e)
         {
+            this.Title = "Калькулятор: матрицы - Вычитание матриц";
+
             GridContentAddition.Visibility = Visibility.Collapsed;
             GridContentDifference.Visibility = Visibility.Visible;
             GridContentMultiplication.Visibility = Visibility.Collapsed;
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
-            // GridContentInverse;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Collapsed;
+            GridContentInverse.Visibility = Visibility.Collapsed;
+
+            GridDifferenceFrstTerm.Children.Clear();
+            GridDifferenceScndTerm.Children.Clear();
+            GridDifferenceResult.Children.Clear();
 
             GridDifferenceFrstTerm.Children.Add(CreateMatrix(5, 5, false));
             GridDifferenceScndTerm.Children.Add(CreateMatrix(5, 5, false));
@@ -206,14 +221,20 @@ namespace MatrixXAMLOnly
 
         private void BtnMultiplicationOnScalar_Click(object sender, RoutedEventArgs e)
         {
+            this.Title = "Калькулятор: матрицы - Умножение матрицы на скаляр";
+
             GridContentAddition.Visibility = Visibility.Collapsed;
             GridContentDifference.Visibility = Visibility.Collapsed;
             GridContentMultiplication.Visibility = Visibility.Visible;
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
-            // GridContentInverse;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Collapsed;
+            GridContentInverse.Visibility = Visibility.Collapsed;
+
+            GridMultiplicationOnScalarFrstTerm.Children.Clear();
+            TextBoxMultiplicationOnScalarScndTerm.Text = "";
+            GridMultiplicationOnScalarResult.Children.Clear();
 
             GridMultiplicationOnScalarFrstTerm.Children.Add(CreateMatrix(5, 5, false));
             GridMultiplicationOnScalarResult.Children.Add(CreateMatrix(5, 5, true));
@@ -221,14 +242,19 @@ namespace MatrixXAMLOnly
 
         private void BtnTransposition_Click(object sender, RoutedEventArgs e)
         {
+            this.Title = "Калькулятор: матрицы - Транспонирование матрицы";
+
             GridContentAddition.Visibility = Visibility.Collapsed;
             GridContentDifference.Visibility = Visibility.Collapsed;
             GridContentMultiplication.Visibility = Visibility.Collapsed;
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Visible;
-            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
-            // GridContentInverse;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Collapsed;
+            GridContentInverse.Visibility = Visibility.Collapsed;
+
+            GridTransposeFrom.Children.Clear();
+            GridTransposed.Children.Clear();
 
             GridTransposeFrom.Children.Add(CreateMatrix(3, 5, false));
             GridTransposed.Children.Add(CreateMatrix(5, 3, true));
@@ -236,14 +262,19 @@ namespace MatrixXAMLOnly
 
         private void BtnMultiplicationOnTransposed_Click(object sender, RoutedEventArgs e)
         {
+            this.Title = "Калькулятор: матрицы - Умножение матрицы на её транспонированную матрицу";
+
             GridContentAddition.Visibility = Visibility.Collapsed;
             GridContentDifference.Visibility = Visibility.Collapsed;
             GridContentMultiplication.Visibility = Visibility.Collapsed;
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Visible;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
-            // GridContentInverse;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Collapsed;
+            GridContentInverse.Visibility = Visibility.Collapsed;
+
+            GridMultiplicationOnTransposedTerm.Children.Clear();
+            GridMultiplicationOnTransposedResult.Children.Clear();
 
             GridMultiplicationOnTransposedTerm.Children.Add(CreateMatrix(5, 5, false));
             GridMultiplicationOnTransposedResult.Children.Add(CreateMatrix(5, 5, true));
@@ -251,14 +282,19 @@ namespace MatrixXAMLOnly
 
         private void BtnRowsReplace_Click(object sender, RoutedEventArgs e)
         {
+            this.Title = "Калькулятор: матрицы - Перестановка строк";
+
             GridContentAddition.Visibility = Visibility.Collapsed;
             GridContentDifference.Visibility = Visibility.Collapsed;
             GridContentMultiplication.Visibility = Visibility.Collapsed;
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Visible;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
-            // GridContentInverse;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Collapsed;
+            GridContentInverse.Visibility = Visibility.Collapsed;
+
+            GridRowsReplaceMatrix.Children.Clear();
+            GridRowsReplaceResult.Children.Clear();
 
             GridRowsReplaceMatrix.Children.Add(CreateMatrix(5, 5, false));
             GridRowsReplaceResult.Children.Add(CreateMatrix(5, 5, true));
@@ -266,18 +302,28 @@ namespace MatrixXAMLOnly
 
         private void BtnInverse_Click(object sender, RoutedEventArgs e)
         {
+            this.Title = "Калькулятор: матрицы - Обратная матрица";
+
             GridContentAddition.Visibility = Visibility.Collapsed;
             GridContentDifference.Visibility = Visibility.Collapsed;
             GridContentMultiplication.Visibility = Visibility.Collapsed;
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
-            // GridContentInverse;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Collapsed;
+            GridContentInverse.Visibility = Visibility.Visible;
+
+            GridInverseMatrix.Children.Clear();
+            GridInverseResult.Children.Clear();
+
+            GridInverseMatrix.Children.Add(CreateMatrix(5, 5, false));
+            GridInverseResult.Children.Add(CreateMatrix(5, 5, true));
         }
 
         private void BtnRowsTranspositionReplace_Click(object sender, RoutedEventArgs e)
         {
+            this.Title = "Калькулятор: матрицы - Перестановка строк согласно вектору транспозиции";
+
             GridContentAddition.Visibility = Visibility.Collapsed;
             GridContentDifference.Visibility = Visibility.Collapsed;
             GridContentMultiplication.Visibility = Visibility.Collapsed;
@@ -285,7 +331,11 @@ namespace MatrixXAMLOnly
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
             GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
-            // GridContentInverse;
+            GridContentInverse.Visibility = Visibility.Collapsed;
+
+            GridRowTranspositionReplaceMatrix.Children.Clear();
+            GridRowTranspositionReplaceVector.Children.Clear();
+            GridRowTranspositionReplaceResult.Children.Clear();
 
             GridRowTranspositionReplaceMatrix.Children.Add(CreateMatrix(5, 5, false));
             GridRowTranspositionReplaceVector.Children.Add(CreateMatrix(5, 1, false));
@@ -424,8 +474,7 @@ namespace MatrixXAMLOnly
         #region MultiplicationOnScalar
         private void BtnMultiplicationOnScalarCreateMatrix_Click(object sender, RoutedEventArgs e)
         {
-            int rowCount = 0;
-            int columnCount = 0;
+            int rowCount, columnCount;
             try
             {
                 rowCount = Convert.ToInt32(TextBoxMultiplicationOnScalarRowCount.Text);
@@ -474,6 +523,7 @@ namespace MatrixXAMLOnly
                     catch
                     {
                         MessageBox.Show("Матрица указана некорректно!");
+                        return;
                     }
                 }
             }
@@ -504,6 +554,7 @@ namespace MatrixXAMLOnly
             catch
             {
                 MessageBox.Show("Количество строк/столбцов указано некорректно!");
+                return;
             }
 
             GridTransposeFrom.Children.Clear();
@@ -531,6 +582,7 @@ namespace MatrixXAMLOnly
                     catch
                     {
                         MessageBox.Show("Матрица указана некорректно!");
+                        return;
                     }
                 }
             }
@@ -561,6 +613,7 @@ namespace MatrixXAMLOnly
             catch
             {
                 MessageBox.Show("Количество строк/столбцов указано некорректно!");
+                return;
             }
 
             GridMultiplicationOnTransposedTerm.Children.Clear();
@@ -620,6 +673,7 @@ namespace MatrixXAMLOnly
             catch
             {
                 MessageBox.Show("Количество строк/столбцов указано некорректно!");
+                return;
             }
 
             GridRowsReplaceMatrix.Children.Clear();
@@ -668,8 +722,7 @@ namespace MatrixXAMLOnly
         #region RowTranspositionReplace
         private void BtnRowTranspositionReplaceCreateMatrix_Click(object sender, RoutedEventArgs e)
         {
-            int rowCount = 0;
-            int columnCount = 0;
+            int rowCount, columnCount;
             try
             {
                 rowCount = Convert.ToInt32(TextBoxRowTranspositionReplaceRowCount.Text);
@@ -678,6 +731,7 @@ namespace MatrixXAMLOnly
             catch
             {
                 MessageBox.Show("Количество строк/столбцов указано некорректно!");
+                return;
             }
 
             GridRowTranspositionReplaceMatrix.Children.Clear();
@@ -754,6 +808,71 @@ namespace MatrixXAMLOnly
         #endregion
 
         #region Inverse
+        private void BtnInverseCreateMatrix_Click(object sender, RoutedEventArgs e)
+        {
+            int rowCount, columnCount;
+            try
+            {
+                rowCount = Convert.ToInt32(TextBoxInverseRowCount.Text);
+                columnCount = Convert.ToInt32(TextBoxInverseColumnCount.Text);
+            }
+            catch
+            {
+                MessageBox.Show("Количество строк/столбцов указано некорректно!");
+                return;
+            }
+
+            GridInverseMatrix.Children.Clear();
+            GridInverseResult.Children.Clear();
+
+            GridInverseMatrix.Children.Add(CreateMatrix(rowCount, columnCount, false));
+            GridInverseResult.Children.Add(CreateMatrix(rowCount, columnCount, true));
+        }
+
+        private void BtnInverseCalculate_Click(object sender, RoutedEventArgs e)
+        {
+            int rowCount = ((Grid)GridInverseMatrix.Children[0]).RowDefinitions.Count;
+            int columnCount = ((Grid)GridInverseMatrix.Children[0]).ColumnDefinitions.Count;
+
+            double[,] frstTerm = new double[rowCount, columnCount];
+
+            for (int i = 0; i < rowCount; i++)
+            {
+                for (int j = 0; j < columnCount; j++)
+                {
+                    try
+                    {
+                        frstTerm[i, j] = Convert.ToDouble(((Grid)GridInverseMatrix.Children[0]).Children.Cast<TextBox>().First(e => Grid.GetColumn(e) == j && Grid.GetRow(e) == i).Text);
+                    }
+                    catch
+                    {
+                        MessageBox.Show("Матрица указана некорректно!");
+                        return;
+                    }
+                }
+            }
+
+            MyMatrix matrixFrstTerm = new MyMatrix(frstTerm);
+
+            MyMatrix result;
+            try
+            {
+                result = MyMatrix.Inverse(matrixFrstTerm);
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(ex.Message);
+                return;
+            }
+
+            for (int i = 0; i < rowCount; i++)
+            {
+                for (int j = 0; j < columnCount; j++)
+                {
+                    ((TextBox)((Grid)GridInverseResult.Children[0]).Children[(i * columnCount) + j]).Text = result.data[i, j].ToString();
+                }
+            }
+        }
         #endregion
     }
 }