三次作业总计

 

一.   前言

通过这三次作业的练习以后,我对java和c的区别有了一些初步的认知。本来认为有c的老底然后来写java的作业的话应该不是很难,前两次作业都还好,虽然过程中有很多困难,但最后还是基本完成任务,但是在第三次作业中,我看到了java不一样的地方,难度也上升了很多,花费了很多时间,但是最后还是没能解决问题。这让我心中产生了许多的不解和困惑,并且提醒了我在以后的学习过程中不能再掉以轻心了,要认认真真的对待每一堂课和每次作业。

1.三次作业总结

(1)第一次作业

第一次作业的题目量虽然比较大,但是大多都是比较基础简单的题目,大多都是简单的输入,输出,求和,判断,选择。考察的东西就是java的基本结构和一些比较简单的语法问题,例如if~else语句,循环语句等等。不过还是存在一些细节上的考点,有时候会出现测试点不过的情况,大体上没有什么难度,不过二进制数值提取的这道题目我没有拿满分,有三个测试点没有通过。

(2)第二次作业

第二次作业主要考察的是字符串的提取与循环的运用,大多是将输入的内容提取一部分出来,如7-2 串口字符解析和7-3 String的格式判断与内容提取,还有将输入的内容转换一下,如7-1字母-数字转换。这次题目的难度还算比较均衡,除去第二题比较困难,题意难解,另外两道题的难度还算适中,并不是很困难。

(3)第三次作业

第三次作业相比较于前两次作业而言,难度比较大,主要是对新知识点正则表达式的考察和使用。在网上阅读完相关资料以后,并没能完全将这个知识点掌握并运用到题目当中去,一直处于一个一知半解的状态下。

二.设计与分析

第二次作业的7-2源码如下:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        String in = input.nextLine();

        if (in.length() < 11 || in.matches("^[1]*$")) {

            System.out.println("null data");

            return;

        }

        int i,j,sum,num=1;

        boolean m = false, n = false;

        for (i = 0; i < in.length() - 10; i++) {

            if (in.charAt(i) == '0') {

                System.out.print(num + ":");

                num++;

                if (in.charAt(i + 10) == '0') {

                    m = false;

                } else {

                    m = true;

                    sum = 0;

                    for (j = i + 1; j < i + 9; j++) {

                        if (in.charAt(j) == '1') {

                            sum++;

                        }

                    }

                    if (sum % 2 == 0) {

                        if (in.charAt(i + 9) == '1') {

                            n = true;

                        } else {

                            n = false;

                        }

                    } else {

                        if (in.charAt(i + 9) == '0') {

                            n = true;

                        } else {

                            n = false;

                        }

                    }

                }

                if (m) {

                    if (n) {

                        for (j = i + 1; j < i + 9; j++) {

                            System.out.print(in.charAt(j));

                        }

                        System.out.print("\n");

                    } else {

                        System.out.println("parity check error");

                    }

                } else {

                    System.out.println("validate error");

                }

                i = i + 10;

            }

        }

    }

}

 

 

这道题目对正则表达式有了初步的考察。

这题运用正则表达式的匹配功能来判断输入的合法性,也就是判断语句if中的 in.matches("^[1]*$"),通过这个语句来筛选正确输入的情况。然后通过if~else语句来筛选出各种情况,并进行输出。其中也考察了奇偶校验中的奇校验。通过对这道题目的练习,对奇偶校验有了一个初步的理解。

 

第三次作业7-1的源码如下:

import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

public class Main {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        String s = input.nextLine();

        int i;

        for(i=0;i<s.length();i++)

        {

            if((s.charAt(i)=='+'&&s.charAt(i+1)=='+')||(s.charAt(i)=='-'&&s.charAt(i+1)=='-'))

            {System.out.println("Wrong Format");

            return;}

        }

        double num=0.0;

        String u;

        Pattern pattern1 = Pattern.compile("([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");

        Matcher matcher1 = pattern1.matcher(s);

        double x1,x2,y1,y2;

        matcher1.find();

            u = matcher1.group(1);

            x1 = Double.parseDouble(u);

            u = matcher1.group(3);

            y1 = Double.parseDouble(u);

        matcher1.find();

        u = matcher1.group(1);

        x2 = Double.parseDouble(u);

        u = matcher1.group(3);

        y2 = Double.parseDouble(u);

        if(matcher1.find())

        {

            System.out.println("wrong number of points");

            return;

        }

            num = Math.sqrt(Math.pow((x1-x2) * 1.0, 2) + Math.pow((y1-y2)* 1.0, 2));

