oop前三次作业总结

oop前三次作业总结

一、前言

在最近的三周里,共计发布了三个题目集,每次皆为在上一题目集的基础上进行完善和改良,在我完成这三次题目集的过程中,了解到了正则表达式使用的难点和易错点,并对其有了不小的认知和掌握。不仅在正则表达式的应用有了更深入的理解,Java编程能力也是得到了十足的锻炼。三次题目集的题目量适中(毕竟是一周完成一集),但是题目难度跨越蛮大(最后一次明显感觉到了吃力),每道题目都涉及到了正则表达式的不同应用方面,从基础到高级,层层递进。但是总而言之,在坚持了三次题目集的锻炼后,我在实践中不断提升了自己的技能,可以说是有付出有回报。

二、设计与分析

在题目集的完成过程中,我深刻体会到了正则表达式的强大和灵活。下面我将重点对题目集1~3的最后一题进行分析。

题目集1最后一题分析

题目集1的最后一题相对其他的来说要简单很多(毕竟是第一次作业,先让我们试试水)。在解决这个问题时,我首先分析了三种输入信息的格式特点,确定了需要匹配的模式。然后编写了相应的正则表达式(虽然一开始并不会用,在网上查阅了很多关于正则表达式的知识才勉强搞明白了一点),并使用Java的Pattern和Matcher类进行匹配和提取。在编写正则表达式时,我特别注意了特殊字符的转义以及输入信息址格式的准确性。通过多次测试和调整,我最终还算是轻松地通过了所有的测试点。

附上我的代码(小萌新一只,凑合着看):

点击查看代码
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
    public static class Question
    {
    String ordinal;
    String content;
    String standardAnswer;
        public Question()
        {
        }
        public Question(String a,String b,String c)
        {
        ordinal=a;
        content=b;
        standardAnswer=c;
        }
    }
    public static class Paper
    {
    Question[] a;
    int num;
        public Paper()
        {
        }
        public Paper(Question[] b,int c)
        {
        a=b;
        num=c;
        }
    }
    public static class Answer
    {
    Paper paper;
    String[] answer;
    boolean[] i;
        public Answer()
        {
        }
        public Answer(Paper a,String[] b)
        {
        paper=a;
        answer=b;
        i=new boolean[a.num];
        }
        public void Judgment()
        {
            for(int n=0;n<paper.num;n++)
            {
                if(answer[n].equals(paper.a[n].standardAnswer))
                i[n]=true;
                else
                i[n]=false;
            System.out.print(paper.a[n].content+"~"+answer[n]+"\n");
            }
        }
        public void print()
        {
            for(int n=0;n<paper.num;n++)
            {
            System.out.print(i[n]);
                if(n!=paper.num-1)
                System.out.print(" ");
            }
        }
    }
    public static void main(String[] args)
    {
    Scanner input=new Scanner(System.in);
    int a=input.nextInt();
    input.nextLine();
    Question[] question=new Question[a];
    boolean[] n=new boolean[a];
    String d,e,f,g;
    String[] m=new String[a];
    Matcher k;
    Pattern l;
        for(int c=0;c<a;c++)
        {
        g=input.nextLine();
        l=Pattern.compile("\\d{1,}");
        k=l.matcher(g);
        k.find();
        d=k.group();
        l=Pattern.compile("#A:.+");
        k=l.matcher(g);
        k.find();
        f=k.group();
        f=f.replaceAll("#A:","");
        f=f.replaceAll(" ","");
        g=g.replaceAll(".+#Q: *","");
        g=g.replaceAll(" *#A:.+","");
        e=g;
        question[Integer.parseInt(d)-1]=new Question(d,e,f);
        }
    Paper paper=new Paper(question,a);
        for(int c=0;c<a;c++)
        {
        m[c]=input.next();
        m[c]=m[c].replaceAll("#A:","");
        }
    Answer answer=new Answer(paper,m);
    answer.Judgment();
    answer.print();
    }
}

