一个简单的分数类

                            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;

}
写在最后

本次的分数类是较为简单的,虽然看上去又臭又长,但只要写了一会就发现
大部分的工作都是相似的。作为小白,有些低级的错误让大家见笑了

下面放出我们的作业,多了单目的运算
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值