四则运算题目生成程序(基于控制台)

一、需求分析:
1. 使用 -n 参数控制生成题目的个数,使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围
2.每道题目中的运算符个数不超过3个
3. 题目和运算结果中如果出现假分数应用真分数表示
4.将生成的题目存入Exercise.txt,题目答案存入Answer.txt,用户做题结果存入Grade.txt
5.程序支持1万道题目的生成
6.对生成的题目进行查重
二、功能设计
根据用户输入的参数进行生成题目,并进行答题
三、设计实现

下面给出重要代码部分  

1.

public BinaryTree createQues(int span,int max_len)
{
TreeNode left, right;
NumNode num_1 = this.createNum(span);
left = num_1;
for (int i = 0; i < max_len-1; i++)
{
NumNode num_2 = this.createNum(span);
right = num_2;
OpNode op = this.createOperator(left, right);
left = op;
}
BinaryTree tree = new BinaryTree(left, max_len);
tree.OrderTra(tree.getroot(),tree.getroot());
return tree;
}

利用递归创建随机表达式函数,span表示最大数字 max_len表示生成题目的数量。

2.

public int compareTree(BinaryTree tree1,BinaryTree tree2){
if(tree1.getheight() !=  tree1.getheight())
{
return 1;
}

if (tree1.getnumber() != tree1.getnumber())
{
return 1;
}


if(compareNode(tree1.getroot(),tree2.getroot())==1){
return 1;
}
return 0;
}

利用递归进行树的查重。前两个if是为了提高效率。compareNode函数在下面  

3.

public int compareNode(TreeNode node1, TreeNode node2)
{
//比较节点的类型
if (node1.type != node2.type)
{
return 1;
}
else
{
int l=0, r=0;
if (node1.left != null && node2.left != null)
{
l=compareNode(node1.left, node2.left);
}
if (node1.right != null && node2.right != null)
{
r = compareNode(node1.right, node2.right);
}
if (l == 0 && r == 0 && node1.value.getnumerator() == node2.value.getnumerator()&& node1.value.getdenominator() == node2.value.getdenominator())
{
return 0;
}
return 1;
}

比较节点是否一致。 

4.

public Number OrderTra(TreeNode root,TreeNode last)
{
if (root != null)
{
if (root.type == 1)
{
root.s = root.value.ToString();
return root.value;
}
else
{
Number left = OrderTra(root.left, root);
Number right = OrderTra(root.right, root);
root.s = root.left.s + root.op + root.right.s;
if (CalTools.test_op(root.op, last.op) == 0)
{
root.s = "(" + root.s + ")";
}
root.value = CalTools.calcute_number(left, right, root.op);
last = root;
return root.value;
}
}
return null;
}

后序遍历表达式,并生成其字符串,用于把树转换成表达式。 

5.

public void adjustTree(TreeNode root)
{
if (root.left != null)
{
adjustTree(root.left);
}
if (root.right != null)
{
adjustTree(root.right);
}
if (root.left != null && root.right != null)
{
if (root.left.value.getvalue() < root.right.value.getvalue())
{
TreeNode tmp = root.right;
root.right = root.left;
root.left = tmp;
}
}
}

左子树永远比右子树大,方便比较。

6.

public void adjust()
{
int yue = CalTools.get_Yue(this.numerator, this.denominator);
if (yue != 1)
{
this.numerator = this.numerator / yue;
this.denominator = this.denominator / yue;
}
}

yue是两个数的最大公约数,这个函数用于优化计算结果。  

7。生成随机数函数public NumNode createNum(int span)

8。生成随机运算符函数public OpNode createOperator(TreeNode left,TreeNode right)

9。用AppDomain.CurrentDomain.BaseDirectory来跟踪程序运行的地址

10.用System.IO.StreamWriter类来创建文本存放题目答案

四、测试运行

把Answer全部复制到txt上传答案

这里可能最后改的时候忘记调整了

应该把Form1.cs中第220行改成

re.Add("(" + count + ")" + i + "," + li[i].getroot().s.ToString() + "repeat" + j + "," + li[j].getroot().s.ToString());就可以了

五、源代码
项目地址:https://gitee.com/jmdxzlg/sizeyunsuan.git 

六、小结

由于学艺不精,迟了两周才做好实验,中间很多问题都是同学帮助完成的。代码可能存在许多问题还没改正,敬请谅解。

 

posted on 2018-04-19 23:37  jmdxzlg  阅读(155)  评论(0编辑  收藏  举报

导航