zoukankan      html  css  js  c++  java
  • 3.1-互评-OO设计-有理数类的设计

    有理数类的设计

    有理数类的代码。

    package practice;
    
    public class RationalNumber {
        private int molecule;   //分子
        private int denominator;  //分母
    
        public RationalNumber(int molecule,int denominator){
            this.molecule =molecule;
            if(denominator==0)          //错误情况输入提示
            {
            	System.out.println("输入错误,分母不能为0");   
            	System.exit(0);
            }
            else  this.denominator =denominator; 
        }
    
        public int GetMolecule() {
            return this.molecule; //获得分子
        }
    
        public int GetDenominator() {
            return this.denominator;  //获得分母
        }
    
    
    	public void SetMolecule(int molecule) {//设置分子
    		this.molecule = molecule;
    	}
    
    
    	public void SetDenominator(int denominator) {//设置分母
    		this.denominator = denominator;
    	}
    
    	public RationalNumber Reduction() {//约分运算
        	int m,d;              
        	m=this.molecule;
        	d=this.denominator;
        	
        	if(m<d)
        	{
        		int temp=m;
        		m=d;
        		d=temp;
        	}
        	
        	while(d!=0)
        	{
        		int temp=m;
        		m=d;
        		d=temp%d;
        	}
        	
    	   this.denominator/=m; //经循环后获得的m为最大公因子
    	   this.molecule/=m;
    	   return this;
        }
        
        public RationalNumber Add(RationalNumber number2) {//加法运算
        	RationalNumber result=new RationalNumber(0,1);
            result.denominator=number2.denominator*this.denominator;
            result.molecule=number2.molecule*this.denominator+this.molecule*number2.denominator;
            return result.Reduction();             //得到结果后调用约分
    
        }
        
        public RationalNumber Subtraction(RationalNumber number2) {//减法运算
        	RationalNumber result=new RationalNumber(0,1);
        	RationalNumber temp=new RationalNumber(0,1);
        	temp.molecule=-number2.molecule;
        	temp.denominator=number2.denominator;
        	result=Add(temp);                      //减法就是添上负号的加法运算
            return result;
        }
        
        public RationalNumber Muiltiply(RationalNumber number2) {//乘法运算
        	RationalNumber result=new RationalNumber(0,1);
        	result.molecule=this.molecule*number2.molecule;
        	result.denominator=this.denominator*number2.denominator;
        	return result.Reduction();
        }
        
        public RationalNumber Division(RationalNumber number2) {//除法运算
        	RationalNumber temp=new RationalNumber(0,1);
        	temp.denominator=number2.molecule;
        	temp.molecule=number2.denominator;
        	return Muiltiply(temp);   //除以一个数相当于乘上该数的倒数
        }
       
        public String toString(){
            if(denominator ==1){
                return molecule +"";
            }else{
                return molecule +"/"+ denominator;
            } //转化为字符串
        }
        
    }
    

    测试代码(要在与有理数类不同包的其他类中调用有理数类)

    package test;//在不同包中
    
    import practice.RationalNumber; 
    
    public class Main {
    	 public static void main(String[] args) {
    	        RationalNumber x = new RationalNumber(4, 9);
    	        RationalNumber y = new RationalNumber(2, 9);
    	        
    	        System.out.println("x的分母为:"+x.GetDenominator());
    	        System.out.println("x的分子为:"+x.GetMolecule());
    	        System.out.println("x = " + x);
    	        
    	        System.out.println("y的分母为:"+y.GetDenominator());
    	        System.out.println("y的分子为:"+y.GetMolecule());
    	        System.out.println("y = " + y);
    	        
    	        System.out.println("x + y = " + x.Add(y));
    	        System.out.println("x - y = " + x.Subtraction(y));
    	        System.out.println("x * y = " + x.Muiltiply(y));
    	        System.out.println("x / y = " + x.Division(y));
    	        
    	    }
    }
    
    
    • 测试结果

    尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?

    C语言的有理数代码中,往往是通过有理数的 数据结构体 + 函数 来实现有理数的相关运算。
    而我设计的类则是将 有理数的 属性以及方法 都包含在类中。
    在调用使用时,这些属性和方法都是针对该对象的,直接对该对象进行操作调用。
    而C中的函数调用方法中传递参数时,传递参数值往往可能是多个对象的值或属性,需要考虑是哪几个对象间的操作函数,可能并不是只针对某一个对象

    尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论:

    别人如何复用你的代码?

    通过导入我设计的有理数类,如测试样例中:

    //不同包中导入有理数类
    package test;       
    
    import practice.RationalNumber; 
    

    别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?

    依赖,有需要用到有理数的属性的时候代码中自然会有所体现需要调用。
    但是当我的有理数类属性修改时并不影响他人调用有理数代码。

    有理数类的public方法是否设置合适?为什么有的方法设置为private?

    有理数类的public方法设置合理,方便调用,包中的其他类都可以调用。
    如有理数的属性设为private,这正是有理数的不能轻易改变的代码部分。比如一些产品属性是不便使用客户修改的这种情况,就需要设置private。同时设为private也更好的保证代码的安全性.

  • 相关阅读:
    ubuntu关闭和开启防火墙
    supervisor 从安装到使用
    suse11/12关闭防火墙
    [Linux实用工具]Linux监控工具munin的展示(Nginx)
    [Linux实用工具]Linux监控工具munin的安装和配置
    [Linux]阿里云免费试用体验(在阿里云的ubuntu上部署个人服务)
    [Linux基础环境/软件]Linux下安装resin web服务器(涉及gcc、jdk环境部署)
    [Linux基础环境/软件]Linux下安装mysql
    [Linux实用工具]Windows下同步Linux文件(Linux安装Samba和配置)
    [Linux实用工具]Ubuntu环境下SSH的安装及使用
  • 原文地址:https://www.cnblogs.com/zml7/p/13766902.html
Copyright © 2011-2022 走看看