분류 | 게시판 |
베스트 |
|
유머 |
|
이야기 |
|
이슈 |
|
생활 |
|
취미 |
|
학술 |
|
방송연예 |
|
방송프로그램 |
|
디지털 |
|
스포츠 |
|
야구팀 |
|
게임1 |
|
게임2 |
|
기타 |
|
운영 |
|
임시게시판 |
|
이렇게 분수 2개를 입력하면 분수계산기로 덧샘, 뺄셈, 곱샘, 나눗셈이 출력되게 해야 하는거예요..
사칙연산은 각각 함수로 만들어야 하고, 음수 계산이 가능해야 한다.
분모의 최대 공약수는 '유클리드 호제법'을 이용한다
분수 표현방식은 분자/분모
분수는 기약분수로 표현해야 한다. 분모에는 0이 입력될수 없다.
부호는 분자가 가지고 있고, 분자에 0이 있으면 0/0 으로 출력
이런 조건입니다. ㅠㅠㅠㅠ
struct 사용안함
#include <stdio.h>
// 분수에서 분모와 분자 중 큰 값이 어떤 값인지 가지고 있는 데이터 타입
typedef enum larger
{ DENOMINATOR,
NUMERATOR }
Larger;
/////////////////// 함수정의(함수 프로토 타입)
int findLCM(int m, int n);
Larger checkFractionWhichIsLarger(int numerator, int denominator);
void swapFirstIsLarger(int* num1, int* num2);
void addFraction1(int f1n, int f1d, int f2n, int f2d, int* rn, int* rd);
////////////////////
int main(void){
int f1d, f1n; // 분수 1의 분모, 분자 denominator, numerator
int f2d, f2n; // index 0 : 분모, 1: 분자
int r1d, r1n;
int r2[2];
// 분수 두개 입력받기
// 에러처리부분 - 분모가 0이면 다시 입력받도록 하기 : 추가하세요.
printf("input fraction 1 : ");
scanf("%d/%d", &f1n, &f1d); // 분자/분모
printf("input fraction 2 : ");
scanf("%d/%d", &f2n, &f2d); // 분자/분모
// 기약분수 만들기
makingIrreducible(&f1d, &f1n);
makingIrreducible(&f2d, &f2n);
// 사칙연산 하기
addFraction1(f1n, f1d, f2n, f2d, &r1n, &r1d);
printf(" add : %d/ %d\n", r1n,r1d);
return 0;
}
/////////////////////////////////////////////
//최대 공약수 구하기 : 유클리드 호제법
/////////////////////////////////////////////
//1071은 1029로 나누어 떨어지지 않기 때문에, 1071을 1029로 나눈 나머지를 구한다. => 42
//1029는 42로 나누어 떨어지지 않기 때문에, 1029를 42로 나눈 나머지를 구한다. => 21
//42은 21로 나누어 떨어진다.
// 최대공약수는 21;
int findGCD(int larger, int smaller){
int remainder = 0;
int devider = 0;
if(0== smaller)
return larger;
while(1){
remainder = larger % smaller;
if(0 == remainder){
return smaller;
}else {
larger = smaller;
smaller = remainder;
}
}
};
/////////////////////////////
// 최소공배수 구하기
// 두 숫자 m,n
// lcm = m * n / gcd
////////////////////////////
int findLCM(int m, int n){
int temp;
if(n>m){
temp = m;
m = n;
n = temp;
}
return (m * n) / findGCD(m,n);
}
/////////////////
Larger checkFractionWhichIsLarger(int numerator, int denominator){
Larger whichIsLarge = NUMERATOR;
if( (denominator) > (numerator)){
whichIsLarge = DENOMINATOR;
}
return whichIsLarge;
}
//////////////////////
//큰 값을 첫번째 오도록 바꾸는 함수
void swapFirstIsLarger(int* num1, int* num2){
int temp;
}
/////////////////////// 곱하기/나누기 부호처리
void checkMultipliResultSign(int *num1, int *num2){
}
/////////////////////////////
// 기약분수로 만들기
////////////////////////////
void makingIrreducible(int* numerator, int* denominator){
Larger whichIsLarge;
int larger, smaller;
int gcd;
// 분수와 분모중 큰 수 체크 & 가지고 있기
// 두수의 최대 공약수 구하기
// 두 수를 최대 공약수로 나누기
// 체크되어있는 큰 수가 어떤 수인지에 따라 값 바꾸기
}
/////////////////////////////
// 분수끼리 더하기
void addFraction1(int f1n, int f1d, int f2n, int f2d, int* rn, int* rd){
int gcd, lcm;
}
/////////////////////////////
// 분수끼리 빼기
/////////////////////////////
// 함수 작성 g
/////////////////////////////
// 분수끼리 곱하기
/////////////////////////////
void multiplyFraction1(int f1n, int f1d, int f2n, int f2d, int* rn, int* rd){
checkMultipliResultSign(&f1n, &f2n);
*rd = f1d * f2d;
*rn = f1n * f2n;
}
/////////////////////////////
// 분수끼리 나누기
/////////////////////////////
void divideFraction1(int f1n, int f1d, int f2n, int f2d, int* rn, int* rd){
}
struct 사용
#include <stdio.h>
// 분수 타입 선언
typedef struct fraction{
int denominator; //분모
int numerator; // 분자,부호는 분자가 가지고 있음.
} Fraction;
// 분수에서 분모와 분자 중 큰 값이 어떤 값인지 가지고 있는 데이터 타입
typedef enum larger
{ DENOMINATOR,
NUMERATOR }
Larger;
/////////////////// 함수정의(함수 프로토 타입)
int findGCD(int , int);
int findLCM(int, int );
Larger checkFractionWhichIsLarger(Fraction f1);
void swapFirstIsLarger(int*, int*);
void multiplyFraction1(Fraction f1, Fraction f2, Fraction* result);
Fraction multiplyFraction2(Fraction f1, Fraction f2);
void divideFraction1(Fraction f1, Fraction f2, Fraction* result);
Fraction divideFraction2(Fraction f1, Fraction f2);
////////////////////
int main(void){
Fraction f1, f2, resultSolution1, resultSolution2;
// 분수 두개 입력받기
// 에러처리부분 - 분모가 0이면 다시 입력받도록 하기 : 추가하세요.
printf("input fraction 1 : ");
scanf("%d/%d", &f1.numerator, &f1.denominator); // 분모 분자
printf("input fraction 2 : ");
scanf("%d/%d", &f2.numerator, &f2.denominator); // 분모 분자
// 기약분수 만들기
makingIrreducible(&f1);
makingIrreducible(&f2);
// 사칙연산 하기
addFraction1(f1, f2, &resultSolution1);
printf(" add : %d/ %d\n", resultSolution1.numerator, resultSolution1.denominator);
resultSolution2 = addFraction2(f1, f2);
printf(" add : %d/ %d\n", resultSolution2.numerator, resultSolution2.denominator);
return 0;
}
/////////////////////////////////////////////
//최대 공약수 구하기 : 유클리드 호제법
/////////////////////////////////////////////
//1071은 1029로 나누어 떨어지지 않기 때문에, 1071을 1029로 나눈 나머지를 구한다. => 42
//1029는 42로 나누어 떨어지지 않기 때문에, 1029를 42로 나눈 나머지를 구한다. => 21
//42은 21로 나누어 떨어진다.
// 최대공약수는 21;
int findGCD(int larger, int smaller){
int remainder = 0;
int devider = 0;
if(0== smaller)
return larger;
else if(0> smaller)
smaller *= -1;
while(1){
remainder = larger % smaller;
if(0 == remainder){
return smaller;
}else {
larger = smaller;
smaller = remainder;
}
}
};
/////////////////////////////
// 최소공배수 구하기
// 두 숫자 m,n
// lcm = m * n / gcd
////////////////////////////
int findLCM(int m, int n){
//////////////최소공배수!
}
///////////////// 분수에서 분자 분모중 큰 값 확인
Larger checkFractionWhichIsLarger(Fraction f1){
Larger whichIsLarge = NUMERATOR;
if( (f1.denominator) > (f1.numerator)){
whichIsLarge = DENOMINATOR;
}
return whichIsLarge;
}
//////////////////////
void swapFirstIsLarger(int* num1, int* num2){
int temp;
if((*num2) > (*num1)){
temp = *num1;
*num1 = *num2;
*num2 = temp;
}
}
////////////////////// 곱하기시 부호 처리
void checkMultipliResultSign(Fraction* f1, Fraction* f2){
/////////////// 곱하기시 부호처리
}
///////////////////// 부호 처리 : 분모에 부호있을 경우 부호 옮기기
// 함수 만드세요.
///////////////////// 결과가 0인이 체크
void checkResultIsZero(Fraction * f){
}
/////////////////////////////
// 기약분수로 만들기
////////////////////////////
void makingIrreducible(Fraction *f1){
Larger whichIsLarge;
int larger, smaller;
int gcd;
// 분수와 분모중 큰 수 체크 & 가지고 있기
whichIsLarge = checkFractionWhichIsLarger(*f1);
larger = f1->denominator;
smaller = f1->numerator;
swapFirstIsLarger(&larger, &smaller);
// 두수의 최대 공약수 구하기
gcd = findGCD(larger, smaller);
// 두 수를 최대 공약수로 나누기
larger /= gcd;
smaller /= gcd;
// 체크되어있는 큰 수가 어떤 수인지에 따라 값 바꾸기
if(whichIsLarge == NUMERATOR){
f1->numerator = larger;
f1->denominator = smaller;
}else {
f1->numerator = smaller;
f1->denominator = larger;
}
}
/////////////////////////////
// 분수끼리 더하기
/////////////////////////////
// 방법1 : 포인터로 넘기기!
void addFraction1(Fraction f1, Fraction f2, Fraction* result){
int gcd, lcm;
if(f1.denominator == f2.denominator){
result->denominator = f1.denominator;
result->numerator = f1.numerator + f2.numerator;
}else{
// 분모의 최대공약수와 최소공배수를 구함
lcm = findLCM(f1.denominator, f2.denominator);
gcd = findGCD(f1.denominator, f2.denominator);
result->denominator = lcm;
result->numerator = f1.numerator * (lcm / f1.denominator)
+ f2.numerator * (lcm / f2.denominator);
}
}
// 방법2 : return value사용하기
Fraction addFraction2(Fraction f1, Fraction f2){
}
/////////////////////////////
// 분수끼리 빼기
/////////////////////////////
void substractFraction1(Fraction f1, Fraction f2, Fraction* result){
}
// 방법2 : return value사용하기
Fraction substractFraction2(Fraction f1, Fraction f2){
}
/////////////////////////////
// 분수끼리 곱하기
/////////////////////////////
void multiplyFraction1(Fraction f1, Fraction f2, Fraction* result){
result->denominator = f1.denominator * f2.denominator;
result->numerator = f1.numerator * f2.numerator;
makingIrreducible(result);
}
// 방법2 : return value사용하기
Fraction multiplyFraction2(Fraction f1, Fraction f2){
Fraction result;
result.denominator = f1.denominator * f2.denominator;
result.numerator = f1.numerator * f2.numerator;
makingIrreducible(&result);
return result;
}
/////////////////////////////
// 분수끼리 나누기
/////////////////////////////
void divideFraction1(Fraction f1, Fraction f2, Fraction* result){
}
// 방법2 : return value사용하기 : 함수 만들기
너무 어려네요.... 어떻게 고쳐야 하나요?ㅠ struct도 모르겠고 return value도 모르겠고 다 모르겠습니다 ㅜ
죄송합니다. 댓글 작성은 회원만 가능합니다.