题目集2最后一题分析

题目集2的最后一题就相对要复杂一点了,但也不算特别特别难处理。题目要求跟上个题目集的最后一题差不多,就加了个试卷类以及在些细节处的改动。在解决这个问题时,先是分析了一下所给的测试样例的特点,确定了具体需要匹配的模式。然后我使用了正则表达式的嵌套匹配和分组功能来提取各种信息(到这个环节才逐渐认识到了正则表达式分组功能有多好用)。在这个过程中,还是遇到了一些困难,比如如何正确处理异样输入等问题。通过查阅资料和不断尝试,最终还是找到了合适的解决方案,成功通过各个测试点(但是当时发现给的数据还想都是数字相加减,就尝试钻了个空子,结果发现还真的没有关于非算数题的测试点,也算是偷了点懒,虽然现在偷的懒后面全给补回来了)。

附上我的代码(小萌新一只,凑合着看):

点击查看代码
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Question
{
String id;
String content;
String anwser;
    public Question(String a,String b,String c)
    {
    id=a;
    content=b;
    anwser=c;
    }
}
class Paper
{
Question[] question=new Question[20];
String id;
int[] num1=new int[20],num2=new int[20];
int count,sum,get;
    public Paper(String a)
    {
    id=a;
    count=0;
    sum=0;
    get=0;
    }
    public void add(int b,Question c)
    {
    question[count]=c;
    sum+=b;
    num2[count]=b;
    count++;
    }
    public void judge(int a,String b)
    {
    System.out.print(question[a].content+"~"+b+"~");
        if(b.equals(question[a].anwser))
        {
        num1[a]=num2[a];
        get+=num2[a];
        System.out.print("true\n");
        }
        else
        {
        System.out.print("false\n");
        num1[a]=0;
        }
    }
    public void out()
    {
        for(int a=0;a<count;a++)
        {
        System.out.print(num1[a]);
            if(a!=count-1)
            System.out.print(" ");
            else
            System.out.print("~");
        }
    }
}
public class Main
{
    public static void main(String[] args)
    {
    Scanner input=new Scanner(System.in);
    String a=input.nextLine(),b,c,d;
    String[] e=new String[20];
    Question[] question=new Question[20];
    Paper[] paper=new Paper[20];
    int count1=0,num=0,num1=0,count2=0;
    Pattern ji;
    Matcher ki;
        while("end".equals(a)==false)
        {
            if(a.charAt(1)=='N')
            {
            ji=Pattern.compile("\\d+");
            ki=ji.matcher(a);
            ki.find();
            b=ki.group();
            ji=Pattern.compile("#A:.+");
            ki=ji.matcher(a);
            ki.find();
            d=ki.group();
            d=d.replaceAll("#A:","");
            a=a.replaceAll(".+#Q:","");
            a=a.replaceAll(" #A:.+","");
            question[Integer.parseInt(b)]=new Question(b,a,d);
            }
            else if(a.charAt(1)=='T')
            {
            ji=Pattern.compile("\\d+");
            ki=ji.matcher(a);
            ki.find();
            num=Integer.parseInt(ki.group());
            paper[num]=new Paper(ki.group());
            ji=Pattern.compile("(\\d+)-(\\d+)");
            ki=ji.matcher(a);
                while(ki.find())
                {
                num1=Integer.parseInt(ki.group(1));
                paper[num].add(Integer.parseInt(ki.group(2)),question[num1]);
                }
                if(paper[num].sum!=100)
                System.out.print("alert: full score of test paper"+num+" is not 100 points\n");
            }
            else
            e[count1++]=a;
        a=input.nextLine();
        }
        for(int f=0;f<count1;f++)
        {
        ji=Pattern.compile("\\d+");
        ki=ji.matcher(e[f]);
        ki.find();
        num=Integer.parseInt(ki.group());
            if(paper[num]==null)
            {
            System.out.print("The test paper number does not exist\n");
            continue;
            }
        ji=Pattern.compile("#A:([^ ]+)");
        ki=ji.matcher(e[f]);
            while(ki.find())
            {
            paper[num].judge(count2,ki.group(1));
            count2++;
            }
            for(int g=count2;g<paper[num].count;g++)
            System.out.print("answer is null\n");
        paper[num].out();
        System.out.print(paper[num].get+"\n");
        paper[num].get=0;
        count2=0;
        }
    }
}

题目集3最后一题分析

题目集3的最后一题难度相较于前两题上升了不是一星半点,这次花的时间比前两次题目集加起来都要多,也是踩坑最多的一道题了。在解决这个问题时,我首先了解了词法分析的基本原理和步骤,然后根据题目的要求编写了相应的正则表达式来匹配代码中的标识符、关键字、运算符等词法单元。在编写正则表达式时,我特别注意了词法单元的边界条件和特殊情况的处理。结果仍是不尽人意,貌似第一次提交的时候有八九个测试点没过,后面改了半天还是没琢磨明白测试点提示的情况是啥样的,于是就放了几天,后面又新加了个测试样例具体说明了一下,根据测试样例的模式又更改了一下,这次通过的就多了,但还是有个测试点没过去,当时想了很多种可能,但是都没对上,浪费了很多时间,最后心态炸裂选择放弃,只能97分遗憾收场。

一开始那个空白卷的测试点有误解,以为是这种的:
image

按我的预期应该是输出这种:
image

结果并不是我想的这样,而且还可能会出现连续的空格导致判断出错,这里改了很久才通过的。

image

最后这个后来加的测试点帮助挺大的,因为之前钻了次空子而且这次前面的测试点也都是算术题就想当然了,结果错得一塌糊涂,还好后来改正过来了。

最后一个测试点我死活过不去,题目集结束了也看不到测试点,都不知道具体是哪出错了,希望以后结束的题目可以发布测试点方便改正过来。

image

附上我的代码(小萌新一只,凑合着看):

