Advertisement
VladimirKostovsky

гребанный сыр

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