분수(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 reference 형태로 구현했기 때문에 Fraction에 포함되어 있는 두개의 값인 bunja와 bunbo값이 복사되지 않고, 주소값만 복사되어 사용되므로 복사를 위한 메모리나 시간이 추가로 필요하지 않는다. 이해를 위해 두 방식을 비교하는 그림을 추가했다.