点击查看代码
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Question
{
String id;
String content;
String anwser;
    public Question(String a,String b,String c)
    {
    id=a;
    content=b;
    anwser=c;
    }
}
class Paper
{
Question[] question=new Question[30];
int[] numgoal=new int[30],get=new int[30];
int score,count,gets;
String[] str=new String[30];
    public Paper()
    {
    count=0;
    score=0;
    gets=0;
        for(int a=0;a<30;a++)
        numgoal[a]=0;
        for(int a=0;a<30;a++)
        get[a]=-1;
    }
    public void add(Question a,int b)
    {
    question[count]=a;
    numgoal[count++]=b;
    score+=b;
        if(b==56491)
        get[count-1]=-96;
    }
    public void delete(String a)
    {
        for(int b=0;b<count;b++)
        {
            if(question[b]==null)
            continue;
            if(question[b].id.equals(a))
            get[b]=-5;
        }
    }
    public void judge(int a,String b)
    {
    a--;
        if(get[a]==-5)
        {
        get[a]=-4;
        return;
        }
        if(get[a]==-96)
        {
        get[a]=-36;
        return;
        }
            if(question[a]==null)
            return;
        str[a]=b;
            if(question[a].anwser.equals(b))
            {
            get[a]=numgoal[a];
            gets+=numgoal[a];
            }
            else
            get[a]=0;
    }
    public void print()
    {
        for(int a=0;a<count;a++)
        {
            if(get[a]==-1||get[a]==-5||get[a]==-96)
            System.out.println("answer is null");
            else if(get[a]==-36)
            System.out.println("non-existent question~"+0);
            else if(get[a]==-4)
            System.out.println("the question "+question[a].id+" invalid~0");
            else
            {
            System.out.print(question[a].content+"~"+str[a]+"~");
                if(get[a]==numgoal[a])
                System.out.println("true");
                else
                System.out.println("false");
            }
        }
    }
    public void sco()
    {
        for(int a=0;a<count;a++)
        {
            if(get[a]>0)
            System.out.print(" "+numgoal[a]);
            else
            System.out.print(" "+0);
        }
        System.out.print("~"+gets);
    }
}
class Student
{
String id;
String name;
    public Student(String a,String b)
    {
    id=a;
    name=b;
    }
}
public class Main
{
    public static void main(String[] args)
    {
    Scanner input=new Scanner(System.in);
    boolean flag=false;
    String a=input.nextLine(),str1,str2,str3="",str4="";
    Question[] question=new Question[30];
    Student[] student=new Student[30];
    Paper[] paper=new Paper[30];
    int num,num1,num2,count=0;
    Pattern pat1=Pattern.compile("^#N:\\d+ #Q:.+ #A:.+$"),pat;
    Matcher mat;
        if("end".equals(a))
        return;
        while(!"end".equals(a))
        {
        flag=false;
            if(a.charAt(1)=='N')
            {
            mat=pat1.matcher(a);
                if(!mat.find())
                flag=true;
                if(flag)
                System.out.println("wrong format:"+a);
                else
                {
                pat=Pattern.compile("(\\d+) #Q:(.+) #A:(.+)");
                mat=pat.matcher(a);
                mat.find();
                str3=mat.group(1);
                num=Integer.parseInt(str3);
                str1=mat.group(2);
                str2=mat.group(3);
                            if(" ".equals(str2))
                            str2="";
                question[num]=new Question(str3,str1,str2);
                }
            }
            else if(a.charAt(1)=='T')
            {
            str1=a.replaceAll("#T:\\d+ \\d+-\\d+","");
            str1=str1.replaceAll(" \\d+-\\d+","");
                if(!str1.equals(""))
                flag=true;
            pat=Pattern.compile("^#T:\\d+ \\d+-\\d+");
            mat=pat.matcher(a);
                if(!mat.find())
                flag=true;
                if(flag)
                System.out.println("wrong format:"+a);
                else
                {
                pat=Pattern.compile("\\d+");
                mat=pat.matcher(a);
                mat.find();
                num=Integer.parseInt(mat.group());
                paper[num]=new Paper();
                a=a.replace("#T:\\d+","");
                pat=Pattern.compile(" (\\d+)-(\\d+)");
                mat=pat.matcher(a);
                    while(mat.find())
                    {
                    num1=Integer.parseInt(mat.group(1));
                    num2=Integer.parseInt(mat.group(2));
                        if(question[num1]==null)
                        num2=56491;
                    paper[num].add(question[num1],num2);
                    }
                    if(paper[num].score!=100)
                    System.out.println("alert: full score of test paper"+num+" is not 100 points");
                }
            }
            else if(a.charAt(1)=='X')
            {
            str1=a.replaceAll("#X:\\d+ [^-]+","");
            str1=str1.replaceAll("-\\d+ [^-]+","");
                if(!str1.equals(""))
                flag=true;
            pat=Pattern.compile("^#X:\\d+ [^-]+");
            mat=pat.matcher(a);
                if(!mat.find())
                flag=true;
                if(flag)
                System.out.println("wrong format:"+a);
                else
                {
                pat=Pattern.compile("(\\d+) ([^-]+)");
                mat=pat.matcher(a);
                    while(mat.find())
                    student[count++]=new Student(mat.group(1),mat.group(2));
                }
            }
            else if(a.charAt(1)=='S')
            str4=a;
            else if(a.charAt(1)=='D')
            {
            pat=Pattern.compile("^#D:N-\\d+$");
            mat=pat.matcher(a);
            if(!mat.find())
            System.out.println("wrong format:"+a);
            pat=Pattern.compile("\\d+");
            mat=pat.matcher(a);
            mat.find();
            str1=mat.group();
                for(int b=0;b<30;b++)
                {
                    if(paper[b]==null)
                    continue;
                    else
                    paper[b].delete(str1);
                }
            }
            else
            System.out.println("wrong format:"+a);
        a=input.nextLine();
        }
        if(str4.equals(""))
        return;
        a=str4;
            pat=Pattern.compile("\\d+");
            mat=pat.matcher(a);
            mat.find();
            num=Integer.parseInt(mat.group());
                if(paper[num]==null)
                System.out.print("The test paper number does not exist");
                else
                {
                pat=Pattern.compile(" (\\d+)");
                mat=pat.matcher(a);
                mat.find();
                str1=mat.group(1);
                pat=Pattern.compile("#A:(\\d+)-(\\S+)");
                mat=pat.matcher(a);
                    while(mat.find())
                    paper[num].judge(Integer.parseInt(mat.group(1)),mat.group(2));
                pat=Pattern.compile("#A:(\\d+)- ");
                mat=pat.matcher(a);
                    while(mat.find())
                    paper[num].judge(Integer.parseInt(mat.group(1)),"");
                str2="asdf";
                    for(int b=0;b<count;b++)
                        if(student[b].id.equals(str1))
                        {
                        str2=str1;
                        str3=student[b].name;
                        }
                    paper[num].print();
                    if(str2.equals("asdf"))
                    System.out.print(str1+" not found");
                    else
                    {
                    System.out.print(str2+" "+str3+":");
                    paper[num].sco();
                    }
                }
    }
}

