首页 > 其他分享 >第一次Blog

第一次Blog

时间:2024-04-21 11:22:05浏览次数:18  
标签:题目 正则表达式 试卷 第一次 Blog getter 判题 方法

  1. 前言
    第一次题目集是对类的设计,类与对象的使用和类与数组关联类的考察。第二次题目集是类与对象之间的创建以及运用的考察。第三次题目集是对类的封装性以及Java自带时间包的运用的考察。总而言之,三次题目集的题目量并不算大,题目集的难度也是比较中等。

  2. 设计与分析

    这是答题判题程序-1中相应类的设计。
    Text是题目类,它包含题号(num)、问题(que)、标准答案(standardAnswer),判断题目是否正确的match()方法和每个私有属性的getter()和setter()方法。
    Paper是试卷类,它包含组成试卷的每道题目的数组(textList)、试卷的题目数量(sum),添加试卷题目的add()方法、判断某道题目是否正确的match()方法以及sum属性的getter()方法和textList的getter()和setter()方法。
    Answer是答卷类,它包含答卷对应的试卷(paper)、答案数组(answerList)、每道题是否正确的判题数组(matchList),获得答案数组和判题数组的list()方法和按要求输出答卷信息的output()方法。


这是答题判题程序-2中相应类的设计。
Text类与第一次Text类的设计是一样的。
新加了一个Database的题库类,用来存储所有的题目。它包含题目数组(textList)、所有的题目数量(sum)。添加题目信息的add()方法、sum属性的getter()方法和textList的getter()和setter()方法。
Paper的试卷类在原有的基础上加入了每道题目的分数所组成的数组(scoreList)、试卷号(n)、总题目数(sum)、试卷的总分值(scoers)。方法中新加入了警示试卷满分不是100分的attention()方法以及新加入属性的getter()和setter()方法,删除了判断某道题目是否正确的match()方法。
Answer的答卷类在原有的基础上加入了答卷对应的试卷号(n)、答案的总数(sum)、整张试卷获得的分数(grades)。方法中加入了获得整张试卷分数的getGrades()方法以及新加入属性的getter()和setter()方法。


这是答题判题程序-3中相应类的设计。
Text类、Database类与Paper类没有变化。
新加入的Student类用来存放学生信息,它包含学生学号(del)、学生姓名(name)。学生学号和姓名的getter()和setter()方法。
Answer的答卷类在原有的基础上加入了答答卷的学生的学号(del)、姓名(mane)、以及最后输出答卷信息的每行结果的数组(resultList)。answerlist()方法是用来获得试卷的答案数组、list()方法则是用来获得判题数组和结果数组、gsetGrades()方法使用来获得整张答卷学生获得的总分。其他方法都是某些基本属性的getter()和setter()方法在答题判题程序-2的基础上删除了一些属性没有必要使用getter()和setter()方法的情况。

  1. 踩坑心得
    基本上将类的设计做好、将类的功能实现,大部分的测试点都能通过,最后调整一下正则表达式就可以了。
    在提交的答题判题程序-1中我获取题目的正则表达式是
    #N:\\s*(\\d+)\\s*#Q:(.*?)\\s*#A:(\\S+)
    而获取答案的正则表达式是
    #A:(\\S+)
    很明显我没有考虑到标准答案与回答的答案之间可能存在空格的情况。所以我将获取题目的正则表达式改为了
    #N:\\s*(\\d+)\\s*#Q:(.*?) #A:(.+)
    用.+的贪婪匹配方法获取标准答案的信息再用trim()方法删除字符串首尾的空格。
    而获取答案的正则表达式改为#A:(.+)#A:(.*?)都是不行的,前者是贪婪匹配当匹配#A:2 #A:4时(.+)会成功匹配2 #A:4;而后者是非贪婪匹配,它会与空字符成功匹配。
    这个时候我们考虑可以用?=来进一步限定字符串所以我将获取答案的正则表达式改为了#A:(.*?)(?=#A:|$)用非贪婪匹配的方式当匹配到字符串最后现#A:$才算匹配成功。
    在答题判题程序-2中的测试点相对没有第一次的严格,所有在提交时我用#N:(\\d+) #Q:(.*?) #A:(\\S+)也成功的通过了测试点。
    答题判题程序-3相比于答题判题程序-2并没有增加很多类,但是增加了许多报错提醒。因为可能有格式上的输入错误所以在正则表达式的前面要加上^、末尾要加上$,防止中间匹配成功而前后加上了错误格式的模式。其次,学生的信息之间是以-结尾的所以正则表达式中要用^#X:(\\w+ [^\\s-]+)?(-\\w+ [^\\s-]+)*$来读取学生学号和姓名。最后,答卷上可能出现空白卷和答案是空字符的情况,所以正则表达式要用^#S:(\\d+) (\\S*)( #A:\\d+-(.+))*,用*来实现可能存在的空白卷和答案是空字符的情况。

  2. 改进建议
    1)对于大部分类的属性我都在eclipse中直接生成了它的getter()和setter()方法,而实际情况中有些属性是不需要的,应该根据实际情况来设计属性的方法。
    2)对于答题判题程序-3中对题目的删除我是直接将题目的问题和标准答案赋为了null

