Java必实验二:类的高级应用

一、 实验目的

1. 初步掌握面向对象编程中类的编写。

、实验内容与要求

1. “自行车”、“小汽车”、“火车”都可以称之为“车”。请通过分析,抽象它们所共有的性质,定义一个抽象类Vehicle。在报告中附上程序截图、运行结果截图和详细的文字说明。(20分)

2.编写一个Person类。该类包含三个成员变量name、weight和height,分别代表一个人的身高和体重。在该类中重写Object类的toString方法,当调用它重写的toString方法时,输出这个人的姓名、体重和身高。在报告中附上程序截图、运行结果截图和详细的文字说明。(20分)

3.编写一个队列类Queue,用来存储float型数据,队列中的数据是先进先出的。具体要求如下:成员变量float [] elements用来存储float型数据;成员变量int size用来表示存储的float型数据的个数;构造方法Queue在初始化队列的时候,设置队列的容量为12;方法enqueue(float v)用来往队列中添加一个float型数据;方法dequeue()用从队列中删除并返回一个float型数据;方法getSize()用来返回队列的大小。在报告中附上程序截图、运行结果截图和详细的文字说明。(20分)

4.编写一个秒表类StopWatch,成员变量和方法自定。编写一个支持快速排序算法的类QuickSort,成员变量和方法自定。对100000, 1000000, …等不同长度的数组中的元素(元素的值随机给定)进行排序,并用秒表对象来记录排序所用的时间。在报告中附上程序截图、运行结果截图和详细的文字说明。(20分)

三、实验过程及结果

1.“自行车”、“小汽车”、“火车”都可以称之为“车”。请通过分析,抽象它们所共有的性质,定义一个抽象类Vehicle。(20分)

package example2;
import java.util.Scanner;      
abstract class Vehicle{         //定义交通工具抽象类Vehicle
	protected String name;      //声明被保护的成员变量name
	public Vehicle(String n) {  //抽象类中的一般方法,本方法为定义Vehicle类的有参构造方法
		name = n;
	}
	abstract public void display(); //将打印收费信息的方法声明为抽象方法
}

class Bicycle extends Vehicle{     //定义继承自Vehicle的自行车子类Bicycle
	private int weight;             //声明私有数据成员weight
	public Bicycle(String n, int w) {  //有参构造方法
		super(n);   //调用父类的有参构造方法
		weight = w;
	}
	public void display() {   //实现抽象类中的display()方法
		System.out.printf("%s收费为%.2f\n",name,weight*0.15);
	}
}

class Car extends Vehicle{   //定义继承自Vehicle的小汽车子类Car
	private int num;
	private int weight;    //声明私有数据成员num, weight
	public Car(String n, int nu, int w) {  //有参构造方法
		super(n);   //调用父类的有参构造方法
		num = nu;
		weight = w;
	}
	public void display() {   //实现抽象类中的display()方法
		System.out.printf("%s收费为%.2f\n",name,num * 8 + weight * 0.015);
	}
}

class Train extends Vehicle{  //定义继承自Vehicle的火车子类Train
	private int num;   //声明私有数据成员num
	public Train(String n, int nu) {
		super(n);     //调用父类的有参构造方法
		num = nu;
		num = nu;
	}
	public void display() {   //实现抽象类中的display()方法
		System.out.printf("%s收费为%.2f\n",name, num * 0.15);
	}
}

public class Tool {         //定义主类
	public static void main(String[] args) {  
		Scanner reader = new Scanner(System.in);
		System.out.println("请输入乘客的重量:"); //提示用户输入信息
		int weight1 = reader.nextInt();//从键盘获取weight1
		Vehicle bic = new Bicycle("自行车",weight1); //创建父类对象Vehicle,指向子类对象Bicycle
		bic.display();    //用bic对象调用display()方法
		System.out.println("请输入小汽车的载客量和重量:");
		int num2 = reader.nextInt();
		int weight2 = reader.nextInt();
		Vehicle car = new Car("小汽车",num2,weight2); //创建父类对象Vehicle,指向子类对象Car
		car.display();   //用car对象调用display()方法
		System.out.println("请输入小汽车的载客量:");
		int num1 = reader.nextInt();
		Vehicle tra = new Train("火车",num1);       //创建父类对象Vehicle,指向子类对象Train
		tra.display();  //用Tra对象调用display()方法
		reader.close();  
	}
}

 

2. 编写一个Person类。该类包含三个成员变量name、weight和height,分别代表一个人的身高和体重。在该类中重写Object类的toString方法,当调用它重写的toString方法时,输出这个人的姓名、体重和身高。(20分)

