• 四则运算


    这次是结对开发,这是我和同学写的代码,思路是讲字符串里的数字与符号逐渐取出,然后使用数字栈和符号栈逐渐进行调整,算出结果

    代码:

    // 按要求随机生成四则运算  王世强 2015/3/15  
    #include<iostream>
    #include<stdlib.h>
    #include<iomanip>
    #include<time.h>  
    #include<stdio.h> 
    #include"math.h"  
    #define true 1   
    #define false 0   
    #define OPSETSIZE 7  
    #define random() (rand()%100000)  
    #include"string.h"   
    typedef int Status;
    using namespace std;   
      
    unsigned char Prior[7][7] =  
    { // 运算符优先级表   
        // '+' '-' '*' '/' '(' ')' '#'    
        /*'+'*/'>','>','<','<','<','>','>',  
        /*'-'*/'>','>','<','<','<','>','>',  
        /*'*'*/'>','>','>','>','<','>','>', 
        /*'/'*/'>','>','>','>','<','>','>',
        /*'('*/'<','<','<','<','<','=',' ', 
        /*')'*/'>','>','>','>',' ','>','>',
        /*'#'*/'<','<','<','<','<',' ','=', 
    };   
      
    typedef struct StackChar  
    {  
        char c;   
        struct StackChar *next;   
    }SC;       //StackChar类型的结点SC  
      
    typedef struct StackFloat  
    {  
        float f;   
        struct StackFloat *next;   
    }SF;       //StackFloat类型的结点SF  
      
    SC *Push(SC *s,char c)          //SC类型的指针Push,返回p  
    {  
        SC *p=(SC*)malloc(sizeof(SC));   
        p->c=c;   
        p->next=s;   
        return p;   
    }   
      
    SF *Push(SF *s,float f)        //SF类型的指针Push,返回p  
    {  
        SF *p=(SF*)malloc(sizeof(SF));   
        p->f=f;   
        p->next=s;   
        return p;   
    }   
     
    SC *Pop(SC *s)    //SC类型的指针Pop  
    {  
        SC *q=s;   
        s=s->next;   
        free(q);   
        return s;   
    }   
      
    SF *Pop(SF *s)      //SF类型的指针Pop  
    {  
        SF *q=s;   
        s=s->next;   
        free(q);   
        return s;   
    }   
      
    float Operate(float a,unsigned char theta, float b)      //计算函数Operate  
    {  
        switch(theta)  
        {  
        case '+': return a+b;   
        case '-': return a-b;   
        case '*': return a*b;   
        case '/': return a/b;   
        default : return 0;   
        }   
    }   
      
    char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#'};   
      
    Status In(char Test,char *TestOp)  
    {  
        int Find=false;   
        for (int i=0; i< OPSETSIZE; i++)  
        {  
            if(Test == TestOp[i])  
                Find= true;   
        }   
        return Find;   
    }   
      
    Status ReturnOpOrd(char op,char *TestOp)  
    {   
        for(int i=0; i< OPSETSIZE; i++)  
        {  
            if (op == TestOp[i])  
                return i;  
        }  
    }  
      
    char precede(char Aop, char Bop)  
    {   
        return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];   
    }   
      
    float EvaluateExpression(char* MyExpression)  
    {   
        // 算术表达式求值的算符优先算法  
        // 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合   
        SC *OPTR=NULL;       // 运算符栈,字符元素   
        SF *OPND=NULL;       // 运算数栈,实数元素   
        char TempData[20];   
        float Data,a,b;   
        char theta,*c,Dr[]={'#',''};   
        OPTR=Push(OPTR,'#');   
        c=strcat(MyExpression,Dr);   
        strcpy(TempData,"");//字符串拷贝函数   
        while (*c!= '#' || OPTR->c!='#')  
        {   
            if (!In(*c, OPSET))  
            {   
                Dr[0]=*c;   
                strcat(TempData,Dr);           //字符串连接函数   
                c++;   
                if (In(*c, OPSET))  
                {   
                    Data=atof(TempData);       //字符串转换函数(double)   
                    OPND=Push(OPND, Data);   
                    strcpy(TempData,"");   
                }   
            }   
            else    // 不是运算符则进栈   
            {  
                switch (precede(OPTR->c, *c))  
                {  
                case '<': // 栈顶元素优先级低   
                    OPTR=Push(OPTR, *c);   
                    c++;   
                    break;   
                case '=': // 脱括号并接收下一字符   
                    OPTR=Pop(OPTR);   
                    c++;   
                    break;   
                case '>': // 退栈并将运算结果入栈   
                    theta=OPTR->c;OPTR=Pop(OPTR);   
                    b=OPND->f;OPND=Pop(OPND);   
                    a=OPND->f;OPND=Pop(OPND);   
                    OPND=Push(OPND, Operate(a, theta, b));   
                    break;   
                } //switch  
            }   
        } //while   
        return OPND->f;   
    } //EvaluateExpression  
    
    //符号生成
    char create_symbol(int n)
    {
        int n1,j;    
        char symbol[1];
        if(n==0)
        {
            n1=2;
        }
        else if(n=1)
        {
            n1=4;
        }
        j=random()%n1;
        if(j==0) symbol[0]='+';
        else if(j==1) symbol[0]='-';
        else if(j==2) symbol[0]='*';
        else symbol[0]='/';
        return symbol[0];      
     } 
     //把数字转换成字符串型
     string int_string(int number)
     {
        char str[200];
        itoa(number,str,10);
        string str_=str;
        return str_; 
      } 
      //真分数合成一个字符串
     string combination1(string str1,string str2,char k) 
     {
         string equation;
         equation='('+str1+k+str2+')';
         return equation;
     } 
     //新生成一个数
    string create_num(int proper_fs,int range)
    { 
        int num,num1,num2,fs;
        string str_num,str_num1,str_num2;
          num=random()%range+1;
        str_num=int_string(num);
        if(proper_fs==1)
        {
            fs=random()%3;
            if(fs==1)//判断是否生成真分数  
            {    
                for(;;)
                {
                    num1=random()%range+1;
                     num2=random()%range+1;
                    if(num1<num2) break;
                }
                str_num1=int_string(num1);
                str_num2=int_string(num2);
                str_num=combination1(str_num1,str_num2,'/');
            }
        }
        return str_num; 
      } 
     //运算式转换成一个字符串
     string combination(string str1,string str2,char k) 
     {
         string equation;
         equation=str1+k+str2;
         return equation;
     }
    
    //得出正确答案 
    float get_ans(string str)
    {
        int len;
        float ans;
        len=str.length();
        char num[len];
        for(int j=0;j<len;j++)
        {
            num[j]=str[j];
        }
        //用堆栈解决。。。 
        ans=EvaluateExpression(num);
        return ans;
    } 
     //主函数 
    int main()
    {
        srand((int)time(NULL));  //设置时间种子 ,使得程序每次运行的结果都不同 
        int num1,num2,num3,num4,count,n,change,amount,shuchu,range,j,repeat=0,bracket,proper_fs;
        string str_num1,str_num2,temp;
        float Answer,InputAns;
        cout<<"有无乘除法?1有,0没有:"<<endl;
        cin>>n;
        cout<<"是否有括号?1有,0没有:"<<endl;
        cin>>bracket; 
        cout<<"是否有真分数?1有,0没有:"<<endl;
        cin>>proper_fs; 
        cout<<"请输入数字范围:"<<endl;
        cin>>range; 
        cout<<"请输入出题数量:"<<endl;
        cin>>amount; 
        string Equation[amount];
        char symbol;
        cout<<amount<<"道四则运算题如下:"<<endl; 
        for(int i=0;i<amount;i++)
        {    
            count=random()%3+2;
            str_num1=create_num(proper_fs,range);
            str_num2=create_num(proper_fs,range);
            symbol=create_symbol(n);
            Equation[i]=combination(str_num1,str_num2,symbol);
            if(count>2)
            {
                for(count;count>2;count--)
                {
                    symbol=create_symbol(n);
                    str_num1=Equation[i];
                    if(bracket==1)
                    {
                        change=random()%3;
                        if(change==0)
                        {
                           str_num1='('+str_num1+')';
                         }
                    } 
                    symbol=create_symbol(n);
                    str_num2=create_num(proper_fs,range);    
                    change=random()%2;
                    if(change==0)
                    {
                        temp=str_num1;
                        str_num1=str_num2;
                        str_num2=temp;
                    }                
                    Equation[i]=combination(str_num1,str_num2,symbol);
                }
            }
            //判断是否重复
             for(j=0;j<i;j++)
             {
                 if(Equation[j]==Equation[i])
                 {
                    i=i-1;
                    repeat=1;
                    break;
                 }
             }
             if(repeat!=1)//若不重复,则输出 
             {     
                cout<<Equation[i]<<"=";
                //判断结果是否正确
                cin>>InputAns;
                Answer=get_ans(Equation[i]);
                Answer*=100;
                int temp=(int)Answer;
                Answer=((double)temp)/100.00;
                if(InputAns==Answer)
                {
                    cout<<"回答正确!"; 
                }
                else
                {
                    cout<<"回答错误!正确答案为";
                    cout<<setprecision(2)<<fixed<<Answer;
                } 
                cout<<endl;
             }
        }
    }

    队友王世强:

    http://www.cnblogs.com/wsqJohn/p/5294841.html

  • 相关阅读:
    matlab练习程序(单源最短路径Dijkstra)
    Android开发必须知道SERVICE的10件事
    Android 多种方式正确的加载图像,有效避免oom
    在Android中解决内存溢出 – OutOfMemoryError
    发布Android开源库,看这个文章就够了!
    发掘StateListAnimator的全部潜能
    Android开发中多进程共享数据
    Android使用FFMpeg实现推送视频直播流到服务器
    Android学Jni/Ndk 开发记录(一)
    一张图解释RxJava中的线程控制
  • 原文地址:https://www.cnblogs.com/yifan2016/p/5296389.html
Copyright © 2020-2023  润新知