实验二 基于对象的java编程

1:(FenshuTest.java)理解课本4.5章有理数的类封装,(例4-7)根据内容完成:定义一个类名为FenShu,成员变量:fenZi, fenMu;

方法 :构造函数(参数分别为分子和分母),add方法,要求调用该方法,能返回两个分数的和,即另一个分数,这个分数需要除掉公约数。例如算出的和为9/15 返回的值应该是3/5。创建相应的测试类调用Fenshu的构造函数和add方法。

2:(Student.java)定义一个学生Student类,分别有ID,Name,Sex成员变量,有构造函数(ID, ID和Name),对于学生的Sex, 不能直接赋值给Sex成员变量,需要通过setSex函数和getSex函数来分别设置和获取Sex 变量,思考如何设计这个类?

3:(Calculator.java)创建一个Calculator 类,有add方法,能利用重载实现以下效果:

1:传进两个整数,返回两个整数之和。

2:传进一个整数,一Z个分数,返回一个分数

3:传进两个分数,返回一个分数

注意:分数是个类。

创建相应的测试类调用以上函数 (测试函数直接放在Calculator类里)

4: 定义类:cn.goods.Apple,有价钱,重量
定义类:cn.Consumer,有一个方法buy,能实现:
创建一个苹果的实例,设置相应的价钱和重量,打印出:
“买了()斤苹果,苹果的单价是()元,总价是()元”实现相应操作

  1. 源程序代码:

包装好的FenShu类的代码,接下可以直接调用就好了,(FenShu.java)代码如下:

public class FenShu {

    public int fenZi;

    public int fenMu;

    FenShu(){//构造方法,因为下面用了构造方法这个空的构造函数就没了,但我们需要这个,所以必须写出来

       

    }

    public boolean isInteger(FenShu f) {//判断这个分数是不是整数

        if(f.fenZi%f.fenMu==0) {

            return true;

        }else {

            return false;

        }

    }

    FenShu(int fenZi,int fenMu){//构造分数,参数分别是分子和分母

        this.fenZi=fenZi;

        this.fenMu=fenMu;

    }

    public String toString() {//把分数转换成字符串,输出会比较方便

        return this.fenZi+"/"+this.fenMu;

    }

    public FenShu add(FenShu f1,FenShu f2) {//分数相加的方法

        FenShu f3 = new FenShu();

        f3.fenZi=f1.fenZi*f2.fenMu+f2.fenZi*f1.fenMu;//分子相加的表达式

        f3.fenMu=f1.fenMu*f2.fenMu;//分母相加的表达式

        int g=gcd(f3.fenZi,f3.fenMu);//gcd就是求最大公约数的函数,g就是最大公约数

        f3.fenZi/=g;//分子和分母同时除以最大公约数这个分数就是最简的了

        f3.fenMu/=g;

        return f3;//返回求和的分数类型

    }

    public int gcd(int a,int b) {

        return b==0?a:gcd(b,a%b);//这个是辗转相除法的表示,采用递归思想

    }

}

测试这个分数求和进行的数据测试的代码如下(FenShuTest.java):

public class FenShuTest {//这个类就是对分数求和创建的一个类,FenShu这个类已经包装好了,直接进行调用这个类就好了

    public static void main(String args[]) {

        FenShu f1 = new FenShu(1,15);//声明一个分数并同时对它进行初始化

        FenShu f2 = new FenShu(8,15);//声明一个分数并同时对它进行初始化

        FenShu f3 = new FenShu();//单纯的声明一个分数变量,等下求和需要

        f3=f3.add(f1, f2);//调用f3的分数求和的方法

        System.out.println(f1.toString()+"+"+f2.toString()+"="+f3.toString());//输出分数求和的结果

    }

}

运行结果:

 

  1. 源程序代码:

public class Student {

    String ID;//成员变量

    String Name;

    boolean Sex;//false代表女性,true代表男性

    Student(){

       

    }

    Student(String ID){//构造函数,进行赋值ID

        this.ID=ID;

    }

    Student(String ID,String Name){//构造函数,进行赋值ID和名字

        this.ID=ID;

        this.Name=Name;

    }

    void setSex(boolean Sex) {//设置性别的函数

        this.Sex=Sex;//对传进来的参数进行赋值给这个对象

    }

    public boolean getSex() {

        return this.Sex;//获取这个对象的性别

    }

    public static void main(String args[]) {

        Student stu1 = new Student("3171911132");//stu1这个对象的ID进行初始化

        Student stu2 = new Student("3171911134","黄湘平");//stu2这个对象的IDName进行初始化

        stu1.setSex(false);//设置性别

        stu2.setSex(true);//设置性别

        System.out.printf("学号:%s 姓名:%s 性别:%s",stu2.ID,stu2.Name,stu2.getSex()==true?"":"");//输出

    }

}

运行结果:

 

 

  1. 源程序代码:

public class Calculator {

    int add(int a,int b) {//重载方法两个整型相加

        return a+b;

    }

