Guest User

Untitled

a guest
Nov 15th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. int *createMatrix(int **p, int n); //행열의 공간을 할당한 후 주소를 RETURN하는 함수
  7. void input(int **p, int n); //행열의 값을 입력받음
  8.  
  9. void main()
  10. {
  11. int n; //행과 열을 결정할 변수 n 선언
  12. int **pA = NULL, **pB = NULL, **pAB = NULL; //A행렬, B행렬, 벡터의 곱을 저장할 포인터 선언
  13. int **pDiagnol = NULL;
  14. int i, j; //반복문에 사용할 i, j
  15. int col, low; //행, 열 변수 선언
  16. int sum = 0; //대각선의 합
  17.  
  18. scanf("%d", &n); //변수 n 입력받음
  19.  
  20.  
  21. pA = (int **)malloc(n * sizeof(int *));
  22. pB = (int **)malloc(n * sizeof(int *)); //N개만큼의 행을 가지는
  23. pAB = (int **)calloc(n, sizeof(int *)); //공간을 각 변수에 할당
  24.  
  25. if (pA == NULL || pB == NULL || pAB == NULL) {
  26. printf("Not Enough Memory!\n");
  27. return;
  28. }
  29.  
  30. createMatrix(pA, n);
  31. createMatrix(pB, n); //각 주소와 n을 인자로
  32. createMatrix(pAB, n); //함수를 호출하고 N개 만큼의 열의 공간을 할당시킴
  33.  
  34. input(pA, n);
  35. input(pB, n); //각 행열에 값을 입력해줌
  36.  
  37. col = 0;
  38. low = 0; // col, low를 0으로 초기화
  39.  
  40. for (i = 0; i < n * n; i++) { // n * n개의 행렬
  41. for (j = 0; j < n; j++) { //j를 곱하고자 하는 값을 찾는데 사용
  42. pAB[col][low] += (pA[col][j] * pB[j][low]); //행렬 곱셈 규칙을 이용해 해당하는 행렬에 값을 대입
  43. }
  44.  
  45. low++; // 한 원소를 구한 후 열 증가
  46. if (low == n) { //열의 수와 행의 수가 같을 경우
  47. low = 0; //열을 0으로 초기화 후
  48. col++; //행 증가
  49. }
  50. }
  51.  
  52. /*
  53. for (i = 0; i < n; i++) {
  54. for (j = 0; j < n; j++) { // n * n개 만큼의
  55. printf("%d ", pVector[i][j]); // 행렬값을 출력함
  56. }
  57. printf("\n"); //한 행을 출력한 후 줄바꿈
  58. }
  59. */
  60.  
  61. pDiagnol = (int **)malloc(2 * sizeof(int *)); //두 열을 할당
  62. createMatrix(pDiagnol, n); //각 열에 공간 할당
  63.  
  64. for (i = 0; i < n; i++) { //대각선으로 첫번째, 두번째 열에 저장
  65. pDiagnol[0][i] = pAB[i][i];
  66. pDiagnol[1][i] = pAB[i][n - 1 - i];
  67. sum += pDiagnol[0][i] - pDiagnol[1][i]; //각 대각선끼리의 합
  68. }
  69.  
  70. for (i = 0; i < 2; i++) {
  71. for (j = 0; j < n; j++) {
  72. printf("%d ", pDiagnol[i][j]);
  73. }
  74. printf("\n");
  75. }
  76.  
  77.  
  78. printf("%d\n", sum);
  79.  
  80.  
  81. for (i = 0; i < n; i++) {
  82. free(pA[i]), free(pB[i]), free(pAB[i]); //각 행렬의 열 메모리 해제
  83. }
  84. free(pA), free(pB), free(pAB); //각 행 메모리 해체
  85.  
  86. for (i = 0; i < 2; i++) {
  87. free(pDiagnol[i]); //각 대각선 행렬의 열 메모리 해제
  88. }
  89. free(pDiagnol); //대각선 행렬의 행 메모리 해제
  90.  
  91. }
  92.  
  93. int *createMatrix(int **p, int n)
  94. {
  95. int i; //반복문에 사용할 i
  96.  
  97. for (i = 0; i < n; i++) {
  98. p[i] = (int *)calloc(n, sizeof(int)); //각 배열의 공간 할당과 동시에 0으로 초기화
  99. }
  100.  
  101. return p; //주소값 return
  102. }
  103.  
  104. void input(int **p, int n)
  105. {
  106. int i, j; // 반복문에 사용할 i, j
  107.  
  108. for (i = 0; i < n; i++) {
  109. for (j = 0; j < n; j++) { //각 행렬에
  110. scanf("%d", &p[i][j]); //값을 입력해줌
  111. }
  112. }
  113. }
Add Comment
Please, Sign In to add comment