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

  题目:写一个能自动生成小学四则运算题目程序

  要求:

  • 除了整数以外,还要支持真分数的四则运算
  • 让程序能接受用户输入答案,并判断对错

  对于求解四则运算的算法,在数据结构课程上有过相同的题目,但是当时我们需要做的求一个给定的四则运算题目的结果。根据逆波兰表达式将中缀式转换成后缀表达式再利用栈结构求解。这次的任务难点确在于随机生成四则运算题目。刚开始的想法太low了,根据常规表达式的结构随机生成一个数,一个运算符,再一个数……但是往深了想,这种方法很难实现,因为一个表达式不仅仅有操作数和+ - * / 运算符,还有括号这个最高优先级的运算符,往一个随机生成的操作数和四个运算符组成的符号流中添括号,想想好复杂。所以采用了二叉树结构,非终结点为运算符,叶子结点为操作数,形如:a+b,a*(b+c),(a-b)*c/d可以表示为:

这种结构抽象为:

很自然就能想到递归结构,接下来就是具体实现地过程了。

先定义表达式结点类Experssion:常规属性为父节点指针Parent,左子结点指针Left,右子结点指针Right,还包括表达式结果Result,当前运算符oper,是否为左节点标志isLeft(为了后来添加括号而定义)。

其中,为了支持分数运算,我后来又定义一个Value类,私有数据为分子,分母(int numer,int demon),这样可以将整数统一看成分母为1的分数进行运算。类中成员函数包括的当然就是加减乘除和比较运算符的重载函数了,但是题目要求将分数显示为最简真分数的形式,所以又定义了约分函数Gcd。不过在实现开始阶段,我将数据类型就用整型代替了,这样比较方便。

生成一个表达式可以分成三步:创建表达式框架,根据生成的框架填充表达式和为表达式添加括号。

1)创建表达式框架:Void CreateEx(int NumOfOper)

  其中, NumOfOper表示为即将生成的表达式中的运算符个数,这决定了表达式的基本框架。

整个二叉树的根节点是一个非终结点,表示的是一个运算符,当然这个运算符是随机生成的。接下来就是为根节点的左子结点和右子结点分配运算符个数了

1         int NumOfLeftOper = rand() % NumOfOper;
2         int NumOfRightOper = NumOfOper - NumOfLeftOper-1;
3         left->CreateEx(NumOfLeftOper);
4         right->CreateEx(NumOfRightOper);

递归生成左子式和右子式,直到运算符个数分配完,基本框架也就形成了。

2)根据生成的框架填充表达式:Value FillExFrame(int MaxNum)

  其中,MaxNum表示的是题目要求的表达式中操作数的最大值。

采用的也是递归求解。

		LResult = left->FillExFrame(MaxNum);
		RResult = right->FillExFrame(MaxNum);

  递归深入到叶子结点时,随机生成操作数。但是其中有很多细节问题需要注意,题目要求有:生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1 − e2的子表达式,那么e1 ≥ e2。生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。这也就说操作数的随机生成也是有限制的。根据运算符的不同,LResult和RResult要分情况讨论(其中,LResult和RResult表示左子表达式结果和右子表达式结果)。当oper为 ‘-‘ 时,LResult>=RResult。当oper为 ‘÷‘ 时,RResult != 0 && LResult <= RResult。但是根据运行程序,叶子结点在最底层被生成,这两个叶子结点只能符合直系父节点运算符的要求,在父节点中根据这两个叶子结点和运算符计算出来的结果并不一定能符合更上一层结点运算符的要求,在这种情况下该怎么办呢?我在这里偷了点懒,当发生oper为 ‘-’ 号,但是LResult < RResult时,就将这个运算符变成 ‘÷’ 号。当oper为 ‘÷‘ 号,RResult == 0 或LResult > RResult 时,就将oper变成 ‘-‘ 号,这样就不用考虑其他的问题了(⊙﹏⊙b汗)

