c·c++/c 프로그래밍

행렬의 덧셈, 뺄셈, 곱셈 - 동적할당

바로이순간 2012. 3. 25. 21:02

#include <stdio.h>

#include <stdlib.h>
void matAdd(double **a, double **b, double **c, int rows, int cols) {
  int i, j;
  for(i=0;i<rows;i++)
    for(j=0;j<cols;j++)
      c[i][j]=a[i][j]+b[i][j];
}

void matSub(double **a, double **b, double **c, int rows, int cols) {
  int i, j;
  for(i=0;i<rows;i++)
    for(j=0;j<cols;j++)
      c[i][j]=a[i][j]-b[i][j];
}

void matMult(double **a, double **b, double **c, int num1, int num2, int num3) {
  int i, j, k;
  double x;

  for(i=0;i<num1;i++) {
    for(j=0;j<num3;j++) {
      x=0.;
      for(k=0;k<num2;k++)
        x=x+a[i][k]*b[k][j];

      c[i][j]=x;
    }
  }
}

void matPrint(double **a, int rows, int cols) {

  int i, j;

 

  for(i=0;i<rows;i++) {

    for(j=0;j<cols;j++) {

      printf("%10.4f", a[i][j]);

    }

    printf("\n");

  }

}


int main() {
  int n1, n2, n3;
  int i, j;

  double x;
  double *ptr;
  double **arrA, **arrB, **arrC;

// 곱셈의 테스트를 위해서 세수를 입력 받았다.
// 덧셈 뺄셈을 위해서는 두수만 필요하다,
// 요령을 부려서 3 3 3 같이 같은 수들을 넣으면
// 덧셈, 뺄셈, 곱셈을 테스트 하는데 다 쓸수 있다.
// 실제로는 곱셈의 경우 두번째 행렬은 첫번째 행렬과 곱할수 있으면 된다.

  printf("행렬의 덧셈 뺄셈 곱셈을 위해서 3 수를 입력하세요: ");
  scanf("%d %d %d", &n1, &n2, &n3);

  arrA=(double **)malloc(4*n1);
  arrB=(double **)malloc(4*n2);
  arrC=(double **)malloc(4*n1);

  ptr=(double *)malloc(8*n1*n2);
  for(i=0;i<n1;i++) arrA[i]=(double *)((int)ptr+8*n2*i);

  ptr=(double *)malloc(8*n2*n3);
  for(i=0;i<n2;i++) arrB[i]=(double *)((int)ptr+8*n3*i);

  ptr=(double *)malloc(8*n1*n3);
  for(i=0;i<n1;i++) arrC[i]=(double *)((int)ptr+8*n3*i);

  for(i=0;i<n1;i++) {
    for(j=0;j<n2;j++) {
      printf("행렬 1 [%d][ %d] 의 값: ", i, j);
      scanf("%lf", &x);

      arrA[i][j]=x;
    }
  }

  for(i=0;i<n1;i++) {
    for(j=0;j<n2;j++) {
      printf("행렬 2 [%d][ %d] 의 값: ", i, j);
      scanf("%lf",  &x );

      arrB[i][j]=x; 
    }
  }

  matAdd(arrA, arrB, arrC, n1, n2);

  

  printf("\n행렬의 덧셈: \n");

  matPrint(arrC, n1, n2);

  

  matSub(arrA, arrB, arrC, n1, n2);

  

  printf("\n행렬의 뺄셈: \n");

  matPrint(arrC, n1, n2);  

 


// #########################################################################
// 행렬A의 행 n1 열 n2 행렬B의 행 n2 열 n3 이어야 한다. 행렬C의 행 n1 열 n3 이어야 한다.
//##########################################################################

  matMult(arrA, arrB, arrC, n1, n2, n3);
 

  printf("\n행렬의 곱셈: \n");

  matPrint(arrC, n1, n3);


  return 0;

}

'c·c++ > c 프로그래밍' 카테고리의 다른 글

주민번호 체크수자는 어떻게 구하나?  (0) 2012.03.26
네이버 질문 중에서   (0) 2012.03.26
하노이탑 이해하기  (0) 2012.03.24
동적할당 행렬의 곱셈  (0) 2012.03.24
10000팩토리얼 구하기  (0) 2012.03.23