厦大计算机系Java程序设计实验(三)

习题1 三角形类

题目描述:从课本的GeometricObject类继承一个Triangle 类,并满足下列条件:

  • 有3个私有double成员表示三条边,默认长度为1.0;
  • 有1个无参构造方法,用于创建默认三角形;
  • 有1个3参数构造方法,用于创建指定三角形,不需要考虑3边非法的情况;
  • 有1个getArea(),1个getPerimeter() 分别返回三角形的面积和周长;
  • 有1个toString()方法返回三条边的信息,形如"Triangle: side1 = " + side1 + " side2 = " + side2 + "side3 = " + side3。

写一个测试类,测试Triangle类,并且需要设置该类继承来的color和filled 属性。

解题思路:首先实现课本上的GeometricObject类,然后通过继承实现Triangle 类。Triangle 类内包括三条边的边长,以及两个构造函数、两个获取数据的公有函数,并且覆盖实现了toString()方法。

源代码

以下为GeometricObject类的具体实现。

import java.util.Date;

public class GeometricObject
{
    private String color = "white";
    private boolean filled = false;
    private Date dateCreated;
    
    public GeometricObject()
    {
        this.dateCreated = new Date();
    }
    
    public GeometricObject(String color, boolean filled)
    {
        this.dateCreated = new Date();
        this.color = color;
        this.filled = filled;
    }
    
    public String getColor()
    {
        return this.color;
    }
    
    public void setColor(String color)
    {
        this.color = color;
    }
    
    public boolean isFilled()
    {
        return this.filled;
    }
    
    public void setFilled(boolean filled)
    {
        this.filled = filled;
    }
    
    public Date getDateCreated()
    {
        return this.dateCreated;
    }
    
    @Override
    public String toString()
    {
        return "created on " + dateCreated + "\ncolor: " + color +
                " and filled: " + filled;
    }
}

以下是GeometricObject类的子类Triangle的实现。

public class Triangle extends GeometricObject
{
    private double a = 1.0;
    private double b = 1.0;
    private double c = 1.0;
    
    public Triangle()
    {
        super();
    }
    
    public Triangle(double a, double b, double c)
    {
        super();
        this.a = a;
        this.b = b;
        this.c = c;
    }
    
    public double getArea()
    {
        double p = (a + b + c) / 2;
        return Math.sqrt(p * (p - a) * (p - b) * (p - c));
    }
    
    public double getPerimeter()
    {
        return a + b + c;
    }
    
    @Override
    public String toString()
    {
        return "Triangle: side1 = " + a + " side2 = " + b + " side3 = " + c;
    }
}

如下为测试类的实现。

public class Test
{
    public static void main(String[] args)
    {
        Triangle triangle1 = new Triangle(3.0, 4.0, 5.0);
        System.out.println("Area: " + triangle1.getArea());
        System.out.println("Perimeter: " + triangle1.getPerimeter());
        System.out.println(triangle1.toString());
        
        triangle1.setColor("black");
        System.out.println("Color: " + triangle1.getColor());
        triangle1.setFilled(true);
        System.out.println("isFilled: " + triangle1.isFilled());
    }
}

测试样例

Area: 6.0
Perimeter: 12.0
Triangle: side1 = 3.0 side2 = 4.0 side3 = 5.0
Color: black
isFilled: true

习题2 删除重复数字

题目描述:写一个方法,能够删除ArrayList中的重复数字,其中数字的类型是Integer。要求在原ArrayList中直接删除重复数字。方法原型如下:

public static void removeDuplicate(ArrayList list)

在main方法中调用上述方法,输出删除后的结果。例如某次运行结果如下:

输入:34 5 3 5 6 4 33 2 24

输出:34 5 3 6 4 33 2

解题思路:对于每一个list中的元素,检查其前面的所有元素看是否存在重复,如果存在,则将该元素从表中删除,并且将当前的元素下标向前移动一个,因为表的长度减少了1。

源代码

import java.util.ArrayList;
import java.util.Objects;
import java.util.Scanner;

public class DeleteCommonElement
{
    public static void main(String[] args)
    {
        ArrayList list = new ArrayList<>();
        Scanner input = new Scanner(System.in);
        
        int count, temp;
        System.out.print("Enter the number of list: ");
        count = input.nextInt();
        
        System.out.print("Enter each element in the list: ");
        for(int i = 0; i < count; ++i)
        {
            temp = input.nextInt();
            list.add(temp);
        }
        
        removeDuplicate(list);
        
        System.out.print("Elements in the list after removing duplication: ");
        for(int i = 0; i < list.size(); ++i)
        {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
    }
    
    public static void removeDuplicate(ArrayList list)
    {
        for(int i = 0; i < list.size(); ++i)
        {
            for(int j = 0; j < i; ++j)
            {
                if(Objects.equals(list.get(j), list.get(i)))
                {
                    list.remove(i);
                    --i;
                    break;
                }
            }
        }
    }
}

测试样例

Enter the number of list: 10
Enter each element in the list: 34 5 3 5 6 4 33 2 2 4
Elements in the list after removing duplication: 34 5 3 6 4 33 2

习题3  异常捕捉

题目描述:写一个程序,练习捕捉异常。

1、首先创建一个100个元素的数组,并用随机数填充该数组,类型随意。

2、提示用户输入一个下标,输出该下标对应的元素值。如果输入不是整数,输出“Input Mismatch.”并提示用户重新输入;如果下标越界,输出“Out of Bounds.”并提示用户重新输入;如果不是以上情况,程序输出元素值后正常结束。

3、代码不允许使用if语句,只能用异常捕捉实现上述功能。

解题思路:使用try-catch语句块,在try块中尝试输入下标,如果出现异常,则交给相应的catch块进行处理。

源代码

import java.util.*;

public class ExceptionTest
{
    public static void main(String[] args)
    {
        int[] a = new int[100];
        Random random1 = new Random(3);
        Scanner input = new Scanner(System.in);
        boolean continueInput = true;

        for(int i = 0; i < 100; ++i)
        {
            a[i] = random1.nextInt(1000);
        }
        
        do
        {
            try
            {
                System.out.print("Enter a index: ");
                int index = input.nextInt();
                
                if(index  < 0 || index >= 100)
                    throw new IndexOutOfBoundsException();
                
                System.out.println("Element a[" + index + "] is " + a[index]);
                
                continueInput = false;
            }
            catch(InputMismatchException ex1)
            {
                System.out.println("Input Mismatch. ");
                input.nextLine();
            }
            catch(IndexOutOfBoundsException ex2)
            {
                System.out.println("Out of Bounds. ");
                input.nextLine();
            }
        }
        while(continueInput);
    }
}

测试样例

Enter a index: 4.2
Input Mismatch. 
Enter a index: -1
Out of Bounds. 
Enter a index: 200
Out of Bounds. 
Enter a index: 8
Element a[8] is 459

习题4 网页分析

题目描述:抓取厦大主页中的“快速链接”下的所有内容。

提示:“快速链接”部分的HTML形如:

  • 官方微博
  • 程序输出为:[序号]标题 URL ,每行一个链接,如:

    [1] 官方微博 http://e.weibo.com/xmunews

    [2] 易班厦大 http://yiban.xmu.edu.cn/

    [3] 厦大网址导航 http://123.xmu.edu.cn/

    ……

    解题思路:首先打开该网站,从网站的流中利用正则表达式匹配出快速链接的标题、网址等信息,并将其输出。

    源代码

