C语言设计实现抽象数据类型有理数基本操作包括有理数的加法,减法,乘法,除法,以及求有理数的分子,分母。
时间: 2024-09-21 13:13:23 浏览: 79
在C语言中,由于C语言本身并不支持内置的抽象数据类型(ADT)或复杂的数据结构,我们通常需要自己手动定义结构体和相关的运算函数来实现一个有理数的数据类型。以下是一个简单的示例,展示了如何创建一个`Ratio`结构体,并为其提供加法、减法、乘法、除法以及获取分子和分母的方法:
```c
#include <stdio.h>
#include <stdbool.h>
// 定义一个表示有理数的数据结构
typedef struct {
int numerator; // 分子
int denominator; // 分母
} Ratio;
// 检查分母是否为0,防止除以零错误
bool safe_division(int a, int b) {
return b != 0;
}
// 计算两个有理数的加法
Ratio add(Ratio r1, Ratio r2) {
int new_numerator = r1.numerator * r2.denominator + r2.numerator * r1.denominator;
int new_denominator = r1.denominator * r2.denominator;
return (new_denominator == 0) ? (Ratio{}) : {new_numerator, new_denominator};
}
// 计算两个有理数的减法
Ratio subtract(Ratio r1, Ratio r2) {
int new_numerator = r1.numerator * r2.denominator - r2.numerator * r1.denominator;
int new_denominator = r1.denominator * r2.denominator;
return (new_denominator == 0) ? (Ratio{}) : {new_numerator, new_denominator};
}
// 计算两个有理数的乘法
Ratio multiply(Ratio r1, Ratio r2) {
return {r1.numerator * r2.numerator, r1.denominator * r2.denominator};
}
// 计算两个有理数的除法,如果除数不为0
Ratio divide(Ratio r1, Ratio r2) {
if (safe_division(r2.denominator, r1.denominator)) {
int new_numerator = r1.numerator * r2.denominator;
return {new_numerator, r2.numerator};
} else {
return (Ratio){0, 0}; // 返回一个特殊的标记,如{0, 0}代表"无法除"
}
}
// 获取分子和分母
void print_ratio(Ratio ratio) {
printf("(%d/%d)", ratio.numerator, ratio.denominator);
}
int main() {
Ratio r1 = {5, 3};
Ratio r2 = {2, 7};
Ratio sum = add(r1, r2);
Ratio diff = subtract(r1, r2);
Ratio prod = multiply(r1, r2);
Ratio div_result = divide(r1, r2);
printf("Addition: %s\n", print_ratio(sum));
printf("Subtraction: %s\n", print_ratio(diff));
printf("Multiplication: %s\n", print_ratio(prod));
if (div_result.numerator != 0 && div_result.denominator != 0) {
printf("Division: %s\n", print_ratio(div_result));
} else {
printf("Division is not possible.\n");
}
return 0;
}
```
在这个例子中,我们假设用户不会传递分母为零的操作数。如果你希望处理这种边界情况,可以在各个操作函数内部添加额外的检查。
阅读全文