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. 麻雀虽小,五脏俱全。这虽然仅是一个为期一周的个人项目,却包含了项目的各个要素。诸如设计,测试等步骤必不可少,否则便会遇到难以预料的问题。

  • 相关阅读:
    CentOS7升级系统内核
    ASP.NET MVC控制器里捕获视图的错误验证信息(ErrorMessage)
    Android Studio小技巧
    ASP.NET 预编译笔记
    EnyimMemcached(64位)使用实例
    SQL Server Profiler小技巧——筛选请求
    [疑难杂症]解决实际开发中各种问题bug
    [整理]EF6.X更新了什么(版本历史中文版)
    史上最全的ASP.NET MVC路由配置,以后RouteConfig再弄不懂神仙都难救你啦~
    微信开发调试小工具进化→微信用户发送信息模拟器发布!——这标题起真是好数码暴龙的说
  • 原文地址:https://www.cnblogs.com/FUduomi/p/4830577.html
Copyright © 2011-2022 走看看