    import java.util.Scanner;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class WebGripper
    {
        public static void main(String[] args)
        {
            try
            {
                java.net.URL url = new java.net.URL("http://www.xmu.edu.cn");
                int count = 1;
                Scanner input = new Scanner(url.openStream());
                while(input.hasNext())
                {
                    String line = input.nextLine();
                    
                    String regex = "";
                    Pattern pattern = Pattern.compile(regex);
                    Matcher matcher = pattern.matcher(line);
                    
                    while(matcher.find())
                    {
                        String title = ">[^<].*?[^>]";
                        String href = "href=\"http://.*?\"";
                        
                        Pattern patternTitle = Pattern.compile(title);
                        Matcher matcherTitle = patternTitle.matcher(matcher.group());
                        Pattern patternHref = Pattern.compile(href);
                        Matcher matcherHref = patternHref.matcher(matcher.group());
                        
                        while(matcherTitle.find() && matcherHref.find())
                        {
                            System.out.print("[" + count + "] ");
                            ++count;
                            System.out.print(matcherTitle.group().replaceAll(">|", "") + " ");
                            System.out.println(matcherHref.group().replaceAll("href=\"|\"|>", ""));
                        }
                    }
                }
            }
            catch(java.net.MalformedURLException ex)
            {
                System.out.println("Invalid URL. ");
            }
            catch(java.io.IOException ex)
            {
                System.out.println("I/O Errors: no such file. ");
            }
        }
    }
    

    测试样例

    测试样例1:

    [1] 网上展馆 http://wszg.xmu.edu.cn/
    [2] 校园地图 http://map.xmu.edu.cn/
    [3] 学科 http://gs.xmu.edu.cn/ch/index/news/catid/28/
    [4] 师资 http://rsc.xmu.edu.cn/s/137/t/722/p/1/c/8710/d/8883/list.htm
    [5] 本科生教育 http://jwc.xmu.edu.cn/
    [6] 研究生教育 http://gs.xmu.edu.cn/
    [7] 继续教育与网络教育 http://nec.xmu.edu.cn/
    [8] 国际学生教育 http://oec.xmu.edu.cn/
    [9] 管理 http://xsc.xmu.edu.cn/
    [10] 自然科学与技术 http://std.xmu.edu.cn/
    [11] 人文与社会科学 http://skc.xmu.edu.cn/
    [12] 博士后科研流动站 http://rsc.xmu.edu.cn/s/137/t/445/p/1/c/6462/d/6636/list.htm
    [13] 厦门大学学报(自然版) http://jxmu.xmu.edu.cn/
    [14] 厦门大学学报(哲社版) http://xdxbs.xmu.edu.cn/
    [15] 成果产业化 http://zcjy.xmu.edu.cn/
    [16] 大学科技园 http://kjy.xmu.edu.cn/
    [17] 战略合作 http://zlhz.xmu.edu.cn/
    [18] 后勤服务 http://hqjt.xmu.edu.cn/
    [19] 会议服务 http://www.xmuiaec.com/
    [20] 出版服务 http://www.xmupress.com/
    [21] 团委 http://tw.xmu.edu.cn/
    [22] 学生委员会 http://xsh.xmu.edu.cn/
    [23] 研究生会 http://yjsh.xmu.edu.cn/
    [24] 社团联合会 http://slh.xmu.edu.cn/
    [25] 鼓浪听涛BBS http://bbs.xmu.edu.cn/
    [26] 校园活动 http://lecture.xmu.edu.cn/
    [27] 国际合作与交流 http://ice.xmu.edu.cn/project.aspx
    [28] 港澳台合作与交流 http://ice.xmu.edu.cn/chinese.aspx
    [29] 孔子学院 http://www.cnconfucius.com/
    [30] 留学服务 http://ice.xmu.edu.cn/abroad.aspx
    [31] 招生 http://zsb.xmu.edu.cn
    [32] 就业 http://jyzd.xmu.edu.cn
    [33] 官方微博 http://e.weibo.com/xmunews
    [34] 易班厦大 http://yiban.xmu.edu.cn/
    [35] 厦大网址导航 http://123.xmu.edu.cn/
    [36] 数字图书馆 http://lib.xmu.edu.cn/
    [37] 校友服务 http://alumni.xmu.edu.cn/
    [38] 教育基金会 http://edf.xmu.edu.cn/
    [39] 马来西亚分校 http://www.xmu.edu.my
    [40] 嘉庚学院 http://jgxy.xmu.edu.cn/
    [41] 国际学院 http://liuxue.xmu.edu.cn/
    [42] 汉推南方基地 http://www.cnconfucius.com/
    [43] 网上展馆 http://wszg.xmu.edu.cn/
    [44] 信息公开 http://gk.xmu.edu.cn/
    [45] 招聘信息 http://rsc.xmu.edu.cn/s/137/t/722/p/1/c/6467/d/6557/list.htm
    [46] 网上展馆 http://wszg.xmu.edu.cn/
    [47] 校园地图 http://map.xmu.edu.cn/
    [48] 学科 http://210.34.0.175/hy/Introduction/Introduction_gjzdxk.asp
    [49] 师资 http://rsc.xmu.edu.cn/s/137/t/722/p/1/c/8710/d/8883/list.htm
    [50] 本科生教育 http://jwc.xmu.edu.cn/
    [51] 研究生教育 http://gs.xmu.edu.cn/
    [52] 继续教育与网络教育 http://nec.xmu.edu.cn/
    [53] 国际学生教育 http://oec.xmu.edu.cn/
    [54] 管理 http://xsc.xmu.edu.cn/
    [55] 自然科学与技术 http://stinfo.xmu.edu.cn/
    [56] 人文与社会科学 http://skc.xmu.edu.cn/
    [57] 博士后科研流动站 http://rsc.xmu.edu.cn/s/137/t/445/p/1/c/6462/d/6636/list.htm
    [58] 厦门大学学报(自然版) http://jxmu.xmu.edu.cn/
    [59] 厦门大学学报(哲社版) http://xdxbs.xmu.edu.cn/
    [60] 成果产业化 http://zcjy.xmu.edu.cn/
    [61] 大学科技园 http://kjy.xmu.edu.cn/
    [62] 战略合作 http://zlhz.xmu.edu.cn/
    [63] 后勤服务 http://hqjt.xmu.edu.cn/
    [64] 会议服务 http://www.xmuiaec.com/
    [65] 出版服务 http://www.xmupress.com/
    [66] 团委 http://tw.xmu.edu.cn/
    [67] 学生委员会 http://xsh.xmu.edu.cn/
    [68] 研究生会 http://yjsh.xmu.edu.cn/
    [69] 社团联合会 http://slh.xmu.edu.cn/
    [70] 鼓浪听涛BBS http://bbs.xmu.edu.cn/
    [71] 校园活动 http://lecture.xmu.edu.cn/
    [72] 国际合作与交流 http://ice.xmu.edu.cn/project.aspx
    [73] 港澳台合作与交流 http://ice.xmu.edu.cn/chinese.aspx
    [74] 孔子学院 http://www.cnconfucius.com/
    [75] 留学服务 http://ice.xmu.edu.cn/abroad.aspx
    [76] 招生 http://zsb.xmu.edu.cn
    [77] 就业 http://jyzd.xmu.edu.cn
    [78] 爱厦大 http://ixiada.xmu.edu.cn
    [79] 旧版主页 http://www2012.xmu.edu.cn/
    

