Java语言程序设计上机实验报告

时间:2024.5.8

本科生实验报告

实验课程         Java语言程序设计                         

学院名称         信息科学与技术学院                                  

专业名称         软件工程                             

学生姓名                                     

学生学号                                      

指导教师                                  

实验地点         6A502                          

实验成绩                                          

                                  二〇##年一月八日
 

Java语言程序设计上机实验报告

摘要

本实验报告用于记录在Java语言程序设计课程开设的上机实验中记录上机实验过程,以激励自己学习进步并为将来的学习提供一系列参考资料。

关键字  Java语言;实验;编程;语法;算法

第1章     实验一

1.1   设计一个名为RegularPolygon的正n边形类

1.1.1  要求

一个名为n的int型私有数据域定义多边形的边数,默认值为3。

一个名为side的double型私有数据域存储边的长度,默认值为1。

一个名为x的double型私有数据域,它定义多边形中点的x坐标,默认值为0。

一个名为y的double型私有数据域,它定义多边形中点的y坐标,默认值为0。

一个创建带默认值的正多边形的无参构造方法。

一个能创建带指定边数和边长度、中心在(0,0)的正多边形的构造方法。

一个能创建带指定边数和边长度、中心在(x,y)的正多边形的构造方法。

所有数据域的get和set方法。

一个返回多边形周长的方法getPerimeter()。

一个返回多边形面积的方法getArea()。计算正多边形面积的公式是:面积=(n*side2)/(4*tan(180/n))

分别使用无参构造方法、 RegularPolygon (6,4)和RegularPolygon(10,4,5.6,7.8)创建三个RegularPolygon对象,并显示每个对象的周长和面积。

1.1.2  代码

2                     //RegularPolygon.java

3                      

4                     publicclass RegularPolygon {

5                        privateint n = 3;//一个名为n的int型私有数据域定义多边形的边数,默认值为3。

6                        privatedouble side = 1;//一个名为side的double型私有数据域存储边的长度,默认值为1。

7                        privatedouble x = 0;//一个名为x的double型私有数据域,它定义多边形中点的x坐标,默认值为0。

8                        privatedouble y = 0;//一个名为y的double型私有数据域,它定义多边形中点的y坐标,默认值为0。

9                       

10                    //一个创建带默认值的正多边形的无参构造方法。

11                    public RegularPolygon(){

12                             this.setN(3);

13                             setSide(1);

14                             setX(0);

15                             setY(0);

16                    }

17                   

18                    //一个能创建带指定边数和边长度、中心在(0,0)的正多边形的构造方法。

19                    public RegularPolygon(int n, double side){

20                             this.setN(n);

21                             this.setSide(side);

22                             setX(0);

23                             setY(0);

24                    }

25                   

26                    //一个能创建带指定边数和边长度、中心在(x,y)的正多边形的构造方法。

27                    public RegularPolygon(int n, double side, double x, double y){

28                             this.setN(n);

29                             this.setSide(side);

30                             this.setX(x);

31                             this.setY(y);

32                    }

33                  

34                    //所有数据域的get和set方法。

35                    publicint getN() {

36                             return n;

37                    }

38                  

39                    publicvoid setN(int n) {

40                             this.n = n;

41                    }

42                  

43                    publicdouble getSide() {

44                             return side;

45                    }

46                  

47                    publicvoid setSide(double side) {

48                             this.side = side;

49                    }

50                  

51                    publicdouble getX() {

52                             return x;

53                    }

54                  

55                    publicvoid setX(double x) {

56                             this.x = x;

57                    }

58                  

59                    publicdouble getY() {

60                             return y;

61                    }

62                  

63                    publicvoid setY(double y) {

64                             this.y = y;

65                    }

66                   

67                    //一个返回多边形周长的方法getPerimeter()。

68                    publicdouble getPerimeter(){

69                             return n * side;

70                    }

71                   

72                    //一个返回多边形面积的方法getArea()。计算正多边形面积的公式是:面积=(n*side2)/(4*tan(180/n))

73                    publicdouble getArea(){

74                             return (n * side * side)/(4 * Math.tan(Math.PI/n));

75                    }

76                  

77                 }

//main

publicclass main {

         publicstaticvoidmain (String[] args){

                  

                   //使用无参方法构造一个对象

                   RegularPolygon r1 = new RegularPolygon();

                   //使用RegularPolygon(6, 4)方法构造一个对象

                   RegularPolygon r2 = new RegularPolygon(6, 4);

                   //使用RegularPolygon(10, 4, 5.6, 7.8)方法构造一个对象

                   RegularPolygon r3 = new RegularPolygon(10, 4, 5.6, 7.8);

                                    

                   //显示每个对象的周长和面积;

                   System.out.println("无参数多边形的面积是:\t" + r1.getArea() + "\t周长为:\t" + r1.getPerimeter());

                   System.out.println("两个参数多边形的面积是:\t" + r2.getArea() + "\t周长为:\t" + r2.getPerimeter());

                   System.out.println("四个参数多边形的面积是:\t" + r3.getArea() + "\t周长为:\t" + r3.getPerimeter());

         }

}

1.2 设计一个名为Account的账户类

1.2.1 要求

n  一个名为id的int类型的私有账户数据域(默认值0)

n  一个名为balance的double类型的私有数据域存储余额(默认值0)

n  一个名为annualInterestRate的double类型的私有数据域存储当前利率(默认值0)。假设所有的账户都有相同的利率。

n  一个名为dateCreated的Date类型的私有数据域存储账户开户日期。(import java.util.Date)

