zoukankan      html  css  js  c++  java
  • 生成四则运算式


    结对作业

    题目要求

    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)

  • 相关阅读:
    Oracle并行操作——从串行到并行
    Log4Net使用指南
    NET开发人员应该要知道
    测试11g压缩性能
    C#不同操作系统下,界面大小不一的原因
    采用nettcp绑定的wcf宿主到iis7
    Packaging Oracle Data Access Components into .Net projects
    Operating System Property Values
    【转】《Effective C#中文版:改善C#程序的50种方法》读书笔记
    解决.svc 无法解析
  • 原文地址:https://www.cnblogs.com/liu-ya/p/8869321.html
Copyright © 2011-2022 走看看