到这里,框架也填充完整了。

3)为表达式添加括号

  这就要考虑运算符和括号之间优先级了,一开始定义的isLeft就是这时候用的,子表达式是当前左子结点时,同级运算符并不需要加括号的(同级运算符先算左边)。当子表达式是当前右子节点时,同级运算符就需要加括号了,也就这点区别,其他的情况当然是低优先级就加括号了。

基本上,表达式类就形成了,把表达式中操作数的数据类型变成已经定义的Value类,就基本完成了整个程序。

后来,我有把这个程序添加了图形界面,用的是MFC,就是一个简单的列表控件显示表达式,这个控件就是上一篇博客中的可编辑列表框。运行结果如下图:

时间: 2024-10-14 12:43:09

个人项目:自动生成四则运算题目总结的相关文章

用不同语言实现自动生成四则运算题目

Github项目地址:https://github.com/Aiyaxc/zuoye- 题目:用不同语言实现自动生成四则运算题目的命令行程序. (1)题目要求: a.  能自动生成小学四则运算题目(注意是给小学生用的,要是结果出现负数的话他们会迷茫的!) b. 除了整数外,还要支持真分数的四则运算  (2)思路: a.四则运算加减乘除,采用两个随机数,由于不能出现负数,所以在对两个随机数进行减法运算的时候,需要进行比较大小,而除法在运算中,除数不能取0. b.  进行真分数运算应注意假分数的影响

自动生成四则运算题目

主要功能:随机生成四则运算题目 设计思想:先通过一个简单的四则运算,再不断完善 源代码 #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

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

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

结对项目(自动生成四则运算题目程序)

一.Github项目地址:https://github.com/Vigor-creat/-.git 项目成员:胡兆禧 3118005092  余金龙 3118005116 二.PSP PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划     · Estimate · 估计这个任务需要多少时间 30 48 Development 开发     · Analysis · 需求分析 (包括学习新技术) 120 1

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

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

写一个能自动生成四则运算题目的软件,要求除了整数,还要支持正分数的四则运算。和同学们比较各自的程序功能、实现方法的异同。

package Rational; import java.util.Random; import java.util.Scanner; public class szys{             public static void res() {                                                   System.out.println("1.显示答案\t2.直接出下一题");                             

3月10号周二课堂练习:关于自动生成四则运算题目的程序的延伸

对题目要求进行初步的分析: 1.判断两次随机数是否相同    将产生的题目保存(循环)下来,然后将结果进行(循环)比较. 2.多加入一个变量Num,来控制题目数量 3.在每一个switch选择的语句,进行选择判断  3.1选择是否有乘除法,  3.2是否有括号 判断是否加减乘除是否都存在,加减在算式中的位置,然后进行选择是否添加括号 3.3数值范围 主要控制随机数产生器模余的大小(如a=rand()%n,n可以取任意值)    3.4加减有无负数 比较减数和被减数的大小  3.5除法有无余数 将

结对项目——自动生成小学四则运算

结对项目——自动生成小学四则运算 1.Github项目地址: https://github.com/Vicky-Leung/demo 项目制作人:3218005081梁小燕 3218005083许梓莹 2.PSP表格: PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划  60  159 · Estimate · 估计这个任务需要多少时间 60 159 Development 开发  1770  2166 ·

20194684 + 自动生成四则运算题第一版报告

前提需求 要求:使用C或Java语言完成一个自动生成四则运算试题的程序 软件基本功能如下. 自动生成10道100以内的2个操作数的四则运算算式(+ - * /),要求运算结果也在100以内 剔除重复算式.2+3 和 2+3 是重复算式,2+3 和 3+2 不属于重复算式 题目数量可定制 相关参数可控制 是否包含乘法和除法 操作数数值范围可控 操作数是否含负数 生成的运算题存储到外部文件result.txt中 需求分析 某幼儿园,老师要每天出30道加减乘除法题目给孩子做.于是,想写一个脚本完成这件