n  一个能创建默认账户的无参构造方法。

n  一个能创建带特定id和初始余额的的账户的构造方法。

n  id、balance和annualInterestRate的get和set方法

n  dateCreated的get方法

n  一个名为getMonthlyInterestRate()的方法返回月利率。

n  一个名为withDraw的方法从账户提款。

n  一个名为deposit的方法向账户存款。

n  编写一个测试程序,创建一个账户id为123、余额为2000元、年利率为4.5%的Account对象。使用withDraw方法取款200元,使用deposit方法存款3000元,然后打印余额、月利息以及这个账户的开户日期。

1.2.2 代码

//Account.java

package Account;

import java.util.Date;

publicclass Account {

         //一个名为id的int类型的私有账户数据域(默认值0)

         privateint id = 0;

        

         //一个名为balance的double类型的私有数据域存储余额(默认值0)

         privatedouble balance = 0;

        

         //一个名为annualInterestRate的double类型的私有数据域存储当前利率(默认值0)。

         privatedouble annualInterestRate = 0;

        

         //一个名为dateCreated的Date类型的私有数据域存储账户开户日期。

         private Date dateCreated;

        

         //一个能创建默认账户的无参构造方法。

         public Account(){

                   this.setId(0);

                   this.setBalance(0);

                   dateCreated = new Date();

         }

        

         //一个能创建带特定id和初始余额的的账户的构造方法。

         public Account(int id, double balance){

                   this.setId(id);

                   this.setBalance(balance);

                   dateCreated = new Date();

         }

         //id、balance和annualInterestRate的get和set方法

         publicint getId() {

                   return id;

         }

         publicvoid setId(int id) {

                   this.id = id;

         }

         publicdouble getBalance() {

                   return balance;

         }

         publicvoid setBalance(double balance) {

                   this.balance = balance;

         }

         publicdouble getAnnualInterestRate() {

                   return annualInterestRate;

         }

         publicvoid setAnnualInterestRate(double annualInterestRate) {

                   this.annualInterestRate = annualInterestRate;

         }

         //dateCreated的get方法

         public Date getDateCreated() {

                   return dateCreated;

         }

        

         //一个名为getMonthlyInterestRate()的方法返回月利率

         publicdouble getMonthlyInterestRate(){

                   return getAnnualInterestRate()/12;

         }

        

         //一个名为withDraw的方法从账户提款。

         publicdouble withDraw(double draw){

                   if(draw <= getBalance()){

                            setBalance(getBalance() - draw);

                            return draw;

                   }else{

                            return 0;

                   }

         }

         //一个名为deposit的方法向账户存款。

         publicdouble deposit(double deposit){

                   setBalance(getBalance() + deposit);

                   return deposit;

         }

}

//main

package Account;

publicclass Main {

         publicstaticvoid main(String[] args){

                   //创建一个账户id为123、余额为2000元、年利率为4.5%的Account对象。

                   Account account = new Account(123, 2000);

                   account.setAnnualInterestRate(0.045);

                  

                   //使用withDraw方法取款200元

                   account.withDraw(200);

                  

                   //使用deposit方法存款3000元

                   account.deposit(3000);

                  

                   //然后打印余额、月利息以及这个账户的开户日期。

                   System.out.println("账户  "+account.getId()+"  的余额为:\t" + account.getBalance());

                   System.out.println("月利息为:\t" + account.getMonthlyInterestRate() * account.getBalance());

                   System.out.println("开户日期:\t" + account.getDateCreated());

                  

         }

}

第2章     实验二

2.1三角形类Triangle

2.1.1 要求

v  设计一个三角形类Triangle来扩展Geometricobject类,该类包括:

v  三个名为side1, side2和side3的double数据域表示这个三角形的三条边,它们的默认值是1.0

v  一个无参构造方法创建默认的三角形

v  一个能创建指定side1, side2和side3的三角形的构造方法

v  所有三个数据域的get方法

v  一个名为getArea()的方法返回这个三角形的面积 ,计算公式为s=(side1+ side2+ side3)/2

v  一个名为getPerimeter()的方法返回这个三角形的周长

v  编写测试程序,创建边长为1、1.5和1,颜色为yellow,filled为true的Triangle对象,然后显示它的面积、周长、颜色以及是否被填充

v  显示以该对象创建的具有三角形底的Pillar类对象的体积。

2.1.2 代码

//Geometricobject.java

package Geometricobject;

publicabstractclass Geometricobject {

         private String color = "White";

         private String filled = "false";

         publicabstractdouble getArea();

         publicabstractdouble getPerimeter();

         public String getColor() {

                   return color;

         }

         publicvoid setColor(String color) {

                   this.color = color;

         }

         public String getFilled() {

                   return filled;

         }

         publicvoid setFilled(String filled) {

                   this.filled = filled;

         }

}

//Pillar.java

package Geometricobject;

publicclass Pillar {

         private Geometricobject geometricobject;

         privatedouble height;

         public Pillar(Geometricobject geometricobject, double height){

                   this.geometricobject = geometricobject;

                   this.height = height;

         }

         publicdouble getVolume(){

                   return height * geometricobject.getArea();

         }

        

}

//Triangle

package Geometricobject;

//设计一个三角形类Triangle来扩展Geometricobject