            System.out.println(num);

 

    }

}

 

 

这道题目主要也是对正则表达式的运用和理解。不过难度却稍微高了一些,深度也大了一些。首先我们要同过正则表达式的匹配功能来筛选出正确输入的情况,然后同过获取功能将我们所需要的数据拿出来单独存取,最后再通过公式运算来获得最终的结果。设想过程中很不错,不过编写程序的过程中却经常出现测试点不通过的情况。错误输入格式的情况屡屡再现,最终也没有妥善的解决。

 

第三次作业7-2的源码如下:

import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

public class Main {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        String s = input.nextLine();

        int i;

        for(i=0;i<s.length();i++)

        {

            if((s.charAt(i)=='+'&&s.charAt(i+1)=='+')||(s.charAt(i)=='-'&&s.charAt(i+1)=='-'))

            {System.out.println("Wrong Format");

            return;}

        }

        String u;

        Pattern pattern1 = Pattern.compile("([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");

        Matcher matcher1 = pattern1.matcher(s);

        double a[]=new double[8];

        int j= 0;

        while(matcher1.find())

        {

            u = matcher1.group(1);

            a[j] = Double.parseDouble(u);

            j++;

            u = matcher1.group(3);

            a[j] = Double.parseDouble(u);

            j++;

        }

        if(s.charAt(0)=='1')

        {

            double t = (a[3]-a[1])/(a[2]-a[0]);

            if(a[2]!=a[0])

            System.out.println(t);

            else

                System.out.println("Slope does not exist");

            return;

        }

        else if(s.charAt(0)=='2')

        {

            double t =Math.abs((((a[3]-a[5])/(a[2]-a[4]))*a[0]-a[1]+a[5]-((a[3]-a[5])/(a[2]-a[4]))*a[2])/

                    Math.sqrt(((a[3]-a[5])/(a[2]-a[4]))*((a[3]-a[5])/(a[2]-a[4]))+1));

            System.out.println(t);

            return;

        }

        else if(s.charAt(0)=='3')

        {

            double t =Math.abs((((a[3]-a[5])/(a[2]-a[4]))*a[0]-a[1]+a[5]-((a[3]-a[5])/(a[2]-a[4]))*a[2])/

                    Math.sqrt(((a[3]-a[5])/(a[2]-a[4]))*((a[3]-a[5])/(a[2]-a[4]))+1));

            if(t==0)

                System.out.println("ture");

            else

                System.out.println("false");

            return;

        }

        else if(s.charAt(0)=='4')

        {

            if((a[3]-a[1])/(a[2]-a[0])==(a[7]-a[5])/(a[6]-a[4]))

                System.out.println("ture");

            else

                System.out.println("false");

            return;

        }

        else if(s.charAt(0)=='5')

        {

            return;

        }

    }

}

 

这题相较于第一题而言难度上升了很多。

这道题有所包含的内容如下:

1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。

在写这道题的时候,我的想法是先判断输入的合理性,然后再对输入合法的内容进行提取,再单独对提取出来的数据进行处理,通过输入的第一个字符判断所需要的功能,此时用if~else语句去正确处理这些数据,得到最终的输出结果。。大体上是这个设计思路,然后再编写代码的过程中进行了一部分修改。

 

第三次作业7-3的源码如下:

import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

public class Main {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        String s = input.nextLine();

        int i;

        String u;

        Pattern pattern1 = Pattern.compile("([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");

        Matcher matcher1 = pattern1.matcher(s);

        double a[]=new double[8];

        int j= 0;

        while(matcher1.find())

        {

            u = matcher1.group(1);

            a[j] = Double.parseDouble(u);

            j++;

            u = matcher1.group(3);

            a[j] = Double.parseDouble(u);

            j++;

        }

        if(s.charAt(0)=='1')

        {

            double c = Math.sqrt((a[0]-a[2])*(a[0]-a[2])+(a[1]-a[3])*(a[1]-a[3]));

            double d = Math.sqrt((a[0]-a[4])*(a[0]-a[4])+(a[1]-a[5])*(a[1]-a[5]));

            double e = Math.sqrt((a[4]-a[2])*(a[4]-a[2])+(a[5]-a[3])*(a[5]-a[3]));

            if(c==d&&c==e)

            {

                System.out.print("ture ture");

            }

            else if(c==d||c==e||d==e)

                System.out.print("ture false");

            else

                System.out.print("false false");

            return;

        }

        else if(s.charAt(0)=='2')

        {

 

            return;

        }

        else if(s.charAt(0)=='3')

