**JAVA实验**
哈尔滨理工大学
软件与微电子学院
实 验 报 告
(2019-2020第一学期)
课程名称: 面向对象程序设计Java
班 级: 软件18-3班
学 号: 1814010307
姓 名: 冯禹瑄
实验名称 实验1 类与对象 专 业 软件工程
姓 名 冯禹瑄 学 号 1814010307 班 级 软件18-3班
一、实验目的:
(1)熟悉Java程序运行的环境
(2)掌握类的定义
(3)掌握类的成员属性和成员方法的设计方法
(4)掌握对象的创建和使用
二、实验内容:
(1) 任务一:定义一个类Triangle(三角形)
三个成员属性:
分别对应三条边
两个成员方法:
计算周长的方法
计算面积的方法
注意:
要校验三条边是否能够成一个三角形
(2)任务二: 定义一个Triangle数组,数组长度假定为10
分别创建10个Triangle对象,存到数组里
对这一组Triangle对象按照面积从小到大排序
对这一组Triangle对象按照周长从小到大排序
三、实验设备及软件环境:
(1) 实验设备:实验室计算机
(2) 软件环境:windows系统,eclipse软件环境
四、实验过程及结果:
(1) 实验过程:
任务一:Triangle类:
package Test;
public class Triangle {
private double a;
private double b;
private double c;
Triangle(){
}
Triangle(double a,double b,double c){
this.a=a;
this.b=b;
this.c=c;
}
public boolean istriangle(double a,double b,double c){
if(a+b>c&&a+c>b&&b+c>a){
return false;
}
return true;
}
public double perimeter(double a,double b,double c){
return a+b+c;
}
public double area(double a,double b,double c){
return Math.sqrt((a+b+c/2)*((a+b+c/2)-a)*((a+b+c/2)-b)*((a+b+c/2)-c));
}
}
主类:
package Test;
import java.util.Scanner;
public class Test1 {
public static void main(String [] args){
Triangle t=new Triangle();
System.out.println("请输入三角形三边长度:");
Scanner sc=new Scanner(System.in);
double a=sc.nextDouble();
double b=sc.nextDouble();
double c=sc.nextDouble();
if(t.istriangle(a, b, c)){
System.out.println("这三条边不能构成三角形");
return;
}
System.out.println("三角形周长为:"+t.perimeter(a, b, c));
System.out.println("三角形面积为:"+t.area(a, b, c));
}
}
任务二:
package Test;
import java.util.Arrays;
import java.util.Scanner;
public class Test2 {
public static void main(String [] args){
Triangle [] t=new Triangle [11];
double [] zc=new double [11];
double [] mj=new double [11];
Scanner sc=new Scanner(System.in);
for(int i=0;i<10;i++){
System.out.println("请输入三角形三条边");
double a=sc.nextDouble();
double b=sc.nextDouble();
double c=sc.nextDouble();
t[i]=new Triangle(a,b,c);
if(t[i].istriangle(a, b, c)){
System.out.println("该三条边不能构成三角形,请重新输入");
i--;
continue;
}
zc[i]=t[i].perimeter(a, b, c);
mj[i]=t[i].area(a, b, c);
}
System.out.println("这一组Triangle对象按照面积从小到大排序为:");
area(t, mj);
System.out.println("这一组Triangle对象按照周长从小到大排序为:");
perimeter(t, zc);
}
private static void perimeter(Triangle[] t, double[] zc) {
int i,j;
double temp;
for(i=0;i<t.length-1;i++){
for(j=i;j<t.length-i-1;j++){
if(zc[j]>zc[j+1]){
temp=zc[j];
zc[j]=zc[j+1];
zc[j+1]=temp;
}
}
}
System.out.println(Arrays.toString(zc));
}
private static void area(Triangle[] t, double[] mj) {
int i,j;
double temp;
for(i=0;i<t.length-1;i++){
for(j=i;j<t.length-i-1;j++){
if(mj[j]>mj[j+1]){
temp=mj[j];
mj[j]=mj[j+1];
mj[j+1]=temp;
}
}
}
System.out.println(Arrays.toString(mj));
}
}
(2)分析结果:
任务一:
一、若三个长度构不成三角形如图一所示:
图一
二、若三个长度能构成三角形如图二所示:
图二
任务二:
一、若三个长度构不成三角形如图图三所示:
图三
二、循环创建对象过程如图四所示:
图四
三、循环创建十个对象后排序结果如图五所示:
图五
五、总结
通过这次实验课我熟悉了Java运行环境,掌握了类的定义,学习了成员变量与成员方法的使用,并且掌握了对象的创建和使用,学习到了面向对象的编程思想。面向对象的编程思想很好,通过对象帮助我们去做想做的事情,把事情简单化。即分为两步,第一步、创建对象。第二步、让对象帮我们做事情。希望在以后的学习中,我能更加深入的了解Java这门语言,学习到更多有趣的知识。
分割线
//***************************************************************************************//
实验名称 实验二 继承与接口 专 业 软件工程
姓 名 冯禹瑄 学 号 1814010307 班 级 软件18-3
一、实验目的:
(1) 理解继承的意义
(2)掌握继承的设计
(3)理解接口的意义
(4)掌握接口的设计和实现
(5)理解面向抽象编程的思想
二、实验内容:
(1)圆形、三角形、长方形、正方形是四类具体的常规图形,共同点只要图形参数确定了,周长和面积就可以计算得到。基于此,定义如图的五个类,并且继承关系如图箭头所示。
该任务的思路:
在父类Shape里定义两个抽象方法,分别对应于计算周长和计算面积
在各子类里,定义每种图形的特定属性,并覆盖父类的计算周长和计算面积方法
(2)
定义一个接口ShapeComparator,如下图所示
定义该接口的两个实现类,
一个实现类对两个图形进行周长比较
一个实现类对两个图形进行面积比较
注意,此任务并不限定是哪种图形
(3) 定义一个Shape数组,数组长度假定为20
分别创建20个图形对象,包括不同类型的图形(圆形、三角形、长方形、正方形),存到数组里
使用任务2定义的两个接口实现类完成下面两个排序:
对这一组图形按照面积从小到大排序
对这一组图形按照周长从小到大排序
注意:此处涉及多态
三、实验设备及软件环境
操作系统:windows 10
软件环境:JAVA
四、实验过程及结果:
package exper2;
abstract class Shape {
public abstract double Perimeter(); // 定义计算周长的方法
public abstract double Area(); // 定义计算面积的方法
}
interface ShapeComparator {
/*
* 如果返回值>0,则s1>s2
* 如果返回值<0,则s1<s2
* 如果返回值=0,则s1==s2
*/
public int compareTo(Shape s1,Shape s2);
}
class ComparePer implements ShapeComparator {
@Override
public int compareTo(Shape s1, Shape s2) {
// TODO Auto-generated method stub
int result = 0;
if (s1.Perimeter() > s2.Perimeter()) {
result = 1;
} else if (s1.Perimeter() < s2.Perimeter()) {
result = -1;
} else {
result = 0;
}
return result;
}
}
class CompareArea implements ShapeComparator {
@Override
public int compareTo(Shape s1, Shape s2) {
// TODO Auto-generated method stub
int result = 0;
if (s1.Area() > s2.Area()) {
result = 1;
} else if (s1.Area() < s2.Area()) {
result = -1;
} else {
result = 0;
}
return result;
}
}
class Rectangle extends Shape {
// 定义矩形的长宽
protected double l;
protected double w;
// 带参构造函数
public Rectangle(double l, double w) {
this.l = l;
this.w = w;
}
@Override
public double Perimeter() {
return this.l * 2 + this.w * 2;
}
@Override
public double Area() {
return this.l * this.w;
}
}
class Square extends Rectangle {
public Square(double l) {
super(l, l);
// TODO Auto-generated constructor stub
}
}
class Triangle extends Shape {
// 定义三角形的三条边
private double a;
private double b;
private double c;
// 带参构造函数
public Triangle(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
@Override
public double Perimeter() {
// TODO Auto-generated method stub
return this.a + this.b + this.c;
}
@Override
public double Area() {
// TODO Auto-generated method stub
double p = (this.a + this.b + this.c) / 2;
return Math.sqrt(p * (p - this.a) * (p - this.b) * (p - this.c));
}
}
class Circle extends Shape {
private double r; // 定义圆的半径
// 带参构造函数
public Circle(double r) {
this.r = r;
}
@Override
public double Perimeter() {
// TODO Auto-generated method stub
return 2*Math.PI*this.r;
}
@Override
public double Area() {
// TODO Auto-generated method stub
return Math.PI*Math.pow(this.r, 2);
}
}
public class Main {
// 打印数组的函数
public static void printByArea(Shape shape[]) {
for(int i=0;i<shape.length;i++) {
System.out.println(shape[i].Area());
}
System.out.println();
}
public static void printByPeri(Shape shape[]) {
for(int i=0;i<shape.length;i++) {
System.out.println(shape[i].Perimeter());
}
System.out.println();
}
// 按面积排序
public static void sortByArea(Shape shape[]) {
System.out.println("按面积排序前的数组为(打印面积):");
printByArea(shape);
ShapeComparator comp = new CompareArea();
for(int i=0;i<shape.length;i++) {
boolean flag = false;
for(int k=0;k<shape.length-i-1;k++) {
if(comp.compareTo(shape[k], shape[k+1])==1) {
Shape temp = shape[k];
shape[k] = shape[k+1];
shape[k+1] = temp;
flag = true;
}
}
if(!flag) break;
}
System.out.println("按面积排序后的数组为(打印面积):");
printByArea(shape);
}
// 按周长排序
public static void sortByPeri(Shape shape[]) {
System.out.println("按周长排序前的数组为(打印周长):");
printByPeri(shape);
ShapeComparator comp = new ComparePer();
for(int i=0;i<shape.length;i++) {
boolean flag = false;
for(int k=0;k<shape.length-i-1;k++) {
if(comp.compareTo(shape[k], shape[k+1])==1) {
Shape temp = shape[k];
shape[k] = shape[k+1];
shape[k+1] = temp;
flag = true;
}
}
if(!flag) break;
}
System.out.println("按周长排序后的数组为(打印周长):");
printByPeri(shape);
}
public static void main(String[] args) {
// 创建20个shape数组
Shape[] shape = new Shape[20];
int j=0;
//创建五个正方形
for(int i=1;i<=5;i++) {
shape[j++] = new Square(i);
}
// 创建5个圆形
for(int i=11;i<=15;i++) {
shape[j++] = new Circle(i);
}
// 创建5个矩形
for(int i =21;i<=25;i++) {
shape[j++] = new Rectangle(i,i+1);
}
// 创建5个三角形
shape[j++] = new Triangle(3,4,5);
shape[j++] = new Triangle(4,5,6);
shape[j++] = new Triangle(7,8,9);
shape[j++] = new Triangle(6,7,8);
shape[j] = new Triangle(5,6,7);
sortByArea(shape);
sortByPeri(shape);
}
}
五、总结:
这次实验让我了解了类的接口和上调,方便了函数的应用,可以通过用最少的代码实现更多的功能,跟之前函数的重载与内部类相互贯通,对我有很大的帮助。
分割线
//***************************************************************************************//
实验名称 实验三 输入流和输出流 专 业 软件工程
姓 名 冯禹瑄 学 号 1814010307 班 级 软件18-3班
一、实验目的:
(1)掌握数据流的分类和使用方法;
(2)掌握使用流读取文件的内容的方法;
(3)掌握将流写入文件的方法
二、实验内容:
任务1——文件分割
将一个给定文件按文件大小平均分割成n个部分,输入输出形式如下:
输入:abc.avi 5
输出:abc_1.avi,
abc_2.avi,
abc_3.avi,
abc_4.avi,
abc_5.avi
任务2——文件合并
读取任务1分割的多个文档,按顺序将它们合并到一个新文档中。
输入:abc_1.avi, abc_2.avi, abc_3.avi, abc_4.avi, abc_5.avi
输出: 123.avi
三、实验设备及软件环境:
操作系统:windows 10 软件环境:JAVA
四、实验过程及结果:
任务1:文件分割
import java.io.*;
class SplitDemo
{
public static void main(String[] args)throws IOException
{
splitDemo(); }
public static void splitDemo()throws IOException
{
FileInputStream fis = new FileInputStream("C:\\Users\\ts\\Desktop\\java实验三\\切割\\abc.avi");
FileOutputStream fos = null;
byte[] buf = new byte[1040*1080];
int len,count = 0;
while((len=fis.read(buf))!=-1)
{
fos = new FileOutputStream("C:\\Users\\ts\\Desktop\\java实验三\\切割结果\\"+"abc_"+(++count)+".avi");
fos.write(buf,0,len);
fos.flush();
fos.close();
}
fis.close();
}
}
切割前:
切割后:
任务2:文件合并
import java.io.*;
import java.util.*;
class SequenceDemo {
public static void main(String[] args) throws IOException {
sequenceDemo();
}
public static void sequenceDemo() throws IOException {
FileInputStream fis = null;
FileOutputStream fos = new FileOutputStream("C:\\Users\\ts\\Desktop\\java实验三\\合并\\123.avi");
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
int count = 0;
File dir = new File("C:\\Users\\ts\\Desktop\\java实验三\\切割结果\\");
File[] files = dir.listFiles();
for (int x = 0; x < files.length; x++) {
al.add(new FileInputStream(files[x]));
}
final Iterator<FileInputStream> it = al.iterator(); Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {
public boolean hasMoreElements() {
return it.hasNext();
}
public FileInputStream nextElement() {
return it.next();
}
};
SequenceInputStream sis = new SequenceInputStream(en);
byte[] buf = new byte[1024 * 1024];
while ((count = sis.read(buf)) != -1) {
fos.write(buf, 0, count);
}
sis.close();
fos.close();
}
}
合并前:
合并后:
五、总结:
通过这次实验我了解了Java语言的输入输出流和一些相关知识,学会了将文件进行分割和合并,这次实验我收获了很多,可以更好地使用java这门语言。
分割线
//***************************************************************************************//
实验名称 实验4 线程 专 业 软件工程
姓 名 冯禹瑄 学 号 1814010307 班 级 软件18-3
一、实验目的:
(1)掌握线程的含义和状态;
(2)掌握创建线程以及数据在线程之间共享的方法;
(3)掌握多线程同步方法;
二、实验内容:
多线程大文档拷贝
三、实验设备及软件环境:
实验设备:计算机
实验软件:eclipse
四、实验过程及结果:
public class StaticVariable {
public static void main(String[] args) {
MyThread mt = new MyThread();
new Thread(mt).start();
while (mt.i <= 100) {
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
}
System.out.println(mt.sum);
}
}
}
class MyThread implements Runnable {
double sum = 0;
int i;
public void run() {
double factorial = 1;
for (i = 1; i <= 100; i++) {
factorial *= i;
sum += factorial;
int b = (int) (Math.random() * 10);
try {
Thread.sleep(b);
} catch (InterruptedException ex) {
}
}
}
}
五、总结:
通过这次实验掌握了利用JAVA语言编写多线程程序的方法,掌握了线程的调度方法,掌握了多线程环境中GUI程序的编写方法。了解了线程的概念、线程的生命周期。