C++에서 생성자를 사용하여 분수에 대한 산술 연산

Jay Shaw 2023년10월12일
  1. C++에서 생성자를 사용하여 분수에 대한 산술 연산
  2. C++에서 생성자 선언 및 데이터 멤버 초기화
  3. C++에서 작업을 수행하는 멤버 메서드 구현
C++에서 생성자를 사용하여 분수에 대한 산술 연산

이 기사에서는 생성자를 사용하여 분수를 만드는 방법, 분수 배수를 줄이는 GCD를 찾는 방법, 계산을 수행하는 방법에 대해 설명합니다.

C++에서 생성자를 사용하여 분수에 대한 산술 연산

독자는 프로그램의 전제 조건을 이해해야 합니다. 생성자를 사용하여 분수를 만들려면,

  1. 분모는 0이 아니어야 합니다.
  2. 분자와 분모가 모두 서로 나눌 수 있는 경우 최소 배수로 줄여야 합니다.
  3. 프로그램은 결과가 새로운 데이터 멤버를 통해 저장되고 표시되도록 설계되어야 하며, 기존 변수는 변경되지 않아야 합니다.

이러한 조건은 프로그램을 실행 가능하게 만들고 분수를 올바르게 계산할 수 있게 합니다.

C++에서 생성자 선언 및 데이터 멤버 초기화

