Advertisement
Matixs

Untitled

May 13th, 2023
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 13.08 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3.  
  4.  
  5. namespace Fedortsov.Lab7Exc1
  6. {
  7.     internal class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             int[,] incidenceMatrix = null;
  12.  
  13.             Menu(out incidenceMatrix);
  14.         }
  15.  
  16.         static void Menu(out int[,] incidenceMatrix)
  17.         {
  18.             incidenceMatrix = null;
  19.             DoublyLinkedList<int>[] adjacencyList = null;
  20.  
  21.             int choice;
  22.  
  23.             bool exit = false;
  24.  
  25.             while (!exit)
  26.             {
  27.                 Console.Clear();
  28.                 Console.WriteLine("Задание: преобразовать матрицу инцидентности в список смежности.");
  29.                 Console.WriteLine("1. Ввести матрицу инцидентности");
  30.                 Console.WriteLine("2. Преобразовать в список смежности");
  31.                 Console.WriteLine("3. Экспортировать список смежности в файл");
  32.                 Console.WriteLine("4. Импортировать матрицу инцидентности из файла");
  33.                 Console.WriteLine("5. Выход");
  34.                 Console.WriteLine("\n\nВажно для импорта:\n" +
  35.                     "1. Первая строка файла должна содержать количество вершин (целое число)." +
  36.                     "\n2. Вторая строка файла должна содержать количество ребер (целое число).\n" +
  37.                     "3. Далее следуют строки, каждая из которых соответствует одной вершине и содержит набор чисел,\n" +
  38.                     "являющихся элементами матрицы инцидентности для этой вершины. " +
  39.                     "\nКаждый элемент матрицы должен быть отделен от других пробелом.\n" +
  40.                     "Пример:\n" +
  41.                     "4\n" +
  42.                     "3\n" +
  43.                     "1 1 0\n" +
  44.                     "1 1 1\n" +
  45.                     "0 0 1\n" +
  46.                     "1 0 0\n");
  47.  
  48.                 do
  49.                 {
  50.                     Console.Write("\nВыбор: ");
  51.                 } while (!int.TryParse(Console.ReadLine(), out choice));
  52.  
  53.                 switch (choice)
  54.                 {
  55.                     case 1:
  56.                         incidenceMatrix = FillMatrixFromConsole();
  57.                         break;
  58.  
  59.                     case 2:
  60.                         if (incidenceMatrix == null)
  61.                         {
  62.                             Console.WriteLine("Матрица инцидентности не задана");
  63.                             break;
  64.                         }
  65.  
  66.                         adjacencyList = ConvertMatrixToList(incidenceMatrix);                        
  67.  
  68.                         Console.WriteLine("Список смежности:");
  69.                         for (int i = 0; i < adjacencyList.Length; i++)
  70.                         {
  71.                             Console.Write($"{i + 1} - > ");
  72.  
  73.                             foreach (int vertex in adjacencyList[i])
  74.                             {
  75.                                 Console.Write($"{vertex + 1} ");
  76.                             }
  77.  
  78.                             Console.WriteLine();
  79.                         }
  80.  
  81.                         Console.ReadKey();
  82.  
  83.                         break;
  84.  
  85.                     case 3:
  86.                         if (adjacencyList == null)
  87.                         {
  88.                             Console.WriteLine("Список смежности не задан");
  89.                             break;
  90.                         }
  91.  
  92.                         ExportAdjacencyList(adjacencyList);
  93.  
  94.                         Console.ReadKey();
  95.  
  96.                         break;
  97.  
  98.                     case 4:
  99.  
  100.                         if (ImportIncidenceMatrix(out int[,] matrix))
  101.                         {
  102.                             Console.WriteLine("Импорт завершен!");
  103.                             incidenceMatrix = matrix;
  104.                         }
  105.                         else
  106.                         {
  107.                             Console.WriteLine("Импорт матрицы инцидентности не удался");
  108.                         }
  109.  
  110.                         Console.ReadKey();
  111.  
  112.                         break;
  113.  
  114.                     case 5:
  115.                         exit = true;
  116.                         break;
  117.  
  118.                     default:
  119.                         Console.WriteLine("Неверный выбор");
  120.                         break;
  121.                 }
  122.  
  123.                 Console.WriteLine();
  124.             }
  125.         }
  126.  
  127.         static int[,] FillMatrixFromConsole()
  128.         {
  129.             int[,] incidenceMatrix = null;
  130.             bool incidenceMatrixExists, isCorrectAmountEdges, isCorrectVertex;
  131.             int maxAmountEdges, n, m;
  132.  
  133.             do
  134.             {
  135.                 do
  136.                 {
  137.                     Console.Write("Введите количество вершин: ");
  138.                 } while (!int.TryParse(Console.ReadLine(), out n));
  139.  
  140.                 maxAmountEdges = n * (n - 1) / 2;
  141.  
  142.                 do
  143.                 {
  144.                     do
  145.                     {
  146.                         Console.Write("Введите количество ребер: ");
  147.                     } while (!int.TryParse(Console.ReadLine(), out m));
  148.  
  149.                     if (maxAmountEdges < m)
  150.                     {
  151.                         isCorrectAmountEdges = true;
  152.                         Console.WriteLine("\nМаксимальное кол-во ребер: " + maxAmountEdges + ". Повторите ввод.\n");
  153.                     }
  154.                     else
  155.                         isCorrectAmountEdges = false;
  156.  
  157.                 } while (isCorrectAmountEdges);
  158.  
  159.  
  160.                 incidenceMatrix = new int[n, m];
  161.  
  162.                 for (int i = 0; i < n; i++)
  163.                 {
  164.                     for (int j = 0; j < m; j++)
  165.                     {
  166.                         do
  167.                         {
  168.                             do
  169.                             {
  170.                                 Console.Write($"Введите элемент [{i},{j}]: ");
  171.                             } while (!int.TryParse(Console.ReadLine(), out incidenceMatrix[i, j]));
  172.  
  173.                             if (incidenceMatrix[i, j] != 1 && incidenceMatrix[i, j] != 0)
  174.                             {
  175.                                 isCorrectVertex = false;
  176.                                 Console.WriteLine("\nВведите элемент правильно: 1 или 0.\n");
  177.                             }
  178.                             else
  179.                                 isCorrectVertex = true;
  180.  
  181.                         } while (!isCorrectVertex);
  182.                     }
  183.                 }
  184.  
  185.                 incidenceMatrixExists = true;
  186.  
  187.                 for (int i = 0; i < n; i++)
  188.                 {
  189.                     int degree = 0;
  190.                     for (int j = 0; j < m; j++)
  191.                     {
  192.                         degree += incidenceMatrix[i, j];
  193.                     }
  194.                     if (degree % 2 != 0) // нечетная степень у вершины
  195.                     {
  196.                         incidenceMatrixExists = false;
  197.                         break;
  198.                     }
  199.                 }
  200.  
  201.                 if (!incidenceMatrixExists)
  202.                     Console.WriteLine("Матрица инцидентности не существует. Повторите ввод.");
  203.  
  204.             } while (!incidenceMatrixExists);
  205.  
  206.             Console.WriteLine("Матрица инцидентности:");
  207.             for (int i = 0; i < n; i++)
  208.             {
  209.                 for (int j = 0; j < m; j++)
  210.                 {
  211.                     Console.Write($"{incidenceMatrix[i, j]} ");
  212.                 }
  213.                 Console.WriteLine();
  214.             }
  215.  
  216.             Console.ReadKey();
  217.  
  218.             return incidenceMatrix;
  219.         }
  220.         static DoublyLinkedList<int>[] ConvertMatrixToList(int[,] incidenceMatrix)
  221.         {
  222.             DoublyLinkedList<int>[] adjacencyList = null;
  223.  
  224.             adjacencyList = new DoublyLinkedList<int>[incidenceMatrix.GetLength(0)];
  225.  
  226.             for (int i = 0; i < incidenceMatrix.GetLength(0); i++)
  227.             {
  228.                 adjacencyList[i] = new DoublyLinkedList<int>();
  229.  
  230.                 for (int j = 0; j < incidenceMatrix.GetLength(1); j++)
  231.                 {
  232.                     if (incidenceMatrix[i, j] == 1)
  233.                     {
  234.                         for (int k = 0; k < incidenceMatrix.GetLength(0); k++)
  235.                         {
  236.                             if (k != i && incidenceMatrix[k, j] == 1)
  237.                             {
  238.                                 adjacencyList[i].AddLast(k);
  239.                             }
  240.                         }
  241.                     }
  242.                 }
  243.             }
  244.  
  245.             return adjacencyList;
  246.         }
  247.         static void ExportAdjacencyList(DoublyLinkedList<int>[] adjacencyList)
  248.         {
  249.             try
  250.             {
  251.                 Console.Write("Введите имя файла для экспорта: ");
  252.                 string filename = Console.ReadLine();
  253.  
  254.                 using (StreamWriter writer = new StreamWriter(filename))
  255.                 {
  256.                     for (int i = 0; i < adjacencyList.Length; i++)
  257.                     {
  258.                         writer.Write($"{i}: ");
  259.  
  260.                         foreach (int vertex in adjacencyList[i])
  261.                         {
  262.                             writer.Write($"{vertex} ");
  263.                         }
  264.  
  265.                         writer.WriteLine();
  266.                     }
  267.                 }
  268.                 Console.WriteLine($"Список смежности экспортирован в файл {filename}");
  269.             }
  270.             catch (IOException)
  271.             {
  272.                 Console.WriteLine("Ошибка экспорта!");
  273.             }
  274.         }
  275.         public static bool ImportIncidenceMatrix(out int[,] matrix)
  276.         {
  277.             matrix = null;
  278.  
  279.                 Console.Write("Введите путь к файлу: ");
  280.             string filePath = Console.ReadLine();
  281.  
  282.             try
  283.             {
  284.                 if (!File.Exists(filePath))
  285.                 {
  286.                     Console.WriteLine("Ошибка: файл не существует.");
  287.                     return false;
  288.                 }
  289.  
  290.                 using (var reader = new StreamReader(filePath))
  291.                 {
  292.                     if (!int.TryParse(reader.ReadLine(), out int vertexCount) || vertexCount <= 0)
  293.                     {
  294.                         Console.WriteLine("Ошибка: некорректное количество вершин.");
  295.                         return false;
  296.                     }
  297.  
  298.                     if (!int.TryParse(reader.ReadLine(), out int edgeCount) || edgeCount <= 0)
  299.                     {
  300.                         Console.WriteLine("Ошибка: некорректное количество ребер.");
  301.                         return false;
  302.                     }
  303.  
  304.                     matrix = new int[vertexCount, edgeCount];
  305.  
  306.                     for (int i = 0; i < vertexCount; i++)
  307.                     {
  308.                         string line = reader.ReadLine();
  309.                         string[] values = !string.IsNullOrWhiteSpace(line) ? line.Split(' ') : new string[0];
  310.  
  311.                         if (values.Length != edgeCount)
  312.                         {
  313.                             Console.WriteLine($"Ошибка: некорректное количество элементов в строке {i + 3}.");
  314.                             return false;
  315.                         }
  316.  
  317.                         for (int j = 0; j < edgeCount; j++)
  318.                         {
  319.                             if (!int.TryParse(values[j], out matrix[i, j]))
  320.                             {
  321.                                 Console.WriteLine($"Ошибка: некорректный элемент в строке {i + 3}, столбце {j + 1}.");
  322.                                 return false;
  323.                             }
  324.                         }
  325.                     }
  326.                 }
  327.             }
  328.             catch (FileNotFoundException)
  329.             {
  330.                 Console.WriteLine("Ошибка: файл не найден.");
  331.                 return false;
  332.             }
  333.             catch (UnauthorizedAccessException)
  334.             {
  335.                 Console.WriteLine("Ошибка: доступ к файлу запрещен.");
  336.                 return false;
  337.             }
  338.             catch (Exception ex)
  339.             {
  340.                 Console.WriteLine($"Ошибка: {ex.Message}");
  341.                 return false;
  342.             }
  343.  
  344.             return true;
  345.         }
  346.     }
  347. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement