生成四则运算式


结对作业

题目要求

  1. 能够自动生成四则运算练习题
  2. 可以定制题目数量
  3. 用户可以选择运算符
  4. 用户设置最大数(如十以内、百以内等)
  5. 用户选择是否有括号、是否有小数
  6. 用户选择输出方式(如输出到文件、打印机等)
  7. 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)

角色扮演

经过我和我的伙伴商量我们决定如下:

驾驶员:刘亚(本人)
领航员:江民亮
图形界面用Android 开发
三个界面:1.用户选择界面。2.题目界面。 3. 用户做题后正确率显示界面
app名字叫“成长小学生”

功能一:设置

根据用户选择可以定制题目数量,运算符,最大数,是否有括号和小数

功能二:出题

由于是面对手机用户开发的(界面比较小)所以我们决定每次只出10道题目,如果用户想再继续做题,我们在屏幕下方设置两个按钮,“再来10道题”界面就可以刷新再出10道题,如果觉得做够了,点击“就这样吧”即可结束。

功能三:计算并显示正确率

当用户点击“就这样吧”的时候会出现次界面,会反馈出给用户鼓励的话和成绩

核心代码

主要分为两个函数Formula(){}(产生运算式的函数),Calculate(String eq){}(计算等式的函数), ```

public void Formula(){
//等式
int number=0;
int i=1;
int symbol=0;
String ch ="";
while(i<=count){
number=rand.nextInt(maxValue);
char c=equation.charAt(equation.length()-1);
if(c'/'){ //判断除号后面是否为0,是则置为1
number=1;
}
symbol=rand.nextInt(4);//[0,4)的随机整数数
switch (symbol){
case 0: ch="+"; break;
case 1: ch="-"; break;
case 2: ch=""; break;
case 3: ch="/"; break;
}
if(i!=count){
/
char c=equation.charAt(equation.length()-1);
System.out.println(c);
if(c!='+' && c!='-' && c!='' && c!='/')/
boolean y=false;
y=ProduceFirstBrackets(i);
if(Decimal){
equation+=number/10.0;
}
else{
equation+=number;
}
if(y
false)
ProduceLastBrackets(i);
equation+=ch;
}
else{
//是否为小数
if(Decimal){
equation+=number/10.0;
}
else{
equation+=number;
}
ProduceLastBrackets(i);
}
i++;
}
equation+="=";
equation=equation.trim();
String test="3+2*5=";
System.out.println("结果:"+test);
System.out.println(Calculate(test));
System.out.println("结果:"+equation);
System.out.println(Calculate(equation));
}
public boolean ProduceFirstBrackets(int i){ // 产生左括号
boolean yes=false;
int ran=rand.nextInt(4);
switch(ran){
case 1: {
equation+="("; yes=true; bracketNum++; break;
}
}
return yes;
}
public void ProduceLastBrackets(int i){ // 产生右括号
if(i==count && bracketNum>0){
for(int j=0;j<bracketNum;j++){
equation+=")";
}
}
else{
int ran=rand.nextInt(3);
switch(ran){
case 1: {
if(i!=1 && bracketNum>0){
equation+=")"; bracketNum--;break;
}
else{
break;
}
}
}
}
}

<h4>计算函数优先级(,*,/,+,-,)

public Double Calculate(String eq){
numberStack=new Stack();
symbolStack=new Stack();//初始化栈
//eq=removeStrSpace(eq);
StringBuffer temp=new StringBuffer();
for(int i=0;i<eq.length();i++){
char ch=eq.charAt(i);
if(isNumber(ch)){
temp.append(ch);
}else{
String tempStr=temp.toString();
if(!tempStr.isEmpty()){
Double num =Double.parseDouble(tempStr); //将字符串转换为小数
numberStack.push(num); //数字进栈
temp =new StringBuffer();//重置数字缓存
}
while(!comparePri(ch) && !symbolStack.empty()){
Double b=numberStack.pop();
Double a=numberStack.pop();
switch((char)symbolStack.pop()){
case '+':
numberStack.push(a+b); break;
case '-':
numberStack.push(a-b); break;
case '':
numberStack.push(a
b); break;
case '/':
numberStack.push(a/b); break; //需要判断b是否为0,
default:
break;
}
}
if(ch!='='){
symbolStack.push(new Character(ch)); //符号入栈
if(ch == ')'){//去掉括号
symbolStack.pop();
symbolStack.pop();
}
}
else if(!numberStack.empty()){
while(true){ //不加这步就算不出2+35=
Double b=numberStack.pop();
if(numberStack.empty()){
return b;
}
Double a=numberStack.pop();
switch((char)symbolStack.pop()){
case '+':
numberStack.push(a+b); break;
case '-':
numberStack.push(a-b); break;
case '
':
numberStack.push(ab); break;
case '/':
numberStack.push(a/b); break; //需要判断b是否为0,
default:
break;
}
}
}
}
}
return numberStack.pop();
}
private boolean comparePri(char ch) {
// TODO Auto-generated method stub
if(symbolStack.empty()){
return true;
}
char top=(char)symbolStack.peek();//查看栈顶元素
if(top=='('){
return true;
}
switch(ch){
case '(': return true;
case '
': {
if(top== '+' || top'-'){
return true;
}else{
return false;
}
}
case '/': {
if(top
'+' || top=='-'){
return true;
}else{
return false;
}
}
case '+': return false;
case '-': return false;
case ')': return false;
default:
break;
}
return true;
}

private boolean isNumber(char ch) {
	// TODO Auto-generated method stub
	if(ch>='0' && ch<='9' || ch=='.'){
		return true;
	}
	return false;
}

<h4>总结
由于时间关系,没有来的急对界面进行优化,还有功能一有一个传参数值的bug一直没有调试好,还有在计算的时候经过领航员长时间的调试基本没有计算错的了,谈谈我们的领航员吧,结对讲究的就是合作吧,开始开发之前我们一起讨论,怎么写界面,怎么添加功能,考虑除0的情况,在写计算函数的时候我们讨论如何考虑优先级,决定用栈来写,代码全部由我完成,所以我们还是合作愉快的。快要接近截止时间了,能力有限,只能做到此了。

<h4>要看全部代码戳[这里](https://coding.net/u/liu_ya/p/Four_Formula/git/tree/master/?public=true)

原文地址:https://www.cnblogs.com/liu-ya/p/8869321.html