[C#] 행렬 계산기 (3) - 대리 연산자를 활용하여 함축화

2020. 10. 15. 22:48·제작/기타 프로그램
반응형

기본 코드 :


//더하기 메소드
static public Matrix Plus(Matrix m1, Matrix m2) {
	Matrix result;

	/*
	행렬의 크기들을 비교하여 더 작은 행과 열에 맞추어 계산한다.
	Ex) 1 2 3       3 4      4 6 3
	    4 5 6   +   1 2   =  5 7 6
		7 8 9                7 8 9
	
	*/
	
	if(m1.row > m2.row && m1.column > m2.column) {
		result = PlusMatrix(m1, m2, m2.row, m2.column);
	}
	else if(m1.row <= m2.row) {
		result = PlusMatrix(m1, m2, m1.row, m2.column);
	}
	else if(m1.column <= m2.column) {
		result = PlusMatrix(m1, m2, m2.row, m1.column);
	}
	else {
		result = PlusMatrix(m1, m2, m1.row, m1.column);
	}
	return result;
}
		
//빼기 메소드
      
	/*
	행렬의 크기들을 비교하여 더 작은 행과 열에 맞추어 계산한다.
	Ex) 1 2 3       3 4      -2 -2 3
	    4 5 6   -   1 2   =   3 3 6
		7 8 9                 7 8 9
		
		*/
static public Matrix Minus(Matrix m1, Matrix m2) {

	Matrix result;

	if(m1.row > m2.row && m1.column > m2.column) {
		result = MinusMatrix(m1, m2, m2.row, m2.column);
	}
	else if(m1.row <= m2.row) {
		result = MinusMatrix(m1, m2, m1.row, m2.column);
	}
	else if(m1.column <= m2.column) {
		result = MinusMatrix(m1, m2, m2.row, m1.column);
	}
	else {
		result = MinusMatrix(m1, m2, m1.row, m1.column);
	}
	return result;
}

static private Matrix PlusMatrix(Matrix m1, Matrix m2, int row, int column) {
	
	/*
	반복되는 코드들을 간추려 메소드화 시켰다.
	*/
	
	Matrix res = new Matrix(row, column);
		
	for(int i = 0; i < row; i++) {
		
		ArrayList m1_row = (ArrayList) m1.matrix[i];
		ArrayList m2_row = (ArrayList) m2.matrix[i];
		
		ArrayList columns = new ArrayList();
		
		for(int j = 0; j < column; j++) {
			columns.Add((int)m1_row[j] + (int)m2_row[j]);
		}
		res.matrix.Add(columns);
	}
	return res;
}

static private Matrix MinusMatrix(Matrix m1, Matrix m2, int row, int column) {
	
	/*
	반복되는 코드들을 간추려 메소드화 시켰다.
	*/
	
	Matrix res = new Matrix(row, column);
		
	for(int i = 0; i < row; i++) {
		
		ArrayList m1_row = (ArrayList) m1.matrix[i];
		ArrayList m2_row = (ArrayList) m2.matrix[i];
		
		ArrayList columns = new ArrayList();
		
		for(int j = 0; j < column; j++) {
			columns.Add((int)m1_row[j] - (int)m2_row[j]);
		}
		res.matrix.Add(columns);
	}
	return res;
}

 

Plus와 Minus코드가 column.Add() 부분의 아주 약간의 차이를 빼곤 차이가 없기에 쓸데없는 코드 반복을 줄이기 위해

대리자 연산자를 사용해서 줄여보고자 한다.

 

 

변경된 코드 :


delegate int PlusMinusCalc(int a, int b);

static public Matrix CalcMatrix (Matrix m1, Matrix m2, 
			PlusMinusCalc pmc) {
		
	Matrix result;
	
	if(m1.row > m2.row && m1.column > m2.column) {
		result = CalculatePlusMinus(m1, m2, m2.row, m2.column, pmc);
	}
	else if(m1.row <= m2.row) {
		result = CalculatePlusMinus(m1, m2, m1.row, m2.column, pmc);
	}
	else if(m1.column <= m2.column) {
		result = CalculatePlusMinus(m1, m2, m2.row, m1.column, pmc);
	}
	else {
		result = CalculatePlusMinus(m1, m2, m1.row, m1.column, pmc);
	}
	return result;
}
static private Matrix CalculatePlusMinus (Matrix m1, Matrix m2, int row, 
			int column, PlusMinusCalc pmc) {
	
	/*
	반복되는 코드들을 간추려 메소드화 시켰다.
	*/
	
	Matrix res = new Matrix(row, column);
		
	for(int i = 0; i < row; i++) {
		
		ArrayList m1_row = (ArrayList) m1.matrix[i];
		ArrayList m2_row = (ArrayList) m2.matrix[i];
		
		ArrayList columns = new ArrayList();
		
		for(int j = 0; j < column; j++) {
			columns.Add(pmc((int)m1_row[j], (int)m2_row[j]));
		}
		res.matrix.Add(columns);
	}
	return res;
}

class main {
		
    static public int PlusDelegate(int a, int b) {return a + b;}

    static public int MinusDelegate(int a, int b) {return a - b;}

	static void Main() {
		Matrix m1 = new Matrix();
		m1.inputRowColumn();
		m1.inputMatrix();
		m1.printMatrix();
	
		Matrix m2 = new Matrix();
		m2.inputRowColumn();
		m2.inputMatrix();
		m2.printMatrix();
		
		Matrix m3 = Matrix.CalcMatrix(m1, m2, new PlusMinusCalc(PlusDelegate));
		m3.printMatrix();
		
		Matrix m4 = Matrix.CalcMatrix(m1, m2, new PlusMinusCalc(MinusDelegate));
		m4.printMatrix();
	}
}

 

1. 대리자 연산자를 정의한다.

delegate int PlusMinusCalc(int a, int b);

2. 연산에 필요한 메소드들을 정의한다.

static public int PlusDelegate(int a, int b) {return a + b;}

static public int MinusDelegate(int a, int b) {return a - b;}

 

3. 필요한 메소드에 대리자 연산자를 매개변수로 넣는다.

static public Matrix CalcMatrix (Matrix m1, Matrix m2, 
			PlusMinusCalc pmc) {
		···
}
static private Matrix CalculatePlusMinus 
			(Matrix m1, Matrix m2, int row, 
			int column, PlusMinusCalc pmc) {
	
	/*
	반복되는 코드들을 간추려 메소드화 시켰다.
	*/
	
	···
}

 

4. 메소드 호출시 대리자 연산자를 생성하여 매개변수로 보낸다.

//Plus 연산
Matrix m3 = Matrix.CalcMatrix(m1, m2, new PlusMinusCalc(PlusDelegate));
m3.printMatrix();

//Minus 연산
Matrix m4 = Matrix.CalcMatrix(m1, m2, new PlusMinusCalc(MinusDelegate));
m4.printMatrix();

 

사용 예제 :


 

반응형
저작자표시 (새창열림)

'제작 > 기타 프로그램' 카테고리의 다른 글

[C#] 행렬 계산기 (6) - 전체 코드  (0) 2020.10.21
[C#] 행렬 계산기 (5) - 곱셈 계산  (0) 2020.10.21
[C#] 행렬 계산기 (4) - 이차원 배열로 더 간단하게 표현  (0) 2020.10.20
[C#] 행렬 계산기(2) - 더하기, 빼기 메소드  (0) 2020.10.11
[C#] 행렬 계산기 (1) - 행렬 생성 및 입력 출력  (0) 2020.10.09
'제작/기타 프로그램' 카테고리의 다른 글
  • [C#] 행렬 계산기 (5) - 곱셈 계산
  • [C#] 행렬 계산기 (4) - 이차원 배열로 더 간단하게 표현
  • [C#] 행렬 계산기(2) - 더하기, 빼기 메소드
  • [C#] 행렬 계산기 (1) - 행렬 생성 및 입력 출력
Dev.Poinguinie
Dev.Poinguinie
게임, 코딩 블로그 입니다. 여러 일상적인 글도 올려요! 많이 봐주세요! 감사합니다.
  • Dev.Poinguinie
    펭귄교수
    Dev.Poinguinie
    • 분류 전체보기
      • 새티스팩토리
        • 정보
        • 모드
        • 리뷰
      • 펠월드
        • 정보
        • 패치노트
      • 게임
        • 스팀 세일
        • 테라리아
        • 디펜서바이버
      • App
        • Kotlin
        • Flutter
      • Front End
        • HTML
        • JavaScript
        • React
      • Back End
        • Node.js
      • Docker
        • Docker 강의
        • Docker Project
      • 프로그래밍
        • AI
        • Chrome Extension
        • Markdown
        • Python
        • C++
        • Linux
        • Error
        • Tool
      • Computer Science
        • Algorithm
        • Network
      • 게임 프로그래밍
        • 유니티
      • 제작
        • 웹사이트
        • 기타 프로그램
      • 일상
        • 자작시
        • 노래 추천 및 정보
        • 블로그 운영
        • 내일의 모든 것
        • 오블완 챌린지
      • 리뷰
        • 식당 리뷰
        • IT 리뷰
  • 최근 글

  • 링크

    • 새티스 팩토리 모드
    • 깃허브 블로그
    • 깃허브 프로필
  • 공지사항

    • 티스토리 스킨 변경
    • 파이썬 코딩 강의 공지사항
  • hELLO· Designed By정상우.v4.10.3
Dev.Poinguinie
[C#] 행렬 계산기 (3) - 대리 연산자를 활용하여 함축화
상단으로

티스토리툴바