C++的一个简单的分数类
最近老师布置了一个分数类的作业,完成之后决定写出来和大家分享一下,本人是一个小白,程序中难免会有许多不完善的地方,希望大家能多多谅解。
本文主要使用了几个自己编写的头文件(函数)和一个类定义来实现程序
程序使用形式
分数的加减乘除和比较通分
(+ - * / < > <= >= == !=)
如:
输入 1/2 + 1/3 输出 5/6
输入 1/2 < 1/3 输出 FLASE
几个重要的头文件
1.最大公因数和最小公倍数
#ifndef __FACTOR_H__
#define __FACTOR_H__ //定义文件名(factor.h)
// 最大公因数
int factor(int a, int b)
{H
a = (a%b == 0 ? b : factor(b, a%b)); //使用了函数的递归
return a;
}
#endif
#ifndef __MULTIPLE_H_
#define __MULTIPLE_H_ // 定义文件名(multiple.h)
#include"factor.h" //使用上面定义的公因数函数
//公倍数
int multiple(int a, int b)
{
int k;
k = (a%b == 0 ? b : factor(b, a%b));
k = (a / k)*(b / k)*k;
return k;
}
#endif
2.将输入的字符串转化为数字,并求出分子分母
比如我们输入 1/8 ,这个函数可以帮我们将1, 8 分离出来
分子分母思路一样,返回值不同,下面只展示返回分子的头文件
#ifndef __NUMERATOR_T__
#define __NUMERATOR_T__ //定义文件名(numerator.h)
#include<math.h>
//求分子
int numerator(char a[20]) //返回分子值,形参是一段字符,且假设长度小于20
{
char x[20] = { "0" }; char y[20] = { "0" }; // x用于分子,y用于分母
int k = 0; int fenzi; int fenmu;
for (int n = 0; n <= 19; n++) //20-1
{
if (a[n] != '/') //当遇到“/”时停下
{
x[n] = a[n];
}
else { k = n; break; }
}
fenzi = k; //分子位数
for (int n = 0; k <= 18; k++, n++) //20-2
{
if (a[k + 1] != '\0')
{
y[n] = a[k + 1];
}
else { fenmu = n; break; } // 分母位数
}
// cout<<x<<y 即可检验是否出错
//下面将字符如“123”转换为int 123
int zi = 0; int mu = 0;
int wei = 0;
for (int n = fenzi - 1; n >= 0; n--) //从分子个位开始
{
int shu;
if (n > 0 || a[n] != '-')
{
shu = int(a[n]) - 48;
zi = zi + pow(10, wei)*shu; wei++;
}
else { zi = -zi; break; } //分子为负数的情况下
}
wei = 0;
for (int n = fenmu + fenzi; n > fenzi; n--)
{
int shu;
shu = int(a[n]) - 48;
mu = mu + pow(10, wei)*shu; wei++;
}
return zi; //返回int型 分子值
};
#endif //
3.判断进行何种运算
这个函数先涉及了类定义,有疑问的兄弟可以先跳过
#ifndef __DOUBLE_H__
#define __DOUBLE_H__ //定义文件名(double.h)
#include <iostream>
using namespace std;
#include <math.h>
#include"numerator.h" //numerator 取分子
#include"denominator.h" //denominator 取分母
#include"factor.h" //Common factor 公因数
#include"multiple.h" //Common multiple 公倍数
#include"fraction.h " //fraction 分数类的定义
#include"positive.h" //Positive number 取正数 很简单的函数略过
void doubles(char o,char *A,char *B)//三个形参,A,B代表两个分数
{
// 字符 o 利用字母(ABCD……)代表+ - / * > < >= <= == !=
switch (o)
{
case 'A':
{
fraction fra1; fraction fra2(A); fraction fra3(B);
fra1 = fra2 + fra3; //类的自定义加法,在类定义中重载
fra1.showout1(); //类的输出函数
}
break;
case 'B':
{
fraction fra1; fraction fra2(A); fraction fra3(B);
fra1 = fra2 - fra3;
fra1.showout1();
}
break;
case 'C':
{
fraction fra1; fraction fra2(A); fraction fra3(B);
fra1 = fra2 * fra3;
fra1.showout1();
}
break;
case 'D':
{
fraction fra1; fraction fra2(A); fraction fra3(B);
fra1 = fra2 / fra3;
fra1.showout1();
}
break;
case 'E':
{
fraction fra1; fraction fra2(A); fraction fra3(B);
fra1 = fra2 || fra3; // 两个分数通分
}
break;
case 'F':
{
fraction fra1; fraction fra2(A); fraction fra3(B);
fra1 = fra2 > fra3;
fra1.showout2(); //类的另一种输出函数
}
break;
case'G':
{
fraction fra1; fraction fra2(A); fraction fra3(B);
fra1 = fra2 < fra3;
fra1.showout2();
}
break;
case'H':
{
fraction fra1; fraction fra2(A); fraction fra3(B);
fra1 = fra2 >= fra3;
fra1.showout2();
}
break;
case'I':
{
fraction fra1; fraction fra2(A); fraction fra3(B);
fra1 = fra2 <= fra3;
fra1.showout2();
}
break;
case'J':
{
fraction fra1; fraction fra2(A); fraction fra3(B);
fra1 = fra2 == fra3;
fra1.showout2();
}
break;
case'K':
{
fraction fra1; fraction fra2(A); fraction fra3(B);
fra1 = fra2 != fra3;
fra1.showout2();
}
break;
default:cout << "错误的输入" << endl;
}
};
#endif // !1
类定义
定义类 fraction
#ifndef __FRACTION_H__
#define __FRACTION_H__
#include <math.h>
#include"numerator.h" //numerator 取分子
#include"denominator.h" //denominator 取分母
#include"factor.h" //Common factor 公因数
#include"multiple.h" //Common multiple 公倍数
#include"positive.h" //Positive number 取正数
using namespace std;
//定义一个类的运算,通过运算符的重载来实现双目运算符的实现
class
fraction
{
public:
fraction(const char*str) //构造函数实现初始化
{
a = new char[20];
strcpy(a, str);
}
fraction() {};
//下面都是重载运算符,以友元函数形式出现
friend fraction operator + (const fraction &b1, const fraction &b2);
friend fraction operator - (const fraction &b1, const fraction &b2);
friend fraction operator * (const fraction &b1, const fraction &b2);
friend fraction operator / (const fraction &b1, const fraction &b2);
friend fraction operator > (const fraction &b1, const fraction &b2);
friend fraction operator < (const fraction &b1, const fraction &b2);
friend fraction operator >= (const fraction &b1, const fraction &b2);
friend fraction operator <= (const fraction &b1, const fraction &b2);
friend fraction operator != (const fraction &b1, const fraction &b2);
friend fraction operator == (const fraction &b1, const fraction &b2);
friend fraction operator || (const fraction &b1, const fraction &b2); //通分运算符
void showout1()
{ // 避免输出1/-2 的情况
if (mu < 0 && zi>0)
{
cout << -zi << "/" << -mu<<endl;
}
if (mu < 0 && zi <= 0)
{
cout << -zi << "/" << -mu<<endl;
}
if (mu > 0 && zi > 0)
{
cout << zi << "/" << mu<<endl ;
}
if (mu > 0 && zi <= 0)
{
cout<< zi << "/" << mu<<endl;
}
if (mu == 0)
{
cout << " 分母为0,错误!"<<endl;
}
};
void showout2()
{
if (boo1 == 1) { cout << "TURE"<<endl; }
if (boo1 == 0) { cout<< "FLASE"<<endl; }
}
int x, y;
private:
char *a;
int zi, mu; //分子,分母
int boo1; //对错
};
fraction operator + (const fraction &b1, const fraction &b2)
{
fraction fra; // 返回一个fraction 类
int x1, x2, y1, y2;
x1 = numerator(b1.a); x2 = numerator(b2.a); //取分子
y1 = denominator(b1.a); y2 = denominator(b2.a); //取分母
int z1; z1 = factor(y1, y2); //公因数
int z2; z2 = multiple(y1, y2); //公倍数
fra.zi = x1 * (z2 / y1) + x2 * (z2 / y2);
fra.mu = z2;
//上下约分
fra.x = positive(fra.zi); //取正数
fra.y = positive(fra.mu);
fra.x = factor(fra.x, fra.y);
fra.zi = fra.zi / fra.x;
fra.mu = fra.mu / fra.x;
return fra;
}
//同加法
fraction operator - (const fraction &b1, const fraction &b2)
{
fraction fra;
int x1, x2, y1, y2;
x1 = numerator(b1.a); x2 = numerator(b2.a);
y1 = denominator(b1.a); y2 = denominator(b2.a);
int z1; z1 = factor(y1, y2);
int z2; z2 = multiple(y1, y2);
fra.zi = x1 * (z2 / y1) - x2 * (z2 / y2);
fra.mu = z2;
fra.x = positive(fra.zi);
fra.y = positive(fra.mu);
fra.x = factor(fra.x, fra.y);
fra.zi = fra.zi / fra.x;
fra.mu = fra.mu / fra.x;
return fra;
}
fraction operator * (const fraction &b1, const fraction &b2)
{
fraction fra;
int x1, x2, y1, y2;
x1 = numerator(b1.a); x2 = numerator(b2.a);
y1 = denominator(b1.a); y2 = denominator(b2.a);
int z1; z1 = factor(y1, y2);
int z2; z2 = multiple(y1, y2);
fra.zi = x1 * x2;
fra.mu = y1 * y2;
fra.x = positive(fra.zi);
fra.y = positive(fra.mu);
fra.x = factor(fra.x, fra.y);
fra.zi = fra.zi / fra.x;
fra.mu = fra.mu / fra.x;
return fra;
}
fraction operator / (const fraction &b1, const fraction &b2)
{
fraction fra;
int x1, x2, y1, y2;
x1 = numerator(b1.a); x2 = numerator(b2.a);
y1 = denominator(b1.a); y2 = denominator(b2.a);
int z1; z1 = factor(y1, y2);
int z2; z2 = multiple(y1, y2);
fra.zi = x1 * y2;
fra.mu = y1 * x2;
fra.x = positive(fra.zi);
fra.y = positive(fra.mu);
fra.x = factor(fra.x, fra.y);
fra.zi = fra.zi / fra.x;
fra.mu = fra.mu / fra.x;
return fra;
}
fraction operator > (const fraction &b1, const fraction &b2)
{
fraction fra;
int x1, x2, y1, y2;
x1 = numerator(b1.a); x2 = numerator(b2.a);
y1 = denominator(b1.a); y2 = denominator(b2.a);
int z1; z1 = factor(y1, y2);
int z2; z2 = multiple(y1, y2);
if ((x1 * (z2 / y1)) > (x2 * (z2 / y2)))
{
fra.boo1 = 1;
}
else { fra.boo1 = 0; }
return fra;
}
fraction operator < (const fraction &b1, const fraction &b2)
{
fraction fra;
int x1, x2, y1, y2;
x1 = numerator(b1.a); x2 = numerator(b2.a);
y1 = denominator(b1.a); y2 = denominator(b2.a);
int z1; z1 = factor(y1, y2);
int z2; z2 = multiple(y1, y2);
if ((x1 * (z2 / y1)) < (x2 * (z2 / y2)))
{
fra.boo1 = 1;
}
else { fra.boo1 = 0; }
return fra;
}
fraction operator >= (const fraction &b1, const fraction &b2)
{
fraction fra;
int x1, x2, y1, y2;
x1 = numerator(b1.a); x2 = numerator(b2.a);
y1 = denominator(b1.a); y2 = denominator(b2.a);
int z1; z1 = factor(y1, y2);
int z2; z2 = multiple(y1, y2);
if ((x1 * (z2 / y1)) >= (x2 * (z2 / y2)))
{
fra.boo1 = 1;
}
else { fra.boo1 = 0; }
return fra;
}
fraction operator <= (const fraction &b1, const fraction &b2)
{
fraction fra;
int x1, x2, y1, y2;
x1 = numerator(b1.a); x2 = numerator(b2.a);
y1 = denominator(b1.a); y2 = denominator(b2.a);
int z1; z1 = factor(y1, y2);
int z2; z2 = multiple(y1, y2);
if ((x1 * (z2 / y1)) <= (x2 * (z2 / y2)))
{
fra.boo1 = 1;
}
else { fra.boo1 = 0; }
return fra;
}
fraction operator == (const fraction &b1, const fraction &b2)
{
fraction fra;
int x1, x2, y1, y2;
x1 = numerator(b1.a); x2 = numerator(b2.a);
y1 = denominator(b1.a); y2 = denominator(b2.a);
int z1; z1 = factor(y1, y2);
int z2; z2 = multiple(y1, y2);
if ((x1 * (z2 / y1)) == (x2 * (z2 / y2)))
{
fra.boo1 = 1;
}
else { fra.boo1 = 0; }
return fra;
}
fraction operator != (const fraction &b1, const fraction &b2)
{
fraction fra;
int x1, x2, y1, y2;
x1 = numerator(b1.a); x2 = numerator(b2.a);
y1 = denominator(b1.a); y2 = denominator(b2.a);
int z1; z1 = factor(y1, y2);
int z2; z2 = multiple(y1, y2);
if ((x1 * (z2 / y1)) != (x2 * (z2 / y2)))
{
fra.boo1 = 1;
}
else { fra.boo1 = 0; }
return fra;
}
//通分直接输出
fraction operator || (const fraction &b1, const fraction &b2)
{
fraction fra;
int x1, x2, y1, y2;
x1 = numerator(b1.a); x2 = numerator(b2.a);
y1 = denominator(b1.a); y2 = denominator(b2.a);
int z1; z1 = factor(y1, y2);
int z2; z2 = multiple(y1, y2);
fra.zi = x1 * (z2 / y1) + x2 * (z2 / y2);
fra.mu = z2;
cout << x1 * (z2 / y1) << "/" << z2 << " " << x2 * (z2 / y2) << "/" << z2 << endl;
return fra;
};
#endif // !__FRACTION_H__
主程序
由于我们将重要的程序都分块放到了头文件中,主程序只需要判断执行什么双目运算
#include <iostream>
#include <math.h>
#include"numerator.h" //numerator 取分子
#include"denominator.h" //denominator 取分母
#include"factor.h" //Common factor 公因数
#include"multiple.h" //Common multiple 公倍数
#include"fraction.h" //fraction 分数类的定义
#include"positive.h" //Positive number 取正数
#include"double.h" //双目运算符的选择
using namespace std;
int main()
{
char a[20], b[20], c[20];
cin>>a,cin>>b;cin>> c;
char B= '0'
{
//判断是什么双目运算符
if (strcmp(b, "+") == 0) //字符比较函数在标准库中
B = 'A';
else if (strcmp(b, "-") == 0)
B = 'B';
else if (strcmp(b, "*") == 0)
B = 'C';
else if (strcmp(b, "/") == 0)
B = 'D';
else if (strcmp(b, "tongfen") == 0) //通分
B = 'E';
else if (strcmp(b, ">") == 0)
B = 'F';
else if (strcmp(b, "<") == 0)
B = 'G';
else if (strcmp(b, ">=") == 0)
B = 'H';
else if (strcmp(b, "<=") == 0)
B = 'I';
else if (strcmp(b, "==") == 0)
B = 'J';
else if (strcmp(b, "!=") == 0)
B = 'K';
doubles(B, a, c); //执行双目运算
}
}
return 0;
}
写在最后
本次的分数类是较为简单的,虽然看上去又臭又长,但只要写了一会就发现
大部分的工作都是相似的。作为小白,有些低级的错误让大家见笑了
下面放出我们的作业,多了单目的运算