java有理数类的封装_【Java笔记】有理数的类封装
分数是有理数(Rational),我们经常做分数的四则运算得到的是小数,如果我们运行分数的四则运算想要得到分数,要怎样做呢?
用类实现对有理数的封装可以做到。
有理数有两个重要的成员,即分子(numerator)和分母(denominator),另外还有重要的四则运算。
Rational类应该具有以下属性(成员变量)和功能(方法):
1.成员变量:int型变量numerator(分子)、denominator(分母)
2.方法(分数的四则运算):
(1)提供Rational add(Rational r)方法,即有理数调用该方法和参数指定的有理数做加法运算,并返回一个Rational对象。
int newNumerator=numerator*b+denominator*a;//通分后的分子运算
int newDenominator=denominator*b;//分母通分
(2)提供Rational sub(Rational r)方法,即有理数调用该方法和参数指定的有理数做减法运算,并返回一个Rational对象。
int newNumerator=numerator*b-denominator*a;//通分后的分子运算
int newDenominator=denominator*b;//分母通分
(3)提供Rational muti(Rational r)方法,即有理数调用该方法和参数指定的有理数做乘法运算,并返回一个Rational对象。
int newNumerator=numerator*a;//分子相乘
int newDenominator=denominator*b;//分母相乘
(4)提供Rational div(Rational r)方法,即有理数调用该方法和参数指定的有理数做除法运算,并返回一个Rational对象。
int newNumerator=numerator*b;//一个数除于另一个数等于一个数剩于另一个数的倒数
int newDenominator=denominator*a;
根据以上分析,给出Rational类代码如下:
Rational.java
public class Rational {
int numerator; //分子
int denominator; //分母
Rational(){
}
Rational(int a,int b){ //有参构造函数
if(a==0){
numerator=0;
denominator=0;
}
else{
setNumeratorAndDenominator(a,b);
}
}
void setNumeratorAndDenominator(int a,int b){ //设置分子和分母
int c=f(Math.abs(a),Math.abs(b)); //计算最大公约数
numerator=a/c;
denominator=b/c;
if(numerator<0&&denominator<0){
numerator=-numerator;
denominator=-denominator;
}
}
int getNumerator(){
return numerator;
}
int getDenominator(){
return denominator;
}
int f(int a,int b){ //计算最大公约数
if(awhile(r!=0){
a=b;
b=r;
r=a%b;
}
return b;
}
Rational add(Rational r){ //加法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*b+denominator*a;
int newDenominator=denominator*b;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
Rational sub(Rational r){ //减法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*b-denominator*a;
int newDenominator=denominator*b;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
Rational muti(Rational r){ //乘法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*a;
int newDenominator=denominator*b;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
Rational div(Rational r){ //除法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*b;
int newDenominator=denominator*a;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
}
现在有了Rational类,接下来就可以让该类创建若干个对象,并让它们交互信息必要的四则运算来完成程序要达成的目的(两个或两个以上的分数进行四则运算得到分数),下面的主类MainClass只用Rational对象计算两个分数的四则运算,并计算了2/1+3/2+5/3+…的前10项的和:
MainClass.java
public class MianClass {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Rational firstRational=new Rational(2,10); //第一个分数
Rational secondRational=new Rational(10,5); //第二个分数
//加法运算
Rational resultRational=firstRational.add(secondRational); //进行加法运算
int resultNumerator=resultRational.getNumerator(); //进行加法运算后的分子
int resultDenominator=resultRational.getDenominator();//进行加法运算后的分母
System.out.println("2/10+10/5="+resultNumerator+"/"+resultDenominator);
//减法运算
resultRational=firstRational.sub(secondRational);
resultNumerator=resultRational.getNumerator();
resultDenominator=resultRational.getDenominator();
System.out.println("2/10-10/5="+resultNumerator+"/"+resultDenominator);
//乘法运算
resultRational=firstRational.muti(secondRational);
resultNumerator=resultRational.getNumerator();
resultDenominator=resultRational.getDenominator();
System.out.println("2/10*10/5="+resultNumerator+"/"+resultDenominator);
//除法运算
resultRational=firstRational.div(secondRational);
resultNumerator=resultRational.getNumerator();
resultDenominator=resultRational.getDenominator();
System.out.println("2/10÷10/5="+resultNumerator+"/"+resultDenominator);
//2/1+3/2+5/3+...的前10项的和
int k=1,n=10; //项数
System.out.println("计算2/1+3/2+5/3+...的前"+n+"项的和:");
Rational sum=new Rational(0,1);//和,初始为0
Rational item=new Rational(2,1);//项值,首项为2/1
while(k<=n){
sum=sum.add(item);
k++;
int prevNumerator=item.getNumerator();
int prevDenominator=item.getDenominator();
item=new Rational(prevNumerator+prevDenominator,prevNumerator);
}
resultNumerator=sum.getNumerator();
resultDenominator=sum.getDenominator();
System.out.println("用分数表示:"+resultNumerator+"/"+resultDenominator);
double doubleResult=(resultNumerator*1.0)/resultDenominator;
System.out.println("用小数表示:"+doubleResult);
}
}
运行结果为:
(整理自Java面向对象程序设计第2版)
java有理数类的封装_【Java笔记】有理数的类封装相关推荐
- java对数字的处理_[java初探10]__关于数字处理类
前言 在我们的日常开发过程中,我们会经常性的使用到数字类型的数据,同时,也会有众多的对数字处理的需求,针对这个方面的问题,在JAVA语言中.提供解决方法的类就是数字处理类 java中的数字处理类包括: ...
- java long 对应mybati类型_修改 mybatis-generator 中数据库类型和 Java 类型的映射关系...
使用 mybatis-generator 发现数据库类型是 tinyint(4) , 生成 model 时字段类型是 Byte ,使用的时候有点不便 数据库的类型和 Model 中 Java 类型的关 ...
- Java 微信公众号开发_学习笔记
一.课程介绍 本套课程的学习内容,开发语言 微信公众号介绍,申请以及后台设置详解 编辑模式下的消息回复,菜单建立,素材管理等 开发前的环境搭建以及工具准备 开发者模式的切换.以及消息的接收与响应 百度 ...
- java 微信群发多图文_[Java教程]httpClient实现微信公众号消息群发
[Java教程]httpClient实现微信公众号消息群发 0 2016-09-21 20:00:10 1.实现功能 向关注了微信公众号的微信用户群发消息.(可以是所有的用户,也可以是提供了微信ope ...
- c++引用另一个类的方法_转:关于A类,B类,C类IP地址的网段和主机数的计算方法...
转:关于A类,B类,C类IP地址的网段和主机数的计算方法 关于A类,B类,C类IP地址的网段和主机数的计算方法 IP地址是一个32位的二进制数,由四个八位字段组成.每个IP地址包括两部分:一部分为网络 ...
- python元类是什么_谈谈Python中元类Metaclass(一):什么是元类
简单的讲,元类创建了Python中所有的对象. 我们说Python是一种动态语言,而动态语言和静态语言最大的不同,就是函数和类不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个HelloW ...
- python新式类和旧式类的区别_浅谈python新式类和旧式类区别
python的新式类是2.2版本引进来的,我们可以将之前的类叫做经典类或者旧式类. 为什么要在2.2中引进new style class呢?官方给的解释是: 为了统一类(class)和类型(type) ...
- java查看对象锁级别_对象级别锁 vs 类级别锁(Java)
前言 对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指 ...
- java实型常量用十六进制表示_[Java入门笔记] Java语言基础(二):常量、变量与数据类型...
常量与变量 什么是常量和变量 常量与变量都是程序在运行时用来存储数据一块内存空间 常量: 常量的值在程序运行时不能被改变,Java中声明常量必须使用final关键字.常量还可以分为两种意思: 第1种意 ...
- java原生封装_[Java教程]原生AJAX封装
[Java教程]原生AJAX封装 0 2016-07-12 13:00:08 回归下原生js,网上看到的AJAX封装,遂拿来改改,不知还有何弊端,望指出!1 var ajaxHelper = { 2 ...
最新文章
- jQuery的选择器(一)
- Yii-mongo操作
- boost::make_biconnected_planar用法的测试程序
- 国产服务器芯片对比分析,影速分析:通过国内云主机评测对比国内服务器异同...
- uniapp 微信小程序打包发布
- 飞鸽传书整个逻辑盲写,不做测试
- vue data为什么是函数_由 Vue 中三个常见问题引发的深度思考
- TextView显示html信息、在文本下面添加下划线、中划线、设置图片
- 拓端tecdat|R语言利用基线协变量提高随机对照试验的效率
- [洛谷P4081][USACO17DEC]Standing Out from the Herd
- D8(YT88)加密狗破解与加密工具
- cad卸载_老师傅爱不释手的6款CAD插件,款款优秀,用了就再也不舍得卸载
- 索尼计算机bios正确设置,索尼bios设置图解教程
- PDF 转 Word - 免费在线 pdf 转换成 word 文档
- python3 简单爬虫实战|使用selenium来模拟浏览器抓取选股宝网站信息里面的股票
- PCB布局布线中地的设计(地与地使用跨接)。
- 如何选择技术方向和编程语言
- Java(详解) 1011 A+B 和 C (15 分)
- 通宵教室(ACM水题)
- C++学习心得:字符串转换(to_string,stoi,stol,stoul)
热门文章
- 西南交通大学高级语言程序设计(SCAI000812)第2次实验报告-学生成绩管理系统(链表版)
- 如何获取美团外卖推广链接
- c语言中函数名可不可以由用户命名,C语言中变量名及函数名的命名规则与驼峰命名法...
- 管理安装软件包yum什么是yum
- ODOO13 JS 自定义按钮后续来了
- 启动SparkSql,报javax.jdo.JDOFatalInternalException: Error creating transactional connection factory
- 嵌入式系统课堂小结5
- mysql 最大值65536_SQL server事物复制报错:要复制的 LOB 数据的长度(xxxxx)超出了配置的最大值 65536...
- 基于MODIS数据的NDVI与LST相关性分析(IDL代码实现)
- メンアットワーク!3 men at work3 猎人们的青春攻略