题目:设计实现抽象数据类型“有理数”
内容:设计并上机实现抽象数据类型“有理数”,有理数的基本操作包括:两个有理数的加、减、乘、除等(包括有理数的创建和输出)。
要求:
- 有理数的类型,我们可以构造成一个结构体类型,这个结构体由两个整数构成,分别表示有理数的分子和分母。 //int fz; int fm;
- 在初始化或创建一个有理数时,可以给出有理数的分子和分母来创建一个有理数;也可以给出一个小数形式的有理数,来计算对应的分子分母来创建一个有理数(可设置一个允许的计算误差)。
- 以分数形式创建有理数时,要处理分母为零的异常情况。
- 输出不能有类似于4/4、3/6这样的结果数据。
- 要有能根据用户输入选择不同运算的菜单选择界面。
#include<stdio.h>
#include<math.h>
struct fraction{
int molecule;
int denominator;
}f[2];
int reduction(int m,int n){
int max,min,i,largest_reduction=1;
if(m<0)m=abs(m);
if(n<0)n=abs(n);
if(m>=n){
max=m,min=n;
}
else{
max=n,min=m;
}
for(i=2;i<=min;i++){
if(max%i==0&&min%i==0){
max/=i;
min/=i;
largest_reduction*=i;
i=1;
}
}
return largest_reduction;
}
int decimal(float n){
int time=0;
while(n-int(n)!=0){
time++;
n*=10;
}
return time;
}
int bigger(int time,float n){
int i;
for(i=0;i<time;i++){
n*=10;
}
return n;
}
void print(int n,int m){
if(n==0){
printf("0\n");
}
else{
if(abs(n)==abs(m)){
if(m!=n){
printf("-1\n");
}
else{
printf("1\n");
}
}
else{
printf("%d/%d\n",n,m);
}
}
}
int main(int argc,char*argv[])
{
struct fraction f[2];
int choose,work=0,i,j,k=0;
float molecule[2]={0},denominator[2]={1,1};
int mol,den;
for(i=0;i<2;i++){
printf("***********************************\n");
printf("* 菜单 *\n");
printf("* 1:输入一个分数 *\n");
printf("* 2:输入一个小数 *\n");
printf("***********************************\n");
printf("输入想要进行操作的序号:");
scanf("%d",&choose);
if(choose==1){
printf("输入分子和分母(空格隔开):\n");
scanf("%d %d",&f[i].molecule,&f[i].denominator);
while(f[k].denominator==0){
printf("分母不合法!请重新输入分母:");
scanf("%d",&f[i].denominator);
}
}
else if(choose==2){
printf("输入小数:\n");
scanf("%f",&molecule[i]);
f[i].molecule=bigger(decimal(molecule[i]),molecule[i]);
f[i].denominator=bigger(decimal(molecule[i]),1);
}
else{
printf("无效的操作!请重新输入:");
i--;
}
}
for(i=0;i<1;i++){
printf("*******************************\n");
printf("* 菜单 *\n");
printf("* 1:加法 2:减法 *\n");
printf("* 3:乘法 4:除法 *\n");
printf("* 5:结束 *\n");
printf("*******************************\n");
printf("输入想要进行操作的序号:");
scanf("%d",&choose);
if(choose==1){
mol=f[0].molecule*f[1].denominator+f[1].molecule*f[0].denominator;
den=f[1].denominator*f[0].denominator;
printf("%d/%d + %d/%d=",f[0].molecule,f[0].denominator,f[1].molecule,f[1].denominator);
print(mol/reduction(mol,den),den/reduction(mol,den));
i--;
}
else if(choose==2){
mol=f[0].molecule*f[1].denominator-f[1].molecule*f[0].denominator;
den=f[1].denominator*f[0].denominator;
printf("%d/%d - %d/%d=",f[0].molecule,f[0].denominator,f[1].molecule,f[1].denominator);
print(mol/reduction(mol,den),den/reduction(mol,den));
i--;
}
else if(choose==3){
mol=f[0].molecule*f[1].molecule;
den=f[1].denominator*f[0].denominator;
printf("%d/%d * %d/%d=",f[0].molecule,f[0].denominator,f[1].molecule,f[1].denominator);
print(mol/reduction(mol,den),den/reduction(mol,den));
i--;
}
else if(choose==4){
mol=f[0].molecule*f[1].denominator;
den=f[1].molecule*f[0].denominator;
printf("%d/%d / %d/%d=",f[0].molecule,f[0].denominator,f[1].molecule,f[1].denominator);
print(mol/reduction(mol,den),den/reduction(mol,den));
i--;
}
else if(choose==5){
return 0;
}
else{
printf("无效的操作!请重新输入:");
i--;
}
}
return 0;
}