一、需求分析:
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
六、小结
由于学艺不精,迟了两周才做好实验,中间很多问题都是同学帮助完成的。代码可能存在许多问题还没改正,敬请谅解。