浏览代码

добавил перестановку строк + по вектору транспозиции

Никита Кашлач 3 年之前
父节点
当前提交
5c5c1f842e
共有 4 个文件被更改,包括 249 次插入40 次删除
  1. 91 9
      MatrixXAMLOnly/MainWindow.xaml
  2. 106 30
      MatrixXAMLOnly/MainWindow.xaml.cs
  3. 51 0
      MatrixXAMLOnly/Matrix.cs
  4. 1 1
      MatrixXAMLOnly/MatrixXAMLOnly.csproj

+ 91 - 9
MatrixXAMLOnly/MainWindow.xaml

@@ -129,7 +129,7 @@
                 <Button x:Name="BtnTransposition" Style="{StaticResource HamburgerMenuItemBtn}" Click="BtnTransposition_Click"/>
                 <Button x:Name="BtnMultiplicationOnTransposed" Style="{StaticResource HamburgerMenuItemBtn}" Click="BtnMultiplicationOnTransposed_Click"/>
                 <Button x:Name="BtnRowsReplace" Style="{StaticResource HamburgerMenuItemBtn}" Click="BtnRowsReplace_Click"/>
-                <Button x:Name="BtnRowsReplaceOnTranspositionVector" Style="{StaticResource HamburgerMenuItemBtn}" Click="BtnRowsReplaceOnTranspositionVector_Click"/>
+                <Button x:Name="BtnRowsTranspositionReplace" Style="{StaticResource HamburgerMenuItemBtn}" Click="BtnRowsTranspositionReplace_Click"/>
                 <Button x:Name="BtnInverse" Style="{StaticResource HamburgerMenuItemBtn}" Click="BtnInverse_Click"/>
             </StackPanel>
         </Grid>
@@ -543,12 +543,12 @@
 
                     <StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
                         <TextBlock Text="Количество строк: "/>
-                        <TextBox x:Name="TextBoxRowReplaceRowCount" Style="{StaticResource NonMatrix}" MaxLength="1"/>
+                        <TextBox x:Name="TextBoxRowReplaceRowCount" 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="TextBoxRowReplaceColumnCount" Style="{StaticResource NonMatrix}" MaxLength="1"/>
+                        <TextBox x:Name="TextBoxRowReplaceColumnCount" Style="{StaticResource NonMatrix}" MaxLength="1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                     </StackPanel>
 
                     <Button x:Name="BtnRowReplaceCreateMatrix" Grid.Column="2" Content="Построить матрицу" Click="BtnRowReplaceCreateMatrix_Click"/>
@@ -573,15 +573,17 @@
                             <Grid.RowDefinitions>
                                 <RowDefinition/>
                                 <RowDefinition/>
-                                <RowDefinition/>
                             </Grid.RowDefinitions>
 
-                            <TextBox x:Name="TextBoxRowReplaceFrstTerm" Grid.Row="0" Width="50" Height="50" HorizontalAlignment="Center" VerticalAlignment="Bottom" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="20" FontWeight="SemiBold" MaxLength="2"/>
-
-                            <TextBlock Text="=>" Grid.Row="1" Style="{StaticResource OperationSign}"/>
-
-                            <TextBox x:Name="TextBoxRowReplaceScndTerm" Grid.Row="2" Width="50" Height="50" HorizontalAlignment="Center" VerticalAlignment="Top" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="20" FontWeight="SemiBold" MaxLength="2"/>
+                            <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Center">
+                                <TextBox x:Name="TextBoxRowReplaceFrstTerm" Grid.Row="0" Grid.Column="0" Width="50" Height="50" FontSize="20" FontWeight="SemiBold" MaxLength="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
+                                <TextBlock Text=" =>" Grid.Row="0" Grid.Column="1" Style="{StaticResource OperationSign}"/>
+                            </StackPanel>
 
+                            <StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Center" Grid.Row="1">
+                                <TextBlock Text=" &lt;=" Grid.Row="0" Grid.Column="1" Style="{StaticResource OperationSign}"/>
+                                <TextBox x:Name="TextBoxRowReplaceScndTerm" Grid.Row="0" Grid.Column="0" Width="50" Height="50" FontSize="20" FontWeight="SemiBold" MaxLength="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
+                            </StackPanel>
                         </Grid>
 
                         <Grid x:Name="GridRowsReplaceResult" Grid.Column="2">
@@ -604,5 +606,85 @@
             </Grid>
         </Grid> <!-- RowsReplace -->
         
