引言

我们说,编程语言的精髓在于封装,而面向对象语言完胜面向过程语言的原因就是具有更好的可封装性,而C++就是这样的一种多范型语言,常用而复杂的工作完全不必在每一份源文件中重敲,就好像我们不需要自己手写printf()和scanf()一样,自建一个属于自己的头文件,可以为编程提供很大的帮助,我今天就要推荐一下我自己原创的分数类(实际上C++STL库有分数类,只是性能很低,而且使用极其不方便,而我的这个分数类具有很多前者不具备的优点,而且颇具工程码风,易于理解与更新)。

注:此为原创文章,转载则务必说明原出处。

Code

将下面的代码存入一个名为fraction.h文件中,并在同目录下的源文件中加上:#include“fraction”即可使用该分数类(使用方法见后面)。

或是在IDE存放头文件的目录下添加一个名为fraction.h的文件,放入该代码并编译,然后便可在该电脑的任何地方创建.cpp文件,并用#include <fraction>包含该文件。

 //拱大垲原创
//分数类实现~~~0.8.5
//fraction:分数
//numerator:分子
//denominator:分母
//输入分数时请以回车结尾
//输入部分如含有空格,则空格后面的部分会被忽略
//fraction可缩写为fac,计算机可以识别 #include <iostream>
#include <cmath> #ifndef __fraction_h_
#define __fraction_h_ using namespace std; namespace std
{ //分数类
class fraction
{
public:
static long long MCF(long long a, long long b); friend ostream& operator<< (ostream& os,const fraction& the_fraction);
friend istream& operator>> (istream& is,fraction& the_fraction); friend fraction operator+ (const fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator- (const fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator* (const fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator/ (const fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator+= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator-= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator*= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator/= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator- (const fraction& the_fraction);
friend fraction operator++ (fraction& the_fraction);
friend fraction operator++ (fraction& the_fraction,int);
friend fraction operator-- (fraction& the_fraction);
friend fraction operator-- (fraction& the_fraction,int); friend bool operator> (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator< (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator>= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator<= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator== (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator!= (fraction& the_fraction_a,const fraction& the_fraction_b); fraction();
fraction(long long the_numerator);
fraction(long long the_numerator,long long the_denominator);
fraction(fraction the_fraction_a,fraction the_fraction_b); double decimal();
long long getnum();
long long getden();
void setnum(long long num);
void setden(long long den); private:
long long numerator;
long long denominator; }; long long fraction::MCF(long long a, long long b)
{
return a==? b:MCF(b%a,a);
} ostream& operator<< (ostream& os,const fraction& the_fraction)
{
bool book=the_fraction.numerator>=&&the_fraction.denominator>=||the_fraction.numerator<&&the_fraction.denominator<;
if(book==false)
os<<"(-";
if(the_fraction.denominator!=)
os<<abs(the_fraction.numerator)<<"/"<<abs(the_fraction.denominator);
else
os<<abs(the_fraction.numerator);
if(book==false)
os<<")";
return os;
} istream& operator>> (istream& is,fraction& the_fraction)
{
char input[];
char ch;
bool mid=false;
bool is_pt=true;
the_fraction.numerator=the_fraction.denominator=;
cin>>input;
for(int i=;;i++)
{
ch=input[i];
if(ch=='\0')
break;
if(ch=='-')
{
is_pt=!is_pt;
continue;
}
if(ch=='/')
{
mid=true;
continue;
}
if(mid==false)
the_fraction.numerator=the_fraction.numerator*+(ch-'');
else
the_fraction.denominator=the_fraction.denominator*+(ch-'');
}
if(mid==false)
the_fraction.denominator=;
if(the_fraction.denominator==)
{
cout<<"False,the denominator == 0!!!";
return is;
}
long long mcf=fraction::MCF(the_fraction.numerator,the_fraction.denominator);
the_fraction.numerator/=mcf;
the_fraction.denominator/=mcf;
if(!is_pt)
the_fraction.numerator=-the_fraction.numerator;
return is;
} fraction operator+ (const fraction& the_fraction_a,const fraction& the_fraction_b)
{
long long the_numerator=the_fraction_a.numerator*the_fraction_b.denominator+the_fraction_b.numerator*the_fraction_a.denominator;
long long the_denominator=the_fraction_a.denominator*the_fraction_b.denominator;
return fraction(the_numerator,the_denominator);
} fraction operator- (const fraction& the_fraction_a,const fraction& the_fraction_b)
{
long long the_numerator=the_fraction_a.numerator*the_fraction_b.denominator-the_fraction_b.numerator*the_fraction_a.denominator;
long long the_denominator=the_fraction_a.denominator*the_fraction_b.denominator;
return fraction(the_numerator,the_denominator);
}
fraction operator* (const fraction& the_fraction_a,const fraction& the_fraction_b)
{
long long the_numerator=the_fraction_a.numerator*the_fraction_b.numerator;
long long the_denominator=the_fraction_a.denominator*the_fraction_b.denominator;
long long mcf=fraction::MCF(the_numerator,the_denominator);
the_numerator/=mcf;
the_denominator/=mcf;
fraction the_fraction(the_numerator,the_denominator);
return the_fraction;
} fraction operator/(const fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a*fraction(the_fraction_b.denominator,the_fraction_b.numerator);
} fraction operator+= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a=the_fraction_a+the_fraction_b;
} fraction operator-= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a=the_fraction_a-the_fraction_b;
} fraction operator*= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a=the_fraction_a*the_fraction_b;
} fraction operator/= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a=the_fraction_a/the_fraction_b;
} fraction operator- (const fraction& the_fraction)
{
return -the_fraction;
} fraction operator++ (fraction& the_fraction)
{
the_fraction=the_fraction+;
return the_fraction;
}
fraction operator++ (fraction& the_fraction,int)
{
the_fraction=the_fraction+;
return the_fraction-;
}
fraction operator-- (fraction& the_fraction)
{
the_fraction=the_fraction-;
return the_fraction;
}
fraction operator-- (fraction& the_fraction,int)
{
the_fraction=the_fraction-;
return the_fraction+;
} bool operator> (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator>the_fraction_b.numerator*the_fraction_a.denominator;
}
bool operator< (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator<the_fraction_b.numerator*the_fraction_a.denominator;
}
bool operator>= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator>=the_fraction_b.numerator*the_fraction_a.denominator;
}
bool operator<= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator<=the_fraction_b.numerator*the_fraction_a.denominator;
}
bool operator== (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator==the_fraction_b.numerator*the_fraction_a.denominator;
}
bool operator!= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator!=the_fraction_b.numerator*the_fraction_a.denominator;
} fraction::fraction()
{
numerator=;
denominator=;
} fraction::fraction(long long the_numerator)
{
numerator=the_numerator;
denominator=;
} fraction::fraction(long long the_numerator,long long the_denominator)
{
long long mcf=fraction::MCF(the_numerator,the_denominator);
numerator=the_numerator/mcf;
denominator=the_denominator/mcf;
} fraction::fraction(fraction the_fraction_a,fraction the_fraction_b)
{
long long the_numerator=the_fraction_a.numerator*the_fraction_b.denominator;
long long the_denominator=the_fraction_a.denominator*the_fraction_b.numerator;
long long mcf=fraction::MCF(the_numerator,the_denominator);
numerator=the_numerator/mcf;
denominator=the_denominator/mcf;
} double fraction::decimal()
{
return 1.0*numerator/denominator;
} long long fraction::getnum()
{
return numerator;
}
long long fraction::getden()
{
return denominator;
}
void fraction::setnum(long long num)
{
numerator=num;
long long mcf=fraction::MCF(numerator,denominator);
numerator/=mcf;
denominator/=mcf;
}
void fraction::setden(long long den)
{
if(den!=)
{
denominator=den;
long long mcf=fraction::MCF(numerator,denominator);
numerator/=mcf;
denominator/=mcf;
}
else
{
cout<<"False,the denominator == 0!!!";
}
} typedef fraction fac; } #endif

