我的程序有效,但它告诉我这个功能有错误
Fraction(int a, int b)
// generate a fraction which is a/b
{
num = a;
if(b > 0)
den = b;
else
den = 1;
}
我的程序被编写为输出错误而不是编译器给我一个错误,所以程序说这个成员构造函数是不正确的,我需要确保denom永远不会消极。 这有什么不对吗?
#include <iostream>
#include <cmath>
#include <cassert>
using namespace std;
class Fraction
{
public:
// constructor
Fraction(int a, int b)
// generate a fraction which is a/b
{
num = a;
if(b > 0)
den = b;
else
den = 1;
}
Fraction(int a)
// generate a fraction which is a/1
{
num=a;
den=1;
}
Fraction()
// generate a fraction which is 0/1. i.e 0
{
num=0;
den=1;
}
// member functions
int get_numerator() const
// return the numerator of the fraction
{
return num;
}
int get_denominator() const
// return the denominator of the fraction
{
return den;
}
void reduce()
// reduce this fraction to simplest form. For instance,
// 2/4 will be reduced to 1/2
{
num /= gcd();
den /= gcd();
}
Fraction reciprocal() const
// return the reciprocal of this Fraction
{
return Fraction(den, num);
}
// friend functions
friend Fraction operator +(const Fraction& f1, const Fraction& f2)
// return the sum of f1 and f2,
// the result is reduced
{
int n = f1.num * f2.den + f2.num * f1.den;
int d = f1.den * f2.den;
Fraction temp = Fraction(n, d);
temp.reduce();
return temp;
}
friend Fraction operator -(const Fraction& f1, const Fraction& f2)
// return the difference of f1 and f2,
// the result is reduced
{
int n = f1.num *f2.den - f2.num * f1.den;
int d = f1.den * f2.den;
Fraction temp = Fraction(n, d);
temp.reduce();
return temp;
}
friend Fraction operator *(const Fraction& f1, const Fraction& f2)
// return the product of f1 and f2,
// the result is reduced
{
int n = f1.num * f2.num;
int d = f1.den * f2.den;
Fraction temp = Fraction(n, d);
temp.reduce();
return temp;
}
friend Fraction operator /(const Fraction& f1, const Fraction& f2)
// return the quotient of f1 and f2,
// the result is reduced
{
int n = f1.num * f2.den;
int d = f1.den * f2.num;
Fraction temp = Fraction(n, d);
temp.reduce();
return temp;
}
friend Fraction operator -(const Fraction& f)
// return the negation of f
{
Fraction temp;
temp.num=-f.num;
return temp;
}
friend bool operator < (const Fraction& f1, const Fraction& f2)
// return true if f1 is less than f2.
// False otherwise
{
return f1.num*f2.den < f2.num*f1.den;
}
friend bool operator > (const Fraction& f1, const Fraction& f2)
// return true if f1 is greater than f2.
// False otherwise
{
return f1.num*f2.den > f2.num*f1.den;
}
friend bool operator <= (const Fraction& f1, const Fraction& f2)
// return true if f1 is less or equal to f2.
// False otherwise
{
return f1.num*f2.den <= f2.num*f1.den;
}
friend bool operator >= (const Fraction& f1, const Fraction& f2)
// return true if f1 is greater or equal to f2.
// False otherwise
{
return f1.num*f2.den >= f2.num*f1.den;
}
friend bool operator == (const Fraction& f1, const Fraction& f2)
// return true if f1 is equal to f2.
// False otherwise
{
return f1.num*f2.den == f2.num*f1.den;
}
friend bool operator != (const Fraction& f1, const Fraction& f2)
// return true if f1 is not equal to f2.
// False otherwise
{
return f1.num*f2.den != f2.num*f1.den;
}
friend istream& operator >> (istream& in, Fraction& f)
// input f in the form of a/b, where b cannot be zero. Also,
// if b is negative, the Fraction will change b to be positive.
// So, again, 1/-3 will be changed to -1/3
{
char temp;
in >> f.num >> temp >> f.den;
if(f.den < 0)
{
f.num *= -1;
f.den *= -1;
}
return in;
}
friend ostream& operator << (ostream& out, Fraction& f)
// output a Fraction f in form of a/b
{
out << f.num << " / " << f.den;
return out;
}
private:
int num; // numerator of the fraction
int den; // denominator of the fraction
int gcd();
// A prvate function that is used to find the gcd of numerator
// and denominator by using Euclidean Algorithm
};
// all following test functions are given
double test1();
// test all constructors and two get methods.
// All these functions worth 1.5 points
double test2();
// test neg, reduce, and reciprocal functions.
// All these functions worth 1.5 points
double test3();
// test add, sub, mul, and div functions.
// All these functions worth 3 points
double test4();
// test less, greater, equal, less_or_equal, greater_or_equal,
// not_equal. All these functions worth 2 points
double test5();
// test input and output function. This two functions worth 1 points
答案 0 :(得分:1)
a=3
和b=-4
您的构造函数将设置num=3
和denom=1
。您需要更正调用方的期望或修改代码:
if (den > 0){
num = a;
den = b;
}
else{
den = -b;
num = -a
}
答案 1 :(得分:1)
另外,要添加上面的解决方案,请处理上面den == 0的情况 所以..
if(den == 0)
{
den = 1 ;
}