+        <!-- RowTranspositionReplace -->
+        <Grid x:Name="GridContentRowTranspositionReplace" 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="TextBoxRowTranspositionReplaceRowCount" 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="TextBoxRowTranspositionReplaceColumnCount" Style="{StaticResource NonMatrix}" MaxLength="1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
+                    </StackPanel>
+
+                    <Button x:Name="BtnRowTranspositionReplaceCreateMatrix" Grid.Column="2" Content="Построить матрицу" Click="BtnRowTranspositionReplaceCreateMatrix_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.2*"/>
+                            <ColumnDefinition Width="0.3*"/>
+                            <ColumnDefinition Width="0.2*"/>
+                            <ColumnDefinition/>
+                        </Grid.ColumnDefinitions>
+
+                        <Grid x:Name="GridRowTranspositionReplaceMatrix" Grid.Column="0">
+                            
+                        </Grid>
+
+                        <TextBlock Text="=>" Grid.Column="1" Style="{StaticResource OperationSign}"/>
+
+                        <Grid x:Name="GridRowTranspositionReplaceVector" Grid.Column="2">
+                            
+                        </Grid>
+
+                        <TextBlock Text="=>" Grid.Column="3" Style="{StaticResource OperationSign}"/>
+
+                        <Grid x:Name="GridRowTranspositionReplaceResult" Grid.Column="5">
+
+                        </Grid>
+                    </Grid>
+                </Border>
+            </Grid>
+
+            <!-- BottomBody -->
+            <Grid Grid.Row="2">
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition Width="2*"/>
+                    <ColumnDefinition/>
+                    <ColumnDefinition/>
+                </Grid.ColumnDefinitions>
+
+                <Button x:Name="BtnRowTranspositionReplaceDiagramm" Grid.Column="1" Content="Диаграмма"/>
+                <Button x:Name="BtnRowTranspositionReplaceCalculate" Grid.Column="2" Content="Вычислить" Click="BtnRowTranspositionReplaceCalculate_Click"/>
+            </Grid>
+        </Grid> <!-- RowTranspositionReplace -->
+        
     </Grid>
 </Window>

+ 106 - 30
MatrixXAMLOnly/MainWindow.xaml.cs

@@ -15,12 +15,9 @@ namespace MatrixXAMLOnly
     /// </summary>
     public partial class MainWindow : Window
     {
-        Operation operation;
-
         public MainWindow()
         {
             InitializeComponent();
-            operation = Operation.NoChosen;
 
             BtnAddition.Content = "Сложение матрицы";
             BtnDifference.Content = "Вычитание матрицы";
@@ -28,7 +25,7 @@ namespace MatrixXAMLOnly
             BtnTransposition.Content = "Транспонирование матрицы";
             BtnMultiplicationOnTransposed.Content = "Умножение матрицы на её \nтранспонированную матрицу";
             BtnRowsReplace.Content = "Перестановка строк";
-            BtnRowsReplaceOnTranspositionVector.Content = "Перестановка строк согласно \nвектору транспозиции";
+            BtnRowsTranspositionReplace.Content = "Перестановка строк согласно \nвектору транспозиции";
             BtnInverse.Content = "Обратная матрицы";
         }
 
@@ -182,7 +179,7 @@ namespace MatrixXAMLOnly
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            // GridContentRowReplaceOnTranspositionVector;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
             // GridContentInverse;
 
             GridAdditionFrstTerm.Children.Add(CreateMatrix(5, 5, false));
@@ -198,7 +195,7 @@ namespace MatrixXAMLOnly
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            // GridContentRowReplaceOnTranspositionVector;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
             // GridContentInverse;
 
             GridDifferenceFrstTerm.Children.Add(CreateMatrix(5, 5, false));
@@ -214,7 +211,7 @@ namespace MatrixXAMLOnly
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            // GridContentRowReplaceOnTranspositionVector;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
             // GridContentInverse;
 
             GridMultiplicationOnScalarFrstTerm.Children.Add(CreateMatrix(5, 5, false));
@@ -229,7 +226,7 @@ namespace MatrixXAMLOnly
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Visible;
-            // GridContentRowReplaceOnTranspositionVector;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
             // GridContentInverse;
 
             GridTransposeFrom.Children.Add(CreateMatrix(3, 5, false));
@@ -244,7 +241,7 @@ namespace MatrixXAMLOnly
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Visible;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            // GridContentRowReplaceOnTranspositionVector;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
             // GridContentInverse;
 
             GridMultiplicationOnTransposedTerm.Children.Add(CreateMatrix(5, 5, false));
@@ -259,11 +256,11 @@ namespace MatrixXAMLOnly
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Visible;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            // GridContentRowReplaceOnTranspositionVector;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
             // GridContentInverse;
 
-            GridRowsReplaceMatrix.Children.Add(CreateMatrix(3, 5, false));
-            GridRowsReplaceResult.Children.Add(CreateMatrix(5, 3, true));
+            GridRowsReplaceMatrix.Children.Add(CreateMatrix(5, 5, false));
+            GridRowsReplaceResult.Children.Add(CreateMatrix(5, 5, true));
         }
 
         private void BtnInverse_Click(object sender, RoutedEventArgs e)
