厦大计算机系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<Integer> 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<Integer> 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<Integer> 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形如:

<li><a href="http://e.weibo.com/xmunews"target="_blank"><i class="iconicon-list-alt"></i>官方微博</a></li>

程序输出为:[序号]标题 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 = "<a.*?/a>";
                Pattern pattern = Pattern.compile(regex);
                Matcher matcher = pattern.matcher(line);
                
                while(matcher.find())
                {
                    String title = ">[^<].*?[^>]</a>";
                    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(">|</a>", "") + " ");
                        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] <img style="opacity: 1;"src="/govweb/c1293/201604/5068280/images/694c4afb689e408b917a841aef7f9204.jpg"  http://www.gov.cn/premier/2016-04/26/content_5068208.htm

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

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

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

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

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

……

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值