四则运算题目自动生成

 一、程序要求:   

1. 使用 -n 参数控制生成题目的个数,例如

Myapp.exe -n 10 -o Exercise.txt

将生成10个题目。

2. 使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围,例如

Myapp.exe -r 10

将生成10以内(不包括10)的四则运算题目。该参数可以设置为1或其他自然数。该参数必须给定,否则程序报错并给出帮助信息。

3. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。

4. 每道题目中出现的运算符个数不超过3个。

5. 程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。例如,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。

6. 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件,格式如下:

1. 答案1

2. 答案2

特别的,真分数的运算如下例所示:1/6 + 1/8 = 7/24。

7. 程序应能支持一万道题目的生成。

8. 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,并会输出所有题目中重复的题目,输入参数如下:

Myapp.exe -e <exercisefile>.txt -a <answerfile>.txt -o Grade.txt

统计结果输出到文件Grade.txt,格式如下:

Correct: 5 (1, 3, 5, 7, 9)

Wrong: 5 (2, 4, 6, 8, 10)

Repeat:2

RepeatDetail:

(1)   2,45+32  Repeat 3,32+45

(2)   5,3+(2+1)  Repeat 7,1+2+3

解释:

Correct: 5 ----5道题目正确,正确的题号 1,3,5,7,9

Wrong:5 -----5道题目错误,错误的题号 2,4,6,8,10

Repeat:2   2---组题目重复

(1) 第一组 题号2,题目 45+32  与题号3的题目重复,题号3为 32+45

(2)第二组  题号5,题目 3+(2+1) 与题号7的题目重复,题号7为 1+2+3

其中“:”后面的数字5表示对/错的题目的数量,括号内的是对/错题目的编号。为简单起见,假设输入的题目都是按照顺序编号的符合规范的题目。

二、功能分析

我们需要实现的功能模块

1、随机生成运算符的个数和运算符。

2、根据运算符的个数随机生成运算所需的数值。

3、随机组合运算符和数值,生成运算表达式。

4、将3生成的表达式随机插入括号得到新的表达式。

6、使用逆波兰式计算表达式的数值。

7、在计算数值的过程中使用suffix.txt文件保存计算过程。

8、利用7保存的文件suffix.txt检查4生成的表达式是否重复,若没重复,则将计算结果保存到answer.txt和4生成的表达式保存到exercise.txt,若重复,则将该表达式和与之重复的表达式写入grade.txt文件中。

9、将exercise.txt写入的结果和answer.txt的数值表达。若正确,则将该题序号记录正确记录到grade.txt正确题目那一行中。若不正确,则记录到grade.txt错误的那一行中。

三、部分功能实现的思路

1、功能分析中的4的实现思路

由于生成的运算符不用超过三个,简化了这个题目的难度,我使用了分类的思想。

a、先遍历表达式,将运算符出现的位置存入一个数组。

b、判断运算符的个数。

如果运算符为两个的话,括号最多一个。遍历a生成的数组,当运算符是第一个,先随机是否有括号生成,若有括号生成,则左括号在第一个数前面,右括号在第二个数后面。

当运算符是第二个时,先随机是否有括号生成,若有括号生成,则左括号在第二个数的前面,右括号在第三个数的后面。

如果运算符为三个的话,括号最多两个。遍历a生成的数组,但运算符是第一个的时候,随机有多少个括号,如果括号为一个,则左括号在第一个数的的前面。然后随机生成右括号数的位置。

如果右括号在第二位数时,符号移动一位,随机生成该符号是否包含在括号里,若有括号则左括号在第一个数前面,右括号在第三个数后面。如没有括号,运算符移动一位,随机生成该符号是否包含在括号里,

如有括号则左括号插入在第三位数的前面...。

每一次插入括号需要改变保存符号位置数组的值。

通过方法虽然实现了这个功能,但是这个方法缺陷太多。分类讨论太复杂,不能解决更多个符号,这个还需要改进。

2、功能6的实现思路

所需要计算的表达式是化简过后的真分数,真分数前面有自然数,不便于计算。先把所有化简的分数都化为真分数,使用真分数的形式计算。

先将中缀表达式化为后缀表达式。表达式的/运算符号用?代替,避免与真分数的/相同。

后缀表达式计算数值,先实现真分数的运算,可以将真分数拆分成两个数,然后通分就算,计算结果再约分。

运算过程,遍历后缀表达式,如果是真分数先入栈,如果是运算符,出栈两个数,进行对应运算符的真分数运算。

3、功能7的实现思路

因为每个式子的运算过程没记录了下来,并且乘法和加法在记录时,左边的数值大右边的数值小的原则。所有如果式子重复,他们的运算过程会相等。

四、代码实现

代码地址:https://git.coding.net/ThinkAlone/Arithmetic.git

五、功能演示

1、生成10000道程序

2、生成10000道题目的过程中出现的部分重复表达式

虽然生成了10000道程序,但是重复的可能还是很低

3、答案测试

生成的题目,并写了答案

答案:

检查结果:

六、展示PSP

 PSP2.1 Personal Software Process Stages  estimated time(分钟)  Actual time(分)
 Planning  计划  20  23
 · Estimate  估计这个任务需要多少时间 20 23
 Development  开发  990  1106
 · Analysis  需求分析 (包括学习新技术)  40  40
 · Design Spec  生成设计文档  60  50
 · Design Review  设计复审  60  73
 · Coding Standard  代码规范  30  33
 · Design  具体设计 120  130
 · Coding  具体编码  600  700
 · Code Review  代码复审  60  50
 · Test  测试(自我测试,修改代码,提交修改)  20  30
 Reporting  报告  60  70
 ·  测试报告  30  30
 ·  计算工作量  20  30
 ·  并提出过程改进计划  10  10
       

