Advertisement
VladimirKostovsky

Противный код 5 лабы

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