JAVA实验

                               **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程序的编写方法。了解了线程的概念、线程的生命周期。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值