    FenShu add(int a,FenShu f2) {//重载方法一个整型加一个分数

        FenShu f1 = new FenShu(a*f2.fenMu,f2.fenMu);//把整数化成分数,与另一个分数的分母相关

        return f1.add(f1,f2);//直接调用FenShu类中的分数相加就可以了

    }

    FenShu add(FenShu f1,FenShu f2) {//重载方法两个分数相加

        FenShu f3 = new FenShu();//声明一个对象

        return f3.add(f1, f2);//直接调用FenShu类中的分数相加就可以了

    }

    public static void main(String args[]) {

        int a=5,b=4;

        FenShu f1 = new FenShu(1,15);//声明的同时进行初始化赋值

        FenShu f2 = new FenShu(14,15);//声明的同时进行初始化赋值

        FenShu f = new FenShu();

        Calculator f3 = new Calculator();//声明Calculator类,调用它的重载方法要用

        //进行数据测试

       

        System.out.printf("两个整数相加的结果:%d+%d=%d%n",a,b,f3.add(a, b));

        f=f3.add(a, f2);

        if(f.isInteger()) {//这个是调用FenShu里的方法,判断该结果的分数是不是一个整数

            System.out.printf("整数加分数的结果:%d+%s=%d%n",a,f2.toString(),f.fenZi/f.fenMu);

        }else {

            System.out.printf("整数加分数的结果:%d+%s=%s%n",a,f2.toString(),f.toString());

        }

        f=f3.add(f1, f2);

        if(f.isInteger()) {//这个是调用FenShu里的方法,判断该结果的分数是不是一个整数

            System.out.printf("两个分数相加的结果:%s+%s=%d%n",f1.toString(),f2.toString(),f.fenZi/f.fenMu);

        }else {

            System.out.printf("两个分数相加的结果:%s+%s=%s%n",f1.toString(),f2.toString(),f.toString());

        }

    }

}

运行结果:

 

  1. 源程序代码:

包名:cn.goods

类名:Apple

package cn.goods;

public class Apple {

    public double price;

    public Apple(double price){

        this.price=price;//初始化苹果的单价

    }

}

包名:cn

类名:Consumer

package cn;

import cn.goods.Apple;

public class Consumer {

    public double weight;//顾客买的单价

    public double sum;//总价

    public Consumer(double weight) {

        this.weight=weight;//初始化顾客要买的数量

    }

    public void buy(Consumer con,Apple app) {

        con.sum=con.weight*app.price;//顾客要付的总价

        System.out.printf("顾客买了%.2f斤苹果,苹果的单价是%.2f元,总价是%.2f%n",con.weight,app.price,con.sum);

    }

    public static void main(String args[]) {

        Apple app_ower= new Apple(10.5);

        Consumer con = new Consumer(5.5);

        con.buy(con,app_ower);

    }

}

运行结果:

 

错误1:

错误代码:

 

错误提示:

 

错误原因分析:

以上错误的代码是我想测试下构造函数是否能单独使用,结果发现了一些问题,构造函数只能在new的后面进行使用,而且它只进行一次,单独去用是不行的,通过提示我们可以看出,如果想让第三行成立的就必须构造一个方法与这个名字相同,并且还要是静态的方法才可以,因为静态方法才可以不用加对象名。

解决方法:

    static void Student(String st) {

        return ;

    }

在前面加上这段代码就可以运行了。

 

错误2

错误代码关键截图:

 

 

 

错误提示:

 

错误原因分析:

这个判断该分数的方法是一开始的写法,到运行的时候才发现不能进行运行,我就进行了分析提示,首先我就发现这个判断分数是不是整数的方法没有对象名,再者就是这个Calculator类没有这个相关的方法,我的本意是调用FenShu里的那个方法名,如果一定要让这句话实现的话也是可行的,在这个类进行相关的方法构造方法,解决方法在接下来的解决方法。

解决方法:

方案1:在Calculator类里进行构造方法Student,并且这个方法是静态方法的才可以。如下:

    static boolean isInteger(FenShu f) {

        if(f.fenZi%f.fenMu==0) {

            return true;

        }else {

            return false;

        }

    }

方案2

把那个if的语句进行修改就行了,改成调用FenShu里的该方法名,正确写法if(f.isInteger())就可以了。

 

错误3

错误代码:

 

正确代码:

 

错误提示:

 

错误原因分析:

正确代码和错误代码差了一个static,这个一个词让这两个方法差了很多,我无意添加了static,也就让这个方法变成了静态方法,静态方法是不能使用this这个语句,所以那个提示就是这个意思了。

解决方法:

去掉static,让这个方法从静态方法变成普通方法,这样就可以调用this的语句了。

 第一题:

    public String toString() {//把分数转换成字符串,输出会比较方便

        return this.fenZi+"/"+this.fenMu;

    }

    public FenShu add(FenShu f1,FenShu f2) {//分数相加的方法

        FenShu f3 = new FenShu();

        f3.fenZi=f1.fenZi*f2.fenMu+f2.fenZi*f1.fenMu;//分子相加的表达式

        f3.fenMu=f1.fenMu*f2.fenMu;//分母相加的表达式

        int g=gcd(f3.fenZi,f3.fenMu);//gcd就是求最大公约数的函数,g就是最大公约数

        f3.fenZi/=g;//分子和分母同时除以最大公约数这个分数就是最简的了

        f3.fenMu/=g;

        return f3;//返回求和的分数类型

    }

    public int gcd(int a,int b) {

        return b==0?a:gcd(b,a%b);//这个是辗转相除法的表示,采用递归思想

    }

 

第二题:

    Student(String ID){//构造函数,进行赋值ID

        this.ID=ID;

    }

    Student(String ID,String Name){//构造函数,进行赋值ID和名字

        this.ID=ID;

        this.Name=Name;

    }

    void setSex(boolean Sex) {//设置性别的函数

        this.Sex=Sex;//对传进来的参数进行赋值给这个对象

    }

    public boolean getSex() {

        return this.Sex;//获取这个对象的性别

    }

 

第三题:

    int add(int a,int b) {//重载方法两个整型相加

        return a+b;

    }

    FenShu add(int a,FenShu f2) {//重载方法一个整型加一个分数

        FenShu f1 = new FenShu(a*f2.fenMu,f2.fenMu);//把整数化成分数,与另一个分数的分母相关

        return f1.add(f1,f2);//直接调用FenShu类中的分数相加就可以了

    }

    FenShu add(FenShu f1,FenShu f2) {//重载方法两个分数相加

        FenShu f3 = new FenShu();//声明一个对象

        return f3.add(f1, f2);//直接调用FenShu类中的分数相加就可以了

    }

第四题:

public class Apple {

    public double price;

    public Apple(double price){

        this.price=price;//初始化苹果的单价

    }

}

public class Consumer {

    public double weight;//顾客买的单价

    public double sum;//总价

    public Consumer(double weight) {

        this.weight=weight;//初始化顾客要买的数量

    }

    public void buy(Consumer con,Apple app) {

        con.sum=con.weight*app.price;//顾客要付的总价

        System.out.printf("顾客买了%.2f斤苹果,苹果的单价是%.2f元,总价是%.2f%n",con.weight,app.price,con.sum);

    }

}

本次实验让我掌握了使用类来封装对象的属性和行为,掌握对象的组合以及参数传递,并且能定义类的构造函数,重载函数。用类来封装在其他类使用的确方便了很多,但在调用的过程一定要注意它们之间的关系,要调用正确。构造函数只能在new的后面下进行使用,并且它只能调用一次,构造函数的参数不同也就代表着不同的构造函数,使用起来是不一样的,如果我们创建了属于自己想要的构造函数的话,那么原本默认的构造函数就不会自动调用了,如果我们还需要这个默认的构造函数就必须写出来,把它的隐式写出来才能进行使用。在一个测试数据的类里进行重载函数,然后调用其他包装好的类,也就是说这个类里只有重载函数,没有成员变量,使用过程就可以很多情况下使用其他类来调用进行想要的功能实现,就比如第三题的Calculator类那样,也就有点再次包装这个类,方便以后进行使用,或者调用这个类。通过本次实验,我最大的收获就是为何要包装,以及它的意义,好处。多实践,多领悟,多编程,写一套属于自己的代码风格。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java程序设计》课程实验指导书程序代码(答案)(实验),个人原创,仅供参考与交流。 希望多多交流,共同进步! 实验 Java语言基础 一、实验目的: 熟悉Java基本语法,基本数据类型,各种运算符及表达式的使用,掌握运算符优先级,熟悉使用Java的选择语句,循环语句。 实验内容: 1.编写Java Application程序,输出1900年到2000年之间的所有润年。(闰年的判断条件:能被4整除且不能被100整除,或能被400整除); 2.编写Java Appet 程序打印 “水仙花” 数 (它的个、十、百位数字的立方的和等于该数本身,如:153=1^3+5^3+3^3) 3. 编写Java Application程序,分别用do-while和for循环计算1+1/2!+1/3!+1/4!...的前20项和 三、实验要求: 1. 正确使用Java语言的选择语句,循环语句; 2. 调试程序、编译,运行后得到正确的结果 3.写出实验报告。要求记录编译和执行Java程序当中的系统错误信息提成示,并给出解决办法。 四、实验步骤: 1.编写主类; 2.在static public void main(String[ ] args)方法中加入实现要求功能的代码,主要步骤如下: (第一题)从1900到2000循环,按照闰年的判断条件是则输出1900年到2000年之间的所有润年。 (第题)编写Java Applet, 在public void paint(Graphics g)方法中加入实现要求功能的代码, 主要步骤是:从100到1000循环,判断每个数是否符合水仙花数的特点,是则输出之。 3.编译运行程序,观察输出结果是否正确。 五、自做实验 1. 输出100以内的所有素数。 提示: 逐个判断小于a的每个正整数x,第重循环针对x,判断其是否是质数。 2.将所输入之正整数,以、八、十六进制表示出来。 提示: 可写三个方法分别计算输出、八、十六进制表示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值