// Fraction structure, using typedef #include using namespace std; struct Fraction { int num; int denom; }; // some useful functions void PrintFraction(Fraction f); // pass by value void InputFraction(Fraction& fptr); // pass by address Fraction AddByRef(const Fraction& f1, const Fraction& f2); Fraction AddByAddress(const Fraction* p1, const Fraction* p2); // Test routine (main) int main() { Fraction f1 = {0,1}, f2 = {3,4}, f3 = {1,2}; Fraction r1, r2; cout << "f1 = "; PrintFraction(f1); cout << "\tf2 = "; PrintFraction(f2); cout << "\tf3 = "; PrintFraction(f3); // Test out the InputFraction funtion cout << "\n\nInput new fraction for f1: "; InputFraction(f1); cout << "\nInput new fraction for f2: "; InputFraction(f2); cout << "\nInput new fraction for f3: "; InputFraction(f3); cout << "\nNew values:\n"; cout << "\nf1 = "; PrintFraction(f1); cout << "\tf2 = "; PrintFraction(f2); cout << "\tf3 = "; PrintFraction(f3); // Test out the add functions r1 = AddByRef(f1, f2); r2 = AddByAddress(&f1, &f3); cout << "\n\nf1 + f2 = "; PrintFraction(r1); cout << "\nf1 + f3 = "; PrintFraction(r2); cout << "\nf2 + f3 = "; PrintFraction(AddByRef(f2, f3)); cout << "\n"; return 0; } void PrintFraction(Fraction f) { cout << f.num << '/' << f.denom; } void InputFraction(Fraction& f) { char divsign; // to consume the '/' cin >> f.num >> divsign >> f.denom; } Fraction AddByRef(const Fraction& f1, const Fraction& f2) // pass by const reference. f1 and f2 are nicknames for the incoming data { Fraction r; // to store the result r.num = f1.num * f2.denom + f2.num * f1.denom; r.denom = f1.denom * f2.denom; return r; // returned by value // why should we NOT return by reference? } Fraction AddByAddress(const Fraction* p1, const Fraction* p2) { Fraction r; r.num = p1->num * p2->denom + p2->num * p1->denom; r.denom = p1->denom * p2->denom; return r; // returned by value }