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

更新时间:2023-10-17 17:50:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

本科生实验报告

实验课程 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 5 6 7 8 9

public class RegularPolygon {

private int n = 3;//一个名为n的int型私有数据域定义多边形的边数,默认值为3。 private double side = 1;//一个名为side的double型私有数据域存储边的长度,默认值为1。

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

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

//一个创建带默认值的正多边形的无参构造方法。 public RegularPolygon(){ this.setN(3); setSide(1); setX(0); setY(0); }

//一个能创建带指定边数和边长度、中心在(0,0)的正多边形的构造方法。 public RegularPolygon(int n, double side){ this.setN(n); this.setSide(side); setX(0); setY(0); }

//一个能创建带指定边数和边长度、中心在(x,y)的正多边形的构造方法。 public RegularPolygon(int n, double side, double x, double y){ this.setN(n); this.setSide(side); this.setX(x); this.setY(y); }

//所有数据域的get和set方法。 public int getN() { return n; }

public void setN(int n) { this.n = n; }

public double getSide() { return side; }

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 } //main

public class main {

public static void main (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);

//显示每个对象的周长和面积; public void setY(double y) { this.y = y; }

//一个返回多边形周长的方法getPerimeter()。 public double getPerimeter(){ return n * side; }

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

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

public double getY() { return y; }

public void setX(double x) { this.x = x; }

public double getX() { return x; }

public void setSide(double side) { this.side = side; }

}

}

System.out.println(\无参数多边形的面积是:\\t\ + r1.getArea() + \周长为:\\t\ + System.out.println(\两个参数多边形的面积是:\\t\ + r2.getArea() + \周长为:\\t\ + System.out.println(\四个参数多边形的面积是:\\t\ + r3.getArea() + \周长为:\\t\ +

r1.getPerimeter()); r2.getPerimeter()); r3.getPerimeter());

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

1.2.1 要求

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

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

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

假设所有的账户都有相同的利率。

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

java.util.Date)

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

? 一个能创建带特定id和初始余额的的账户的构造方法。 ? id、balance和annualInterestRate的get和set方法 ? dateCreated的get方法

? 一个名为getMonthlyInterestRate()的方法返回月利率。 ? 一个名为withDraw的方法从账户提款。 ? 一个名为deposit的方法向账户存款。 ? 编写一个测试程序,创建一个账户id为123、余额为2000元、年利率为4.5%的Account

对象。使用withDraw方法取款200元,使用deposit方法存款3000元,然后打印余额、月利息以及这个账户的开户日期。

1.2.2 代码

//Account.java

package Account;

import java.util.Date;

public class Account {

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

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

2.2.2 代码

//Employee.java

package Class;

//Person的子类Employee

public class Employee extends Person { }

//Faculty.java package Class;

//Employee的子类Faculty

public class Faculty extends Employee { }

//Person.java package Class;

//设计一个名为Person的类 public class Person { }

//Staff.java package Class;

private String name; private String address; private String phonenumber;

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

//覆盖每个类的toString方法,显示相应的类名和人名 public String toString(){ }

return this.getClass().getName() + \姓名 :\ + name; this.name = name; this.address = address;

this.phonenumber = phonenumber; //教员有级别 private String level;

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

super(name, address, phonenumber); this.level = level;

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

super(name, address, phonenumber);

//Employee的子类Staff

public class Staff extends Employee { }

//Student.java package Class; //Person的子类Student

public class Student extends Person{ }

//Main.java

package Main; import Class.*; public class Main { }

public static void main(String[] args) { }

//创建Person、 Student、Employee Faculty和Staff Person person = new Person(\, \, \); Student student = new Student(\, \, \, 5); Employee employee = new Employee(\, \, \); Faculty faculty = new Faculty(\, \, \, \); Staff staff = new Staff(\, \, \, \);

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()); //学生有班级号

private int classnumber;

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

super(name, address, phonenumber); this.classnumber = classnumber; //职员有职务称号

private String professionaltitle;

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

super(name, address, phonenumber); this.professionaltitle = professionaltitle;

第3章 实验三

3.1求几何对象的面积之和

3.1.1 要求

? 编写一个方法,求参数列表中所有几何对象的面积之和。方法签名如下: ? public static double sumArea(GeometricObject… a)

? 编写测试程序,创建4个对象(2个矩形,2个三角形),然后使用sumArea方法求

它们的总面积。

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

3.1.2 代码

public static double sumArea(Geometricobject...list){

}

double sum = 0;

for(Geometricobject param:list){ }

return sum;

sum += param.getArea();

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

3.2.1 要求

? 扩展实验一中的RegularPolygon 类和实验二中的Triangle类,使之都实现

Comparable接口。

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

3.2.2 代码

//ComparableGeometricobject.java package Geometricobject;

public abstract class ComparableGeometricobject extends Geometricobject implements

public int compareTo(ComparableGeometricobject o){ return 1; return -1;

Comparable {

if(getArea() > (o.getArea())) else if ((getArea()) < (o.getArea())) else

}

return 0; }