@@ -274,11 +271,11 @@ namespace MatrixXAMLOnly
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            // GridContentRowReplaceOnTranspositionVector;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
             // GridContentInverse;
         }
 
-        private void BtnRowsReplaceOnTranspositionVector_Click(object sender, RoutedEventArgs e)
+        private void BtnRowsTranspositionReplace_Click(object sender, RoutedEventArgs e)
         {
             GridContentAddition.Visibility = Visibility.Collapsed;
             GridContentDifference.Visibility = Visibility.Collapsed;
@@ -286,8 +283,12 @@ namespace MatrixXAMLOnly
             GridContentMultiplicationOnTransposed.Visibility = Visibility.Collapsed;
             GridContentRowsReplace.Visibility = Visibility.Collapsed;
             GridContentTranspose.Visibility = Visibility.Collapsed;
-            // GridContentRowReplaceOnTranspositionVector;
+            GridContentRowTranspositionReplace.Visibility = Visibility.Visible;
             // GridContentInverse;
+
+            GridRowTranspositionReplaceMatrix.Children.Add(CreateMatrix(5, 5, false));
+            GridRowTranspositionReplaceVector.Children.Add(CreateMatrix(5, 1, false));
+            GridRowTranspositionReplaceResult.Children.Add(CreateMatrix(5, 5, true));
         }
         #endregion
 
@@ -652,31 +653,106 @@ namespace MatrixXAMLOnly
 
             MyMatrix matrixFrstTerm = new MyMatrix(frstTerm);
 
-            MyMatrix result = MyMatrix.RowReplace(matrixFrstTerm, Convert.ToInt32(TextBoxRowReplaceFrstTerm.Text), Convert.ToInt32(TextBoxRowReplaceScndTerm.Text));
+            MyMatrix result = MyMatrix.RowReplace(matrixFrstTerm, Convert.ToInt32(TextBoxRowReplaceFrstTerm.Text) - 1, Convert.ToInt32(TextBoxRowReplaceScndTerm.Text) - 1);
             for (int i = 0; i < rowCount; i++)
             {
                 for (int j = 0; j < columnCount; j++)
                 {
-                    ((TextBox)((Grid)GridDifferenceResult.Children[0]).Children[(i * columnCount) + j]).Text = result.data[i, j].ToString();
+                    ((TextBox)((Grid)GridRowsReplaceResult.Children[0]).Children[(i * columnCount) + j]).Text = result.data[i, j].ToString();
                 }
             }
         }
         #endregion
 