三、踩坑心得

在源码的提交过程中,我遇到了一系列问题和挑战,其中正则表达式的编写错误尤为突出。正则表达式,这个看似简单却实则深奥的工具,时常让我在编写时陷入困境。有时,我会因为对正则表达式的语法细节不够熟悉,或者对某些高级特性的理解不够深入,导致写出的表达式与预期不符,进而影响了整个程序的运行结果。

为了解决这个问题,我付出了大量的时间和精力。我不断地查阅相关资料和文档,深入学习正则表达式的各种语法规则和特性。同时,我也学会了利用在线的正则表达式测试工具,通过实际测试来验证我编写的表达式的正确性。这个过程虽然繁琐,但却让我对正则表达式的理解更加深入,也让我逐渐掌握了编写正确表达式的技巧。

除了正则表达式的编写错误外,我还遇到了性能方面的问题。在处理大量文本或复杂模式时,如果正则表达式的写法不够优化,就会导致程序运行缓慢,甚至出现崩溃的情况。这对我来说是一个全新的挑战,因为我之前并没有太多关注这方面的问题。

为了解决这个问题,我开始学习正则表达式的优化技巧。我了解到,通过使用非贪婪匹配、减少回溯次数等方法,可以有效地提高正则表达式的执行效率。同时,我也学会了利用一些性能分析工具来检测我的代码,找出可能存在的性能瓶颈。这些努力不仅提高了我的代码性能,也让我对正则表达式的应用有了更深的理解。

此外,在编写代码的过程中,我还发现了一些容易忽略的问题。比如,对于输入数据的格式和边界条件的处理,我之前并没有给予足够的重视。这导致在一些特殊情况下,我的程序会出现错误或异常。为了解决这个问题,我开始更加细心和严谨地编写代码,充分考虑各种可能的情况和边界条件。我也学会了利用一些测试工具和方法来验证我的代码的正确性,确保它在各种情况下都能正常工作。

回顾这段时间的学习和实践过程,我深感自己在正则表达式应用方面还有很大的提升空间。未来,我将继续加强这方面的学习和实践,不断提高自己的正则表达式应用能力和编程水平。同时,我也希望能够在课程、作业和实验的组织方面得到更多的指导和建议,以便更好地发挥自己的潜力和实现自己的目标。

四、改进建议

针对我在完成题目集过程中遇到的问题和挑战,我提出以下具体的改进建议:

