结对项目第二周总结

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

一、需求分析

  • 能够生成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

原文地址:https://www.cnblogs.com/cxd20175303/p/10703248.html