Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Решение СЛАУ методами Гаусса, Крамера, Гаусса-Жордана, матричным
- //Автор - Горшков Иван, группа ИТ-22Б
- using System;
- using System.IO;
- using System.Linq;
- using System.Net.NetworkInformation;
- using System.Text;
- namespace Matrix {
- class Program {
- static int menu() {
- Console.WriteLine(" ————————————————————————— ");
- Console.WriteLine("| Выберите метод решения |");
- Console.WriteLine("|-------------------------|");
- Console.WriteLine("| 1 | Крамера |");
- Console.WriteLine("| 2 | Гаусса |");
- Console.WriteLine("| 3 | Матричный |");
- Console.WriteLine("| 4 | Гаусса-Жордана |");
- Console.WriteLine(" ————————————————————————— ");
- Console.Write(">> ");
- int choise = 0;
- choise = Convert.ToInt32(Console.ReadLine());
- Console.WriteLine();
- return choise;
- }
- static void Cramer(double [,] free, double [,] matrix, int n, int m) {
- string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt"; //указываем путь к файлу
- double res = 0; //переменная для детерминантов
- double det = Determinant(matrix, n, m); //общий детерминант
- double[,] UsMatrix = new double[n, m]; //создаём копию изначальной матрицы
- UsMatrix = (double[,]) matrix.Clone();
- string[] lines = new string[n]; //массив для хранения ответов
- for (int c = 0; c<n; c++) {
- for (int i = 0; i<n; i++) { //заменяем столбик с номером "C" на вектор свободных членов
- matrix[i, c] = free[i, 0];
- }
- res = Determinant(matrix, n, m)/det; //вычисляем корень
- Console.WriteLine($"x{c + 1} = {res}");
- lines[c] = Convert.ToString(res);
- matrix = (double[,]) UsMatrix.Clone(); //возвращаем матрице изначальный вид
- }
- File.WriteAllLines($"{path}", lines);
- Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
- }
- static void PrintMatrix(double[,] arr, int n, int m) { //печать матрицы
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- Console.Write(String.Format("{0,5}", arr[i, j]));
- }
- Console.WriteLine();
- }
- Console.WriteLine();
- }
- //вычисление детерминанта приведением к треугольному виду
- static double Determinant(double[,] matrix, int n, int m) {
- double res = 1;
- double[,] UsMatrix = new double[n, m];
- UsMatrix = (double[,]) matrix.Clone(); //копирование матрицы
- for (int i = 0; i < n - 1; i++) { //приведение к верхнему треугольному виду
- for (int j = i + 1; j < n; j++) {
- double koef = UsMatrix[j, i] / UsMatrix[i, i];
- for (int k = i; k < n; k++) {
- UsMatrix[j, k] -= UsMatrix[i, k] * koef;
- }
- }
- }
- for (int i = 0, j = 0; i<3 && j<3; i++, j++) {
- res *= UsMatrix[i, j];
- }
- return res;
- }
- static void Gauss (double[,] free, double[,] matrix, int n, int m) {
- string path = @"E:\C#\Университет\Первый круг\1Ж\answer.txt"; //указываем путь к файлу
- double[,] UsMatrix = new double[n, m]; //копия матрицы
- double[,] FreeCopy = new double[n, 1]; //копия вектора
- string[] lines = new string[n]; //хранение ответов
- UsMatrix = (double[,])matrix.Clone(); //копирование матрицы
- FreeCopy = (double[,])free.Clone(); //копирование вектора свободных членов
- for (int i = 0; i < n - 1; i++) { //приведение к верхнему треугольному виду
- for (int j = i + 1; j < n; j++) {
- double koef = UsMatrix[j, i] / UsMatrix[i, i];
- for (int k = i; k < n; k++) {
- UsMatrix[j, k] -= UsMatrix[i, k] * koef;
- }
- FreeCopy[j, 0] -= FreeCopy[i, 0] * koef; //изменение вектора свободных членов
- }
- }
- int count = 1;
- double[] x = new double[n]; //x - массив хранения неизвестных
- x[0] = FreeCopy[n-1, 0] / UsMatrix[n-1, m-1]; //вычисление последнего неизвестного
- for (int i = 1, k = n-2; i<n && k>=0; i++, k--) { //обртаный ход
- for (int j = n-1; j!=k; j--, count++) {
- //формула вычисления неизвестных суть в выражении неизвестного и последющем делении на диагональный элемент
- x[i] = (FreeCopy[k, 0] + UsMatrix[k, j] * (-1) * x[i - count]) / UsMatrix[k,k];
- //FreeCopy - преображённый вектор свободных членов, UsMatrix - преображённая матрица
- }
- count = 1;
- }
- Array.Reverse(x, 0,n); //разворот массива (массив, начальный элемент, длина разворота)
- for (int i = 0; i<n; i++) { //вывод результата на экран и перезапись в string массив
- Console.WriteLine($"x{i+1} = {x[i]}");
- lines[i] = Convert.ToString(x[i]);
- }
- File.WriteAllLines($"{path}", lines); //запись в файл
- Console.WriteLine("\nРезультат работы программы записан в файл answer.txt");
- }
- static void Main(string[] args) {
- string path = @"E:\C#\Университет\Первый круг\1Ж\matrix.txt"; //указываем путь к файлу
- string[] lines = File.ReadAllLines($"{path}"); //считываем строки в элементы string массива
- int n, m;
- n = Int32.Parse(lines[0]); // считываем кол-во строк и столбцов
- m = Int32.Parse(lines[1]);
- double[,] matrix = new double[n, m]; //создаём матрицу
- int r = 3; //память номера элемента массива
- double[,] free = new double[n, 1];
- for (int j = 0; r<n+3; r++, j++) { //запись свободных челенов
- free[j, 0] = Int32.Parse(lines[r]);
- }
- for (int i = 0; i<n; i++) { //построчно записываем из lines в matrix
- for (int j = 0; j<m; j++) {
- r++;
- matrix[i, j] = Int32.Parse(lines[r]);
- }
- }
- Console.WriteLine("Исходная матрциа: ");
- PrintMatrix(matrix, n, m);
- Console.WriteLine("Вектор свободных членов: ");
- PrintMatrix(free, n, 1);
- int choise = menu(); //вывод меню на экран
- switch (choise) {
- case 1:
- Cramer(free, matrix, n, m);
- break;
- case 2:
- Gauss(free, matrix, n, m);
- break;
- default:
- Console.WriteLine("Ошибка ввода");
- break;
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment