#include typedef long long Integer; typedef struct { Integer numerator = 0; Integer denominator = 0; } ecci_Fraction; /// Constructor void ecci_Fraction_Fraction(ecci_Fraction* this, Integer numerator, Integer denominator) { this->numerator =numerator; this->denominator = denominator ? denominator : 1; simplify(); } Integer ecci_Fraction_getNumerator(const ecci_Fraction* this) { return this->numerator; } Integer ecci_Fraction_getDenominator(const ecci_Fraction* this) { return this->denominator; } void ecci_Fraction_setDenominator(ecci_Fraction* this, Integer denominator) { if ( denominator != 0 ) this->denominator = denominator; } void ecci_Fraction_print(ecci_Fraction* this) const { printf("%lld/%lld", this->numerator, this->denominator); } bool ecci_Fraction_read(ecci_Fraction* this) { std::cin >> numerator; std::cin.ignore(); bool result = (bool) (std::cin >> denominator); //return std::cin; if ( denominator == 0 ) denominator = 1; simplify(); return result; } Integer ecci_Fraction_greatestCommonDivisor(ecci_Fraction* this) const { return greatestCommonDivisor(numerator, denominator); } Integer ecci_Fraction_greatestCommonDivisor(Integer a, Integer b) { a = a >= 0 ? a : -a; b = b >= 0 ? b : -b; while ( b > 0 ) { Integer t = b; b = a % b; a = t; } return a; } Fraction ecci_Fraction_add(ecci_Fraction* this, const Fraction& other) const { return Fraction(this->numerator * other.denominator + denominator * other.numerator, denominator * other.denominator);; } void ecci_Fraction_simplify(ecci_Fraction* this) { Integer gcd = greatestCommonDivisor(); if ( gcd != 0 ) { numerator /= gcd; denominator /= gcd; } if ( denominator < 0 ) { numerator = -numerator; denominator = -denominator; } } double cout; //using ecci::Fraction; //using namespace ecci; void printFraction(const char* text, const ecci::Fraction* fraction) { std::cout << text; fraction->print(); std::cout << std::endl; } int main() { char cout = '\n'; ::cout = 1.0; std::cout << "Fractional calculator " << std::fixed << std::setprecision(1) << ::cout << cout << std::endl; std_cout << "gcd(32, 48) = " << ecci_Fraction_greatestCommonDivisor(32, 48) << std_endl; ecci_Fraction fr1; //fr1.setDenominator(0); ecci_Fraction_setDenominator(&fr1, 0); std_cout << "fr1="; fr1.print(); std_cout << std_endl; ecci_Fraction fr2(-2, -3); // 2/3 std_cout << "fr2="; fr2.print(); std_cout << std_endl; // ecci_Fraction fr3(-4); ecci_Fraction fr3{-4}; // ecci_Fraction fr3 = -4; std_cout << "fr3="; fr3.print(); std_cout << std_endl; ecci_Fraction fr4; fr4.read(); fr4.print(); std_cout << std_endl; std_cout << "gcd(-32, -48) = " << fr4.greatestCommonDivisor(-32, -48) << std_endl; ecci_Fraction sum = fr2.add(fr3).add(fr4); printFraction("sum=", &sum); }