zoukankan      html  css  js  c++  java
  • 结对编程:四则运算。组员:闫浩楠 杨钰宁 开发语言: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));  }
        }


    运行结果:

  • 相关阅读:
    改变人生的32句励志名言(转载)
    Unrecognized Attribute 'xmlns' when working with VS.NET Express Edition
    学外语的十条珍贵经验(转)
    自考版“八荣八耻”
    弟弟手机丢了
    近期准备学习3本书
    盗版vs2005.net买不到
    非常希望有“苏州.net俱乐部”
    My twenty,the end of a dynasty.
    死递归:“段错误”产生的可能原因之一
  • 原文地址:https://www.cnblogs.com/shaloo/p/5847663.html
Copyright © 2011-2022 走看看