//ComparableRegularPolygon.java package Geometricobject;

public class ComparableRegularPolygon extends ComparableGeometricobject {

public double getSide() { }

return side; public void setN(int n) { }

this.n = n; public int getN() { }

return n; private int n = 3; private double side = 1; private double x = 0; private double y = 0;

public ComparableRegularPolygon(){ }

public ComparableRegularPolygon(int n, double side){ }

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

this.setN(n); this.setSide(side); this.setX(x); this.setY(y); this.setN(n); this.setSide(side); setX(0); setY(0); this.setN(3); setSide(1); setX(0); setY(0);

}

//ComparableRectangle.java package Geometricobject;

public class ComparableRectangle extends ComparableGeometricobject{

private double width = 1.0; private double height = 1.0;

public ComparableRectangle(){}

public ComparableRectangle(double width, double height){ }

public double getArea(){ return width * height;}

this.width = width; this.height = height; public void setY(double y) { }

public double getPerimeter(){ }

public double getArea(){ }

return (n * side * side)/(4 * Math.tan(Math.PI/n)); return n * side; this.y = y; public double getY() { }

return y;

public void setX(double x) { }

this.x = x; public double getX() { }

return x;

public void setSide(double side) { }

this.side = side;

}

public double getPerimeter(){ return width + width + height +height;} public double getWidth(){ return this.width;} public double getHeight(){ return this.height;}

//ComparableTriangle.java package Geometricobject;

public class ComparableTriangle extends ComparableGeometricobject{ }

private double side1 = 1.0; private double side2 = 1.0; private double side3 = 1.0;

public ComparableTriangle(){}

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

public double getSide1() { }

public double getSide2() { }

public double getSide3() { }

public double getArea(){ }

public double getPerimeter(){ }

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

3.3找出最大的对象

3.3.1 要求

? 编写一个方法,返回对象列表中最大的对象。 ? 方法签名:

Public static Object max(Comparable…a)

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

的对象。

3.3.2 代码

public static ComparableGeometricobject max(ComparableGeometricobject...list){

}

ComparableGeometricobject o = list[0]; for(ComparableGeometricobject param:list){ } return o;

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

o = param;

第4章 实验四

4.1求几何对象的面积排序

4.1.1 要求

? 编写一个方法,求参数中几何对象数组的面积排序(冒泡法)。方法签名如下: ? public static void bubbleSort(GeometricObject[] a) ? 编写测试程序,创建4个对象(4个矩形或4个三角形)的数组,然后使用bubbleSort

方法对它们的面积进行冒泡法排序。

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

4.1.2 代码

public static void bubbleSort(ArrayList list, ArrayList r){

ComparableGeometricobject temp;

}

while(list.size() > 0){ }

temp = list.get(0);

for(int j=0; j

list.remove(temp); r.add(temp);

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

4.2修改后的Account类

4.2.1 要求

? ? ? ?

在实验一Account类的基础上做如下修改: 添加一个String型的数据域name存储客户名字

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

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

? 修改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 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(); }

public Account(int id, double balance){ this.setId(id); this.setBalance(balance); dateCreated = new Date(); transactions = new ArrayList(); }

//添加一个新的构造方法,该方法创建一个带指定名字、id和初始余额的账户 public Account(int id, String name, double balance){ this.setId(id); this.setName(name); this.setBalance(balance); dateCreated = new Date(); transactions = new ArrayList(); }

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 要求

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

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

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

? 一个名为balance的double型数据域表示交易后的新余额 ? 一个名为description的String型数据域描述交易

D’表示存

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

? 编写一个测试程序,创建一个年利率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;

public class Transaction {

public Date getDate() { }

public char getType() { }

public double getAmount() { }

public double getBalance() { }

return balance; return amount; return type; return date;

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

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

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

//一个名为balance的double型数据域表示交易后的新余额 private double 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 String getDescription() { }

return description;

//Main.java package Main;

import Account.*;

public class Main { }

public static void main(String[] args) { }

// TODO Auto-generated method stub

//创建一个年利率1.5%、余额1000、id为112、名字为zhao的Account对象。 Account account = new Account(112, \, 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

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

第5章 实验五

5.1ArrayIndexOutBoundException异常

5.1.1 要求

? ? ? ?

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

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

提示用户输入数组的下标,然后显示对应的元素值。 如果指定的下标越界,就显示消息out of bounds

5.1.2 代码

//Main.java package Main;

import java.util.Scanner;

public class Main { }

}

public static int number[] = new int[20];