使用方法

目录

  • 简介
  • 一目运算符重载
  • 二目运算符重载
  • 构造函数
  • 成员函数
  • 数据成员
  • 注意事项

简介

一个重载了几乎所有运算符的分数类。

一目运算符重载

friend fraction operator-  (const fraction& the_fraction);

friend fraction operator++ (fraction& the_fraction);

friend fraction operator++ (fraction& the_fraction,int);

friend fraction operator-- (fraction& the_fraction);

friend fraction operator-- (fraction& the_fraction,int);

这些友元函数重载了前置与后置的自增自减运算符,以及取负运算符,如a是一个分数,-a表示a的相反数,a++/a--表示后置递增/递减,++a/--a表示前置递增/递减。

二目运算符重载

friend ostream& operator<< (ostream& os,const fraction& the_fraction);

friend istream& operator>> (istream& is,fraction& the_fraction);

该函数重载了输入输出运算符,使之可以用于cin/cout对象,如a是分数类对象,其值等于-4/3,cout<<a,将在屏幕上显示(-4/3),cin>>a将读取一个整数加一个分数线再加一个整数,如42/43,输入完毕后以回车结尾,不可以以空格结尾,可以任意一个整数前加负号已输入分数(若输入-4/-3,则系统会按整数存储,即4/3)。