for(int i=0;i<list.size();)
        {
        	Pattern pat=Pattern.compile("^#D:N-(\\d+)$");
            Matcher mat=pat.matcher(list.get(i));
            if(mat.find())
            {
            	for(Text j:database.getTextList())
            	{
            		if(j.getNum()==Integer.parseInt(mat.group(1)))
            		{
            			j.setQue(null);
            			j.setStandardAnswer(null);
            		}
            	}
            	list.remove(i);
            }
            else
            	i++;
        }

但我觉得可以在Text类中加入一个boolean类型的数来判断这道题目是否有被删除,这样可以方便对以后题目的再次使用以及对题目的修改有较大帮助。
3)随着读取信息的增多,main方法中for循环的使用也越来越频繁

for(int i=0;i<list.size();)
        {
            Pattern pat=Pattern.compile("^#N:(\\d+) #Q:(.+) #A:(.+)");
            Matcher mat=pat.matcher(list.get(i));
            if(mat.find())
            {
                database.add(Integer.parseInt(mat.group(1).trim()),mat.group(2).trim(),mat.group(3).trim());
                list.remove(i);
            }
            else
            	i++;
        }
        for(int i=0;i<list.size();)
        {
        	Pattern pat=Pattern.compile("^#D:N-(\\d+)$");
            Matcher mat=pat.matcher(list.get(i));
            if(mat.find())
            {
            	for(Text j:database.getTextList())
            	{
            		if(j.getNum()==Integer.parseInt(mat.group(1)))
            		{
            			j.setQue(null);
            			j.setStandardAnswer(null);
            		}
            	}
            	list.remove(i);
            }
            else
            	i++;
        }
        for(int i=0;i<list.size();)
        {
            Pattern pat=Pattern.compile("^#T:(\\d+)( \\d+-\\d+)*$");
            Matcher mat=pat.matcher(list.get(i));
            if(mat.find())
            {
                Paper paper=new Paper(Integer.parseInt(mat.group(1)));
                Pattern pat1=Pattern.compile("(\\d+)-(\\d+)");
                Matcher mat1=pat1.matcher(list.get(i));
                while(mat1.find())
                {
                    paper.add(Integer.parseInt(mat1.group(1)),Integer.parseInt(mat1.group(2)),database);
                }
                paperList.add(paper);
                list.remove(i);
            }
            else
            	i++;
        }
        for(int i=0;i<list.size();)
        {
        	Pattern pat=Pattern.compile("^#X:(\\w+ [^\\s-]+)?(-\\w+ [^\\s-]+)*$");
            Matcher mat=pat.matcher(list.get(i));
            if(mat.find())
            {
            	Pattern pat1=Pattern.compile("(\\w+) ([^\\s-]+)");
                Matcher mat1=pat1.matcher(list.get(i));
                while(mat1.find())
                {
                	Student student=new Student();
                	student.setStu(mat1.group(1).trim(),mat1.group(2));
                	stulist.add(student);
                }
                list.remove(i);
            }
            else
            	i++;
        }
        for(int i=0;i<list.size();)
        {
            Pattern pat=Pattern.compile("^#S:(\\d+) (\\S*)( #A:\\d+-(.+))*");
            Matcher mat=pat.matcher(list.get(i));
            if(mat.find())
            {
            	Answer answer=new Answer(Integer.parseInt(mat.group(1)),mat.group(2).trim());
                for(Paper j:paperList)
                {
                	if(j.getN()==Integer.parseInt(mat.group(1)))
                	{
                		answer.setPaper(j);
                		break;
                	}
                }
                if(answer.getPaper()==null)
                {
                    text.add("The test paper number does not exist");
                    list.remove(i);
                    continue;
                }
                Pattern pat1=Pattern.compile("#A:(\\d+)-(.*?)(?=#A:|$)");
                Matcher mat1=pat1.matcher(list.get(i));
                while(mat1.find())
                {
                    answer.answerlist(Integer.parseInt(mat1.group(1)),mat1.group(2).trim());
                }
                answerList.add(answer);
                list.remove(i);
            }
            else
            	i++;
        }

其实,以上for循环的内容都大差不差,可以尝试着用一个方法来完成功能,减少main方法中的圈复杂度,使代码更加简洁。

  1. 总结
    三次题目集的难度其实并不大,只是随着类的增加,类的功能、类与类之间的关系变得越来越复杂,容易让人产生思维紊乱。经过三次题目集的训练,受益最多的就是我对于正则表达式的运用,对于正则表达式的好处也越来越深刻。当然,对于类的属性和方法的设计还需要进一步的学习和改进,使得设计更加合理。其次,对于Java自带的日期包的学习和运用还是不是很深刻,还需要进一步的学习和研究。最后,值得一提的就是和同伴们一起讨论,总有些自己过不去的测试点思考了很久还是没有思路,当时经过与同伴们的谈论有时真的能很快找到问题所在,也希望以后能有更多机会能够和同伴们一起讨论学习。

标签:题目,正则表达式,试卷,第一次,Blog,getter,判题,方法
From: https://www.cnblogs.com/-zjm/p/18147693

相关文章

  • 第一次OOPBlog
    PTA也写过了三次作业了,虽然很遗憾都没有拿到满分,不过在练习的过程中也很直观的学到了一点:做题不能因为不会就轻易放弃,要学会钻研。借着这次机会,好好的和之前的自己“算个帐”。首先是第一次作业中:1.涉及到了对象的包装,即面向对象的程序的三大技术之一,如:设计一个风扇类:点击查......
  • PTA三次题目集总结性Blog
    (1)前言1.第一次题目集知识点主要涉及类的设计和实现、构造方法的使用、成员变量和访问器/修改器的定义、方法的重写(toString方法)、对象的创建和调用方法、控制台输入和输出的使用、浮点数的格式化输出等,题量比较适中,难度也比较适中,要求实现的功能较为基础,但需要一定的类设计和方......
  • OOP课程第一次博客
    目录1.前言2.设计与分析1.第一次pta作业2.第二次pta作业3.第三次pta作业3.踩坑心得4.改进建议5.总结1.前言前三次pta题目集的最后一题主要是实现一个模拟小型测试的答题判题程序,第二次题目集在第一次的基础上新增了一个答卷类,第三次题目集在第二次题目集上新增了一个学生类并且......
  • 关于发布题目集1~3的总结性Blog
    前言:这几次关于答题判题程序是通过从键盘中输入提取出对应的信息(比如说题目,试卷,答卷等等)然后再进行逐一判断。从中考查的知识点是正则表达式的运用,加上了split函数的运用,类的数组运用等等。主要的还是这三点。由于一直的迭代,导致最终它的题目要求越来越多,导致难度直线上升。也从8......
  • 题目集1~3的总结性Blog
    一、前言第一次题集知识点主要是掌握类和对象的使用创建,以及类与类之间的关系,还有正则表达式的运用,动态数组ArrayList类的使用,以及方法。这一次的题集难度不是很大,因为是第一次所以来说题量有点大。也是艰难完成了。第二次题集知识点与第一次的类似主要还是对正则表达式的使......
  • blog1
    1前言1.1知识点总结(1)在题目集1里分别有类与对象的使用(包括方法的定义(void方法,int类型返回等等)与属性的定义(例如整形,布尔型的定义等等),如何对类与对象进行引用(使用new创建一个新类,并进行有参构造或无参构造对类里的属性进行赋值))(2)类与类之间的引用,包括方法之间的互相调用(包括一个......
  • blog.admin net8发布二级目录,及图片上传路径处理
    1、发布二级目录,修改以下配置,及对应的二级目录名跟配置的一致 2、图片上传a、修改后台api代码imgController.cspublicasyncTask<MessageModel<string>>InsertPicture([FromForm]UploadFileDtodto){if(dto.file==null||!dto.file.Any())returnFail......
  • memory-cnblog
    linux虚拟内存系统进程的虚拟内存用户区分段:代码段、数据段、堆、共享库、栈内核区:存放进程信息,PID\程序计数器、打开文件列表、task和mm(描述虚拟内存)结构等Linux加载进程时(exec系列系统调用)会为该地址空间每个段分配VMA,VMA数据结构(vm_area_struct)会描述该段的虚拟空间......
  • 4.18第一次冲刺
    晨会1.人员:袁兴兰、齐飞跃、王瑞2.会议讨论袁兴兰:1.今天打算完成寻找免费api,完成博客的整理齐飞跃:1.今天打算学习调用第三方库或第三方api王瑞:1.今天打算画出安卓前端页面2.遇到的问题:调用摄像头报错,版本不兼容3.任务看板 4.合照 ......
  • https://blog.csdn.net/qq_64314976/article/details/125843147
    importjava.awt.FlowLayout;importjava.awt.GridLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.ButtonGroup;importjavax.swing.JButton;importjavax.swing.JCheckBox;importjavax.swing.JComboBox;importjavax.s......