实现一个自动生成小学四则运算题目的命令行程序(java实现)
Github项目地址:https://github.com/xiaobaot/wordcount/tree/master/sizeyusuan
团队成员:谢家明(代码生成) 谢竣(测试完善)
项目需求:
1. 使用 -n 参数控制生成题目的个数,例如
Myapp.exe -n 10
将生成10个题目。
2. 使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围,例如
Myapp.exe -r 10
将生成10以内(不包括10)的四则运算题目。该参数可以设置为1或其他自然数。该参数必须给定,否则程序报错并给出帮助信息。
3. 生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1 − e2的子表达式,那么e1 ≥ e2。
4. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。
5. 每道题目中出现的运算符个数不超过3个。
6. 程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8 × 6 = 也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。
生成的题目存入执行程序的当前目录下的Exercises.txt文件,格式如下:
1. 四则运算题目1
2. 四则运算题目2
……
其中真分数在输入输出时采用如下格式,真分数五分之三表示为3/5,真分数二又八分之三表示为2’3/8。
7. 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件,格式如下:
1. 答案1
2. 答案2
特别的,真分数的运算如下例所示:1/6 + 1/8 = 7/24。
8. 程序应能支持一万道题目的生成。
9. 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,输入参数如下:
Myapp.exe -e <exercisefile>.txt -a <answerfile>.txt
统计结果输出到文件Grade.txt,格式如下:
Correct: 5 (1, 3, 5, 7, 9)
Wrong: 5 (2, 4, 6, 8, 10)
其中“:”后面的数字5表示对/错的题目的数量,括号内的是对/错题目的编号。为简单起见,假设输入的题目都是按照顺序编号的符合规范的题目。
PSP开发耗时
|
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
|
Planning |
计划 |
60 |
100 |
|
· Estimate |
· 估计这个任务需要多少时间 |
100 |
120 |
|
Development |
开发 |
600 |
660 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
120 |
150 |
|
· Design Spec |
· 生成设计文档 |
40 |
50 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
50 |
60 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
40 |
40 |
|
· Design |
· 具体设计 |
60 |
60 |
|
· Coding |
· 具体编码 |
120 |
120 |
|
· Code Review |
· 代码复审 |
60 |
90 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 |
60 |
|
Reporting |
报告 |
90 |
90 |
|
· Test Report |
· 测试报告 |
60 |
60 |
|
· Size Measurement |
· 计算工作量 |
30 |
30 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
|
合计 |
1520 |
1720 |
设计思路
1.我们首先想到的是整数化分数的运算,再对分子分母进行化简,我们试图生成两个分子和两个分母(分母至少一个为零时则全置为1,从而达到生成整数而用分数去运算的效果)来实现让整数和分数的计算可以同步。
2.对分数(不论是结果还是题目)进行判断,是假分数则化为带分数的形式,是真分数保持不变。
3.通过对不同文件的操作输出题目,答案以及统计答题者情况。
4.程序需求中的查重功能没有实现。
具体代码实现
main函数部分代码:
public static void main(String[] args){
Scanner sc= new Scanner(System.in);
System.out.println("请输入产生几以内的数字:");
range=sc.nextInt();
System.out.println("请输入产生多少个运算表达式:");
int num=sc.nextInt();
int rightcount[]=new int[num+];
int wrongcount[]=new int[num+];
int right1=;
int wrong1=;
String[] results=new String[num];int i;
for( i=;i<num;i++){
/*具体的功能如下面的代码(两个class除外)*/
}
生成题目:
String expArr[]=new String[];//定义生成的题目
int a= (int) (random.nextInt(range));//分子
int b= (int) (random.nextInt(range));//分母
int c= (int) (random.nextInt(range));//另一个分子
int d= (int) (random.nextInt(range));//另一个分母
int fuhao;//运算符
fuhao= (int) (random.nextInt());
if(b!=&&d!=) {//分母均不为0时生成带有分数的计算题,同时计算结果
if(fuhao==) {
int fenzi=a*d+b*c;
int fenmu=b*d;
expArr[]=biaodashi(a,b)+'+'+biaodashi(c,d)+'=';
System.out.println(expArr[]);
results[i]=reductionofFraction(fenzi, fenmu); }
if(fuhao==&&a*d-b*c>=) {
int fenzi=a*d-b*c;
int fenmu=b*d;
expArr[]=biaodashi(a,b)+'-'+biaodashi(c,d)+'=';
System.out.println(expArr[]);
results[i]=reductionofFraction(fenzi, fenmu); }
if(fuhao==&&a*d-b*c<) {
int fenzi=b*c-a*d;
int fenmu=b*d;
expArr[]=biaodashi(a,b)+'-'+biaodashi(c,d)+'=';
System.out.println(expArr[]);
results[i]=reductionofFraction(fenzi, fenmu); }
if(fuhao==) {
int fenzi=a*c;
int fenmu=b*d;
expArr[]=biaodashi(a,b)+'×'+biaodashi(c,d)+'=';
System.out.println(expArr[]);
results[i]=reductionofFraction(fenzi, fenmu); }
if(fuhao==&&c!=) {
int fenzi=a*d;
int fenmu=b*c;
expArr[]=biaodashi(a,b)+'÷'+biaodashi(c,d)+'=';
System.out.println(expArr[]);
results[i]=reductionofFraction(fenzi, fenmu); }
if(fuhao==&&c==) {
break;
/*c=1;
int fenzi=a*d;
int fenmu=b*c;
expArr[0]=biaodashi(a,b)+'÷'+biaodashi(c,d)+'=';
System.out.println(expArr[0]);
results[i]=reductionofFraction(fenzi, fenmu);*/ } }
else {//分母至少一个为0时生成只含有整式的运算式,同时计算结果
b=; d=;
if(fuhao==) {
int fenzi=a*d+b*c;
int fenmu=b*d;
expArr[]=a+"+"+c+"=";
System.out.println(expArr[]);
results[i]=reductionofFraction(fenzi, fenmu);//计算结果 }
if(fuhao==&&a*d-b*c>=) {
int fenzi=a*d-b*c;
int fenmu=b*d;
expArr[]=a+"-"+c+"=";
System.out.println(expArr[]);
results[i]=reductionofFraction(fenzi, fenmu);//计算结果 }
if(fuhao==&&a*d-b*c<) {
int fenzi=b*c-a*d;
int fenmu=b*d;
expArr[]=c+"-"+a+"=";
System.out.println(expArr[]);
results[i]=reductionofFraction(fenzi, fenmu);//计算结果 }
if(fuhao==) {
int fenzi=a*c;
int fenmu=b*d;
expArr[]=c+"×"+a+"=";
System.out.println(expArr[]);
results[i]=reductionofFraction(fenzi, fenmu);//计算结果 }
if(fuhao==&&c!=) {
int fenzi=a*d;
int fenmu=b*c;
expArr[]=a+"÷"+c+"=";
System.out.println(expArr[]);
results[i]=reductionofFraction(fenzi, fenmu);//计算结果 }
if(fuhao==&&c==) {
break;//排除分母为零的情况
/*c=1;
int fenzi=a*d;
int fenmu=b*c;
expArr[0]=a+"÷"+c+"=";
System.out.println(expArr[0]);
results[i]=reductionofFraction(fenzi, fenmu);*/ }
对分数的处理:
public static String reductionofFraction(int a, int b) {// 结果的分数约分,用于计算结果
int y = ;
for (int i = a; i >= ; i--) {
if (a % i == && b % i == ) {
y = i;
break;
}
}
int z = a / y;// 分子
int m = b / y;// 分母
if (z == ) {
return "";
}
if(m==) return z+"";
else return biaodashi(z,m);
}
public static String biaodashi(int a,int b) {//判断假分数,并化假分数为带分数
if(a>=b) {
int c;
c=a/b;
int d;
d=a%b;
{if(d==) {return c+"";}
return c+"'"+d+"/"+b;}
}return a+"/"+b;
}
生成题目文件及答案文件:
FileWriter fw = null;
try { File f=new File("Exersies.txt");//题目写入
fw = new FileWriter(f, true);
} catch (IOException e) {
e.printStackTrace();
}if(expArr[]!=null) {
PrintWriter pw = new PrintWriter(fw);
pw.println(i++"."+expArr[]);
pw.flush();
try {
fw.flush();
pw.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}}FileWriter fn = null;
try { File f=new File("Answer.txt");//答案写入
fn = new FileWriter(f, true);
} catch (IOException e) {
e.printStackTrace();
}if(expArr[]!=null) {
PrintWriter pn = new PrintWriter(fn);
pn.println(i++"."+results[i]);
pn.flush();
try {
fn.flush();
pn.close();
fn.close();
} catch (IOException e) {
e.printStackTrace();
}}
统计并输出答题者的情况:
System.out.println("输入ok提交!");//答题完成后输入ok即可提交
Scanner sc1=new Scanner(System.in);
String submit=sc1.nextLine();
if(submit.equals("ok")){
String array[]=new String[num];
try
{ int k=;
FileReader fr = new FileReader("H://eclipse2//eclipse3//sizeyusuan//Your_answers.txt");
BufferedReader br = new BufferedReader(fr);
String s ;
while((s = br.readLine())!=null) {//读取小学生的答案
array[k]=s; k++;
}br.close();
fr.close();
}catch(IOException e){
System.out.println("指定文件不存在");
}
for(int j=;j<num;j++){
if(array[j].equals(results[j])) {//验证答案,统计正确和错误的个数
rightcount[j]=j+;
right1++;
}
else {
wrongcount[j]=j+;
wrong1++;
}
}
FileWriter fg = null;
try {
//反馈正确与错误题目的信息
File f=new File("Grade.txt");
fg = new FileWriter(f, true);
} catch (IOException e) {
e.printStackTrace();
}
PrintWriter pg = new PrintWriter(fg);
pg.println(" ");
pg.print("Correct:"+right1+"(");
for (int j = ; j <= num; j++) {
if (rightcount[j] != ) {
pg.print(rightcount[j] + ",");
}
}
pg.println(")");
pg.print("Wrong:"+wrong1+"(");
for (int j = ; j <= num; j++) {
if (wrongcount[j] != ) {
pg.print(wrongcount[j] + ",");
}
}
pg.print(")");
pg.flush();
try {
fg.flush();
pg.close();
fg.close();
} catch (IOException e) {
e.printStackTrace();
}}
测试运行
题目文件

答案文件

答题者答案文件

校对文件

项目小结
1.每道题目中出现的运算符个数我们只实现了单个运算符,当我们后来试图扩展多个运算符的时候发现时间不够了,因此只能上交较为简单的版本。
2.查重功能以我们的算法和我们的能力感觉实现有难度,所以并不在我们的计划中。
3.遇到的困难主要是数组越界,通过严谨的检查以及步步验证的方式找出了错误并解决了。另一个须待解决的问题是生成题目的速度有些缓慢,因此完善了多次的算法来提高代码的执行效率。
4.总的来说,在结对编程中我们有各自的想法,通过代码的形式来进行人与人之间的交流不失为一种好的方法,在这个过程中我们培养了团队协作的能力和与他人交际的能力,同时也促使自身的编程能力不断提高,这使我们都受益匪浅。当然如果还有机会的话,我还是希望可以实现带括号的运算式的生成以及答案的计算。
实现一个自动生成小学四则运算题目的命令行程序(java实现)的更多相关文章
- myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)
1.Github项目地址 https://github.com/baiyexing/myapp.git 2.功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 功能(已全部实现) 使用 -n ...
- 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序
1. 编写一个能自动生成小学四则运算题目的程序.(10分) 基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图. 本题发一篇随笔,内容包括: 题 ...
- Individual Project "写一个能自动生成小学四则运算题目的程序"
一.题目简介 写一个能自动生成小学四则运算题目的程序. 初步拟定要实现的功能后,估计一下自己需要花多长时间.编程过程中记录自己实际用了多长时间. 然后和同学们比较一下各自程序的功能.实现方法的异同等等 ...
- Python实现自动生成小学四则运算题目
Github地址: https://github.com/guoyuyi/gyy.github.io/blob/%E4%BD%9C%E4%B8%9A1/zy1.py 题目描述: 通过python语言编 ...
- C语言:一个能自动生成小学四则运算题目的程序
完成这个程序,半个小时内完成了,这个程序,可以自动生成小学简易的四则运算,提供菜单让用户选择,然后判断加减乘除,判断答对答错的题目个数,用户同时也可以重新选择继续答题或重新选择或退出程序. 源程序: ...
- python实现自动生成小学四则运算题目(软工第二次项目作业)
前言 软件工程 传送带 作业要求 传送带 作业目标 结对编程:代码实现.性能分析.异常处理说明.记录PSP表格 代码见: github 个人信息:朱育清 3118005437 信安二班 我的partn ...
- java实现自动生成小学四则运算——朱庭震,詹祺豪
组员:朱庭震,詹祺豪 Github地址:https://github.com/ztz1998/second/tree/master 1题目:实现一个自动生成小学四则运算题目的命令行程序. 2说明: 自 ...
- 使用MFC做一个简单的‘能自动生成小学生四则运算的软件’
这是软件工程的第一次作业!但由于我们python还没入门,所以这次的要求是‘语言不限’. 小学期做过一个关于MFC的‘资金管理系统’,也正好可以有界面,所以就选择了自己很熟悉的MFC来做这个作业! 1 ...
- 用命令行编译java并生成可执行的jar包
用命令行编译java并生成可执行的jar包 1.编写源代码. 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: ...
随机推荐
- win32之取画刷的方法
取画刷(HBRUSH) 的六种方法2009-- :00HBRUSH hbr; 第一种: hbr= CreateSolidBrush(RGB(,,)); //单色的画刷 第二种: hbr= (HBRUS ...
- 使用Crypto++库的CBC模式实现加密(二)
前面已经有一篇介绍使用Crypto++库实现的加密的文章了,但是代码中考虑的不完全,所以就重新发了个二 C++封装: #include "zyaes.h" #include < ...
- FreeRTOS官方翻译文档——第二章 队列管理
2.1 概览基于 FreeRTOS 的应用程序由一组独立的任务构成——每个任务都是具有独立权限的小程序.这些独立的任务之间很可能会通过相互通信以提供有用的系统功能.FreeRTOS 中所有的通信与同步 ...
- oracle 命令 登录
1.打开终端,输入命令:sqlplus /nolog 2.连接数据库:conn user_name/passwd@db_name
- Genymotion常见问题整合与解决方案(转)
常见问题1:Genymotion在开启模拟器时卡在了starting virtual device(注意只有tarting virtual device窗口,没有模拟器的黑屏窗口) 原因:Vir ...
- node.js在2018年能继续火起来吗?我们来看看node.js的待遇情况
你知道node.js是怎么火起来的吗?你知道node.js现在的平均工资是多少吗?你知道node.js在2018年还能继续火吗?都不知道?那就来看文章吧,多学点node.js,说不定以后的你工资就会高 ...
- KMP算法完整教程 (下)
下面我们用数学归纳法来解决这个填值的问题. 这里我们借鉴数学归纳法的三个步骤(或者说是动态规划?): 1.初始状态 2.假设第j位以及第j位之前的我们都填完了 3.推论第j+1位该怎么填 初始状态我们 ...
- PostgreSQL入门指南
默认端口:5432 创建用户与数据库 PostgreSQL初次安装后,默认会生成一个名为postgres的数据库和一个名为postgres的数据库用户.这里需要注意的是,同时还生成了一个名为postg ...
- thinkphp中phpexcel的使用
1.下载phpexcel文件(之前提到过!) 2.下载后将文件放到: 3.在控制器中引用: 4.部分实现的代码: public function OutputExcel($data) //导入订单 { ...
- css 五角星 (转)
1.前言 之前做的好几个项目中,都会遇到打分,评分,点赞这样的需求,写了很多次,每次需要再写的时候,就会翻出之前写过的代码,然后copy过来.总觉得这样的话没有进步,没有把知识放进脑袋里,所以,自己花 ...