publicclass Triangle extends Geometricobject{

         //三个名为side1, side2和side3的double数据域表示这个三角形的三条边,它们的默认值1.0

         privatedouble side1 = 1.0;

         privatedouble side2 = 1.0;

         privatedouble side3 = 1.0;

        

         //一个无参构造方法创建默认的三角形

         public Triangle(){}

        

         //一个能创建指定side1, side2和side3的三角形的构造方法

         public Triangle(double side1, double side2, double side3){

                   this.side1 = side1;

                   this.side2 = side2;

                   this.side3 = side3;

         }

        

         //所有三个数据域的get方法

         publicdouble getSide1() {

                   return side1;

         }

         publicdouble getSide2() {

                   return side2;

         }

         publicdouble getSide3() {

                   return side3;

         }

         //一个名为getArea()的方法返回这个三角形的面积 ,计算公式为s=(side1+ side2+ side3)/2

         publicdouble getArea(){

                   return (this.side1 + this.side2 + this.side3)/2;

         }

        

         //一个名为getPerimeter()的方法返回这个三角形的周长

         publicdouble getPerimeter(){

                   returnthis.side1 + this.side2 + this.side3;

         }

        

};

//main.java

package Main;

import Geometricobject.*;

publicclass Main {

         publicstaticvoid main(String[] argv){

                   Triangle triangle = new Triangle(1, 1.5, 1);

                   triangle.setColor("yellow");

                   triangle.setFilled("true");

                   System.out.println("面积\t" + triangle.getArea());

                   System.out.println("周长\t" + triangle.getPerimeter());

                   System.out.println("颜色\t" + triangle.getColor());

                   System.out.println("是否填充\t" + triangle.getFilled());

                   Pillar pillar = new Pillar(triangle, 2);

                   System.out.println("Pillar类的对象体积\t" + pillar.getVolume());

                  

         }

}

2.2设计一个名为Person的类和它的两个名为Student和Employee的子类

2.2.1 要求

v  Employee类又有子类:教员类Faculty和职员类Staff。

v  每个人都有姓名、地址、电话号码

v  学生有班级号

v  教员有级别

v  职员有职务称号

v  覆盖每个类的toString方法,显示相应的类名和人名

v  编写测试程序,创建Person、 Student、Employee Faculty和Staff,并调用它们的toString方法

2.2.2 代码

//Employee.java

package Class;

//Person的子类Employee

publicclass Employee extends Person {

         public Employee(String name, String address, String phonenumber){

                   super(name, address, phonenumber);

         }

}

//Faculty.java

package Class;

//Employee的子类Faculty

publicclass Faculty extends Employee {

         //教员有级别

         private String level;

         public Faculty(String name, String address, String phonenumber, String level){

                   super(name, address, phonenumber);

                   this.level = level;

         }

}

//Person.java

package Class;

//设计一个名为Person的类

publicclass Person {

         private String name;

         private String address;

         private String phonenumber;

        

         public Person(String name, String address, String phonenumber){

                   this.name = name;

                   this.address = address;

                   this.phonenumber = phonenumber;

         }

        

         //覆盖每个类的toString方法,显示相应的类名和人名

         public String toString(){

                   returnthis.getClass().getName() + "\t姓名 :" + name;

         }

}

//Staff.java

package Class;

//Employee的子类Staff

publicclass Staff extends Employee {

         //职员有职务称号

         private String professionaltitle;

         public Staff(String name, String address, String phonenumber, String professionaltitle){

                   super(name, address, phonenumber);

                   this.professionaltitle = professionaltitle;

         }

}

//Student.java

package Class;

//Person的子类Student

publicclass Student extends Person{

         //学生有班级号

         privateintclassnumber;

         public Student(String name, String address, String phonenumber, int classnumber){

                   super(name, address, phonenumber);

                   this.classnumber = classnumber;

         }

}

//Main.java

package Main;

import Class.*;

publicclass Main {

         publicstaticvoid main(String[] args) {

                   //创建Person、 Student、Employee Faculty和Staff

                   Person person = new Person("Person", "ddd", "222");

                   Student student = new Student("Student", "ddd", "2", 5);

                   Employee employee = new Employee("Employee", "ddd", "33");

                   Faculty faculty = new Faculty("Factuly", "ddd", "22", "level");

                   Staff staff = new Staff("Staff", "ddd", "222", "professionaltitle");

                  

                   System.out.println(person.toString());

                   System.out.println(student.toString());

                   System.out.println(employee.toString());

                   System.out.println(faculty.toString());

                   System.out.println(staff.toString());

         }

}

第3章     实验三

3.1求几何对象的面积之和

3.1.1 要求

v  编写一个方法,求参数列表中所有几何对象的面积之和。方法签名如下:

v  public static double sumArea(GeometricObject… a)

v  编写测试程序,创建4个对象(2个矩形,2个三角形),然后使用sumArea方法求它们的总面积。

v  可变参数用法参考书58页,同时请大家使用增强的for语句编程。

3.1.2 代码

publicstaticdouble sumArea(Geometricobject...list){

                   double sum = 0;

                   for(Geometricobject param:list){

                            sum += param.getArea();

                   }

                   return sum;

         }

3.2实现可比较大小的RegularPolygon类和 Triangle类

3.2.1 要求

v  扩展实验一中的RegularPolygon 类和实验二中的Triangle类,使之都实现Comparable接口。

v  编写测试程序,测试新的RegularPolygon 类和Triangle类

3.2.2 代码

//ComparableGeometricobject.java

package Geometricobject;