七、总结

由于之前比较少用C++写代码,该题目用了面向过程编程,但是模块划分不是很好,有些模块还是比较乱。这个题目涵盖的知识点比较多,之前学的数据结构和算法忘了,所有耗时比较多。

之前一直写javaWeb程序,比这种题目逻辑简单很多,这个题目做的少。以后要多做一些关于这方面的题目,提高自己的逻辑思维。

时间: 2024-11-08 05:35:16

四则运算题目自动生成的相关文章

四则运算题目自动生成程序

四则运算表达式生成器 目录 一.github地址 二.PSP表格(预期) 三.性能测试 四.设计实现过程 五.关键代码 六.功能测试 七.PSP表格(完成) 八.总结 一.github地址 https://github.com/HTwo2O/ArithmeticCalculator 项目参与者: 罗泉水 3118005101 陈鸿畅 3118005087 二.PSP表格(预期) PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) P

程序实现自动生成30道四则运算题目

课堂上老师要求我们做这样一个题目,题目要求是自动生成30道四则运算题目,要求除整数加减乘除外,还有真分数加减乘除.刚开始听到这个题目一头雾水,有点复杂,但仔细拆分这个题目不难发现,这个题目可以简化成三个小问题,分别是随机数自动生成两个数,自动生成符号,还有输出结果.对于随机数自动生成两个数可以简化为随机数生成整数,随机数生成真分数,生成真分数可以简化到随机数生成分子和分母.对于自动生成符号,也可以简化为随机数生成1,2,3,4,分别代表+,—,*,/,输出结果可以用一个for循化,实现输出30道

自动生成四则运算题目程序

这个代码由自己编写的,采用的是面向过程的思想,主要实现了一些简单的四则运算的自动生成,题目中的数字都限制在100以内,答案有可能超出100.如果题目中出现除法,则需要保留2位小数点,并且不能够四舍五入,否则会显示错误.答题时,答对一题的一分,答错一题不得分也不扣分.每答一题便会显示分数,在做完所有的题目时会计算出总分数和正确率.此程序所生成的四则运算不是很全面,且实现过程比较简单.查看源代码网址https://github.com/xiongxin1/add/blob/master/MSEwor

关于四则运算题目生成项目

PSP2.1 Personal Software Process Stages Time Planning 计划     · Estimate · 估计这个任务需要多少时间 30 Development 开发    · Analysis  · 需求分析 (包括学习新技术) 1  · Design Spec  · 生成设计文档 1   · Design Review  · 设计复审 (和同事审核设计文档) 1   · Coding Standard  · 代码规范 (为目前的开发制定合适的规范)

软件工程关于自动生成四则运算题目程序的见解

1.需求分析 一个程序员在编写程序前第一件事就是要知道我要编写的程序是要干什么的,它要那些功能. 题目中要求一个能自动生成小学四则运算题目的程序,分析起来很简单,做起来也很简单. 2.实施 由于是小学四则运算题目 我们设定数字的大小不超过100,运算符号为+ - * /,而这一切要随机生成,不难想到要用到随机函数.首先使用SRAND函数设定随机数种子srand((unsigned)time(NULL)) ,再使用RAND函数控制随机生成我们想要的0-100的数字,至于如何生成加减乘除符号,我们可

自动生成四则运算题目

主要功能:随机生成四则运算题目 设计思想:先通过一个简单的四则运算,再不断完善 源代码 #include"stdio.h" main(){ int a,b,c,d; printf("自动生成四则运算:\n"); printf("%d+%d= \n",a,b); printf("%d-%d= \n",a,b); printf("%d*%d= \n",a,b); printf("%d/%d= \n&q

能自动生成小学四则运算题目的程序

题目要求 能自动生成小学四则运算题目 除了整数外,还要支持真分数的四则运算 支持多个运算符,也就是混合运算 程序支持判断对错,累计分数并倒计时 分析 分为几个函数功能模块:int getChoice() :    功能:用户选择功能 void showMenu():  功能:显示功能的菜单 void doExercise(int n):  功能:计分器 int test(int n);    功能:进行一道题的测试过程 int main();  主函数 源代码转载于李思雨,博客链接:http:/

自动生成小学四则运算题目的程序心得

#include<stdio.h>#include<math.h>#include<windows.h>int right=0;int wrong=0;void add(){int a,b,c;a=rand()%100;b=rand()%100;printf("请回答:\n\t\t %d + %d = ",a,b);scanf("%d",c);if(a+b==c){printf("回答正确!\n");right

个人项目:自动生成四则运算题目总结

题目:写一个能自动生成小学四则运算题目程序 要求: 除了整数以外,还要支持真分数的四则运算 让程序能接受用户输入答案,并判断对错 对于求解四则运算的算法,在数据结构课程上有过相同的题目,但是当时我们需要做的求一个给定的四则运算题目的结果.根据逆波兰表达式将中缀式转换成后缀表达式再利用栈结构求解.这次的任务难点确在于随机生成四则运算题目.刚开始的想法太low了,根据常规表达式的结构随机生成一个数,一个运算符,再一个数……但是往深了想,这种方法很难实现,因为一个表达式不仅仅有操作数和+ - * /