引言

我们说,编程语言的精髓在于封装,而面向对象语言完胜面向过程语言的原因就是具有更好的可封装性,而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. POJ 2987:Firing(最大权闭合图)

    http://poj.org/problem?id=2987 题意:有公司要裁员,每裁一个人可以得到收益(有正有负),而且如果裁掉的这个人有党羽的话,必须将这个人的所有党羽都裁除,问最少的裁员人数是多 ...

  2. JVM结构的简单梳理

    #cnblogs_post_body img { width: 500px; height: auto; } JVM是什么 JVM的基本特性 JVM的流程结构 1. Java编译(Java Compi ...

  3. MyBatis从入门到精通(十):使用association标签实现嵌套查询

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解使用associati ...

  4. 实现markdown功能

    前言 由于个人一直想弄一个博客网站,所以写博客的功能也就必须存在啦,而之前想过用富文本编辑器来实现的.但是接触了markdown后,发现真的是太好玩了,而且使用markdown的话可以在博客园.CSD ...

  5. 广告过滤器 Adguard Pre v6.4.1814 Lite V2 简约绿色版

    下载地址:点我 基本介绍 当你在浏览网页的时候总是弹出广告是不是非常的不爽,小编为伙伴们提供了Adguard Pre简约绿色版,一款专业的广告过滤器.Adguard Pre简约绿色版可以帮助伙伴们完美 ...

  6. C语言调用VIX_API开关虚拟机

    #include <stdio.h> #include <stdlib.h> #include "vix.h" #define USE_WORKSTATIO ...

  7. sklearn使用技巧

    sklearn使用技巧 sklearn上面对自己api的解释已经做的淋漓尽致,但对于只需要短时间入手的同学来说,还是比较复杂的,下面将会列举sklearn的使用技巧. 预处理 主要在sklearn.p ...

  8. C#3.0新增功能10 表达式树 01 简介

    连载目录    [已更新最新开发文章,点击查看详细] 如果你使用过 LINQ,则会有丰富库(其中 Func 类型是 API 集的一部分)的经验. (如果尚不熟悉 LINQ,建议阅读 LINQ 教程,以 ...

  9. Node.js实现简易的获取access_token

    还是老样子,在自学node.js的道路上走得坑坑洼洼,按住了躁动的自己,调整好心情 ,ready........Go....! 首先在项目里新建config.json,其中 appid 与 appsc ...

  10. 《VR入门系列教程》之8---GearVR

    高端移动虚拟现实设备---三星GearVR     Oculus Rift也许是虚拟现实头显的典范,但是它还是存在许多问题.首先,它需要基于一个具有强大图形计算能力的计算机,而使用一般的笔记本.苹果A ...