-        #region Inverse
+        #region RowTranspositionReplace
+        private void BtnRowTranspositionReplaceCreateMatrix_Click(object sender, RoutedEventArgs e)
+        {
+            int rowCount = 0;
+            int columnCount = 0;
+            try
+            {
+                rowCount = Convert.ToInt32(TextBoxRowTranspositionReplaceRowCount.Text);
+                columnCount = Convert.ToInt32(TextBoxRowTranspositionReplaceColumnCount.Text);
+            }
+            catch
+            {
+                MessageBox.Show("Количество строк/столбцов указано некорректно!");
+            }
+
+            GridRowTranspositionReplaceMatrix.Children.Clear();
+            GridRowTranspositionReplaceVector.Children.Clear();
+            GridRowTranspositionReplaceResult.Children.Clear();
+
+            GridRowTranspositionReplaceMatrix.Children.Add(CreateMatrix(rowCount, columnCount, false));
+            GridRowTranspositionReplaceVector.Children.Add(CreateMatrix(rowCount, 1, false));
+            GridRowTranspositionReplaceResult.Children.Add(CreateMatrix(rowCount, columnCount, true));
+        }
+
+        private void BtnRowTranspositionReplaceCalculate_Click(object sender, RoutedEventArgs e)
+        {
+            int rowCount = ((Grid)GridRowTranspositionReplaceMatrix.Children[0]).RowDefinitions.Count;
+            int columnCount = ((Grid)GridRowTranspositionReplaceMatrix.Children[0]).ColumnDefinitions.Count;
+
+            double[,] frstTerm = new double[rowCount, columnCount];
+            int[] vector = new int[rowCount];
+
+            for (int i = 0; i < rowCount; i++)
+            {
+                for (int j = 0; j < columnCount; j++)
+                {
+                    try
+                    {
+                        frstTerm[i, j] = Convert.ToDouble(((Grid)GridRowTranspositionReplaceMatrix.Children[0]).Children.Cast<TextBox>().First(e => Grid.GetColumn(e) == j && Grid.GetRow(e) == i).Text);
+                    }
+                    catch
+                    {
+                        MessageBox.Show("Матрица указана некорректно!");
+                        return;
+                    }
+                }
+            }
+
+            for (int i = 0; i < rowCount; i++)
+            {
+                try
+                {
+                    vector[i] = Convert.ToInt32(((Grid)GridRowTranspositionReplaceVector.Children[0]).Children.Cast<TextBox>().First(e => Grid.GetColumn(e) == 0 && Grid.GetRow(e) == i).Text) - 1;
+                }
+                catch
+                {
+                    MessageBox.Show("Матрица указана некорректно!");
+                    return;
+                }
+            }
+
+            MyMatrix matrixFrstTerm = new MyMatrix(frstTerm);
+
+            MyMatrix result = MyMatrix.RowReplaceByVector(matrixFrstTerm, vector);
+            if (result != null)
+            {
+                for (int i = 0; i < rowCount; i++)
+                {
+                    for (int j = 0; j < columnCount; j++)
+                    {
+                        ((TextBox)((Grid)GridRowTranspositionReplaceResult.Children[0]).Children[(i * columnCount) + j]).Text = result.data[i, j].ToString();
+                    }
+                }
+            }
+            else
+            {
+                for (int i = 0; i < rowCount; i++)
+                {
+                    for (int j = 0; j < columnCount; j++)
+                    {
+                        ((TextBox)((Grid)GridRowTranspositionReplaceResult.Children[0]).Children[(i * columnCount) + j]).Text = matrixFrstTerm.data[i, j].ToString();
+                    }
+                }
+            }
+            
+        }
         #endregion
-    }
 
-    enum Operation
-    {
-        Addition,
-        Difference,
-        MultiplicationOnScalar,
-        Transposition,
-        MultiplicationOnTransposed,
-        RowReplace,
-        RowReplaceOnTranspositionVector,
-        Inverse,
-        NoChosen
+        #region Inverse
+        #endregion
     }
 }

+ 51 - 0
MatrixXAMLOnly/Matrix.cs

@@ -168,6 +168,57 @@ namespace Matrix
             return new MyMatrix(array);
         }
 
+        public static MyMatrix RowReplaceByVector(MyMatrix matrix, int[] vector)
+        {
+            int[] nowVector = new int[vector.Length];   // 0 1 2 3 4 - 4 1 2 3 0 - 4 1 0 3 2 - 4 1 0 2 3
+            for (int i = 0; i < nowVector.Length; i++)  // 4 1 0 2 3 - 4 1 0 2 3 - 4 1 0 2 3 - 4 1 0 2 3
+            {
+                nowVector[i] = i;
+            }
+
+            MyMatrix result = null; 
+            for (int i = 0; i < vector.Length; i++)
+            {
+                if (nowVector[i] != vector[i])
+                {
+                    int index = 0;
+                    for (int j = 0; j < vector.Length; j++)
+                    {
+                        if (nowVector[j] == vector[i])
+                        {
+                            index = j;
+                        }
+                    }
+
+                    result = MyMatrix.RowReplace(matrix, i, index);
+
+                    int boof = nowVector[i];
+                    nowVector[i] = nowVector[index];
+                    nowVector[index] = boof;
+                }
+            }
+
+            return result;
+        }
+
+        public static MyMatrix Inverse(MyMatrix matrix)
+        {
+            if (matrix.IsMayInverse())
+            {
+                throw new Exception("Матрица не имеет обратной формы");
+            }
+        }
+
+        public bool IsMayInverse()
+        {
+            if (Rows != Columns)
+            {
+                return false;
+            }
+
+            return true;
+        }
+
         public override string ToString()
         {
             StringBuilder sb = new StringBuilder("", Rows * Columns * 2);

+ 1 - 1
MatrixXAMLOnly/MatrixXAMLOnly.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>WinExe</OutputType>
-    <TargetFramework>net5.0-windows</TargetFramework>
+    <TargetFramework>net6.0-windows</TargetFramework>
     <UseWPF>true</UseWPF>
   </PropertyGroup>