게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
c언어 분수계산...
게시물ID : computer_62272짧은주소 복사하기
작성자 : galaxynote2
추천 : 0
조회수 : 7246회
댓글수 : 6개
등록시간 : 2012/10/15 12:02:20

 

이렇게 분수 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도 모르겠고 다 모르겠습니다 ㅜ

 

꼬릿말 보기
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호