본문 바로가기

My Study/Programming&Theory

n x n 행렬 곱

#include<stdio.h>
#include<stdlib.h>

int** Heap(int n);
void Input(int** imsi,int n);
void show(int** arr,int n);
void Multiply(int** arr1,int** arr2,int n);

int main(void)
{
 while(1)
 {  
  int n;
  int **arr1;  //첫번째 행렬
  int **arr2;  //두번째 행렬

  printf("n x n 행렬을 만드실 건가요?(정수 입력) : ");
  scanf("%d",&n);

  arr1=Heap(n);  //첫번째 행렬에 메모리 동적할당 2차원으로..
  arr2=Heap(n);  //두번째 행렬에 메모리 동적할당 2차원으로..

  Input(arr1,n);  //첫번째 행렬에 값 입력 1행1열~n행n열까지!
  Input(arr2,n);  //두번째 행렬에 값 입력 1행1열~n행n열까지!

  system("cls");  //화면 클리어

  show(arr1,n);  //첫번째 행렬을 보여줌
  printf("\n");
  show(arr2,n);  //두번째 행렬을 보여줌
  printf("\n");
  Multiply(arr1,arr2,n);

  fflush(stdin);
  fgetc(stdin);
  system("cls");
 }

 return 0;


}

int** Heap(int n)
{
 int i;

 int **temp=(int **)malloc(sizeof(int) * n);

 for(i = 0; i < n ; i ++)
 {
  temp[i]=(int *)malloc(sizeof(int) * n);
 }

 return temp;
}

void Input(int** imsi,int n)
{
 int j,k;
 static int a=1;
 printf("%d번째 행렬 값 입력 \n",a++);
 for(j = 0; j < n ; j ++)
 {
  for(k = 0 ; k < n ; k++)
  {
   printf("%d행 %d열 : ",j+1,k+1);
   scanf("%d",&imsi[j][k]);
  }
 }
}

void show(int** arr,int n)
{
 int i,j;
 static int b=1;

 if(b != 3)
 {

  printf("%d번째 행렬 \n",b++);
 }
 else
  printf("곱의 결과 \n");

 for(i = 0; i < n ; i++)
 {
  for(j = 0; j<n ;j++)
  {
   printf("%d  ",arr[i][j]);
  }
  printf("\n");
 }
}

void Multiply(int** arr1,int** arr2,int n)
{
 int i,j,k; //반복문 돌리는것
 int temp=0;  //값 임시 저장
 int** result = Heap(n);
 for(i = 0 ; i < n ; i++)
 {
  for(j = 0 ; j<n ; j++)
  {
   for(k = 0; k<n ; k++)
   {
    temp+=arr1[i][k] * arr2[k][j];
   }
   result[i][j] = temp;
   temp = 0;  //들어있는 값 초기화
  }
 }

 show(result,n);
}

n x n 행렬 곱 소스 입니다.
처음에 몇 곱하기 몇 행렬을 할건지 정한다음 1행1열부터 n행n열까지
2개의 행렬에 전부 써 주시면 답이 나옵니다.

'My Study > Programming&Theory' 카테고리의 다른 글

메일슬롯을 사용한 프로세스간 채팅프로그램  (0) 2009.12.08
n원 1차 연립 방정식 해 구하기  (7) 2009.12.07
Trap Flag  (0) 2009.12.05
PEB.ProcessHeap.ForceFlags  (0) 2009.12.05
PEB.ProcessHeap.Flags  (0) 2009.12.05