Advertisement
Solingen

work

Mar 11th, 2024
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5.  
  6. // Структура для представления матрицы
  7. struct Matrix {
  8. double **data; // Двумерный массив
  9. int rows; // Количество строк
  10. int cols; // Количество столбцов
  11. };
  12.  
  13. // Функция для создания матрицы
  14. struct Matrix createMatrix(int rows, int cols) {
  15. struct Matrix mat;
  16. mat.rows = rows;
  17. mat.cols = cols;
  18.  
  19. // Выделение памяти для двумерного массива
  20. mat.data = (double **)malloc(rows * sizeof(double *));
  21. for (int i = 0; i < rows; i++) {
  22. mat.data[i] = (double *)malloc(cols * sizeof(double));
  23. }
  24.  
  25. return mat;
  26. }
  27.  
  28. // Функция для удаления матрицы и освобождения памяти
  29. void deleteMatrix(struct Matrix mat) {
  30. for (int i = 0; i < mat.rows; i++) {
  31. free(mat.data[i]);
  32. }
  33. free(mat.data);
  34. }
  35.  
  36. // Функция для заполнения матрицы случайными числами
  37. void fillMatrix(struct Matrix mat) {
  38. srand(time(NULL)); // Инициализация генератора случайных чисел
  39. for (int i = 0; i < mat.rows; i++) {
  40. for (int j = 0; j < mat.cols; j++) {
  41. mat.data[i][j] = rand() % 100; // Случайное число от 0 до 99
  42. }
  43. }
  44. }
  45.  
  46. // Функция для вывода матрицы на экран
  47. void printMatrix(struct Matrix mat) {
  48. printf("Матрица:\n");
  49. for (int i = 0; i < mat.rows; i++) {
  50. for (int j = 0; j < mat.cols; j++) {
  51. printf("%.2f\t", mat.data[i][j]); // Разделитель - табуляция
  52. }
  53. printf("\n");
  54. }
  55. }
  56.  
  57. // Функция для вычисления следа матрицы
  58. double trace(struct Matrix mat) {
  59. double sum = 0.0;
  60. int min_dimension = (mat.rows < mat.cols) ? mat.rows : mat.cols;
  61. for (int i = 0; i < min_dimension; i++) {
  62. sum += mat.data[i][i];
  63. }
  64. return sum;
  65. }
  66.  
  67. // Функция для вычисления суммы строки или столбца
  68. double sumRowOrCol(struct Matrix mat, int index, char type) {
  69. double sum = 0.0;
  70. if (type == 'r') { // Сумма строки
  71. for (int j = 0; j < mat.cols; j++) {
  72. sum += mat.data[index][j];
  73. }
  74. } else if (type == 'c') { // Сумма столбца
  75. for (int i = 0; i < mat.rows; i++) {
  76. sum += mat.data[i][index];
  77. }
  78. }
  79. return sum;
  80. }
  81.  
  82. // Функция для поиска максимального элемента по модулю в строке или столбце
  83. void findMax(struct Matrix mat, int index, char type) {
  84. double max_val = 0.0;
  85. int max_index = 0;
  86.  
  87. index--; // Переводим индекс из формата пользователя в формат программы
  88.  
  89. if (type == 'r') { // Поиск в строке
  90. for (int j = 0; j < mat.cols; j++) {
  91. if (abs(mat.data[index][j]) > max_val) {
  92. max_val = abs(mat.data[index][j]);
  93. max_index = j;
  94. }
  95. }
  96. printf("Максимальное по модулю значение в строке %d: %.2f по индексу %d\n", index + 1, max_val, max_index+1);
  97. } else if (type == 'c') { // Поиск в столбце
  98. for (int i = 0; i < mat.rows; i++) {
  99. if (abs(mat.data[i][index]) > max_val) {
  100. max_val = abs(mat.data[i][index]);
  101. max_index = i;
  102. }
  103. }
  104. printf("Максимальное по модулю значение в столбце %d: %.2f по индексу %d\n", index + 1, max_val, max_index+1);
  105. }
  106. }
  107.  
  108.  
  109. int main() {
  110. int M, N;
  111. printf("Введите количество строк и столбцов матрицы: ");
  112. scanf("%d %d", &M, &N);
  113.  
  114. struct Matrix mat = createMatrix(M, N);
  115. fillMatrix(mat);
  116.  
  117. printMatrix(mat);
  118.  
  119. printf("Доступные команды:\n");
  120. printf("trace - вычисляет и выводит на экран след матицы - сумму элементов на диагонали\n");
  121. printf("row i j - вычисляет и выводит на экран вектор, соответствующей сумме i-й и j-й строки матрицы.\n");
  122. printf("col i j - аналогично, но суммируются столбцы.\n");
  123. printf("max i - находит максимальный по модулю элемент в i-м стоблце и выводит на экран номер элемента и его значение. То же самое делает и для i-й строки, так что эта команда приводит к выводу на экран двух похожих сообщений.\n");
  124. printf("exit - выход из программы.\n");
  125.  
  126. char command[10];
  127. while (1) {
  128. printf("Введите команду: ");
  129. scanf("%s", command);
  130.  
  131. if (strcmp(command, "trace") == 0) {
  132. printf("След матрицы: %.2f\n", trace(mat));
  133. } else if (strcmp(command, "row") == 0) {
  134. int i, j;
  135. scanf("%d %d", &i, &j);
  136. printf("Сумма строки %d и %d: %.2f\n", i, j, sumRowOrCol(mat, i, 'r') + sumRowOrCol(mat, j, 'r'));
  137. } else if (strcmp(command, "col") == 0) {
  138. int i, j;
  139. scanf("%d %d", &i, &j);
  140. printf("Сумма столбца %d и %d: %.2f\n", i, j, sumRowOrCol(mat, i, 'c') + sumRowOrCol(mat, j, 'c'));
  141. } else if (strcmp(command, "max") == 0) {
  142. int index;
  143. scanf("%d", &index);
  144. findMax(mat, index, 'r');
  145. findMax(mat, index, 'c');
  146. } else if (strcmp(command, "exit") == 0) {
  147. break;
  148. } else {
  149. printf("Неверная команда!\n");
  150. }
  151. }
  152.  
  153. deleteMatrix(mat); // Освобождение памяти
  154. return 0;
  155. }
  156.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement