Advertisement
VladimirKostovsky

Противный код 5 лаба (первая часть)

Nov 18th, 2023
1,409
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.93 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <locale.h>
  3. #include <stdlib.h>
  4.  
  5. // Константы для работы с графом
  6. #define MIN_N 2
  7. #define MAX_N 7
  8. #define FILENAME_SIZE 20
  9.  
  10. // Функция для ввода размера графа с клавиатуры
  11. void inputGraphSize(int* n) {
  12.     printf("Введите количество вершин графа в диапазоне [%d; %d]: ", MIN_N, MAX_N);
  13.     scanf("%d", n);
  14. }
  15.  
  16. // Функция для проверки корректности размера графа
  17. int checkGraphSize(int n) {
  18.     if (n < MIN_N || n > MAX_N) {
  19.         printf("Ошибка: введенное значение n вне допустимого диапазона.\n");
  20.         return 1; // Возврат с ошибкой
  21.     }
  22.     return 0; // Все в порядке
  23. }
  24.  
  25. // Функция для создания матрицы смежности с клавиатуры
  26. void createAdjacencyMatrix(int n, int m1[][MAX_N]) {
  27.     printf("Матрица смежности c размерностью %d x %d\n", n, n);
  28.     for (int i = 0; i < n; i++) {
  29.         for (int j = i; j < n; j++) {
  30.             printf("m1[%d][%d] = ", i, j);
  31.             scanf("%d", &m1[i][j]);
  32.             m1[j][i] = m1[i][j];
  33.         }
  34.     }
  35. }
  36.  
  37. // Функция для чтения матрицы смежности из файла
  38. void readAdjacencyMatrixFromFile(int n, int m1[][MAX_N], const char* fileName) {
  39.     FILE* file;
  40.     if (fopen_s(&file, fileName, "r") != 0) {
  41.         printf("Ошибка открытия файла %s\n", fileName);
  42.         exit(1);
  43.     }
  44.  
  45.     for (int i = 0; i < n; i++) {
  46.         for (int j = i; j < n; j++) {
  47.             fscanf(file, "%d", &m1[i][j]);
  48.             m1[j][i] = m1[i][j];
  49.         }
  50.     }
  51.  
  52.     fclose(file);
  53. }
  54.  
  55. // Функция для вывода матрицы смежности на экран
  56. void printAdjacencyMatrix(int n, int m1[][MAX_N]) {
  57.     printf("Вывод матрицы смежности m1\n");
  58.     for (int i = 0; i < n; i++) {
  59.         for (int j = 0; j < n; j++) {
  60.             printf("%d\t", m1[i][j]);
  61.         }
  62.         printf("\n");
  63.     }
  64. }
  65.  
  66. // Функция для подсчета количества рёбер в графе
  67. int countEdges(int n, int m1[][MAX_N]) {
  68.     int k0 = 0;
  69.     for (int i = 0; i < n - 1; i++) {
  70.         for (int j = 0; j < n - 1; j++) {
  71.             k0 += m1[i][j];
  72.         }
  73.     }
  74.     return k0 / 2;
  75. }
  76.  
  77. // Функция для подсчета связей каждой вершины
  78. void countVertexConnections(int n, int m1[][MAX_N], int* sum) {
  79.     for (int j = 0; j < n - 1; j++) {
  80.         sum[j] = 0;
  81.         for (int i = 0; i < n - 1; i++) {
  82.             sum[j] += m1[j][i];
  83.         }
  84.     }
  85. }
  86.  
  87. // Функция для проверки связности графа
  88. int checkConnectivity(int n, int* sum) {
  89.     int p = 0;
  90.     for (int i = 0; i < n - 1; i++) {
  91.         if (sum[i] == 0) {
  92.             printf("Матрица несвязная\n");
  93.             p++;
  94.         }
  95.     }
  96.     return p;
  97. }
  98.  
  99. // Функция для проверки, является ли граф деревом
  100. int isTree(int k, int n, int p) {
  101.     return (k == n - 2 && p == 0);
  102. }
  103.  
  104. // Главная функция программы
  105. int main() {
  106.     setlocale(LC_ALL, "Russian");
  107.  
  108.     int n; // Переменная для хранения размера графа
  109.     char fileName[FILENAME_SIZE];
  110.  
  111.     // Справка
  112.     printf("\nАлгоритм работы программы:\n");
  113.     printf("1. Пользователь выбирает источник данных: клавиатура или файл (input.txt).\n");
  114.     printf("2. В зависимости от выбора, программа либо запрашивает ввод размера графа и матрицы смежности с клавиатуры,\n");
  115.     printf("   либо считывает данные из файла input.txt.\n");
  116.     printf("3. Программа выводит матрицу смежности.\n");
  117.     printf("4. Программа выполняет проверку.\n");
  118.     printf("5. Память, выделенная под матрицы, освобождается.\n");
  119.     printf("\nАвтор: Павликова Екатерина, группа ПМИ-13\n");
  120.  
  121.     // Выбор файла
  122.     printf("Выберите файл (1 - input1.txt, 2 - input2.txt, 3 - input3.txt): ");
  123.     int fileChoice;
  124.     scanf("%d", &fileChoice);
  125.  
  126.     switch (fileChoice) {
  127.         case 1:
  128.             strcpy(fileName, "input1.txt");
  129.             break;
  130.         case 2:
  131.             strcpy(fileName, "input2.txt");
  132.             break;
  133.         case 3:
  134.             strcpy(fileName, "input3.txt");
  135.             break;
  136.         default:
  137.             printf("Неверный выбор файла. Выход...\n");
  138.             return 1;
  139.     }
  140.  
  141.     // Обработка выбора пользователя
  142.     printf("Выберите источник данных (1 - клавиатура, 2 - файл): ");
  143.     int choice;
  144.     scanf("%d", &choice);
  145.  
  146.     // Обработка выбора пользователя
  147.     if (choice == 1) {
  148.         // Ввод размера графа с клавиатуры
  149.         inputGraphSize(&n);
  150.  
  151.         // Проверка корректности введенного размера графа
  152.         if (checkGraphSize(n)) {
  153.             return 1; // Возврат с ошибкой
  154.         }
  155.     }
  156.     else if (choice == 2) {
  157.         // Инициализация переменной n с использованием константного значения
  158.         printf("Чтение данных из файла %s\n", fileName);
  159.         FILE* file;
  160.         if (fopen_s(&file, fileName, "r") != 0) {
  161.             printf("Ошибка открытия файла %s\n", fileName);
  162.             return 1; // Возврат с ошибкой
  163.         }
  164.  
  165.         // Чтение размера графа из файла
  166.         fscanf(file, "%d", &n);
  167.         fclose(file);
  168.         // Проверка корректности введенного размера графа
  169.         if (checkGraphSize(n)) {
  170.             return 1; // Возврат с ошибкой
  171.         }
  172.     }
  173.     else {
  174.         printf("Ошибка: неверный выбор источника данных.\n");
  175.         return 1; // Возврат с ошибкой
  176.     }
  177.  
  178.     // Выделение памяти под матрицу смежности
  179.     int m1[MAX_N][MAX_N];
  180.  
  181.     // Проверка успешности выделения памяти
  182.     if (m1 == NULL) {
  183.         printf("Ошибка: не удалось выделить память для матрицы смежности.\n");
  184.         return 1;
  185.     }
  186.  
  187.     // Ввод или чтение матрицы смежности в зависимости от выбора пользователя
  188.     if (choice == 1) {
  189.         createAdjacencyMatrix(n, m1);
  190.     }
  191.     else if (choice == 2) {
  192.         readAdjacencyMatrixFromFile(n, m1, fileName);
  193.     }
  194.  
  195.     // Вывод матрицы смежности на экран
  196.     printAdjacencyMatrix(n, m1);
  197.  
  198.     // Подсчет количества рёбер в графе
  199.     int k = countEdges(n, m1);
  200.     printf("В графе %d рёбер\n", k);
  201.  
  202.     // Массив для хранения связей каждой вершины
  203.     int sum[MAX_N - 1];
  204.  
  205.     // Подсчет связей каждой вершины
  206.     countVertexConnections(n, m1, sum);
  207.  
  208.     // Проверка связности графа
  209.     int p = checkConnectivity(n, sum);
  210.  
  211.     // Проверка, является ли граф деревом
  212.     if (isTree(k, n, p)) {
  213.         printf("m1 является деревом\n\n");
  214.     }
  215.     else {
  216.         printf("m1 не является деревом\n\n");
  217.     }
  218.  
  219.     return 0;
  220. }
  221.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement