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


运行结果:

 

posted @ 2016-09-06 23:42  shaloo  阅读(321)  评论(4编辑  收藏  举报