您的位置:首页 > 其它

个人项目——四则运算题目的随机生成

2015-09-22 21:36 309 查看
任务:实现一个自动生成小学四则运算题目的命令行程序。

[b]一、时间预估及实际花费时间[/b]

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

[b]二、项目分析与设计[/b]

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

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

   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;
}


[b]三、性能分析图[/b]

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

[b]  [/b]

[b]  

[/b]

[b]  

[/b]

[b]四、测试实例[/b]
  
  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

[b]五、个人项目总结[/b]

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

简单的题目往深处去探讨往往并不简单。这次个人项目的生成四则运算表达式看似很简单,实际上蕴含着查重,分数等诸多复杂的问题,需要我们做好充分的设计。

设计对于一个项目十分重要。以前经常喜欢拿到题目,构思好算法就直接码代码。结果在过程中才发现自己写的代码逻辑不尽人意。

麻雀虽小,五脏俱全。这虽然仅是一个为期一周的个人项目,却包含了项目的各个要素。诸如设计,测试等步骤必不可少,否则便会遇到难以预料的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: