Java实验三 类与对象

        

 

中南大学计算机学院实验报告

课程名称           Java面向对象程序设计SSD3                       

实验项目名称       实验3《对象和类》                 

学生姓名  Xi_Chen123  专业班级  ******班  学号  ********** 

实验成绩                             日期                      

实验学时:  2   

每组人数:  1   

实验类型:  1  (1:基础性  2:综合性   3:设计性  4:研究性)

实验要求:  1  (1:必修   2:选修      3:其它)

实验类别:  2  (1:基础   2:专业基础  3:专业    4:其它)

  • 实验目的
  1. 设计类,并画出UML类图
  2. 实现UML中的类
  3. 使用类开发应用程序

二、实验内容

   1、(P305, 9.1)【矩形类Rectangle】遵照9.2节中Circle类的例子,设计一个名为Rectangle的类表示矩形。这个类包括:

  1. 两个名为width和height的double型数据域,它们分别表示矩形的宽和高。width和height的默认值都为1。
  2. 创建默认矩形的无参构造方法。
  3. 创建width和height为指定值的矩形的构造方法。
  4. 一个名为getArea()的方法返回这个矩形的面积。
  5. 一个名为getPerimeter()的方法返回矩形周长。

画出该类的UML图并实现这个类。编写一个测试程序,创建两个Rectangle对象:一个矩形的宽为4高为40,另一个矩形的宽为3.5高为35.9。依次显示每个矩形的宽、高、面积和周长。

2. (P307, 9.8)【风扇类Fan】设计一个名为Fan的类表示一个风扇。这个类包括:

  1. 三个名为SLOW、MEDIUM和FAST而值为1、2、3的常量表示风扇的速度。
  2. 一个名为speed的int类型私有数据域表示风扇的速度(默认值为SLOW)。
  3. 一个名为on的boolean类型私有数据域表示风扇是否打开(默认值为false)。
  4. 一个名为radius的double类型私有数据域表示风扇的半径(默认值为5)。
  5. 一个名为color的String类型私有数据域表示风扇的颜色(默认值为blue)。
  6. 这四个数据域的访问器和修改器。
  7. 一个创建默认风扇的无参构造方法。
  8. 一个名为toString()的方法返回描述风扇的字符串。如果风扇是打开的,那么该方法在一个组合的字符串中返回风扇的速度、颜色和半径。如果风扇没有打开,该方法返回一个由“fan is off”和风扇颜色、半径组成的字符串。

画出该类的UML图。实现这个类。编写一个测试程序,创建两个Fan对象。将第一个对象设置为最大速度、半径为10、颜色为yellow、状态为打开。将第二个对象设置为中等速度、半径为5、颜色为blue、状态为关闭。通过调用它们的toString方法显示这些对象。

3.(P308,9.10*)【二次方程式】为二次方程式ax2+bx+c=0设计一个名为QuadraticEquation的类。这个类包括:

  1. 代表三个系数的私有数据域a、b、c。
  2. 一个参数为a、b、c的构造方法。
  3. a、b、c的三个get方法。
  4. 一个名为getDiscriminant()的方法返回判别式,b2-4ac。
  5. 一个名为getRoot1()和getRoot2()的方法返回等式的两个根。

     

   这些方法只有在判别式为非负数时才有用。如果判别式为负,方法返回0。

画出该类的UML图。实现这个类。编写一个测试程序,提示用户输入a、b、c的值,然后显示判别式的结果。如果判别式为正数,显示两个根;如果判别式为0,显示一个根;否则,显示“The equation has no roots”。

4.(P308, 9.13**)【位置类】设计一个名为Location的类,定位二维数组中的最大值及其位置。这个类包括公共的数据域row、column和maxValue,二维数组中的最大值及其下标用double型的maxValue以及int型的row和column存储。

编写下面的方法,返回一个二维数组中最大值的位置。

public static Location locateLargetst(double[][] a)

返回值是一个Location的实例。编写一个测试程序,提示用户输入一个二维数组,然后显示这个数组中的最大元素及下标。运行实例如下:

输入二维数组的行数和列数: 3  4

输入数组:

23.5  35  2  10

4.5  3  45  3.5

35  44  5.5  9.6

最大元素及其下标是: 45 在(1,2)

三、实验要求:

要求每个学生独立完成实验任务。

四、实验报告

1.在一周内完成本项目实验,在可视化平台上提交实验文档,包括:4个.java文件(分别对应以上4道题,不需要.class文件)打包成一个名为“实验3”的.rar或.zip文件,以及实验报告1份(格式与要求见下),报告命名为“班级名(如“2101”)_学号_姓名_实验3.doc”

2. 实验结果与分析

(包括运行结果截图、结果分析等)

实验一

实验二

实验三

 

 

 

实验四

 

3. 心得体会

(记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。)

本次实验的难度略有提升,在编写过程中也有了较多的阻碍和小困难。在查询资料和与同学进行讨论之后,也都得到了较为合理的解决方案。

在编写实验一的过程中,整体较为顺利。在输出结果的过程中,由于double类型在计算过程中会产生精度损失,输出时非常难看,所以采用创建DecimalFormat实例的方法来对数据进行处理后再输出就可以得到正确的结果。

在编写实验二的过程中,最开始是打算分为两个文件进行编写,其中一个class单纯为Fan的类,另一个class为FanDemo,编写main函数对Fan进行输出。由于本次实验需要添加最终静态数据类型,该类型无法跨文件进行使用,所以最后放弃了这个想法,索性直接编写到同一个class中了。

实验三较为繁琐,但并不困难,最核心的思想就是将我们熟悉的公式用程序语言进行合理表达,把握好运算的优先级与括号省略规则就可以轻松编译。在完成了实验三的全部功能后,本以为万事大吉,然而程序却进行了警告:

(警告信息如下)

原因是在程序中没有使用get函数来获取a、b、c的值,因为在这个实验中,main函数和QuadraticEquation编写在同一个类中,可以直接调用私有数据成员,于是这三个get方法就被闲置下来,产生警告。于是我将该文件拆分成了两个类,使得get方法被“强行”使用了,解决了这个警告。

在编写实验四的过程中,第一个较为陌生的知识就是二维数组。二维数组是通过通过两个维度来找到数组中对应的元素,在平时存储数据中较为少见,但在平面图、行列式、矩阵等方面使用较多。首先就是在对二维数组中录入数据的过程,如何达到图例中那样按照行与列的形式输入呢?我使用了Scanner中的实例调用的方法next(),其好处在于空格键和回车键都可以作为元素分割的标识符,缺点在于分割的元素为String类型,无法直接存储到double类型的数组中。所以我再运用了Double类中的double parseDouble(String s);方法,将录入的String元素转化为double类型。部分程序如下:

 

第二个就是对于二维数组的遍历,我们该如何按照行与列逐个遍历二维数组呢?通过网络查询与同学交流,我知道了如下信息:二维数组的数组名可以调用length方法,获取二维数组的行数,譬如:num.length;在第i行,二维数组的数组名+[i]可以调用length方法,获取该行的列数,譬如:num[i].length。参考程序如下: 

总而言之,本次实验难度略有提升,还有一部分问题是对类与对象的使用还是有些生疏,比如编写出了出现警告的程序。在日后的学习中还需要继续加强和改进,继续练习相关的程序题目,达到更高层次的编程水平

4.【附源程序】(除了单独的.java文件,也请复制到实验文档里,方便批阅者评阅)

实验一

package com.xc3;

import java.text.DecimalFormat;

public class Rectangle {
    private  double width=1;
    private double height=1;

    //无参构造方法
    public Rectangle(){
    }

    //带参构造方法
    public Rectangle(double width,double height){
        this.height=height;
        this.width=width;
    }

    //获取width
    public double getWidth(){
        return width;
    }

    //获取height
    public double getHeight(){
        return height;
    }

    //获取area
    public double getArea(){
        return height*width;
    }

    //获取perimeter
    public double getPerimeter(){
        return 2*(height+width);
    }


    public static void main(String[] args) {
        //创建两个Rectangle对象
        Rectangle r1=new Rectangle(4,40);
        Rectangle r2=new Rectangle(3.5,35.9);

        //显示结果
        DecimalFormat df=new DecimalFormat("0.00");
        System.out.println("width:"+r1.getWidth()+" height:"+r1.getHeight()+" area:"+r1.getArea()+" perimeter:"+r1.getPerimeter());
        System.out.println("width:"+r2.getWidth()+" height:"+r2.getHeight()+" area:"+df.format(r2.getArea())+" perimeter:"+df.format(r2.getPerimeter()));
    }
}

实验二

package com.xc3;

public class Fan {
    final static int SLOW=1;
    final static int MEDIUM=2;
    final static int FAST=3;

    private int speed=SLOW;
    private boolean on=false;
    private double radius=5;
    private String color="blue";

    public Fan() {
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public boolean isOn() {
        return on;
    }

    public void setOn(boolean on) {
        this.on = on;
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }


    public String toString() {
        if (isOn()) {
            return "The speed of the fan is " + getSpeed() + ", the radius of the fan is " + getRadius() + ", the color of the fan is " + getColor();
        } else {
            return "The fan is off";
        }
    }


    //main
    public static void main(String[] args) {
        //创建对象
        Fan f1=new Fan();
        Fan f2=new Fan();

        //设置对象
        f1.setSpeed(FAST);
        f1.setRadius(10);
        f1.setColor("yellow");
        f1.setOn(true);

        f2.setSpeed(MEDIUM);
        f2.setRadius(5);
        f2.setColor("blue");
        f2.setOn(false);

        //显示对象
        System.out.println(f1.toString());
        System.out.println(f2.toString());
    }
}

实验三

QuadraticEquation

package com.xc3.QE;

public class QuadraticEquation {
    private double a;
    private double b;
    private double c;

    public QuadraticEquation() {
    }

    public QuadraticEquation(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public double getA() {
        return a;
    }

    public double getB() {
        return b;
    }

    public double getC() {
        return c;
    }

    public double getDiscriminant(){
        return b * b - 4 * a * c;
    }

    public double getRoot1(){
        if(getDiscriminant()>=0) {
            return (-1 * b + Math.sqrt(b * b - 4 * a * c)) / 2 * a;
        }
        return 0;
    }

    public double getRoot2(){
        if(getDiscriminant()>=0) {
            return (-1 * b - Math.sqrt(b * b - 4 * a * c)) / 2 * a;
        }
        return 0;
    }
}

QuadraticEquationDemo

package com.xc3.QE;

import java.util.Scanner;

public class QuadraticEquationDemo {
    public static void main(String[] args) {
        //输入数据
        System.out.println("Please input the a,b,c of the number.");
        Scanner sc=new Scanner(System.in);
        double a=sc.nextDouble();
        double b=sc.nextDouble();
        double c=sc.nextDouble();
        QuadraticEquation qe=new QuadraticEquation(a,b,c);

        //显示判别式结果
        double result=qe.getDiscriminant();
        System.out.println("The result of Discriminant is: "+result);

        //显示结果
        if(result<0){
            //若判别式小于0
            System.out.println("The equation has no roots");
        }else if(result==0){
            //若判别式等于0
            System.out.println("The result of root is: "+qe.getRoot1());
        }else{
            //若判别式大于0
            System.out.println("The result of root1 is: "+qe.getRoot1()+", the root2 is: "+qe.getRoot2());
        }
    }
}

实验四

package com.xc3;

import java.util.Scanner;

public class Location {
    private int row;
    private int colum;
    private double maxValue;

    public Location() {
    }

    public Location(int row, int colum, double maxValue) {
        this.row = row;
        this.colum = colum;
        this.maxValue = maxValue;
    }

    public int getRow() {
        return row;
    }

    public int getColum() {
        return colum;
    }

    public double getMaxValue() {
        return maxValue;
    }

    public static void main(String[] args) {
        //输入行数和列数
        System.out.print("请输入二维数组的行数和列数:");
        Scanner sc=new Scanner(System.in);
        int row=sc.nextInt();
        int colum=sc.nextInt();

        //创建数组并输入数据
        System.out.println("输入数组:");
        double[][] num=new double[row][colum];
        for(int i=0;i<row;i++){
            for(int j=0;j<colum;j++){
                num[i][j]=Double.parseDouble(sc.next());
            }
        }

        //计算数据
        Location l=locateLargest(num);

        //输出结果
        System.out.print("最大元素及其下标是:"+l.getMaxValue()+"  在("+l.getRow()+","+l.getColum()+")");
    }

    public static Location locateLargest(double[][] a){
        int row=0;
        int colum=0;
        double maxValue=a[row][colum];

        for(int i=0;i<a.length;i++){
            for(int j=0;j<a[i].length;j++){
                if(a[i][j]>maxValue){
                    maxValue=a[i][j];
                    row=i;
                    colum=j;
                }
            }
        }

        return new Location(row,colum,maxValue);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值