package example;
import java.io.*;  //加载java.io类库里的所有类
import java.util.Scanner;

class Person{     //定义Person类
	private String name;   
	private float weight;
	private float height;    //声明私有成员变量name,weight,height
	public Person(String n, float w, float h) {//定义有参构造方法
		name = n;
		weight = w;
		height = h;
	}
	public String toString() {  //重写Object类的toString()方法
		return name;
	}
	public void display() {   //定义公有成员方法
		Object obj = this;  
		System.out.printf("这个人的姓名为:%s, 体重为: %.2fkg, 身高为: %.2fcm\n",obj.toString(),weight,height); //用对象obj调用Person类同名toString()方法
	}
}

public class People {    //People主类
	public static void main(String[] args)throws IOException {
		System.out.println("请输入姓名,体重以及身高:");
		BufferedReader buf;
		buf = new BufferedReader(new InputStreamReader(System.in));   		
        String name = buf.readLine();
		Scanner in = new Scanner(System.in);
		float weight = in.nextFloat();
		float height = in.nextFloat(); //获取用户从键盘输入的name,weight,height
		
        Person p = new Person(name, weight, height);//创建对象Person
		p.display();   //用p对象调用display()方法
		in.close();
		buf.close();
	}
}

 

3. 编写一个队列类Queue,用来存储float型数据,队列中的数据是先进先出的。具体要求如下:成员变量float [] elements用来存储float型数据;成员变量int size用来表示存储的float型数据的个数;构造方法Queue在初始化队列的时候,设置队列的容量为12;方法enqueue(float v)用来往队列中添加一个float型数据;方法dequeue()用从队列中删除并返回一个float型数据;方法getSize()用来返回队列的大小。(20分)

package example;
import java.util.Scanner;

class Queue{             //定义Queue类
	private float []elements;
	private int size;   //声明私有成员变量elements,size	
	public Queue(float [] e, int s) {   //有参构造方法
		size = s;
		elements = new float[200];
		for(int i = 0; i < s; i++) {  //
			 elements[i] = e[i];
		}
		s = 12;              //设置size初值
	}

	public void enqueue(float v) {  //入队,传入入队元素,将元素于队尾入队,同时队列大小+1
		elements[size] = v;
		size++;
	}
	public float dequeue() {   //出队,删除队头元素,同时队列长度-1
		float e = elements[0];
		for(int i = 0; i < size - 1; i++) {
			elements[i] = elements[i + 1];
		}
		size--;
		return e;    //返回被删除元素
	}
	public int getSize() {   //返回数组长度,即队列大小
		return size;
	}
	public void display() {   //逐个输出队列元素
		System.out.printf("队列元素为:");
		for(int i = 0; i < size; i++) {
			System.out.printf("%.2f ",elements[i]);
		}
		System.out.println();
	}
}

public class DataStruct {  //主类
	public static void main(String []args) {
		Scanner sc = new Scanner(System.in);
		System.out.printf("请输入数组长度:");
		int size = sc.nextInt();  //从数组获取队列大小
		float []ele = new float[size];
		System.out.printf("请输入队列元素:");
		for(int i = 0; i < size; i++) {
			ele[i] = sc.nextFloat();   //从键盘获取队列元素
		}
		
		Queue q = new Queue(ele, size);//创建对象Queue
		q.display();    //用q对象调用display()方法
		int command;
		System.out.printf("请输入测试次数:");
		int t = sc.nextInt(); //从键盘获取测试次数t
		
		while(true) {   
			if(t == 0)
				break;
			else {
				System.out.printf("请输入操作类型:");
				command = sc.nextInt();   //从键盘获取操作类型
				if(command == 1) {
					float v;
					System.out.printf("请输入添加入队的元素:");
					v = sc.nextFloat();   //从键盘获取入队元素
					q.enqueue(v); //v入队
					q.display();
				}
				else if(command == 2) {
					System.out.printf("出队元素为:%.2f\n",q.dequeue());  //队头元素出队
					q.display();   //打印队列元素
				}
				else if(command == 3) {
					System.out.println("数组长度为:" + q.getSize()); //用q对象调用getSize()方法
					q.display();
				}
				else
					break;
				t--;
			}
		}
		sc.close();
		System.exit(0);
	}
}

 4.编写一个秒表类StopWatch,成员变量和方法自定。编写一个支持快速排序算法的类QuickSort,成员变量和方法自定。对100000, 1000000, …等不同长度的数组中的元素(元素的值随机给定)进行排序,并用秒表对象来记录排序所用的时间。(20分)

package example;

import java.util.*;

class QuickSort{      //QuickSort类
	private int[]elements;
	private int size;
	public QuickSort(int []e, int s) {   //有参构造函数
		size = s;
		elements = new int[s];
		for(int i = 0; i < size; i++) {
			elements[i] = e[i];
		}
	}
    //快速排序算法
	public void quickSort(int []element, int le, int ri) {
		if(le > ri)return;	//递归终止条件
		int i = le;
		int j = ri;
		int temp = element[le]; //定义temp为基准数
		while(i < j) {
            //从右边界向中间遍历,当element[j]大于temp时,继续向左查找,直至element[j]小于temp,下标j左移
			while(element[j] > temp && i < j) {
				j--;
			}
			element[i] = element[j];//将右边查找到的小于等于基准数的数填入右边相应位置
            //从左边界向中间遍历,当element[j]小于等于temp时,继续向右查找,直至element[j]大于temp,下标i右移
			while(temp >= element[i] && i < j) {
				i++;
			}
			element[j] = element[i];//将左边查找到的大于基准数的数填入左边相应位置
		}
		element[i] = temp;//将基准元素填入相应位置
		quickSort(element, le, j - 1);//递归左半边区间进行同样的快速排序
		quickSort(element, j + 1, ri);//递归右半边区间进行同样的快速排序
	}

	public void quickSort() {    //无参quickSort()方法
		quickSort(elements, 0, size - 1);
	}
    //逐个输出数组元素
	public void display() {
		System.out.println("快速排序后数组为:");
		for(int i = 0; i < size; i++) {
			System.out.printf("%d ",elements[i]);
		}
		System.out.println();
	}
}

class StopWatch{    //StopWatch类
	private long startTime;
	private long endTime;
	public StopWatch(long st, long et) {
		startTime = st;
		endTime = et;
	}
    //获取开始时间
	public void getStartTime() {
		startTime = System.nanoTime();
	}
    //获取结束时间
	public void getEndTime() {
		endTime = System.nanoTime();
	}
	public void display() {
		System.out.println("程序运行时间为:"+(endTime-startTime)+"纳秒");
	}
}
//主类
public class Sort {  
	static public void main(String []args) {
		System.out.printf("请输入数组个数:");
		Scanner cn = new Scanner(System.in);
		int size = cn.nextInt();   //获取数组个数
		System.out.printf("请输入数组元素:");
		int []ele = new int[size];
        //获取数组元素
		for(int i = 0; i < size; i++) {
			ele[i] = cn.nextInt();
		}
		QuickSort q = new QuickSort(ele, size);  //创建对象QuickSort
		StopWatch s = new StopWatch(0, 0);  //创建对象StopWatch
		
		s.getStartTime();  //用s对象调用getStartTime()方法
		q.quickSort();
		q.display();   //用q对象调用quickSort(),display()方法
		s.getEndTime();
		s.display();	//用s对象调用getEndTime(),display()方法
		
		cn.close();
	}
}

 

首先,我们可以定义两个,一个是StopWatch,用于计时,另一个是QuickSort,负责快速排序算法。 **StopWatch ** ```java public class StopWatch { private long startTime; // 构造函数开始计时 public StopWatch() { this.startTime = System.nanoTime(); } // 记录并返回停止时间 public long stopAndReturnTime() { return System.nanoTime() - startTime; } // 获取当前运行时间(单位纳秒) public double getCurrentTime() { return (double) (System.nanoTime() - startTime) / 1e9; // 转换为秒 } } ``` **QuickSort ** ```java import java.util.Arrays; import java.util.Random; public class QuickSort { public void quickSort(int[] arr, int low, int high) { if (low < high) { int pivotIndex = partition(arr, low, high); quickSort(arr, low, pivotIndex - 1); quickSort(arr, pivotIndex + 1, high); } } private int partition(int[] arr, int low, int high) { int pivotValue = arr[high]; int i = (low - 1); for (int j = low; j < high; j++) { if (arr[j] <= pivotValue) { i++; swap(arr, i, j); } } swap(arr, i + 1, high); // 将pivot放到正确的位置 return i + 1; } private void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } ``` 然后,我们可以在主程序中创建StopWatch和QuickSort实例,并测试排序: ```java public static void main(String[] args) { Random rand = new Random(); for (int size : Arrays.asList(100000, 500000, 1000000)) { int[] arr = new int[size]; for (int i = 0; i < size; i++) { arr[i] = rand.nextInt(size * 10); } StopWatch stopwatch = new StopWatch(); QuickSort quickSortInstance = new QuickSort(); quickSortInstance.quickSort(arr, 0, arr.length - 1); long elapsedTime = stopwatch.stopAndReturnTime(); System.out.printf("Sorted array of length %d in %.6f seconds.\n", size, elapsedTime); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值