publicabstractclass ComparableGeometricobject extends Geometricobject implements

                   Comparable<ComparableGeometricobject> {

        

         publicint compareTo(ComparableGeometricobject o){

        if(getArea() > (o.getArea()))

                    return 1;

       elseif ((getArea()) < (o.getArea()))

                    return -1;

       else

                    return 0;

         }

}

//ComparableRegularPolygon.java

package Geometricobject;

publicclass ComparableRegularPolygon extends ComparableGeometricobject {

         privateint n = 3;

         privatedouble side = 1;

         privatedouble x = 0;

         privatedouble y = 0;

        

         public ComparableRegularPolygon(){

                   this.setN(3);

                   setSide(1);

                   setX(0);

                   setY(0);

         }

        

        

         public ComparableRegularPolygon(int n, double side){

                   this.setN(n);

                   this.setSide(side);

                   setX(0);

                   setY(0);

         }

        

        

         public ComparableRegularPolygon(int n, double side, double x, double y){

                   this.setN(n);

                   this.setSide(side);

                   this.setX(x);

                   this.setY(y);

         }

         publicint getN() {

                   return n;

         }

         publicvoid setN(int n) {

                   this.n = n;

         }

         publicdouble getSide() {

                   return side;

         }

         publicvoid setSide(double side) {

                   this.side = side;

         }

         publicdouble getX() {

                   return x;

         }

         publicvoid setX(double x) {

                   this.x = x;

         }

         publicdouble getY() {

                   return y;

         }

         publicvoid setY(double y) {

                   this.y = y;

         }

        

        

         publicdouble getPerimeter(){

                   return n * side;

         }

        

        

         publicdouble getArea(){

                   return (n * side * side)/(4 * Math.tan(Math.PI/n));

         }

}

 //ComparableRectangle.java

package Geometricobject;

publicclass ComparableRectangle extends ComparableGeometricobject{

         privatedouble width = 1.0;

         privatedouble height = 1.0;

        

         public ComparableRectangle(){}

         public ComparableRectangle(double width, double height){

                   this.width = width;

                   this.height = height;

         }

        

         publicdouble getArea(){ return width * height;}

         publicdouble getPerimeter(){ return width + width + height +height;}

         publicdouble getWidth(){ returnthis.width;}

         publicdouble getHeight(){ returnthis.height;}

        

}

//ComparableTriangle.java

package Geometricobject;

publicclass ComparableTriangle extends ComparableGeometricobject{

        

        

                   privatedouble side1 = 1.0;

                   privatedouble side2 = 1.0;

                   privatedouble side3 = 1.0;

                  

                  

                   public ComparableTriangle(){}

                  

                  

                   public ComparableTriangle(double side1, double side2, double side3){

                            this.side1 = side1;

                            this.side2 = side2;

                            this.side3 = side3;

                   }

                  

                  

                   publicdouble getSide1() {

                            return side1;

                   }

                   publicdouble getSide2() {

                            return side2;

                   }

                   publicdouble getSide3() {

                            return side3;

                   }

                   publicdouble getArea(){

                            return (this.side1 + this.side2 + this.side3)/2;

                   }

                  

                   publicdouble getPerimeter(){

                            returnthis.side1 + this.side2 + this.side3;

                   }

}

3.3找出最大的对象

3.3.1 要求

v  编写一个方法,返回对象列表中最大的对象。

v  方法签名:

    Public static Object max(Comparable…a)

v  编写测试程序,创建2个RegularPolygon 类和2个Triangle类对象,找出面积最大的对象。

3.3.2 代码         

publicstatic ComparableGeometricobject max(ComparableGeometricobject...list){

                   ComparableGeometricobject o = list[0];

                   for(ComparableGeometricobject param:list){

                            if(o.getArea() < param.getArea()){

                                     o = param;

                            }

                   }

                   return o;

         }

第4章     实验四

4.1求几何对象的面积排序            

4.1.1 要求

v  编写一个方法,求参数中几何对象数组的面积排序(冒泡法)。方法签名如下:

v  public static void bubbleSort(GeometricObject[] a)

v  编写测试程序,创建4个对象(4个矩形或4个三角形)的数组,然后使用bubbleSort方法对它们的面积进行冒泡法排序。

v  排序时,请使用实验3中的max方法比较面积大小。

4.1.2 代码     

publicstaticvoid bubbleSort(ArrayList<ComparableGeometricobject> list, ArrayList<ComparableGeometricobject> r){

                   ComparableGeometricobject temp;

                   while(list.size() > 0){

                            temp = list.get(0);

                            for(int j=0; j<list.size(); j++){

                                     temp = max(temp, list.get(j));

                            }

                            list.remove(temp);

                            r.add(temp);

                   }

         }

4.2修改后的Account类

4.2.1 要求

v  在实验一Account类的基础上做如下修改:

v  添加一个String型的数据域name存储客户名字

v  添加一个新的构造方法,该方法创建一个带指定名字、id和初始余额的账户

v  添加一个名为transactions的数据域,类型为ArrayList,可以为账户存储交易。每笔交易都是一个名为Transaction类的实例

v  修改withDraw和deposit方法,向transactions线性表添加一笔交易。

4.2.2 代码

//account.java

package Account;

import java.util.ArrayList;

import java.util.Date;

public class Account {

      

       //添加一个名为transactions的数据域,类型为ArrayList,可以为账户存储交易。每笔交易都是一个名为Transaction类的实例

       public ArrayList<Transaction> transactions;

      

       //添加一个String型的数据域name存储客户名字

       private String name;

      

       private int id = 0;

      

       private double balance = 0;

      

       private double annualInterestRate = 0;

      

