简单的四则运算题目生成及求值小程序

程序发布至github

题目要求

除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
运算符为 +, −, ×, ÷
并且要求能处理用户的输入,并判断对错,打分统计正确率。
要求能处理用户输入的真分数, 如 1/2, 5/12 等
使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10

需求分析

  • 通过-n参数控制题目个数,通过-s参数执行对错检验输出正确率
  • 生成max=10以内的随机的整数或真分数(分母比分子大),随机的 +, −, ×, ÷符号,组合成四则运算运算题目,输出到文本文件
  • 读入文本文件,解析表达式求值,对比用户的答案,统计正确率
  • 学习新技术
    • 文件的读写
    • markdown
    • string流,string与int的相互转换

设计文档

用户输入命令行,程序根据命令行执行相应功能,Myapp.exe -n 10生成10道随机四则运算题目并输出到文本,Myapp.exe -s读入文本统计正确率并输出到控制台。

具体定义:

  • 运算符号只包含+, −, ×, ÷,=。没有括号。
  • 题目类型:[整数][符号][整数][符号][整数] 和 [真分数][符号][真分数][符号][真分数]
    操作数+运算符+操作数
  • 运算:n1/d1+ (-)n2/d2 通分
    n1/d1* (/)n2/d2 分子分母相乘
    所得结果r统一化简

程序架构:

  • 解析用户输入的命令行。Myapp.exe -n 10,Myapp.exe -s
  • Myapp.exe -n 10 ,返回题目个数
  • 循环生成题目直到满足题目数n
  • 随机生成整数或真分数,运算符,组成一道题目string
  • 一道题目加上 ’=’ 一行,输出到文本文件
  • Myapp.exe -s ,表达式求值并统计正确率
  • 从文本中逐行读入题目和答案string
  • bool result(string one) 将string中算术表达式部分压入optr和opnd栈中计算出结果res,最后从string中解析出答案ans,比对答案,正确返回true,错误返回false。
    -函数返回true则tc+1,false则fc+1。
  • 统计结果tc/(tc+fc)并输出到控制台

代码规范

-随机生成low到high之间的数字的函数int random(int low ,int high)
-随机生成整数,分数,运算符的函数int rNat(low ,high),string rFra(int x),string rOpe(void)
-表达式比对并进行答案比对bool result(string one)

代码说明

//表达式求值并返回正确与否
bool result(string one) {
	istringstream sin(one);
	string ch;
	string e1, e2, theta;
	stack<string> optr, opnd;
	optr.push("=");
	sin >> ch;
	while (ch!="=" || optr.top()!="=") {
		if (!in(ch)) {
			opnd.push(ch);
			sin >> ch;
		}
		else {
			switch (precede(optr.top(), ch)) {
			case '>':
				theta = optr.top(); optr.pop();
				e2 = opnd.top(); opnd.pop();
				e1 = opnd.top(); opnd.pop();
				opnd.push(operate(e1, theta, e2));
				break;
			case '<':
				optr.push(ch);
				sin >> ch;
				break;
			case '=':
				optr.pop();
				sin >> ch;
				break;
			}
		}
	}
	e1=opnd.top();
	if (sin >> e2) {
		if (e1 == e2)return true;
	}
	else return false;
}

软件测试

PSP

  • 手动记录有错漏之处(我还是写个windows程序自动记录比较准确且轻松!)
PSP2.1 PersonalSoftwareProcessStages Time(%)SeniorStudent Time(%)
Planning 计划 8 0
·Estimate 估计这个任务需要多少时间 8 0
Development 开发 82 92
·Analysis 需求分析(包括学习新技术) 6 4
·DesignSpec 生成设计文档 5 8
·DesignReview 设计复审 4 0
·CodingStandard 代码规范 3 2
·Design 具体设计 10 11
·Coding 具体编码 36 61
·CodeReview 代码复审 7 8
·Test 测试(自我测试,修改代码,提交修改) 13 8
Reporting 报告 9 8
· 测试报告 3 0
· 计算工作量 2 0
· 并提出过程改进计划 3 0

总结

  • 前期需求分析及设计文档 做的越详细越正确后期写代码就会越轻松。因为程序架构与流程有了,写代码时只需特定的地方写详细就好。如果一开始就写代码,没有架构后期调试就会很麻烦且代码臃肿。当然写好架构的前提是先学好一门语言。
  • 学习看和查英文帮助文档。毕竟网上的大多个人博客写不是很详细(写这个小程序就有这种感觉了)。
  • 认真学习C++一门。在各门语言之间转来转去实在混乱,通晓一门足以知晓其他语言的大体情况了。
posted @ 2017-03-08 10:04  publicHere  阅读(919)  评论(2编辑  收藏  举报