fork download
  1. #include <stdio.h> // для ввода/вывода
  2. #include <string.h> // для строк
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. int isCorrectMatrix(const char type[])
  7. {
  8. char input[100];
  9. while (1)
  10. {
  11. printf("Write sequence number of matrix: ");
  12.  
  13. fgets(input, sizeof(input), stdin);
  14.  
  15. input[strcspn(input, "\n")] = 0;
  16.  
  17. int temp, n;
  18. if (sscanf(input, "%d%n", &temp, &n) == 1 && n == strlen(input) && temp > 0)
  19. {
  20. return temp;
  21. }
  22. else
  23. {
  24. printf("-------------------------\nIncorrect input!\n");
  25. };
  26. }
  27. }
  28.  
  29. int determinantFunc(int **matrix, int n) {
  30. // порядок равен 2 => детерминант равен единственному элементу
  31. if (n == 1) {
  32. return matrix[0][0];
  33. }
  34.  
  35. // порядок равен 2 => используем формулу для 2x2 детерминанта
  36. if (n == 2) {
  37. return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
  38. }
  39.  
  40. // инициализируем переменную для хранения итогового детерминанта
  41. int det = 0;
  42.  
  43. // инициализируем знак для чередования плюса и минуса в сумме (начинаем с +)
  44. int sign = 1;
  45.  
  46. // для каждого i создаём подматрицу, учитывая минор, исключая строку 0 и столбец i.
  47. for (int i = 0; i < n; i++) {
  48.  
  49. // выделяем память для подматрицы размером n x n, исключая строку 0 и столбец i
  50. int **submatrix = (int **)malloc((n-1) * sizeof(int *));
  51. for (int k = 0; k < n-1; k++) {
  52. submatrix[k] = (int *)malloc((n-1) * sizeof(int));
  53. }
  54.  
  55. // заполняем подматрицу: копируем элементы из строк 1 до n-1, пропуская столбец i
  56. for (int row = 1; row < n; row++) {
  57. int col_index = 0; // индекс столбца в подматрице
  58. for (int col = 0; col < n; col++) {
  59. if (col != i) { // пропускаем столбец i
  60. submatrix[row-1][col_index++] = matrix[row][col];
  61. }
  62. }
  63. }
  64.  
  65. // добавляем к детерминанту: (+1 или -1) * элемент первой строки и столбца i * детерминант подматрицы
  66. det += sign * matrix[0][i] * determinantFunc(submatrix, n-1);
  67.  
  68. // чередуем -1 и +1
  69. sign = -sign;
  70.  
  71. for (int k = 0; k < n-1; k++) {
  72. free(submatrix[k]);
  73. }
  74. free(submatrix);
  75. }
  76.  
  77. return det;
  78. }
  79.  
  80. int CramerMethod(int **matrix, int sequence_number, int *linesResultInSystem)
  81. {
  82. int **delta = (int **)malloc(sequence_number * sizeof(int *));
  83.  
  84. if (delta == NULL)
  85. {
  86. printf("Memory error!\n");
  87. free(delta);
  88. return 1;
  89. }
  90.  
  91. for (int i = 0; i < sequence_number; i++)
  92. {
  93. delta[i] = (int *)malloc(sequence_number * sizeof(int));
  94.  
  95. if (delta[i] == NULL)
  96. {
  97. printf("Memory error!\n");
  98. for (int k = 0; k < i; k++)
  99. {
  100. free(delta[k]);
  101. }
  102. free(delta);
  103. return 1;
  104. }
  105.  
  106. for (int j = 0; j < sequence_number; j++)
  107. {
  108. delta[i][j] = matrix[i][j];
  109. }
  110. }
  111.  
  112. // главный детерминант
  113. int determinantNumber = determinantFunc(delta, sequence_number);
  114.  
  115. for (int i = 0; i < sequence_number; i++)
  116. {
  117. free(delta[i]);
  118. }
  119.  
  120. free(delta);
  121.  
  122. printf("\n------------------\n\nDeterminant of main delta: %d\n", determinantNumber);
  123.  
  124. // остальные детерминанты и высчитывание иксов
  125. if (determinantNumber == 0)
  126. {
  127. printf("\n!!!!!!!!!!!!!!\nInvalid method of Cramer, continue on next method...\n!!!!!!!!!!!!!!\n");
  128. return 1;
  129. }
  130. for (int delta_numeric = 1; delta_numeric <= sequence_number; delta_numeric++)
  131. {
  132. int **delta_another = (int **)malloc(sequence_number * sizeof(int *));
  133. for (int i = 0; i < sequence_number; i++)
  134. {
  135. delta_another[i] = (int *)malloc(sequence_number * sizeof(int));
  136.  
  137. if (delta_another[i] == NULL)
  138. {
  139. printf("Memory error!\n");
  140. for (int k = 0; k < i; k++)
  141. {
  142. free(delta_another[k]);
  143. }
  144. free(delta_another);
  145. return 1;
  146. }
  147.  
  148. for (int j = 0; j < sequence_number; j++)
  149. {
  150. delta_another[i][j] = matrix[i][j];
  151. }
  152. delta_another[i][delta_numeric - 1] = linesResultInSystem[i];
  153. }
  154.  
  155. int anotherDeterminantNumber = determinantFunc(delta_another, sequence_number);
  156.  
  157. float mainX;
  158.  
  159. mainX = (float)anotherDeterminantNumber / determinantNumber;
  160.  
  161. printf("x%d: %.2f; ", delta_numeric, mainX);
  162. for (int i = 0; i < sequence_number; i++)
  163. {
  164. free(delta_another[i]);
  165. }
  166. free(delta_another);
  167. }
  168. }
  169.  
  170. int main()
  171. {
  172. // рандом
  173. srand(time(NULL));
  174.  
  175. // порядок матрицы
  176. int sequence_number;
  177.  
  178. // проверка целочисленности матрицы
  179. sequence_number = isCorrectMatrix("sequence_number");
  180.  
  181. // объявление матрицы и результата линии в системе матриц
  182. int *linesResultInSystem = (int *)malloc(sequence_number * sizeof(int));
  183. int **matrix = (int **)malloc(sequence_number * sizeof(int *));
  184.  
  185. // проверка достатка памяти
  186. if (matrix == NULL)
  187. {
  188. printf("Memory error!\n");
  189. free(matrix);
  190. return 1;
  191. }
  192.  
  193. // наполнение матрицы и результата линии в системе матриц рандомными числами от 0 до 9
  194. for (int i = 0; i < sequence_number; i++)
  195. {
  196. linesResultInSystem[i] = rand() % 10;
  197. matrix[i] = (int *)malloc(sequence_number * sizeof(int));
  198. if (matrix[i] == NULL)
  199. {
  200. printf("Memory error!\n");
  201. for (int k = 0; k < i; k++)
  202. {
  203. free(matrix[k]);
  204. }
  205. free(matrix);
  206. return 1;
  207. }
  208. for (int j = 0; j < sequence_number; j++)
  209. {
  210. matrix[i][j] = rand() % 10;
  211. }
  212. }
  213.  
  214. printf("\n-------------\nYour generated matrix: \n");
  215.  
  216. // вывод системы матриц
  217. for (int i = 0; i < sequence_number; i++)
  218. {
  219. printf("\n");
  220. for (int j = 0; j < sequence_number; j++)
  221. {
  222. if (j > 0)
  223. {
  224. printf(" + %dx", matrix[i][j]);
  225. }
  226. else
  227. {
  228. printf("%dx", matrix[i][j]);
  229. }
  230. }
  231. printf(" = %d", linesResultInSystem[i]);
  232. }
  233.  
  234. int resultOfCramer = CramerMethod(matrix, sequence_number, linesResultInSystem);
  235.  
  236. if (resultOfCramer == 0)
  237. {
  238. return 1;
  239. }
  240.  
  241. for (int i = 0; i < sequence_number; i++) {
  242. free(matrix[i]);
  243. }
  244. free(matrix);
  245. free(linesResultInSystem);
  246.  
  247. return 0;
  248. }
