zoukankan      html  css  js  c++  java
  • 个人项目——四则运算题目的随机生成

    任务:实现一个自动生成小学四则运算题目的命令行程序。


    一、时间预估及实际花费时间

    PSP2.1

    Personal Software Process Stages

    Time

    Planning

    计划

     

      · Estimate

      · 估计这个任务需要多少时间

    15h

    Development

    开发

     

      · Analysis

      · 需求分析 (包括学习新技术)

    2h

      · Design Spec

      · 生成设计文档

    0.5h

      · Design Review

      · 设计复审 (和同事审核设计文档)

    0.5h

     · Coding Standard

      · 代码规范 (为目前的开发制定合适的规范)

    1h

      · Design

      · 具体设计

    3h

      · Coding

      · 具体编码

    3h

      · Code Review

      · 代码复审

    1h

      · Test

      · 测试(自我测试,修改代码,提交修改)

    3h

    Reporting

    报告

     

      · Test Report

      · 测试报告

    1h

      · Size Measurement

      · 计算工作量

    1h

      · Postmortem & Process Improvement Plan

      · 事后总结, 并提出过程改进计划

    0.5h

     

    合计

    16.5h


    二、项目分析与设计

      这项任务要求我们能够随机,不重复的生成小学四则运算表达式。在生成的同时能够计算出这些表达式的标准答案,并能对已有的作答文件进行对错判断。

            从项目的需求进行如下分析:

        1.既然是随机生成表达式,必然会用到随机型变量。

        2.对标准答案有需求,所以计算表达式是一个重要的模块。

        3.对错评判涉及到两个文件内容的比较。

        

        由项目需求及分析可作出如下大致的设计方案:

        1.可构造一个表达式类,类中主要有随机生成表达式的方法。

        2.需要一个计算表达式的函数。而中缀表达式通常需要转换为后缀表达式然后再进行计算,这就设计到了两个函数。

        3.项目需要进行文件的读写,每次运行时要检查文件的状态,在进行新的生成时要清空上一次数据。

        使用较多的中缀表达式转后缀表达式函数:

       

      

    public static ArrayList toBehind(string mid)
            {
                ArrayList arr=new ArrayList();
                int top=-1;
                char p=' ';
                char[] a=new char[10];
                int math = 0;
                Boolean sign = false;
                for(int i=0;i<mid.Length;i++)
                {
                    Boolean continuesign = false;
                    p=mid[i];     //取表达式中一个元素
                    while(p>='0'&&p<='9')   //如果是运算数则直接输出
                    {
                        if (sign)
                        {
                            math = math * 10 + (p - '0');
                            continuesign = true;
                            break;
                        }
                        else
                        {
                            math = p - '0';
                            sign = true;
                            continuesign = true;
                            break;
                        }
                    }
                    if (continuesign)
                        continue;
                    if (sign)
                    {
                        arr.Add(math);
                        math = 0;
                        sign = false;
                    }
                    switch(p)
                    {
                        case '#' :
                            while(top>=0)
                                arr.Add(a[top--]);
                            return arr;
                        case ')' :
                            while (a[top]!='(')
                            {
                                arr.Add(a[top]);
                                top--;
                            }
                            top--;  //放弃读到的')',并且栈顶‘(’退栈
                            break;
                        default :
                            if(top==-1)
                            {
                                a[++top]=p;
                                break;
                            }
                            if(Program.adv(a[top],p)==1) // 若当前运算符优先级低则取代栈顶运算符,原运算符出栈
                            {
                                arr.Add(a[top]);
                                a[top]=p;
                            }
                            else   //若当前运算符优先级高于栈顶运算符,进栈
                                a[++top]=p;
                            break;
                        }
                }
                return null;
            }

    三、性能分析图

      为了了解这个程序的性能,使用了VS的性能分析工具,得到了以下两张性能分析图。

      

      

      


    四、测试实例
      

      1/4 ÷ 3/9
      4/7 × 1/3
      2/5 ÷ 4/6
      4 + 8 + 2
      5/6 + 5/8
      (5 × 4) × 1 × 8
      2 × 9 + (4 × 3)
      2/4 + 5/7
      8/9 × 1/3
      3 + (2 × 5)

      在Answers.txt能够准确得出答案:

      

      3/4
      4/21
      3/5
      14
      11/24
      160
      30
      1'3/14
      8/27
      13


    五、个人项目总结

        通过这次个人项目,我学到了很多经验和教训:

    1. 简单的题目往深处去探讨往往并不简单。这次个人项目的生成四则运算表达式看似很简单,实际上蕴含着查重,分数等诸多复杂的问题,需要我们做好充分的设计。
    2. 设计对于一个项目十分重要。以前经常喜欢拿到题目,构思好算法就直接码代码。结果在过程中才发现自己写的代码逻辑不尽人意。
    3. 麻雀虽小,五脏俱全。这虽然仅是一个为期一周的个人项目,却包含了项目的各个要素。诸如设计,测试等步骤必不可少,否则便会遇到难以预料的问题。

  • 相关阅读:
    Binary Search Tree Iterator 解答
    Invert Binary Tree 解答
    Min Stack 解答
    Trapping Raining Water 解答
    Candy 解答
    Jump Game II 解答
    Implement Hash Map Using Primitive Types
    Gas Station 解答
    Bucket Sort
    HashMap 专题
  • 原文地址:https://www.cnblogs.com/FUduomi/p/4830577.html
Copyright © 2011-2022 走看看