       private Date dateCreated;

      

       public Account(){

              this.setId(0);

              this.setBalance(0);

              dateCreated = new Date();

              transactions = new ArrayList<Transaction>();

       }

      

       public Account(int id, double balance){

              this.setId(id);

              this.setBalance(balance);

              dateCreated = new Date();

              transactions = new ArrayList<Transaction>();

       }

       //添加一个新的构造方法,该方法创建一个带指定名字、id和初始余额的账户

       public Account(int id, String name, double balance){

              this.setId(id);

              this.setName(name);

              this.setBalance(balance);

              dateCreated = new Date();

              transactions = new ArrayList<Transaction>();

       }

      

       public int getId() {

              return id;

       }

       public void setId(int id) {

              this.id = id;

       }

       public double getBalance() {

              return balance;

       }

       public void setBalance(double balance) {

              this.balance = balance;

       }

       public double getAnnualInterestRate() {

              return annualInterestRate;

       }

       public void setAnnualInterestRate(double annualInterestRate) {

              this.annualInterestRate = annualInterestRate;

       }

       public Date getDateCreated() {

              return dateCreated;

       }

      

       public double getMonthlyInterestRate(){

              return getAnnualInterestRate()/12;

       }

      

       public double withDraw(double draw){

              if(draw <= getBalance()){

                     setBalance(getBalance() - draw);

                     Transaction t = new Transaction('w', draw, getBalance(), "取钱");

                     this.transactions.add(t);

                     return draw;

              }else{

                     return 0;

              }

       }

       public double deposit(double deposit){

              setBalance(getBalance() + deposit);

              Transaction t = new Transaction('d', deposit, getBalance(), "存钱");

              this.transactions.add(t);

              return deposit;

       }

       public String getName() {

              return name;

       }

       public void setName(String name) {

              this.name = name;

       }

}

4.3Transaction类

4.3.1 要求

v  一个名为date的Date类型数据域表示交易日期

v  一个名为type的char型数据域表示交易类型,例如: ‘w’表示取钱  ‘D’表示存钱

v  一个名为amount的double型数据域表示交易额

v  一个名为balance的double型数据域表示交易后的新余额

v  一个名为description的String型数据域描述交易

v  一个能创建指定type、amount、balance和description对象的构造方法

v  编写一个测试程序,创建一个年利率1.5%、余额1000、id为112、名字为zhao的Account对象。使用withDraw方法取款20,150,10,使用deposit方法存款300,10,5,然后打印账户清单,显示用户名字,利率,余额和所有交易。

4.3.2 代码      

//Transaction.java

package Account;

import java.util.Date;

publicclass Transaction {

         //一个名为date的Date类型数据域表示交易日期

         private Date date;

         //一个名为type的char型数据域表示交易类型,例如: ‘w’表示取钱  ‘D’表示存钱

         privatechar type;

         //一个名为amount的double型数据域表示交易额

         privatedouble amount;

         //一个名为balance的double型数据域表示交易后的新余额

         privatedouble balance;

         //一个名为description的String型数据域描述交易

         private String description;

        

         //一个能创建指定type、amount、balance和description对象的构造方法

         public Transaction(char type, double amount, double balance, String description){

                   this.type = type;

                   this.amount = amount;

                   this.balance = balance;

                   this.description = description;

                   date = new Date();

         }

         public Date getDate() {

                   return date;

         }

         publicchar getType() {

                   return type;

         }

         publicdouble getAmount() {

                   return amount;

         }

         publicdouble getBalance() {

                   return balance;

         }

         public String getDescription() {

                   return description;

         }

}

//Main.java

package Main;

import Account.*;

publicclass Main {

         publicstaticvoid main(String[] args) {

                   // TODO Auto-generated method stub

                   //创建一个年利率1.5%、余额1000、id为112、名字为zhao的Account对象。

                   Account account = new Account(112, "Zhao", 1000);

                   account.setAnnualInterestRate(0.015);

                   account.withDraw(20);

                   account.withDraw(150);

                   account.withDraw(10);

                   account.deposit(300);

                   account.deposit(10);

                   account.deposit(5);

                  

                   for(int i=0; i<account.transactions.size(); i++){

                            System.out.println(account.transactions.get(i));

                   }

                  

         }

}

第5章     实验五

5.1 ArrayIndexOutBoundException异常

5.1.1 要求

v  创建一个满足下列要求的程序:

v  创建一个由20个随机整数构成的数组。

v  提示用户输入数组的下标,然后显示对应的元素值。

v  如果指定的下标越界,就显示消息out of bounds

5.1.2 代码

//Main.java

package Main;

import java.util.Scanner;

publicclass Main {

         publicstaticintnumber[] = newint[20];

        

         publicstaticvoid main(String[] args) {

                   // TODO Auto-generated method stub

                   for (int i =0 ; i<20; i++){

                            number[i] = (int)Math.random();

                   }

                   @SuppressWarnings("resource")

                  Scanner reader = new Scanner(System.in);

                   int n;

                   while(true){

                            try{

                                     n = reader.nextInt();

                                     System.out.println(n + '\t' + number[n]);

                            }catch(Exception e){

                                     System.out.println("数组越界");

                            }

                           

                   }

         }

}

5.2 修改实验三的Account类

5.2.1 要求

v  如果创建Account对象时,账户余额或利率小于或等于0,则抛出IllegalArgumentException异常。

v  创建一个IllegalWithDrawException类,如果withDraw方法中,取款金额超过账户余额,则抛出IllegalWithDrawException异常

