实验内容
(1)实现两个有理数相加、相减、相乘的运算。
(2)选作内容:实现两个有理数相除的运算
假设用户输入的分母总是非零的
首先定义了一个Rational
结构体来存储有理数的分子(numerator)和分母(denominator),然后提供了四个函数分别用于执行加、减、乘、除运算,并显示结果。
注意:
- 这个程序没有处理除法运算,因为除法运算相对复杂,需要引入除法后结果的整数部分和小数部分,且可能涉及浮点数的处理。
- 在
printRational
函数中,我们简单实现了约分功能,通过寻找分子和分母的最大公约数(gcd)来约分。这里使用了简单的穷举法来计算gcd,对于大数可能不够高效,但足以应对本示例的需求。 - 当处理有理数时,应始终确保分母不为0,尽管在这个示例中用户直接输入,实际应用中可能需要加入更严格的输入验证。
- 输出时,如果分母为负数,则将整个有理数取反,以确保输出的有理数总是正数或零(分子为零时)。
#include <stdio.h> // 定义有理数结构体Rational来存储有理数的分子和分母
typedef struct { int numerator; // 分子 int denominator; // 分母
} Rational; // 求最大公约数(GCD)
int gcd(int a, int b) { while (b != 0) { int temp = b; //将b的值暂存到temp中b = a % b; // 用a除以b的余数来更新b的值 a = temp; // 将原来的b值(现在保存在temp中)赋给a } return a; // 当b变为0时,循环结束,此时a即为两数的最大公约数
} // 约分函数
void simplify(Rational *r) { int g = gcd(r->numerator, r->denominator); // 计算最大公约数r->numerator /= g; // 使用整数除法简化分子//计算 r->numerator 除以 g 的结果,将结果赋值给 r->numerator->denominator /= g; // 使用整数除法简化分子// 确保分母为正 if (r->denominator < 0) { r->numerator = -r->numerator; // 改变分子的符号r->denominator = -r->denominator; // 改变分母的符号}
} // 加法运算
Rational addRational(Rational r1, Rational r2) { Rational result; result.numerator = r1.numerator * r2.denominator + r2.numerator * r1.denominator; result.denominator = r1.denominator * r2.denominator; simplify(&result); return result;
} // 减法运算
Rational subtractRational(Rational r1, Rational r2) { Rational result; result.numerator = r1.numerator * r2.denominator - r2.numerator * r1.denominator; result.denominator = r1.denominator * r2.denominator; simplify(&result); return result;
} // 乘法运算
Rational multiplyRational(Rational r1, Rational r2) { Rational result; result.numerator = r1.numerator * r2.numerator; result.denominator = r1.denominator * r2.denominator; simplify(&result); return result;
} // 除法运算(注意:这里不处理除数为零的情况)
Rational divideRational(Rational r1, Rational r2) { Rational result; if (r2.numerator == 0) { printf("Error: Division by zero.\n"); return (Rational){0, 0}; // 返回一个无效的有理数以表示错误 } result.numerator = r1.numerator * r2.denominator; result.denominator = r1.denominator * r2.numerator; simplify(&result); return result;
} // 打印有理数
void printRational(Rational r) { if (r.denominator == 1) { //分母为1:此时有理数实际上是一个整数,因此只打印分子printf("%d\n", r.numerator); } else if (r.numerator == 0) { //分子为0:此时有理数为0,无论分母是什么,都打印0printf("0\n"); } else { //一般情况:如果分子和分母都不是上述特殊情况,则打印分子和分母,格式为 分子/分母printf("%d/%d\n", r.numerator, r.denominator); }
} int main() { Rational r1, r2, sum, difference, product, quotient; // 输入两个有理数 printf("请输入第一个有理数的分子和分母(用空格分隔): "); scanf("%d %d", &r1.numerator, &r1.denominator); printf("请输入第二个有理数的分子和分母(用空格分隔): "); scanf("%d %d", &r2.numerator, &r2.denominator); // 执行加、减、乘、除运算 sum = addRational(r1, r2); difference = subtractRational(r1, r2); product = multiplyRational(r1, r2); quotient = divideRational(r1, r2); // 显示结果 printf("两个有理数相加的结果是: "); printRational(sum); printf("两个有理数相减的结果是: "); printRational(difference); printf("两个有理数相乘的结果是: "); printRational(product); printf("两个有理数相除的结果是: "); printRational(quotient); return 0;
}