    测试样例2:

    输入网址为http://www.xmu.com.cn时,输出

    I/O Errors: no such file.
    

    测试样例3:

    输入网址为htp://www.xmu.edu.cn时,输出

    Invalid URL.
    

    测试样例4:

    输入网址为http://www.google.com.hk时,输出

    I/O Errors: no such file.
    

    存在的问题

    本程序虽然可以在http://www.xmu.edu.cn上很好的实现题目要求的功能,但是如果在其他网页上进行抓取,将出现一些问题。

    如在中国政府网http://www.gov.cn上进行抓取时,会出现

    [8] 

    这样的情况,由于出现了图片链接而使得正则表达式的匹配出现一些问题,于是,网页的标题变成了非常奇怪的标签。

    还有在搜狐网http://www.sohu.com.cn上抓取网页链接时,会出乱码

    [1] �Ѻ�http://www.sohu.com

    [2] �ѹ�http://www.sogou.com/

    [3] ���뷨 http://pinyin.sogou.com/

    ……

    由于没有考虑编码问题,所以当网页的编码方式出现不同时,程序的结果就会出现错乱。

    声明:由于本人对于正则表达式并不熟悉,所以模式串的正则表达式是本人根据网络上的资料修改后得到,并非本人原创。当然,对正则表达式的不熟悉也给程序带来了一些目前能力所不及的问题。

    你可能感兴趣的:(Java)