v  编写测试程序

5.2.2 代码

//IllegalArgumentException.java

package Account;

@SuppressWarnings("serial")

publicclass IllegalArgumentException extends Exception {

         String message;

         public IllegalArgumentException(){

                   message = "年利率小于或等于0";

         }

         public String warnMess(){

                   return message;

         }

}

//IllegalWithDrawException.java

package Account;

@SuppressWarnings("serial")

publicclass IllegalWithDrawException extends Exception {

         String message;

         public IllegalWithDrawException(double m, double n){

                   message = "取出金额" + m + "超出账户余额" + "n" + "\n";

         }

         public String warnMess(){

                   return message;

         }

}

5.3 定义带三条边的Triangle类

5.3.1 要求

v  Triangle类扩展自GeometricObject类。在三角形中,任意两边之和总大于第三边,Triangle类必须遵从这一规则。创建一个IllegalTriangleException类,如果创建的三角形的边违反了这一规则,抛出一个IllegalTriangleException对象。

v  编写测试程序

5.3.2 代码

//IllegalTriangleException.java

package Geometricobject;

@SuppressWarnings("serial")

publicclass IllegalTriangleException extends Exception {

         String message;

         public IllegalTriangleException(){

                   message = "三角形变长不合法";

         }

         public String warnMess(){

                   return message;

         }

}

//Trianle.java

package Geometricobject;

publicclass Triangle extends Geometricobject{

         privatedouble side1 = 1.0;

         privatedouble side2 = 1.0;

         privatedouble side3 = 1.0;

         public Triangle(){}

        

         privateboolean check(){

                   if( side1 + side2 < side3 ||  side1 + side3 < side2 ||  side3 + side2 < side1){

                            returnfalse;

                   }else{

                            returntrue;

                   }

         }

        

         public Triangle(double side1, double side2, double side3){

                   try{

                   this.side1 = side1;

                   this.side2 = side2;

                   this.side3 = side3;

                   if(!check())

                   thrownew IllegalTriangleException();

                   }catch(IllegalTriangleException e){

                            System.out.println(e.warnMess());

                   }

         }

        

         publicdouble getSide1() {

                   return side1;

         }

         publicdouble getSide2() {

                   return side2;

         }

         publicdouble getSide3() {

                   return side3;

         }

         publicdouble getArea(){

                   return (this.side1 + this.side2 + this.side3)/2;

         }

        

         publicdouble getPerimeter(){

                   returnthis.side1 + this.side2 + this.side3;

         }

        

};

第6章     实验六

6.1 检测回文串

6.1.1 要求

v  如果一个字符串从前向后读和从后向前读都是同一个字符串,则称为回文串。

v  例如:“mom”和“dad”都是回文串

v  编写一个程序,提示用户输入一个字符串,忽略该字符串中的非字母和非数字字符,然后判断是否是回文串。

v  可使用Character类的静态方法

isLetterOrDigit(char ch)来判断字符类型。

6.1.2 代码

//Main.java

package Main;

import java.util.Scanner;

publicclass Main {

        

         publicstaticvoid main(String[] args) {

                   String string;

                  

                   @SuppressWarnings("resource")

                   Scanner reader = new Scanner(System.in);

                  

                   string = reader.nextLine();

                  

                   int size = string.length();

                   int n = size/2 ;

                   int i;

                   for(i = 0; i <= n; i++){

                            if(string.charAt(i) != string.charAt(size - 1 - i)){

                                     break;

                            }

                   }

                   if(i != n+1){

                            System.out.println("wrong");

                   }else{

                            System.out.println("right");

                   }

                  

         }

}

6.2 检验密码

6.2.1 要求

v  一些网站设定了一些制定密码的规则。编写一个方法,检验一个字符串是否是合法的密码。假设密码规则如下:

?  密码必须至少有8个字符

?  密码只能包括字母和数字

?  密码必须至少有2个数字

v  编写一个程序,提示用户输入密码,并判断是否是合法的密码。

6.2.2 代码

//Main.java

package Main;

import java.util.Scanner;

publicclass Main {

         publicstaticvoid main(String[] args) {

                   // TODO Auto-generated method stub

                  

                   String regex = "^(\\w*[0-9]\\w*[0-9]\\w*)$";

                   @SuppressWarnings("resource")

                   Scanner reader = new Scanner(System.in);

                   String string = reader.nextLine();

                   if(string.matches(regex) && string.length() >= 8){

                            System.out.println("ok");

                   }else{

                            System.out.println("wrong");

                   }

         }

}

6.3 在字符串中每个数字出现的次数

6.3.1 要求

v  使用下面的方法头编写一个方法,统计每个数字在字符串中出现的次数:

        public static int[] count(String s)

v  这个方法统计每个数字在字符串中出现的次数。返回值是一个10个元素的数组,每个元素存储的是一个数字出现的次数。

v  例如:执行完 int[] counts = count(“0112ab”);后,counts[0] = 1, counts[1] = 2, counts[2] = 1

6.3.2 代码

//Main.java

package Main;

publicclass Main {

         publicstaticvoid main(String[] args) {

                   // TODO Auto-generated method stub

         }

         publicstaticint[] count(String s){

                   int counts[] = newint[10];

                  

                   int size = s.length();

                   for(int i=0; i<10; i++){

                            counts[i] = 0;

                   }

                   int temp;

                   for(int i=0; i<size; i++){

                            temp = (int)(s.charAt(i) - '0');

                            if(temp>=0 && temp <= 9){

                                     counts[temp]++;

                            }

                   }

                  

                   return counts;

         }

}

