• 结对项目第二周总结


    结对项目——四则运算总结

    一、需求分析

    • 能够生成n道四则运算题,n可由使用者输入来控制
    • 支持整数
    • 支持分数
    • 生成题目中含有括号
    • 可以判断正误,如果错误会输出正确答案
    • 统计正确率
    • 支持多种语言(简体中文,繁體中文,English)
    • 处理生成题目并输出到文件,完成题目后从文件读入并判题。

    二、设计思路

    在第一周的基础上,主要是添加对文件的操作,以及生成语言包。对文件的操作,主要是创建第一个文件,然后用原先的程序生成题目写入到文件中,在文件中写入答案后,用StringTokenizer判断文件中的答案,将文件中的答案与程序运算出来的结果对比,输出正确或错误,最后输出正确率。

    三、实现过程中的关键代码解释:

    主函数,包括对文件的操作以及对语言包的调用

    import java.util.*;
    import java.io.*;
    import java.lang.*;
    import static java.lang.System.out;
    public class Main {
        public static void main(String[] args) throws IOException {
    
            StringTokenizer tokenizer1 = null, tokenizer2 = null;//创建`StringTokenizer`对象作分隔标记
            String token1, token2, token3, token4;
            String s1 = null;
            String str;
            int rightnum = 0, count = 0;
            float rate;
            int n,q = 0,choose;
            String expr;
    
            CreateQuestion creque = new CreateQuestion();
            PrintStream ps = new PrintStream("Exercises.txt");     //创建`Exercises.txt`
            Calculation cal = new Calculation();//创建一个Calculation的对象cal
            ChangeSuffix cs = new ChangeSuffix();//创建一个ChangeSuffix的对象cs
            FileInputStream fis = new FileInputStream("Exercises.txt");//创建指向`Exercises.txt`文件的输入流
            InputStreamReader isr = new InputStreamReader(fis);     //将isr定义为fis的上转型对象
            BufferedReader in = new BufferedReader(isr);      //创建BufferedReader流读取文本行
            Scanner scan = new Scanner(System.in);
            CreateQuestion cq = new CreateQuestion();
            System.out.println("输入0为中文版~~~Input 1 is English version~~~輸入2為簡體中文");//选择语言
            choose = scan.nextInt();//choose的数值对应不同的语言
            Locale locale;
            ResourceBundle res = null;
            switch (choose){
                case 0:
                    locale=new Locale("zh","CN");
                    res= ResourceBundle.getBundle("message",locale);
                    break;
                case 1:
                    locale=new Locale("en","US");
                    res= ResourceBundle.getBundle("message",locale);
                    break;
                case 2:
                    locale=new Locale("ft","CN");
                    res= ResourceBundle.getBundle("message",locale);
                    break;
                default:System.out.println("选择错误!~~~Wrong Choose!~~~選擇錯誤 !");
                    System.exit(0);
            }
    
            while(true)
    
            {
                System.out.print(res.getString("b"));
                n = scan.nextInt();
                System.out.println(" ");
                if (n > 0) {
                    for (int i = 0; i < n; i++) {
                        //生成题目
                        int a;
                        a = i + 1;
                        expr = cq.getQuestion();
                        String s = res.getString("c") + a + ":" + expr + " =";
                        System.out.println(s);
                        ps.println(s);
                    }
                    ps.close();
                    break;
                } else {
                    System.out.println(res.getString("d"));
                }
            }
            Process p=null;
            try {
                p=Runtime.getRuntime().exec("notepad.exe Exercises.txt");
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(res.getString("e"));
            String dd = scan.next();
            if(dd.equals("Y")) {
                PrintStream ps2 = new PrintStream("ExercisesResult.txt");//创建`ExercisesResult.txt`
    
                while ((str = in.readLine()) != null) { //从`Exercises.txt`文件中读入文本行,文件中每个题目都是一行,且形式都为“题目n:表达式 =答案”。
                    tokenizer1 = new StringTokenizer(str, ":");//以":"作为分隔标记
                    token1 = tokenizer1.nextToken();//将":"前的内容赋给token1(“题目n”)
                    token2 = tokenizer1.nextToken();//将":"后的内容赋给token2(“表达式 =答案”)
                    tokenizer2 = new StringTokenizer(token2, "=");//以"="作为分隔标记
                    token3 = tokenizer2.nextToken();//将"="前的内容赋给token3(“表达式”)
                    token4 = tokenizer2.nextToken();//将"="后的内容赋给token4(“答案”)
                    //cs.toSuffix(token3);//将token3转化为后缀表达式
                    if (token4.equals(cal.evaluate(cs.toSuffix(token3)))) {//判断输入答案是否等于计算结果
                        s1 = res.getString("f");
                        rightnum++;
                    } else {
                        s1 = res.getString("g") + cal.evaluate(cs.toSuffix(token3));
                    }
                    String s2 = str + "
    " + s1;
                    System.out.println(s2);
                    ps2.println(s2);//将题目及判断结果写入到`ExercisesResult.txt`文件中
                    count++;
                }
    
                rate = (float) rightnum / count * 100;
                String s3 = (res.getString("h") + count + res.getString("i") + rate + "%");//计算题目数目及正确率,将正确率转化为百分数。
                System.out.println(s3);
                ps2.println(s3);
            }
            else System.out.println(res.getString("j"));
        }
    }

    四、测试方法

    在第一周的基础上  感觉已经没有啥能测试的了。

    五、运行结果截图

    选择语言,并输入要生成的题目数后,将会自动生成文件夹,并在文件夹里面显示题目:

    在文件里输入答案并保存后,输入Y继续,程序会自动读取文件中的答案并判题。显示正确与否,正确率:

    六、代码托管

    七、遇到的问题及解决办法

    问题1:查重

    问题1解决办法:放弃

    问题2:题目的意思是如何对文件进行操作的不太理解,因为放假第十章学的一般,有些文件操作还不熟悉

    问题2解决办法:参考学长的代码,也是一种学习

    问题3:怎么可以支持多种语言呢,难道if(xx)用中文,else if(xx)用英文,else用繁体中文吗

    问题3解决办法:在网上找方法,参考学长的代码,生成properties配置文件

    八、对结对的小伙伴做出评价

    相对于上周,我认为我们的合作方式是有进步的,不像上次那样让他忙活太多东西,这次我也搜了很多资料,做了很多东西,而且这次有不少东西是我们一起做的,有点那种一个驾驶员,一个领航员的意思。有时候,两个人是在一起做一件事,而不是分工做完一件事,这样合作会很好,也没有啥分歧。

    九、PSP图:

    PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
    Planning 计划    
    ·Estimate · 估计这个任务需要多少时间 5 10
    Development 开发    
    ·Anlaysis · 需求分析 (包括学习新技术) 2 2
    ·Design Spec · 生成设计文档 5 5
    ·Design Review · 设计复审 (和同事审核设计文档) 3 3
    ·Coding Standard · 代码规范 (为目前的开发制定合适的规范) 5 5
    ·Design · 具体设计 20 20
    ·Coding · 具体编码 120 100
    · Code Review · 代码复审 10 10
    · Test · 测试(自我测试,修改代码,提交修改) 5 10
    Reporting 报告    
    · Test Report · 测试报告 15 15
    · Size Measurement · 计算工作量 15 15
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 10 10
      合计 220

    205

  • 相关阅读:
    bzoj 2001 CITY 城市建设 cdq分治
    CodeChef
    CodeForces 293E Close Vertices 点分治
    CodeForces 161D Distance in Tree 树上点分治
    POJ-2104 K-th Number CDQ分治
    CodeForces 669 E Little Artem and Time Machine CDQ分治
    BZOJ 1935 园丁的烦恼
    关于dijkstra的优化 及 多源最短路
    nyoj1000_快速幂_费马小定理
    Common Knowledge_快速幂
  • 原文地址:https://www.cnblogs.com/cxd20175303/p/10703248.html
Copyright © 2020-2023  润新知