friend fraction operator+  (const fraction& the_fraction_a,const fraction& the_fraction_b);

friend fraction operator-  (const fraction& the_fraction_a,const fraction& the_fraction_b);

friend fraction operator*  (const fraction& the_fraction_a,const fraction& the_fraction_b);

friend fraction operator/  (const fraction& the_fraction_a,const fraction& the_fraction_b);

这四个运算符重载了+-*/四则运算,使之可以用于分数(计算结果若非最简分数,系统会自动约分)。

friend fraction operator+= (fraction& the_fraction_a,const fraction& the_fraction_b);

friend fraction operator-= (fraction& the_fraction_a,const fraction& the_fraction_b);

friend fraction operator*= (fraction& the_fraction_a,const fraction& the_fraction_b);

friend fraction operator/= (fraction& the_fraction_a,const fraction& the_fraction_b);

这四个函数重载了+=,-=,*=,/=复合运算符,使之可以用于分数,将返回其右面的表达式的值。

friend bool operator>  (fraction& the_fraction_a,const fraction& the_fraction_b);

friend bool operator<  (fraction& the_fraction_a,const fraction& the_fraction_b);

friend bool operator>= (fraction& the_fraction_a,const fraction& the_fraction_b);

friend bool operator<= (fraction& the_fraction_a,const fraction& the_fraction_b);

friend bool operator== (fraction& the_fraction_a,const fraction& the_fraction_b);

friend bool operator!= (fraction& the_fraction_a,const fraction& the_fraction_b);

该6个函数重载了关系运算符,使之可以用于分数。

构造函数

fraction();

此为默认构造函数,将分数初始化为0/1。

fraction(long long the_numerator);

此为转换构造函数,可以将一个long long类型的数据转换为分数,同时也可以显示调用,如:fraction a(10);将创建一个值为10/1的分数。

fraction(long long the_numerator,long long the_denominator);

fraction(fraction the_fraction_a,fraction the_fraction_b);

此为最主要的构造函数,将两个参数的商作为分数的值。

如:fraction a(150,100)将创建一个值为3/2的分数。

如:fraction a(fraction(2,3),fraction(3,2))将创建一个值为1/1的分数。

成员函数

double decimal();

返回分子除以分母的double型值。

long long getnum();

返回分子的值。

long long getden();

返回分母的值。

void setnum(long long num);

接受一个参数,并将其赋给分子(自动约分)。

void setden(long long den);

接受一个非0参数,并将其赋给分母(自动约分)(若参数为0,则不会赋给分母,并在标准输出流中输出错误信息:"False,the denominator == 0!!!")。

数据成员

分子:long long numerator;

分母:long long denominator;

静态成员函数

static long long MCF(long long a, long long b);

此函数接受两个long long型参数,并返回一个值等于他们的最大公因数的long long型值。如fraction::MCF(2,4)的值为2。

注意事项

  使用fraction时的一切有关代码中的fraction都可以简写为fac,二者完全等价。

  分数类的头文件与使用它的源代码文件保存在同一目录下时,必须先编译一下头文件,然后再编译源代码文件,否则会有编译错误,编译后的头文件如果被更改或转移到另一目录下后也必须重新编译,否则会有编译错误!!!

后记

  此为原创文章,未经允许,严禁转载!!!(在评论区或私信中跟我声明后可以转载,但必须说明出处)