생성자는 다른 멤버 메서드와 상호 작용하고 서로 값을 전달합니다. 모든 생성자 프로그램의 첫 번째 단계는 가져오기 패키지를 로드하고 기본 생성자와 매개변수화된 생성자를 선언하는 것입니다.

  • 패키지를 가져옵니다.

    #include <iostream>
    
  • 멤버 메소드 reduce()는 분수를 가장 낮은 배수로 줄이는 데 사용됩니다.

    int reduce(int m, int n);
    
  • namespace stdiostream 패키지에 사용됩니다.

    using namespace std;
    
  • 클래스 이름은 멤버 메서드와 이름이 같아야 합니다.

    class computefraction
    
  • 기본 생성자 private: 분수의 분자와 분모에 대한 두 개의 데이터 멤버가 있습니다.

    {
     private:
      int topline;
      int bottomline;
    
  • 매개변수화된 생성자 public:이 이후에 선언됩니다. 기본 생성자의 데이터 멤버는 여기에서 동일한 데이터 유형 (int tl = 0, int bl = 1)을 가진 두 개의 새 변수로 초기화됩니다.

생성자 클래스에는 5개의 멤버 메서드가 있습니다. 첫번째. computefraction()은 클래스 이름과 동일한 이름을 공유하고 축소 전후의 분수 값을 저장합니다.

값이 다른 멤버 메서드에 전달되기 전에 분수의 감소가 발생해야 합니다. 4가지 연산자 계산(더하기, 빼기, 곱하기 및 나누기)에 대해 4개의 멤버 메서드가 선언됩니다.

선언된 다른 두 멤버 메서드는 분수를 읽고 인쇄합니다.

public:
computefraction(int tl = 0, int bl = 1);
computefraction sum(computefraction b2) const;
computefraction minus(computefraction b2) const;
computefraction mult(computefraction b2) const;
computefraction rem(computefraction b2) const;
void show() const;
void see();

아래는 프로그램의 첫 부분을 나타낸 것입니다.

#include <iostream>

int reduce(int m, int n);
using namespace std;
class computefraction {
 private:
  int topline;
  int bottomline;

 public:
  computefraction(int tl = 0, int bl = 1);
  computefraction sum(computefraction b2) const;
  computefraction minus(computefraction b2) const;
  computefraction mult(computefraction b2) const;
  computefraction rem(computefraction b2) const;
  void show() const;
  void see();
};

C++에서 작업을 수행하는 멤버 메서드 구현

C++에서 분수에 대한 산술 연산을 수행하는 멤버 메서드는 이 기사의 이 부분에서 구현됩니다.

C++에서 분수 클래스 연산자 오버로딩

이 프로그램에서 연산자는 두 분수의 값을 단일 개체에 맞추기 위해 모든 멤버 메서드에서 오버로드됩니다. 오버로딩은 내장 데이터형 대신 사용자 정의 데이터형을 사용하고 반환형을 변경해야 할 때 수행됩니다.

이것은 :: 범위 확인 연산자에 의해 달성됩니다. 특정 클래스에서 생성자의 지역 변수에 액세스합니다.

분수 값은 computefraction 생성자에 저장됩니다. 프로그램은 이 값을 다른 멤버 메서드에 전달하여 산술 연산을 수행하지만 먼저 분수를 줄여야 다른 멤버 메서드에 제공됩니다.

computefraction::computefraction(int tl, int bl) 구문은 computefraction 생성자의 지역 변수에 액세스하는 데 사용됩니다.

computefraction::computefraction(int tl, int bl) : topline(tl), bottomline(bl)

유사하게, 두 분수를 더하는 멤버 메소드에서 연산자 sum은 두 분수의 값에 맞게 오버로드됩니다.

통사론:

return_method class_name::operator(argument)

이 구문은 computefraction 클래스에서 sum 연산자에 액세스하고 복사 개체 b2로 오버로드하고 최종 결과를 생성자 computefraction에 반환합니다.

computefraction computefraction::sum(computefraction b2) const

C++에서 분수의 GCD를 찾는 멤버 메서드

gcd 함수는 분수 배수를 줄이기 위해 GCD를 찾습니다. 분자와 분모는 int mint n의 두 데이터 멤버입니다.

함수는 처음에 값이 음수인지 양수인지 확인합니다. 분자나 분모가 음수이면 m = (m < 0) ? -m : m;.

이 함수는 변수 mn 중에서 더 높은 값을 비교하여 분수 배수를 줄이기 위한 GCD를 찾습니다. 더 큰 값이 변수 n에 저장되면 m으로 바뀝니다.

함수는 더 높은 값이 항상 변수 m에 저장되도록 설계되었습니다. 이 기능은 m이 0으로 줄어들 때까지 높은 값에서 낮은 값을 뺍니다.

마지막으로 n 변수에 남아 있는 값은 GCD이며 반환됩니다.

int gcd(int m, int n) {
  m = (m < 0) ? -m : m;
  n = (n < 0) ? -n : n;

  while (m > 0) {
    if (m < n) {
      int bin = m;
      m = n;
      n = bin;
    }

    m -= n;
  }
  return n;
}

C++에서 분수의 분자와 분모를 줄이는 멤버 메서드

분자와 분모를 GCD로 나누어 분수를 줄입니다.

여기에서 분자에 대한 topline과 분모에 대한 bottomline의 두 변수가 초기화됩니다.

if-else 조건은 변수 bottomline 값을 확인합니다. 값이 0이면 프로그램이 오류 메시지와 함께 종료됩니다.

정수 변수 reducegcd 메서드에서 반환된 두 숫자의 GCD를 저장하기 위해 초기화됩니다.

그런 다음 reduce에 저장된 값을 toplinebottomline에서 나누어 결과를 동일한 변수에 다시 저장합니다.

computefraction::computefraction(int tl, int bl) : topline(tl), bottomline(bl) {
  if (bl == 0) {
    cout << "You cannot put 0 as a denominator" << endl;
    exit(0);  // program gets terminated
  } else
    bottomline = bl;
  int reduce = gcd(topline, bottomline);
  topline /= reduce;
  bottomline /= reduce;
}

C++에서 두 개의 분수를 추가하는 멤버 메서드 만들기

계산 작업에 사용되는 모든 메서드는 복사 생성자와 같은 복사 개체를 만듭니다. 이는 computefraction computefraction::sum(bounty b2) const 구문으로 수행됩니다.

bounty b2 키워드는 b2 사본 객체를 생성합니다. 복사 객체를 만드는 것은 추가 변수를 초기화하지 않고 두 번째 분수에 대해 객체를 재사용하는 것입니다.

두 분수 a/b와 c/d를 더하는 방정식은 다음과 같습니다.

$$ e = \frac {a \cdot d + c \cdot b } {b \cdot d} $$

변수 int tl은 분자의 결과를 저장하고 int bl은 분모의 결과를 저장합니다. 마지막으로 tlbl이 전달됩니다.

computefraction computefraction::sum(bounty b2) const {
  int tl = topline * b2.bottomline + b2.topline * bottomline;
  int bl = bottomline * b2.bottomline;

  return computefraction(tl, bl);
}

다른 멤버 메서드도 같은 방식으로 생성됩니다. 이를 확인하기 위해 독자는 이 기사의 최종 프로그램으로 이동할 수 있습니다.

C++에서 생성자를 사용하여 주요 기능을 구현하는 방법

모든 멤버 메서드가 생성되면 프로그램이 전달된 값을 반환하고 표시할 수 있도록 main() 함수를 작성해야 합니다.

이 프로그램은 최종 사용자에게 다음과 같은 순서로 선택과 응답을 제공하는 방식으로 작성되어야 합니다.

  • 덧셈, 뺄셈 등 연산자를 선택하는 옵션
  • 선택이 잘못되어 프로그램이 다시 로드되면 예외를 던집니다.
  • 올바른 선택이 주어지면 사용자는 첫 번째 분수의 분자와 분모를 입력하고 두 번째 분수를 입력해야 합니다.
  • 분모에 0을 삽입하고 종료하면 오류 예외가 발생합니다.
  • 입력이 정확하면 프로그램은 결과를 최종 응답으로 제공합니다.
  • 프로그램이 1단계로 다시 로드됩니다.

주요 기능에 대한 지역 변수 및 생성자 객체 초기화

메뉴 구동 프로그램으로 char 변수 ch가 선언됩니다. 세 개의 객체가 선언되었습니다. up은 첫 번째 분수를 전달하고 저장하고 down은 두 번째 분수를 저장하고 final은 두 분수의 결과를 표시합니다.

int main() {
  char ch;
  computefraction up;
  computefraction down;
  computefraction final;
}

Do While 루프를 사용하여 메뉴 기반 조건 구현

이 프로그램은 do-while 루프에서 5개의 메뉴 기반 케이스와 기본 케이스를 사용합니다. 처음 네 가지 경우는 계산 작업을 수행하고 다섯 번째 경우는 종료 옵션을 위해 예약되어 있습니다.

default는 범위를 벗어난 선택에 대해 정의됩니다. 프로그램은 사용자가 다섯 번째 경우를 선택하여 프로그램을 종료할 때까지 루프에서 실행됩니다.

do {
  switch (ch) {
    case '1':
      cout << "first fraction: ";
      up.see();
      cout << "Second fraction: ";
      down.see();
      final = up.sum(down);
      final.show();
      break;
    ... case '5':
      break;
      default : cerr << "Choice is out of scope" << ch << endl;
      break;
  }
} while (ch != '5');

C++에서 생성자를 사용하여 분수를 계산하는 완전한 코드

// import package
#include <iostream>

// member method to find gcd, with two data members
int gcd(int m, int n);
using namespace std;
class computefraction {
  // Default constructor
 private:
  int topline;
  int bottomline;
  // Parameterized Constructor
 public:
  computefraction(int tl = 0, int bl = 1);
  computefraction sum(computefraction b2) const;
  computefraction minus(computefraction b2) const;
  computefraction mult(computefraction b2) const;
  computefraction rem(computefraction b2) const;
  void show() const;
  void see();
};

// Member methods of class type bounty.
// In constructors, the class and constructor names must be the same.

computefraction::computefraction(int tl, int bl) : topline(tl), bottomline(bl) {
  if (bl == 0) {
    cout << "You cannot put 0 as a denominator" << endl;
    exit(0);  // program gets terminated
  } else
    bottomline = bl;
  // Below codes reduce the fractions using gcd
  int reduce = gcd(topline, bottomline);
  topline /= multiple;
  bottomline /= multiple;
}

// Constructor to add fractions
computefraction computefraction::sum(computefraction b2) const {
  int tl = topline * b2.bottomline + b2.topline * bottomline;
  int bl = bottomline * b2.bottomline;

  return computefraction(tl, bl);
}

// Constructor to subtract fractions
computefraction computefraction::minus(computefraction b2) const {
  int tl = topline * b2.bottomline - b2.topline * bottomline;
  int bl = bottomline * b2.bottomline;

  return computefraction(tl, bl);
}

// Constructor to multiply fractions
computefraction computefraction::mult(computefraction b2) const {
  int tl = topline * b2.topline;
  int bl = bottomline * b2.bottomline;

  return computefraction(tl, bl);
}

// Constructor to divide fractions
computefraction computefraction::rem(computefraction b2) const {
  int tl = topline * b2.bottomline;
  int bl = bottomline * b2.topline;

  return computefraction(tl, bl);
}

// Method to print output
void computefraction::show() const {
  cout << endl << topline << "/" << bottomline << endl;
}

// Method to read input
void computefraction::see() {
  cout << "Type the Numerator ";
  cin >> topline;
  cout << "Type the denominator ";
  cin >> bottomline;
}

// GCD is calculated in this method
int gcd(int m, int n) {
  m = (m < 0) ? -m : m;
  n = (n < 0) ? -n : n;

  while (m > 0) {
    if (m < n) {
      int bin = m;
      m = n;
      n = bin;
    }

    m -= n;
  }
  return n;
}

// Main Function
int main() {
  char ch;
  computefraction up;
  computefraction down;
  computefraction final;

  do {
    cout << " Choice 1\t Sum\n";
    cout << " Choice 2\t Minus\n";
    cout << " Choice 3\t multiply\n";
    cout << " Choice 4\t Divide\n";
    cout << " Choice 5\t Close\n";

    cout << " \nEnter your choice: ";
    cin >> ch;
    cin.ignore();

    switch (ch) {
      case '1':
        cout << "first fraction: ";
        up.see();
        cout << "Second fraction: ";
        down.see();
        final = up.sum(down);
        final.show();
        break;

      case '2':
        cout << "first fraction: ";
        up.see();
        cout << "Second fraction: ";
        down.see();
        final = up.minus(down);
        final.show();
        break;

      case '3':
        cout << "first fraction: ";
        up.see();
        cout << "Second fraction: ";
        down.see();
        final = up.sum(down);
        final.show();
        break;

      case '4':
        cout << "first fraction: ";
        up.see();
        cout << "Second fraction: ";
        down.see();
        final = up.mult(down);
        final.show();
        break;

      case '5':
        break;  // exits program.
      default:
        cerr << "Choice is out of scope" << ch << endl;
        break;
    }
  } while (ch != '5');  // program stops reloading when choice 5 is selected

  return 0;
}

출력:

 Choice 1        Sum
 Choice 2        Minus
 Choice 3        multiply
 Choice 4        Divide
 Choice 5        Close

Enter your choice: 2
first fraction: Type the Numerator 15
Type the denominator 3
Second fraction: Type the Numerator 14
Type the denominator 7

3/1
 Choice 1        Sum
 Choice 2        Minus
 Choice 3        multiply
 Choice 4        Divide
 Choice 5        Close

Enter your choice: 3
first fraction: Type the Numerator 5
Type the denominator 0
Second fraction: Type the Numerator 6
Type the denominator 8
You cannot put 0 as a denominator

--------------------------------
Process exited after 47.24 seconds with return value 0
Press any key to continue . . .

관련 문장 - C++ Math