Success #stdin #stdout 2.3s 5308KB
stdin
10
stdout
Write sequence number of matrix: 
-------------
Your generated matrix: 

5x + 7x + 7x + 3x + 0x + 2x + 1x + 6x + 3x + 5x = 8
1x + 6x + 8x + 6x + 6x + 3x + 0x + 9x + 7x + 8x = 5
6x + 2x + 6x + 4x + 7x + 1x + 2x + 9x + 1x + 7x = 2
8x + 3x + 9x + 2x + 4x + 7x + 8x + 1x + 2x + 1x = 7
3x + 0x + 5x + 6x + 0x + 6x + 5x + 9x + 8x + 3x = 9
7x + 8x + 2x + 0x + 2x + 1x + 1x + 0x + 0x + 2x = 3
2x + 4x + 9x + 9x + 4x + 2x + 4x + 6x + 1x + 9x = 3
8x + 5x + 6x + 4x + 3x + 7x + 5x + 6x + 2x + 4x = 6
4x + 4x + 9x + 8x + 5x + 1x + 8x + 7x + 6x + 2x = 6
7x + 2x + 8x + 9x + 8x + 4x + 0x + 7x + 0x + 0x = 4
------------------

Determinant of main delta: -334059625
x1: 0.67; x2: -0.16; x3: 0.62; x4: 0.08; x5: -0.69; x6: 0.03; x7: -0.30; x8: -0.10; x9: 0.71; x10: -0.03;