Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.99 KB | None | 0 0
  1. #include"stdafx.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include<math.h>
  6. #define M 10
  7. #define N 50
  8.  
  9. typedef struct matrix
  10. {
  11. int row;
  12. int colm;
  13. int *matr;
  14. } matrix;
  15.  
  16.  
  17. void print_matrix(int *matr, int matrow, int matcolm, char *filename);
  18. int *matrix_transponition(int *matr, int matArow, int matAcolm);
  19. int *mult_2_matr(int matrow1, int matcolm1, int *mat1, int matrow2, int matcolm2, int *mat2);
  20. void matrix_multiplication(matrix*array, int number);
  21. int *minor(int *matrix, int size, int index);
  22. int determiant(int *matrix, int size);
  23. void inverse_matrix(int *matrix, int row, int colm, int number);
  24.  
  25.  
  26.  
  27. int main()
  28. {
  29. int size_of_arr, i = 0, j = 0, k = 0, num_of_digit = 0, colm = 0, row = 0, size_of_digit = 0, size_of_matr = 0, flag = 0, n = 1, c=0, num_act=0;
  30. size_of_arr = M;
  31. size_of_digit = M;
  32. size_of_matr = M;
  33. char* str = (char*)malloc(N * sizeof(char));
  34. char **arr = (char**)malloc(size_of_arr * sizeof(char*));
  35. char* newtext;
  36. int *digit = (int*)malloc(size_of_digit * sizeof(int));
  37. int *buffer;
  38. matrix* arr_matr = (matrix*)malloc(size_of_matr * sizeof(matrix));
  39. FILE *myfile;
  40. myfile = fopen("input_file.txt", "r");
  41. if (myfile != NULL)
  42. {
  43. while (fgets(str, N, myfile) != NULL)
  44.  
  45. {
  46. while (str[0] != '\n')
  47. {
  48. if (str[strlen(str) - 1] == '\n')
  49. str[strlen(str) - 1] = '\0';
  50. flag = 0;
  51. i = 0;
  52. newtext = strtok(str, " ");
  53. while (newtext != NULL)
  54. {
  55. arr[i] = newtext;
  56. i++;
  57. if (i + 1 == size_of_arr)
  58. {
  59. size_of_arr += M;
  60. arr = (char**)realloc(arr, (size_of_arr) * sizeof(char *));
  61. }
  62. newtext = strtok(NULL, " ");
  63. }
  64. size_of_arr = i;
  65. arr[i] = '\0';
  66. colm = i;
  67. if (colm != c && c != 0)
  68. {
  69. printf("wrong with %d\n", n);
  70. flag = 1;
  71. c = 0;
  72. num_of_digit = 0;
  73. break;
  74. }
  75. c = colm;
  76. i = 0;
  77. for (j = 0; j < size_of_arr; j++)
  78. {
  79. if (num_of_digit + j == size_of_digit)
  80. {
  81. size_of_digit += M;
  82. digit = (int*)realloc(digit, size_of_digit * sizeof(int));
  83. }
  84. digit[num_of_digit + j] = atoi(arr[j]);
  85. }
  86. num_of_digit += size_of_arr;
  87. str[0] = '\0';
  88. fgets(str, N, myfile);
  89.  
  90. }
  91. if (flag == 0)
  92. {
  93. row = num_of_digit / colm;
  94. if (k == size_of_matr)
  95. {
  96. size_of_matr += M;
  97. arr_matr = (matrix*)realloc(arr_matr, size_of_matr * sizeof(matrix));
  98. }
  99. arr_matr[k].row = row;
  100. arr_matr[k].colm = colm;
  101. arr_matr[k].matr = (int*)malloc(num_of_digit * sizeof(int));
  102. for (i = 0; i < num_of_digit; i++)
  103. {
  104. arr_matr[k].matr[i] = digit[i];
  105. }
  106. n++;
  107. k++;
  108. c = 0;
  109. flag = 1;
  110. num_of_digit = 0;
  111. colm = 0;
  112. }
  113. }
  114. fclose(myfile);
  115. printf("Select an action with a matrix\n 1:Matrix multiplication\n 2:Matrix transponition\n 3:Inverse matrix\n");
  116. scanf("%d", &num_act);
  117. switch (num_act)
  118. {
  119. case 1:
  120. matrix_multiplication(arr_matr, k);
  121. break;
  122. case 2:
  123. for (i = 0; i < k; i++)
  124. {
  125. char *name_file = "transponition.txt";
  126. buffer=matrix_transponition(arr_matr[i].matr, arr_matr[i].row, arr_matr[i].colm);
  127. print_matrix(buffer, arr_matr[i].colm, arr_matr[i].row, name_file);
  128. }
  129. break;
  130. case 3:
  131. for (i = 0; i < k; i++)
  132. {
  133. inverse_matrix(arr_matr[i].matr, arr_matr[i].row, arr_matr[i].colm, i);
  134. }
  135. break;
  136. default:
  137. printf("Wrong number\n");
  138. break;
  139. }
  140. free(arr);
  141. free(str);
  142. free(digit);
  143. }
  144. else
  145. printf("File can not be opened\n");
  146. system("pause");
  147. return 0;
  148. }
  149.  
  150.  
  151. void print_matrix(int *matr, int matrow, int matcolm, char*filename)
  152. {
  153. FILE *myfile;
  154. myfile = fopen(filename, "a");
  155. if (myfile != NULL)
  156. {
  157. int j = 0;
  158. for (j = 0; j < matrow*matcolm; j++)
  159. {
  160. fprintf(myfile, "%d ", matr[j]);
  161. if ((j + 1) % matcolm == 0)
  162. fprintf(myfile, "\n");
  163. }
  164. fprintf(myfile, "\n");
  165. fclose(myfile);
  166. }
  167. else
  168. printf("File can not be opened\n");
  169. }
  170.  
  171.  
  172. int *matrix_transponition(int *matr, int matrow, int matcolm)
  173. {
  174.  
  175. int *matT = (int *)malloc((matrow*matcolm) * sizeof(int));
  176. int i, j;
  177.  
  178. for (i = 0; i < matrow; i++)
  179. for (j = 0; j < matcolm; j++)
  180. matT[i + matrow*j] = matr[i*matcolm + j];
  181. return matT;
  182. }
  183.  
  184.  
  185. int *mult_2_matr(int matrow1, int matcolm1, int *mat1, int matrow2, int matcolm2, int *mat2)
  186. {
  187. int *res = (int*)malloc((matrow1*matcolm2) * sizeof(int));
  188. int k = 0, n = 0, j = 0, t = 0, i = 0, sum = 0;
  189. while (k < matrow1*matcolm2)
  190. {
  191. if (n != 0 && (n%matcolm2 == 0))
  192. j++;
  193. for (t = 0; t < matcolm2; t++)
  194. {
  195. sum = 0;
  196. for (i = 0; i < matrow2; i++)
  197. {
  198. sum += mat1[j*matrow2 + i] * mat2[t + matcolm2*i];
  199. }
  200. res[k] = sum;
  201. n++;
  202. k++;
  203. }
  204.  
  205. }
  206. return res;
  207. }
  208.  
  209. void matrix_multiplication(matrix*array, int number)
  210. {
  211. char *name_file = "multiplication.txt";
  212. int i = 0, j=0, buf_row=0, buf_colm=0, flag=0, size_of_buf=0, size_of_result=1;
  213. int *result;
  214. buf_row = array[0].row;
  215. buf_colm = array[0].colm;
  216. size_of_buf = buf_row*buf_colm;
  217. int *buffer =(int *)malloc((size_of_buf)*sizeof(int));
  218. for (j=0; j<buf_row*buf_colm; j++)
  219. {
  220. buffer[j] = array[0].matr[j];
  221. }
  222. for (i = 1; i < number; i++)
  223. {
  224. if (buf_colm == array[i].row)
  225. {
  226.  
  227. result = mult_2_matr(buf_row, buf_colm, buffer, array[i].row, array[i].colm, array[i].matr);
  228. }
  229. else
  230. {
  231. printf("Fail\n");
  232. flag = 1;
  233. break;
  234. }
  235. if (flag == 0)
  236. {
  237. buf_colm = array[i].colm;
  238. if (buf_row*buf_colm > size_of_buf)
  239. {
  240. size_of_buf = buf_row*buf_colm;
  241. buffer = (int*)realloc(buffer, size_of_buf * sizeof(int));
  242. }
  243. for (j = 0; j<buf_row*buf_colm; j++)
  244. {
  245. buffer[j] = result[j];
  246. }
  247. }
  248. }
  249. if(flag==0)
  250. print_matrix(result, buf_row, buf_colm, name_file);
  251. free(buffer);
  252. free(result);
  253. }
  254.  
  255.  
  256. int *minor(int *matrix, int size, int index)
  257. {
  258. int i = 0, size_of_buf = 0, flag = 0, j = 0, k = 0, size_of_result = 0;
  259. size_of_buf = size*size - size;
  260. size_of_result = pow(size - 1, 2);
  261. int *buf = (int*)malloc(size_of_buf * sizeof(int));
  262. int *result = (int*)malloc(size_of_result * sizeof(int));
  263. int index_str_to_delete = index / size;
  264. int index_elem_to_delete = index - size*index_str_to_delete;
  265.  
  266. for (i = 0; i < size*index_str_to_delete; i++)
  267. {
  268. buf[i] = matrix[i];
  269. }
  270. for (i = index_str_to_delete*size; i<size_of_buf; i++)
  271. buf[i] = matrix[i + size];
  272.  
  273. while (k<size_of_buf)
  274. {
  275. if ((k - index) % size == 0)
  276. {
  277. k++;
  278. }
  279. result[j] = buf[k];
  280. j++;
  281. k++;
  282. }
  283.  
  284. free(buf);
  285. return result;
  286. }
  287.  
  288. int determiant(int *matrix, int size)
  289. {
  290. int det = 0, degree = 1, i = 0;
  291. if (size == 1)
  292. return matrix[0];
  293. if (size == 2)
  294. return matrix[0] * matrix[3] - matrix[2] * matrix[1];
  295. int *buf;
  296. for (i = 0; i < size; i++)
  297. {
  298. buf = minor(matrix, size, i);
  299. det = det + (degree*matrix[i] * determiant(buf, size - 1));
  300. degree = -degree;
  301. }
  302. free(buf);
  303. return det;
  304. }
  305.  
  306. void inverse_matrix(int *matrix, int row, int colm, int number)
  307. {
  308. FILE *myfile;
  309. int det = 0, i = 0, degree = -1, det_m = 0, k = 0;
  310. int *buf1;
  311. int *buf2;
  312. float *inv_matr;
  313. char *name_file = "inverse matrix.txt";
  314. if (row != colm)
  315. printf("Fail with %d\n", number+1);
  316. else
  317. {
  318. inv_matr = (float*)malloc(row*colm * sizeof(float));
  319. det = determiant(matrix, row);
  320. if (det == 0)
  321. printf("Fail with %d\n", number+1);
  322. else
  323. {
  324. buf2 = (int*)malloc(row*colm * sizeof(int));
  325. for (i = 0; i < row*colm; i++)
  326. {
  327. buf1 = minor(matrix, row, i);
  328. if ((i % row == 0 && row % 2 == 0) || i == 0)
  329. degree = -degree;
  330. det_m = degree*determiant(buf1, row - 1);
  331. buf2[i] = det_m;
  332. degree = -degree;
  333.  
  334. }
  335. buf2 = matrix_transponition(buf2, row, colm);
  336. for (i = 0; i < row*colm; i++)
  337. {
  338. inv_matr[i] = float(buf2[i]) / det;
  339. }
  340. myfile = fopen("inverse matrix.txt", "a");
  341. for (k = 0; k < row*colm; k++)
  342. {
  343. fprintf(myfile, "%g ", inv_matr[k]);
  344. if ((k +1)% row == 0)
  345. fprintf(myfile, "\n");
  346. }
  347. fprintf(myfile, "\n");
  348. fclose(myfile);
  349. free(buf1);
  350. free(buf2);
  351. }
  352. }
  353. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement