본문 바로가기
PROGRAMMING CODE/C

[SOLUTION] 행렬의 덧셈 뺄셈

by daye_ 2021. 10. 18.

[문제] 아래 출력 예와 같이 키보드로부터 양의 정수 m(2< =m<=)과 ~을 입력받고 ,

mxn정수행렬 A와B의 원소(행렬 A,B의 원소들이 가질 수 있는 값을 -100<=원소값<=100를 만족하는 정수)를 난수로 발생시켜 만든 후,

두 행렬의 덧셈(A+B)과 두 행렬의 뺄셈(A-B)의 결과를 출력하는 프로그램을 작성하시오.

(프로그램 작성시 4개 이상의 함수로 구성된 프로그램을 작성하고, 키보드로부터 입력받은 값이 조건에 맞지 않을 경우 오류 메시지를 출력하고 다시 입력받도록 할 것.)

#pragma warning(disable:4996) //scanf오류 방지 코드
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int m_input(); //m입력
int n_input(); //n입력
void addNum(int *arr, int m, int n); //배열에 난수 추가
void plusResult(int *arr1,int *arr2, int m, int n); //덧셈결과
void minusResult(int *arr1, int *arr2, int m, int n); //뺄셈결과

int main(void) {
	int m = m_input(), n = n_input();
	srand(time(NULL));
	int *arr1 = (int*)malloc(sizeof(int)*m*n); //동적할당
	int *arr2 = (int*)malloc(sizeof(int)*m*n);
	addNum(arr1, m, n);
	addNum(arr2, m, n);
	plusResult(arr1, arr2, m, n);
	minusResult(arr1, arr2, m, n);
	free(arr1);
	free(arr2);
	return 0;
}

int m_input() {
	int m = 0;
	while (1) {
		printf("<<< 행렬의 행값(m) : ");
		scanf("%d", &m);
		printf("\n");
		if (2 <= m && m <= 5) return m;
		else printf(">>> 입력 오류(조건: 2 <= m <= 5)\n\n");
	}
}

int n_input() {
	int n = 0;
	while (1) {
		printf("<<< 행렬의 행값(n) : ");
		scanf("%d", &n);
		printf("\n");
		if (2 <= n && n <= 5) return n;
		else printf(">>> 입력 오류(조건: 2 <= n <= 5)\n\n");
	}
}

void addNum(int *arr,int m, int n) {
	int a;
	for (int i = 0; i < (m*n); i++) {
		a = rand() % 2; //0과1중에 랜덤으로 받고 0이면 양수, 1이면 음수 랜덤
		if (a == 0) {   //즉, -100~100랜덤
			arr[i] = rand() % 101;
		}
		else arr[i] = (rand() % 101)*-1;
	}
}

void plusResult(int *arr1, int *arr2, int m, int n) {
	printf("\n>>> %d * %d 행렬 덧셈 결과\n",m,n);
	for (int i = 0; i < (m*n); i+=n) {
		for (int j = i; j < i+n; j++) {
			printf("%4d",arr1[j]);
		}
		printf("     ");
		for (int j = i; j < i+n; j++) {
			printf("%4d", arr2[j]);
		}
		printf("     ");
		for (int j = i; j < i + n; j++) {
			printf("%4d", arr1[j]+arr2[j]);
		}
		printf("\n");
	}

}
void minusResult(int *arr1, int *arr2, int m, int n) {
	printf("\n\n>>> %d * %d 행렬 뺄셈 결과\n",m,n);
	for (int i = 0; i < (m*n); i += n) {
		for (int j = i; j < i + n; j++) {
			printf("%4d", arr1[j]);
		}
		printf("     ");
		for (int j = i; j < i + n; j++) {
			printf("%4d", arr2[j]);
		}
		printf("     ");
		for (int j = i; j < i + n; j++) {
			printf("%4d", arr1[j] - arr2[j]);
		}
		printf("\n");
	}
	printf("\n\n\n");
}

'PROGRAMMING CODE > C' 카테고리의 다른 글

[SOLUTION] 회문 정수 판별  (0) 2021.10.18
[SOLUTION] 완전수 판별  (0) 2021.10.18
[BAEKJOON] No.14681 C언어  (0) 2021.10.18
[BAEKJOON] No.11022 C언어  (0) 2021.10.18
[BAEKJOON] No.11021 C언어  (0) 2021.10.18