public static void main(String[] args) {

// TODO Auto-generated method stub for (int i =0 ; i<20; i++){ }

@SuppressWarnings(\)

Scanner reader = new Scanner(System.in); int n; while(true){ }

try{ }

n = reader.nextInt();

System.out.println(n + '\\t' + number[n]); System.out.println(\数组越界\);

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

}catch(Exception e){

5.2 修改实验三的Account类

5.2.1 要求

? 如果创建Account对象时,账户余额或利率小于或等于0,则抛出

IllegalArgumentException异常。

? 创建一个IllegalWithDrawException类,如果withDraw方法中,取款金额超过账户

余额,则抛出IllegalWithDrawException异常 ? 编写测试程序

5.2.2 代码

//IllegalArgumentException.java package Account;

@SuppressWarnings(\)

public class IllegalArgumentException extends Exception { }

//IllegalWithDrawException.java package Account;

@SuppressWarnings(\)

public class IllegalWithDrawException extends Exception { }

String message;

public IllegalWithDrawException(double m, double n){ }

public String warnMess(){ }

return message;

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

public IllegalArgumentException(){ }

public String warnMess(){ }

return message;

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

5.3 定义带三条边的Triangle类

5.3.1 要求

? Triangle类扩展自GeometricObject类。在三角形中,任意两边之和总大于第三边,

Triangle类必须遵从这一规则。创建一个IllegalTriangleException类,如果创建的三角形的边违反了这一规则,抛出一个IllegalTriangleException对象。 ? 编写测试程序

5.3.2 代码

//IllegalTriangleException.java

package Geometricobject;

@SuppressWarnings(\)

public class IllegalTriangleException extends Exception { }

String message;

public IllegalTriangleException(){ }

public String warnMess(){ }

return message;

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

//Trianle.java

package Geometricobject;

public class Triangle extends Geometricobject{

private double side1 = 1.0; private double side2 = 1.0; private double side3 = 1.0; public Triangle(){}

private boolean check(){ }

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

public double getSide1() { }

return side1; try{

this.side1 = side1; this.side2 = side2; this.side3 = side3; if(!check())

throw new IllegalTriangleException(); }catch(IllegalTriangleException e){ }

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

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

return false; return true; }else{

};

public double getSide2() { }

public double getSide3() { }

public double getArea(){ }

public double getPerimeter(){ }

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

第6章 实验六

6.1 检测回文串

6.1.1 要求

? 如果一个字符串从前向后读和从后向前读都是同一个字符串,则称为回文串。 ? 例如:“mom”和“dad”都是回文串

? 编写一个程序,提示用户输入一个字符串,忽略该字符串中的非字母和非数字字符,

然后判断是否是回文串。

? 可使用Character类的静态方法 isLetterOrDigit(char ch)来判断字符类型。

6.1.2 代码

//Main.java package Main;

import java.util.Scanner;

public class Main {

String string;

@SuppressWarnings(\)

public static void main(String[] args) {

}

}

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(i != n+1){ }

System.out.println(\); System.out.println(\); }else{

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

break;

6.2 检验密码

6.2.1 要求

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

的密码。假设密码规则如下:

? 密码必须至少有8个字符 ? 密码只能包括字母和数字 ? 密码必须至少有2个数字

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

6.2.2 代码

//Main.java package Main;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

}

}

String regex = \; @SuppressWarnings(\)

Scanner reader = new Scanner(System.in); String string = reader.nextLine();

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

System.out.println(\); System.out.println(\); }else{

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

6.3.1 要求

? 使用下面的方法头编写一个方法,统计每个数字在字符串中出现的次数: public static int[] count(String s)

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

个元素存储的是一个数字出现的次数。 ? 例如:执行完 int[] counts = count(“0112ab”);后,counts[0] = 1, counts[1] = 2, counts[2]

= 1

6.3.2 代码

//Main.java package Main;

public class Main {

public static int[] count(String s){

int counts[] = new int[10];

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

public static void main(String[] args) {

// TODO Auto-generated method stub

}

}

}

counts[i] = 0;

int temp;

for(int i=0; i

return counts;

temp = (int)(s.charAt(i) - '0'); if(temp>=0 && temp <= 9){ }

counts[temp]++;

6.4 刽子手游戏

6.4.1 要求

? 随机产生一个单词,单词中的字母都以星号显示。然后提示用户一次猜测一个字母,

当用户才猜测准确时,就显示实际的字母。当用户完成了一个单词,就显示猜错的次数,然后询问用户是否继续猜测另一个单词。 ? 声明一个数组来存储这些单词,例如: String[] words = {“program”,”hello”,…….};

6.4.2 代码

//Main.java package Main;

import java.util.Scanner;

public class Main {

static String[] words = {\,\,\, \, \};

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

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

String pre = str.substring(0, index); String sub = str.substring(index + 1); return pre + n + sub;

throw new ArrayIndexOutOfBoundsException(\越界\);

}

}

static boolean unknown(String s){ }

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

public static void main(String[] args) { }

// TODO Auto-generated method stub @SuppressWarnings(\)

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

while(unknown(key)){ }

System.out.println(key);

System.out.println(key); in = reader.next();

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

for(int i=0; i

return key;

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

key = replace(key, n, i);

for(int i=0; i

return false;

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

return true;

第7章 实验七

本文来源:https://www.bwwdw.com/article/j3vf.html

Top