        {

            double c = Math.sqrt((a[0]-a[2])*(a[0]-a[2])+(a[1]-a[3])*(a[1]-a[3]));

            double d = Math.sqrt((a[0]-a[4])*(a[0]-a[4])+(a[1]-a[5])*(a[1]-a[5]));

            double e = Math.sqrt((a[4]-a[2])*(a[4]-a[2])+(a[5]-a[3])*(a[5]-a[3]));

            double f = c*c+d*d-e*e;

            double g = c*c-d*d+e*e;

            double h = -c*c+d*d+e*e;

            if(f>0&&g>0&&h>0)

                System.out.print("false false ture");

                else if(f==0||g==0||h==0)

                System.out.print("false ture false");

            else if(f<0||g<0||h<0)

                System.out.print("true false false");

            return;

        }

        else if(s.charAt(0)=='4')

        {

 

            return;

        }

        else if(s.charAt(0)=='5')

        {

            return;

        }

    }

}

这道题所包含的内容如下:

1:输入三个点坐标,判断是否是等腰三角形、等边三角形,判断结果输出true/false,两个结果之间以一个英文空格符分隔。
2:输入三个点坐标,输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
3:输入三个点坐标,输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔,
4:输入五个点坐标,输出前两个点所在的直线与三个点所构成的三角形相交的交点数量,如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条线重合,输出"The point is on the edge of the triangle"
5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。
必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"

这道题目与第二道题目类似,首先仍然是筛选输入的数据合理性,如果不合理直接结束。正确输入后,再使用正则表达式,将所需要的数据提取出来单独处理,通过输入的第一个字符判断所需要的功能,此时用if~else语句去正确处理这些数据,得到最终的输出结果。

 

三.踩坑心得

对于前两次作业雷坑相对来说比较少,我记得第一次作业中,很多题的浮点型数据只能定义float类型的浮点数,而不能定义为double类型的浮点型数据。其次就是有些输入输出的问题,总是有些格式错误,我到现在还没搞明白。还有一些时候,再数据输出的时候必须要加上(类型),来避免数据出错。然后从第三次作业开始,主要是对于正则表达式的考察,主要是字符串的匹配和字符串的获取。雷坑就在于如何合理的使用正则表达式,然而我在调试的过程中总是会出现格式错误,测试点不通过,或者是三个点只对一个点。我通过题目给出的测试数据来进行调试,但是最后没有找到哪里的错误。然后我还有很多地方没有写出来,是不知道怎么将正则表达式运用得很好,只能初略的进行筛选,然后获取其中的内容。

四.改进建议

对于前这三次作业而言,我的代码一般都是大家的惯性思维,由于怕出错,所以都写得比较常规,有些题目确实有更简单的思路,但是我不知道怎么去运用哪些方法,可能是知识量储备的比较少吧。例如第三次作业的题目,可以用正则表达式去筛选出输入格式错误的情况,但是我是把输入错误的情况一一表达出来,然后通过判断语句去解决。首先是对正则表达式认知的不到位,不知道怎么去正确使用正则表达式去筛选出输入格式错误的地方,如果将这个点弄明白的话,代码的复杂程度就会降低很多。

五.总结

通过这三次的习题练习,我学到了挺多的东西。

如java的基本结构,变量的类型以及字符串的输入与输出。收获最大的自然是正则表达式与奇偶校验。在Java编程中,我们经常要处理一些字符串的查找等与字符串相关的程序,而正则表达式满足了这个需要,它规定了各种复杂的规则,换句话说,正则表达式就是记录文本规则的代码,计算机处理更多的不是数字而是字符串,而正则表达式就是对字符串进行匹配最为强大的工具,很多语言都支持正则表达式。正则表达式,又称规则表达式。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

正则表达式有四个用处:

1. 字符串的匹配功能

2. 字符串的切割功能

3. 字符串的替换功能

4. 字符串的获取功能

奇校验:校验数据完整性的一种方法,一个字节的8个数据位与校验位加起来之和有奇数个 1。校验线路在收到数后,通过发生器在校验位填上 0 或 1,以保证和是奇数个 1。

因此,校验位是 0 时,数据位中应该有奇数个 1;

而校验位是 1 时,数据位应该有偶数个 1。

如果读取数据时发现与此规则不符,CPU会下令重新传输数据。

但是对于正则表达式的理解还是不到位,仍然处于一知半解的状态,所以我还要多花点心思在正则表达式的身上,多多去研究它,希望能获得更进一步的理解。

posted @ 2022-04-10 16:11  烦到乏味  阅读(51)  评论(0)    收藏  举报