분수(Fraction) 사칙연산하기 (struct& 사용)

c++ 언어 사용

 

 

 

문제 : 

구조체(struct)를 이용해서 분수 값들간의 사칙연산(Operations with Fractions)을 수행하는 함수를 구현한다.

 

 

 

조건 :

1. 구조체(struct)를 사용한다.
2. 두 값의 사칙연산(덧셈, 뺄셈, 곱셈, 나눗셈)에 대한 각 함수를 구현한다.
3. 두 값의 비교연산을 하는 함수를 구현한다.

4. 주소에 의한 참조(call by reference)를 사용한다.

 

 

 

풀이 코드 :

fraction.hpp

typedef struct Fraction{
	int bunja;
	int bunmo;
} Fraction;

void addFraction(Fraction &x, Fraction &y, Fraction &z);
void subFraction(Fraction &x, Fraction &y, Fraction &z);
void multFraction(Fraction &x, Fraction &y, Fraction &z);
void divFraction(Fraction &x, Fraction &y, Fraction &z);
bool compare(Fraction x, Fraction y);
void trimFraction(Fraction &x);

 

faction.cpp

#include "fraction.hpp"

void addFraction(Fraction &x, Fraction &y, Fraction &z){
	z.bunmo = x.bunmo * y.bunmo;
	z.bunja = y.bunmo * x.bunja + x.bunmo * y.bunja;
}
void subFraction(Fraction &x, Fraction &y, Fraction &z){
	z.bunmo = x.bunmo * y.bunmo;
	z.bunja = y.bunmo * x.bunja - x.bunmo * y.bunja;
}
void multFraction(Fraction &x, Fraction &y, Fraction &z){
	z.bunmo = x.bunmo * y.bunmo;
	z.bunja = y.bunja * x.bunja;
}
void divFraction(Fraction &x, Fraction &y, Fraction &z){
	z.bunmo = x.bunmo * y.bunja;
	z.bunja = y.bunmo * x.bunja;
}
bool compare(Fraction x, Fraction y){
	if(y.bunmo * x.bunja - x.bunmo * y.bunja > 0)
		return 1;
	else
		return 0;
}
void trimFraction(Fraction &x){
	int down = x.bunja, up = x.bunmo, com;
	if(x.bunja > x.bunmo){
		down = x.bunmo;
		up = x.bunja;
	}

	for(int i=1; i<=down; i++)
		if((down%i)==0 && (up%i)==0)
			com=i;

	x.bunja/=com;
	x.bunmo/=com;
}

 

main.cpp

#include<iostream>
#include "fraction.hpp"

using namespace std;

int main(){
	Fraction a, b, c;
	bool bi;

	a.bunja=5, a.bunmo=6;
	b.bunja=1, b.bunmo=3;

	printf("a = %d / %d\n", a.bunja, a.bunmo);
	printf("b = %d / %d\n\n", b.bunja, b.bunmo);

	addFraction(a,b,c);
	trimFraction(c);
	printf("더하기\t%d / %d\n", c.bunja, c.bunmo);
	
	subFraction(a,b,c);
	trimFraction(c);
	printf("빼기\t%d / %d\n", c.bunja, c.bunmo);
	
	multFraction(a,b,c);
	trimFraction(c);
	printf("곱하기\t%d / %d\n", c.bunja, c.bunmo);
	
	divFraction(a,b,c);
	trimFraction(c);
	printf("나누기\t%d / %d\n", c.bunja, c.bunmo);

	bi = compare(a,b);
	if(bi==1)
		printf("비교(큰 수) = %d / %d\n", a.bunja, a.bunmo);
	else	
		printf("비교(큰 수) = %d / %d\n", b.bunja, b.bunmo);

	return 0;
}

 

실행 결과 : 

a = 5 / 6
b = 1 / 3

더하기  7 / 6
빼기    1 / 2
곱하기  5 / 18
나누기  5 / 2
비교(큰 수) = 5 / 6

 

 

 

풀이 설명 :

이 예제의 목적은 값 의한 호출(call by value)와 참조에 의한 호출(call by reference)의 차이를 알기 위함이다.

 

[ call by value (값에 의한 호출) ]
[ call by reference (참조에 의한 호출) ]

 

값에 의한 호출

  • call by value
  • 함수를 호출할 때, 입력 파라미터 값이 복사된다.
  • (값이 복사 되므로) 복사를 위한 메모리가 추가로 필요하다.
  • (값이 복사 되므로) 복사를 위한 시간이 추가로 필요하다.

참조에 의한 호출

  • call by reference
  • 함수를 호출할 때, 입력 파라미터 값이 보관되어 있는 주소값이 복사된다.

두 호출방식의 차이는 함수를 호출할 때 사용되는 입력 파라미터의 값이 무엇이냐에 대한 차이이다. 그리고 이 두 차이가 프로그램의 속도와 메모리 관리에 영향을 미친다. 두 방식 중 어떤 방식으로 프로그래밍을 했느냐에 따라 프로그램은 다르게 동작하는데, 위 예제는 call by reference 형태로 구현했기 때문에 Fraction에 포함되어 있는 두개의 값인 bunja와 bunbo값이 복사되지 않고, 주소값만 복사되어 사용되므로 복사를 위한 메모리나 시간이 추가로 필요하지 않는다. 이해를 위해 두 방식을 비교하는 그림을 추가했다.