首页 > 代码库 > 结对编程:四则运算。组员:闫浩楠 杨钰宁 开发语言:C语言

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


运行结果:

技术分享

技术分享

 

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