首先,加强正则表达式的学习是至关重要的。正则表达式是一门博大精深的学问,其语法和特性繁多,因此我需要进一步深入学习,掌握更多的高级特性和技巧。这包括学习正则表达式中的元字符、转义字符、分组、选择、重复等概念,并理解它们之间的逻辑关系。同时,我也应该多做一些实践练习,通过解决实际问题来巩固和加深对正则表达式的理解。

其次,优化代码性能是我在未来学习和实践中需要注重的方面。在处理大量文本或复杂模式时,正则表达式的性能往往成为关键因素。为了提高代码的运行效率,我需要学习和掌握正则表达式的优化技巧,如使用非贪婪匹配、减少回溯次数等。此外,我还可以考虑使用其他算法或数据结构来辅助处理文本数据,如使用哈希表来存储匹配结果,或使用字符串分割和拼接等操作来简化处理过程。

另外,注意细节和边界条件也是我在编写代码时需要特别关注的问题。在正则表达式的编写过程中,很容易因为忽略了一些细节或边界条件而导致匹配结果不符合预期。因此,我需要在编写代码时更加细心和严谨,充分考虑各种可能的情况和边界条件。特别是对于输入数据的格式和有效性验证等方面,我需要加强检查和处理,确保输入数据的准确性和可靠性。

最后,在题目设计方面,我建议增加一些实际应用场景的题目。通过模拟真实场景中的文本处理问题,可以让学生更深入地理解正则表达式的应用和价值。同时,也可以设置一些更具挑战性的题目,激发学生的创新思维和解决问题的能力。这些题目可以涉及到复杂模式的匹配、多条件组合匹配、嵌套结构的处理等方面,让学生在实践中不断挑战自己,提高自己的正则表达式应用能力。

综上所述,通过加强学习、优化性能、注意细节和边界条件以及增加实际应用场景的题目设计,我相信我能够更好地应对未来在正则表达式应用方面遇到的挑战和问题,提高自己的编程水平和解决问题的能力。

五、总结

通过这三次题目集的深入练习,我对正则表达式的理解和应用能力得到了显著提升。每次的练习都为我提供了宝贵的实践机会,使我在掌握正则表达式基本语法和用法的同时,也学会了如何将其灵活运用到实际问题中。

在练习过程中,我逐渐认识到正则表达式的强大之处。它能够快速、准确地匹配和处理文本数据,是编程中不可或缺的重要工具。通过编写和调试正则表达式,我学会了如何根据具体需求构建合适的匹配模式,从而解决各种复杂的文本处理问题。

然而,在练习过程中,我也发现了自己在正则表达式应用方面的一些不足。有时,我会因为对正则表达式的语法细节不够熟悉而写出错误的表达式,导致匹配结果不符合预期。此外,在处理一些复杂模式时,我也曾遇到性能问题,需要进一步优化正则表达式的写法以提高运行效率。

针对这些不足,我计划在未来的学习和实践中采取一些改进措施。首先,我将继续加强对正则表达式语法的学习和理解,通过查阅相关资料和文档,不断巩固自己的基础知识。其次,我将积极参与更多的实践项目,通过实际问题的解决来提升自己的应用能力和技巧。同时,我也会注意总结自己在练习过程中的经验和教训,避免犯同样的错误。

除了个人努力外,我也希望能够在课程、作业和实验的组织方面得到更多的指导和建议。我相信,通过老师的悉心指导和同学们的相互帮助,我能够更好地发挥自己的潜力,实现自己的目标。

总之,这三次题目集的练习让我对正则表达式有了更深入的理解和实践,也为我未来的学习和工作奠定了坚实的基础。我将继续努力提高自己的正则表达式应用能力和编程水平,为未来的挑战做好准备。

最后,我还是得感谢一下老师每次都会在最后一天针对最后一道进行提醒,虽然基本都是对主体的总结,没有分的很细,但也算是不小的帮助了,毕竟一道题卡半天的感觉超级难受。

posted @ 2024-04-21 20:19  一只小腊鸡  阅读(24)  评论(0编辑  收藏  举报