• 结对编程:四则运算。组员:闫浩楠 杨钰宁 开发语言:C语言


    需求分析:1.能够自动出题并给出答案

                  2.包含“+,—,*,/,()” 的四则运算。

                  3.显示题目的答案

    结构设计:1.自动出题用随机数生成语句实现:包括随机生成数字、运算符号和题目长度

         2.用变量约束左右括号顺序和同时存在的特点。

           3.将题目输出并用字符串存储。

           4.对字符串入栈进行运算。

    部分核心代码:

    随机生成题目长度:

    a=rand()%3+3;
    for(i=0;i<a;i++)
    {
      ……
    }

    随机生成数字及符号:

    c=rand()%19+1;  //数字
    printf("%d",c);
    b=rand()%4; //符号
    switch(b)
          {
           case 0: printf("+"); math[m]='+';m++;
            if(i<a-3&&j==10) b=10;
            else b=rand()%4; break;
           case 1: printf("-"); math[m]='-';m++;
            if(i<a-3&&j==10) b=10;
            else b=rand()%4; break;
           case 2: printf("*"); math[m]='*';m++;
            if(i<a-3&&j==10) b=10;
            else b=rand()%4; break;
           case 3: printf("/"); math[m]='/';m++;
            b=20; break;

        }
    if(b==10)
          {
           printf("(");
           math[m]='(';m++;
           j=3;
           b=rand()%4;
          }

    if(j!=10)
          j--;
          if(j==0){
           printf(")");
           math[m]=')';
           m++;
           b=rand()%3;
           j=10;
           }

    利用栈对表达式进行计算:

    采用符号优先值对五种运算符号进行控制。

    while(c!='='||x!='=')  //循环处理表达式中的每一个字符
        {
            if(isOperator(c))  //如果是运算符
            {
                if(flag){
                    seqStackPush(StackData,q);  //表达式入栈
                    q=0;   //操作数清零 
                    flag=0;   //标志清零,表示操作数已经入栈 
                }
                switch(PRI(x,c))   //判断运算符优先级
                {
                    case -1:
                        seqStackPush(StackOper,c);  //运算符进栈
                        c=exp[i++];
                        break;
                    case 0:
                        c=seqStackPop(StackOper);  //运算符括号,等号出栈,被抛弃
                        c=exp[i++];   //取下一个 字符 
                        break; 
                    case 1:
                        oper=seqStackPop(StackOper);   //运算符出栈
                        b=seqStackPop(StackData);
                        a=seqStackPop(StackData);  //两个操作数出栈
                        t=Calc(a,oper,b);  //计算结果
                        seqStackPush(StackData,t);  //将运算结果入栈 
                     break;
                      
                } 
            }else if(c>='0'&&c<='9')  //如果输出的字符在0到9之间
            {
                c-='0';   //把字符转换成数字
                q=q*10+c;       //多位数的进位处理
                
                c=exp[i++];  //取出下一位字符
                 flag=1;  //设置标志,表示操作数未入栈
            } 
            else {
                printf("输入错误\n");
                getch();
                exit(0);
            }
            x=seqStackPeek(StackOper);  //获取栈顶操作符 
        } 
        q=seqStackPop(StackData);   
        seqStackfree(StackOper);  
        seqStackfree(StackData);  //释放内存占用空间
        return q;  //出栈,返回结果 
        
         
    } 

    优先值的判定:

    int PRI(char oper1,char oper2)  
    {
        int pri;
        switch(oper2)   //判断优先级
        {
            case '+':
            case '-':
                if(oper1=='('||oper1=='=')  //为左括号 
                pri=-1;        //oper1<oper2
                else 
                  pri=1;       //oper1>oper2
                break;
            case '*':
            case '/':
                if(oper1=='*'||oper1=='/'||oper1==')')
                  pri=1;   //oper1>oper2
                else
                  pri=-1;     //oper1<oper2
                  break;
            case '(':
                if(oper1==')')       //右括号右侧不能马上出现左括号
                {
                    printf("语法错误\n");
                    exit(0);
                } else
                    pri=-1;       //oper1<oper2
                  break;
            case ')':
                if(oper1=='(')
                   pri=0;
                else if(oper1=='=')
                {
                    printf("括号不匹配\n");
                    exit(0);
                }else
                     pri=1;
                   break;
            case '=':
                if(oper1=='(')
                {
                    printf("括号不匹配\n");
                    exit(0);
                }else if(oper1=='=')
                  pri=0;  //等号匹配,返回0
                 else
                     pri=1;      //oper1>oper2
                   break;       
        }
        return pri;
    } 

    主函数控制题目数量:

    char ans[]="\0";
        int b,i;
        srand(time(0));
        while(1)
        {
            printf("当前功能:生成题库\n");
                printf("请输入所需题目数量:");
                scanf("%d",&b);
                for(i=0;i<b;i++){
                    exp();
                    printf("%d\n",CalcExp(math));  }
        }


    运行结果:

  • 相关阅读:
    svn command line tag
    MDbg.exe(.NET Framework 命令行调试程序)
    Microsoft Web Deployment Tool
    sql server CI
    VS 2010 One Click Deployment Issue “Application Validation did not succeed. Unable to continue”
    mshtml
    大厂程序员站错队被架空,只拿着五折工资!苟活和离职,如何选择?
    揭秘!Windows 为什么会蓝屏?微软程序员竟说是这个原因...
    喂!千万别忘了这个C语言知识!(~0 == -1 问题)
    Linux 比 Windows 更好,谁反对?我有13个赞成理由
  • 原文地址:https://www.cnblogs.com/shaloo/p/5847663.html
Copyright © 2020-2023  润新知