6.4 刽子手游戏

6.4.1 要求

v  随机产生一个单词,单词中的字母都以星号显示。然后提示用户一次猜测一个字母,当用户才猜测准确时,就显示实际的字母。当用户完成了一个单词,就显示猜错的次数,然后询问用户是否继续猜测另一个单词。

v  声明一个数组来存储这些单词,例如:

String[] words = {“program”,”hello”,…….};

6.4.2 代码

//Main.java

package Main;

import java.util.Scanner;

publicclass Main {

         static String[] words = {"program","hello","you", "he", "I"};

        

         static String replace(String str, char n, int index){

                   if(index > str.length() - 1){

                            thrownew ArrayIndexOutOfBoundsException("越界");

                   }

                   String pre = str.substring(0, index);

                   String sub = str.substring(index + 1);

                   return pre + n + sub;

         }

        

         staticboolean unknown(String s){

                   for(int i=0; i<s.length(); i++){

                            if(s.charAt(i) == '*'){

                                     returntrue;

                            }

                   }

                   returnfalse;

         }

        

         static String update(String key, String answer, char n){

                   for(int i=0; i<answer.length(); i++){

                            if(answer.charAt(i) == n){

                                     key =  replace(key, n, i);

                            }

                   }

                   return key;

         }

        

         publicstaticvoid main(String[] args) {

                   // TODO Auto-generated method stub

                   @SuppressWarnings("resource")

                   Scanner reader = new Scanner(System.in);

                   String answer = words[((int)Math.random())%words.length];

                   String key = "";

                   String in;

                   int size = answer.length();

                   for(int i=0; i<size; i++){

                            key += '*';

                   }

                  

                   while(unknown(key)){

                            System.out.println(key);

                            in = reader.next();

                            key = update(key, answer, in.charAt(0));

                   }

                   System.out.println(key);

         }

}

第7章     实验七

7.1在实验四Account类的基础上做如下修改

7.1.1 要求