【作品】超实用C++分数类的更多相关文章

  1. 连分数(分数类模板) uva6875

    //连分数(分数类模板) uva6875 // 题意:告诉你连分数的定义.求连分数,并逆向表示出来 // 思路:直接上分数类模板.要注意ai可以小于0 #include <iostream> ...

  2. OC2_分数类

    // // Fraction.h // OC2_分数类 // // Created by zhangxueming on 15/6/10. // Copyright (c) 2015年 zhangxu ...

  3. 第十七周oj刷题——Problem B: 分数类的四则运算【C++】

    Description 编写分数类Fraction,实现两个分数的加.减.乘和除四则运算.主函数已给定. Input 每行四个数,分别表示两个分数的分子和分母,以0 0 0 0 表示结束. Outpu ...

  4. Problem F: 分数类的类型转换

    Description 封装一个分数类Fract,用来处理分数功能和运算,支持以下操作:   1. 构造:传入两个参数n和m,表示n/m:分数在构造时立即转化成最简分数. 2. show()函数:分数 ...

  5. Problem E: 分数类的输出

    Problem E: 分数类的输出 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2699  Solved: 1227[Submit][Status][ ...

  6. java的分数类

    概述 分数类在算法中非常重要, 而在java中不那么重要,java基础类库提供 了biginteger了,提供类似方式, package 组合数学; public class Fraction { p ...

  7. UVA 10288 Coupons---概率 && 分数类模板

    题目链接: https://cn.vjudge.net/problem/UVA-10288 题目大意: 一种刮刮卡一共有n种图案,每张可刮出一个图案,收集n种就有奖,问平均情况下买多少张才能中奖?用最 ...

  8. 【Java例题】2.2 分数类

    2.定义分数类,包括分子和分母变量.构造方法. 加减乘除方法.化简方法.值计算方法和显示分子和分母的方法. 然后编写一个主类,在其主方法中通过定义两个分数对象来 显示每一个分数的分子值.分母值.化简和 ...

  9. hdu 6206 : Apple 【计算几何 + 分数类】

    题目链接 比赛时C++上__float128都被卡精度,然后扔给队友用Java的BigDecimal过了 算法不多说,求三角形外心可以参考 维基百科 https://zh.wikipedia.org/ ...

随机推荐

  1. 前端Web浏览器基于Flash如何实时播放监控视频画面(一)之获取监控摄像头的RTSP流

    本片文章只是起到抛砖引玉的作用,能从头到尾走通就行,并不做深入研究.为了让文章通俗易懂,尽量使用白话描述. 0x001: 获取 现在市场上普见的摄像头都支持RTSP协议,如果你不懂什么是RTSP协议, ...

  2. Codeforces 348B:Apple Tree(DFS+LCM+思维)

    http://codeforces.com/contest/348/problem/B 题意:给一棵树,每个叶子结点有w[i]个苹果,每个子树的苹果数量为该子树所有叶子结点苹果数量之和,要使得每个结点 ...

  3. 关于关闭WPS锁屏屏保及设置电脑自动关闭显示屏及休眠的分享

    最近公司工作的电脑突然自动加上了屏保锁屏,百思不得其解什么时候设置的,谁给设置的,未经用户允许就擅自给用户设置了??? 金山WPS未经用户允许给用户设置了锁屏屏保,而且这个功能非常不好用,按键盘有时候 ...

  4. Docker笔记(一):什么是Docker

    原文地址: http://blog.jboost.cn/2019/07/13/docker-1.html  1. 前言 接触Docker也有两年多了,断断续续玩过一些应用场景,如安装一些常用工具服务, ...

  5. 在vue项目中遇到关于对象的深浅拷贝问题

    一.问题 项目里新添加了一个多选的功能,其显示的数据都是从后端返回过来的,我们需要在返回来的数据外再额外添加一个是否选中的标记,我的选择是在返回正确的数据时将标记添加进去,然后push到数组中.然后就 ...

  6. 后端访问sso后,如何返回前端vue页面(后端redirect跳转,vue代理,axios带参)

    由于项目要加上公司的sso,出现的一系列问题,找到解决办法,在此记录一下.可能并不适合其他项目,给个参考. 前提: 前端是vue.js,后端springboot sso配置需要增加公司自己的maven ...

  7. restapi(1)- 文件上传下载服务

    上次对restapi开了个头,设计了一个包括了身份验证和使用权限的restful服务开发框架.这是一个通用框架,开发人员只要直接往里面加新功能就行了.虽然这次的restapi是围绕着数据库表的CRUD ...

  8. Image Classification

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  9. ASP.NET CORE配置用户密码验证

    在 class Startup 中配置 public void ConfigureServices(IServiceCollection services) { services.AddDbConte ...

  10. Lucene02--入门程序

    Lucene02--入门程序 开发准备: Win10 IDEA JDK1.8 1.新建一个普通的maven工程 1.1 添加依赖 <dependencies> <!-- Junit单 ...