v  打印账户清单时,显示用户名字,开户日期(格式为年-月-日,例如20##-11-19),利率(格式化为百分数),余额(格式化为货币值,例如:1,234,567¥)和所有交易。

v  增加balanceInterest方法,计算当前存款的利息(按存款存入的天数计算,如果有多笔存款,发生取款交易时,按存入顺序取款)    

7.1.2 代码

publicdouble balanceInterest(){

                   double sum = 0;

                   ArrayList<Double> s = new ArrayList<Double>();

                   double temp = 0;

                   double amount;

                   for(int j=0; j<transactions.size(); j++){

                            for(int k=1; k<s.size(); k++){

                                     sum += s.get(j) * getAnnualInterestRate() * (transactions.get(j).getDate().getYear() + - transactions.get(j-1).getDate().getYear());

                            }

                            if(transactions.get(j).getDescription().compareTo("存钱") == 0){

                                     s.add(transactions.get(j).getAmount());

                            }elseif(transactions.get(j).getDescription().compareTo("取钱") == 0){

                                     amount = transactions.get(j).getAmount();

                                     int i=0;

                                     while(amount > 0 ){

                                               temp = s.get(i);

                                               temp -= amount;

                                               if(temp < 0){

                                                        temp = 0;

                                                        amount -= s.get(i);

                                               }else{

                                                        temp -= amount;

                                               }

                                               s.set(i, temp);

                                     }

                                    

                            }

                   }

                  

                   return sum;

         }

第8章 实验八

8.1 4个小伙伴唱歌

8.1.1 要求

v  编写代码模拟他们唱歌的全过程,要求如下:

v  (1)话筒只有一个,大家轮流随机唱 ~

v  (2)每个人都可以不被打断地唱三句歌词:1、我是x(x=1,2,3,4);2、我最喜欢唱歌;3、大家都爱听我唱歌!

v  (3)每个人都只能唱10次,次数到了,就只有旁观了~

8.1.2 代码      

//Tool

package Tools;

publicclass Tool implements Runnable{

         privateint friend[];

         public Tool(){

                   friend = newint[5];

                   friend[1] = 0;

                   friend[2] = 0;

                   friend[3] = 0;

                   friend[4] = 0;

         }

         publicvoid run(){

                   int singer = Thread.currentThread().getName().charAt(0) - '0';

                   int temp = friend[singer];

                   while(true){

                            if(temp < 10){

                                     sing(temp);

                                     temp ++;

                                     try{

                                               Thread.sleep(1);

                                     }catch(InterruptedException e){

                                     }

                            }else{

                                     return;

                            }

                            friend[singer] = temp;

                   }

         }

         publicsynchronizedvoid sing(int temp){

                   System.out.print("我是" + Thread.currentThread().getName() + ",");

                   System.out.print("我最喜欢唱歌,");

                   System.out.print("大家都爱听我唱歌.");

                   System.out.print(temp + 1 + "\n");

         }

}

//Main.java

package Main;

import Tools.*;

publicclass Main {

         publicstaticvoid main(String[] args) {

                   // TODO Auto-generated method stub

                  

                   Tool tool = new Tool();

                   Thread f1 = new Thread(tool);

                   Thread f2 = new Thread(tool);

                   Thread f3 = new Thread(tool);

                   Thread f4 = new Thread(tool);

                   f1.setName("1");

                   f2.setName("2");

                   f3.setName("3");

                   f4.setName("4");

                   f1.start();

                   f2.start();

                   f3.start();

                   f4.start();

         }

}

8.2说悄悄话的一对情侣

8.2.1 要求

v  一对情侣要说悄悄话,他们不希望被人听到,要求如下:

v  (1)轮流让情侣说话,可以分为男方和女方,悄悄话是用户的输入字符串

v  (2)女方能听懂男方的每句话,同时女方的每一句话都进行了加密,加密方式:倒着说:例如把"我爱你"加密成"你爱我","abc"加密为"cba"

v  (3)男方能够翻译女方的每一句话,同时男方的每一句话也被进行了加密,加密方式是:对每一句话都根据加密密码“无敌小情侣"进行加密!

8.2.2 代码

//Message.java

package Runnable;

import java.util.Scanner;

publicclass Message implements Runnable{

         public Message(){

                   t = "Girl";

         }

         private String t;

         privatechar[] key = "FFF".toCharArray();

         publicvoid run(){

                   while(true){

                            String speaker = Thread.currentThread().getName();

                            if(speaker.compareTo(t) == 0){

                                     speak(t);

                            }else{

                                     try {

                                               Thread.sleep(1);

                                     } catch (InterruptedException e) {

                                               // TODO Auto-generated catch block

                                               e.printStackTrace();

                                     }

                            }

                   }

         }

         publicsynchronizedvoid speak(String speaker){

                   Scanner s = new Scanner(System.in);

                   String temp = s.nextLine();

                   if(speaker.compareTo("Girl") == 0){

                            System.out.print("Gril:\t");

                            for(int i=temp.length() - 1; i >=0; i--){

                                     System.out.print(temp.charAt(i));

                            }

                            System.out.print("\n");

                           

                            this.t = "Boy";

                           

                   }

                   elseif(speaker.compareTo("Boy") == 0){

                            System.out.print("Boy:\t");

                            char [] c = temp.toCharArray();

                            int k = key.length;

                            int n = c.length;

                            for(int i=0; i < n; i++){

                                     int mima = c[i] + key[i%k];

                                     c[i] = (char) mima;

                                     System.out.println(c[i]);

                            }

                            System.out.print("\n");

                           

                            this.t = "Girl";

                   }

         }

}

//Main.java

package Main;

import Runnable.Message;

publicclass Main {

         publicstaticvoid main(String[] args) {

        

         Message m = new Message();

                  

                   Thread g = new Thread(m);

                   Thread b = new Thread(m);

                   g.setName("Girl");

                   b.setName("Boy");

                  

                   g.start();

                   b.start();

                  

         }

}

更多相关推荐:
Java程序设计实验报告

学生实验报告册(理工类)课程名称:JAVA程序设计实验专业班级:M11计算机科学与技术II学生学号:学生姓名:所属院部:XX学院指导教师:20XX20XX学年第二学期金陵科技学院教务处制实验报告书写要求实验报告…

JAVA简单记事本程序设计实验报告(带源码)

JAVA程序设计实验报告院系专业班级11计算机01班姓名任课教师XXX实验题目JAVA简单记事本程序设计目录目录1一引言211课程设计目的212题目说明213开发工具介绍2二总体设计421系统开发平台422系统...

java程序设计课程--实验报告-实验09

Java开发技术实验报告实验序号实验09实验项目名称条件和循环语句二

Java程序设计实验报告 哈工大

Java语言基础实验指导报告书20xx20xx年秋季学期使用班级姓名计算机科学与技术学院实验一Java编程开发环境一实验学时1学时二实验目的1学习从网络下载JDK开发工具与帮助文档2学习安装JDK开发工具及其文...

Java程序设计实验报告20xx

Java程序设计实验指导报告书目录实验1熟悉Java开发环境2实验2简单的输入输出处理3实验3类的练习6实验4Java图形用户界面设计9实验5Java数据流21实验6Java多线程52实验7Java网络功能练习...

JAVA程序设计实验报告

JAVA程序设计实验报告姓名葛猛学号119xx4183班级软件工程112班指导教师柯栋梁20xx年12月24日实验1利用JAVA反射技术分析类结构1实验内容运行程序指定一个要分析的类名称如javalangDou...

简单java程序设计 实验报告

广州大学实验报告学院商学院专业、班级11电子商务姓名、学号课程名称Java语言程序设计项目名称简单java程序设计实验时间:20##年3月8日简单java程序设计_实验报告

JAVA网络程序设计实验报告

Java网络程序设计实验五JDBC班级姓名学号日期20xx68实验五JDBC一实验目的1掌握SQL语句和MYSQL数据库操作命令2掌握关系型数据库设计规则3掌握JDBC类库包使用规则二实验内容1学习SQL语言基...

java程序设计 实验报告7

学生实验报告书实验课程名称实验课程名称实验课程名称实验课程名称实验课程名称

《JAVA程序设计》实验报告

福建师范大学协和学院本科实验报告课程名称JAVA程序设计系别信息技术系专业计算机科学与技术班级学号姓名20xx年实验项目列表JAVA程序设计实验相关说明实验要求1明确实验课是课程的重要组成部分与理论课有着同等地...

java程序设计课程--实验报告-实验04

Java开发技术实验报告实验序号实验04实验项目名称Applet的编写与运行

Java语言程序设计实验报告1

Java语言程序设计实验报告一学生姓名孙文琳班级信息111学号20xx52275119实验地点经管中心证券实验室指导教师赵利平实验日期20xx36实验环境Windows20xxJDK161实验目的1养成良好的编...

java程序设计实验报告(36篇)