zoukankan      html  css  js  c++  java
  • 软件工程个人作业03

    设计思想:

    1.根据功能分成两个部分,一个是单纯运算,一个是思则混合运算;

    2.单纯运算,生成题目后判断正确与否

    3.四则混合运算,申请两个数组,一个数组存放数字,一个存放符号

    4,判断用栈的思想,判断优先级,然后先算乘除后算加减(待修正)

    5.计数

    程序源代码:

    #include<iostream>
    using namespace std;
    #include<string>
    #include<ctime>
    #include<stdlib.h>
    #include<stdio.h>
    #include<ctype.h>
    #define STACK_INIT_SIZE 100 //存储空间初始分配量
    #define STACKINCREMENT 10 //存储空间分配增量
    #define OK 0
    #define ERROR 127
      
    //定义一个顺序栈
    typedef struct 
    {    
        int*base;    //在栈构造之前和销毁之后,base的值为NULL    
        int*top;    //栈顶指针    
        int stacksize;   //当前已分配的存储空间,以元素为单位    
    }SqStack;
    
    int InitStack(SqStack*S)
    {    
        //构造一个空栈    
        S->base=(int*)malloc(STACK_INIT_SIZE*sizeof(SqStack));    
        if(NULL==S->base)    
        { //内存分配失败        
            return ERROR ;        
        }    
        S->top=S->base ;    
        S->stacksize=STACK_INIT_SIZE ;
         
        return OK ;    
    }
    
    char GetTop(SqStack*S,char*element)
    {    
        //若栈不空,取栈顶元素,用element返回    
        if(S->base==S->top)    
        {        
            return ERROR ;        
        }    
        *element=*(S->top-1);
         
        return*element ;    
    }
    
    int Push(SqStack*S,int element)
    {    
        //插入元素element为新的栈顶元素    
        if((S->top-S->base)>S->stacksize)    
        {
            //栈满,追加空间        
            S->base=(int*)realloc(S->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SqStack));        
            if(NULL==S->base)        
            {            
                return ERROR ;            
            }        
            S->top=S->base+S->stacksize ;        
            S->stacksize+=STACKINCREMENT ;        
        }    
        *S->top++=element ;
         
        return OK ;    
    }
    
    int Pop(SqStack*S,int*element)
    {    
        //若栈不为空,则删除栈顶元素,用element返回其值    
        if(S->top==S->base)    
        {        
            return ERROR ;        
        }    
        *element=*(--S->top);
         
        return OK ;    
    }
    int PopOPTR(SqStack*S,char*element)
    {    
        if(S->top==S->base)    
        {        
            return ERROR ;        
        }    
        *element=*(--S->top);
         
        return OK ;    
    }
    //判断字符c是否在集合OP中
    int InOP(char c,char OP[7])
    {    
        for(int i=0;i<7;i++)    
        {        
            if(c==OP[i])        
            {            
                return OK ;            
            }        
        }
         
        return ERROR;    
    }
    //判断运算符的优先级
    int Compare(int a,int b)
    {    
        if('+'==a)    
        {        
            switch(b)        
            {            
            case '+' :            
                return '>';            
            case '-' :            
                return '>' ;            
            case '*' :            
                return '<' ;            
            case '/' :            
                return '<' ;
            case '=' :            
                return '>' ;            
            }        
        }    
        if('-'==a)    
        {        
            switch(b)        
            {            
            case '+' :            
                return '>' ;            
            case '-' :            
                return '>' ;            
            case '*' :            
                return '<' ;            
            case '/' :            
                return '<' ;
            case '=' :            
                return '>' ;            
            }        
        }
         
        if('*'==a)    
        {        
            switch(b)        
            {            
            case '+' :            
                return '>' ;            
            case '-' :            
                return '>' ;            
            case '*' :            
                return '>' ;            
            case '/' :            
                return '>' ;
            case '=' :            
                return '>' ;            
            }        
        }
         
        if('/'==a)    
        {        
            switch(b)        
            {            
            case '+' :            
                return '>' ;            
            case '-' :            
                return '>' ;            
            case '*' :            
                return '>' ;            
            case '/' :            
                return '>' ;
            case '=' :            
                return '>' ;            
            }        
        }
        
        if('='==a)    
        {        
            switch(b)        
            {            
            case '+' :            
                return '<' ;            
            case '-' :            
                return '<' ;
            case '*' :            
                return '<' ;            
            case '/' :            
                return '<' ; 
            case '=' :            
                return '=' ;            
            }        
        }    
        return ERROR ;    
    }
      
    //简单计算
    int Calculate(int left,char oper,int right)
    {    
        int result=0 ;    
        switch(oper)    
        {        
        case '+' :        
            result=left+right ;        
            break ;        
        case '-' :        
            result=left-right ;        
            break ;        
        case '*' :        
            result=left*right ;        
            break ;        
        case '/' :        
            result=left/right;        
            break ;        
        }
        return result ;    
    }
    
    void main()
    {
        int choose,T=0,F=0;
        cout<<"请选择 1 四则运算 2 四则混合运算";
        cin>>choose;
        if(choose == 1)
        {
            for(int i=0;i<30;i++)
            {
                int fuhao=rand()%4; 
                int a=rand()%100;
                int b=rand()%99+1;
                int result,shang,yushu;
                if(fuhao==0) //加法运算
                {
                    cout<<a<<"+"<<b<<"=";
                    cin>>result;
                    if((a+b)==result)
                    {
                        cout<<"正确"<<endl;
                        T++;
                    }
                    else
                    {
                        cout<<"错误"<<endl;
                        F++;
                    }
                }
                if(fuhao==1)//减法运算
                {
                    cout<<a<<"-"<<b<<"=";
                    cin>>result;
                    if((a-b)==result)
                    {
                        cout<<"正确"<<endl;
                        T++;
                    }
                    else
                    {
                        cout<<"错误"<<endl;
                        F++;
                    }
                }
                if(fuhao==2)//乘法运算
                {
                    cout<<a<<"*"<<b<<"=";
                    cin>>result;
                    if((a*b)==result)
                    {
                        cout<<"正确"<<endl;
                        T++;
                    }
                    else
                    {
                        cout<<"错误"<<endl;
                        F++;
                    }
                }
                if(fuhao==3)//除法运算
                {
                    cout<<a<<"÷"<<b<<"=";
                    if(a%b==0)
                    {
                        cin>>result;
                        if((a+b)==result)
                        {
                            cout<<"正确"<<endl;
                            T++;
                        }
                        else
                        {
                            cout<<"错误"<<endl;
                            F++;
                        }
                    }
                    else
                    {
                        cout<<"请输入商和余数,中间空格隔开";
                        cin>>shang>>yushu;
                        if((a/b)==shang&&(a%b)==yushu)
                        {
                            cout<<"正确"<<endl;
                            T++;
                        }
                        else
                        {
                            cout<<"错误"<<endl;
                            F++;
                        }
                    }
                }
            }
            cout<<"您做对"<<T<<"道题"<<endl;
            cout<<"您做错"<<F<<"道题"<<endl;
        }
    
        else if(choose == 2)
        {
            int length,chlen;
            int num[20];
            char chs[20];
            char ch[4]={'+','-','*','/'};
            for(int i=0;i<30;i++)
            {
                int result;
                length = rand()%6+2;
                chlen = length - 1;
                for(int i=0;i<length;i++)
                {
                    num[i]=rand()%99+1;
                }
                for(int i=0;i<chlen;i++)
                {
                    chs[i]=ch[rand()%4];
                }
                chs[chlen]='=';
                for(int i=0;i<chlen;i++)
                {
                    chs[i]=ch[rand()%4];
                }
    
                for(int i=0;i<length;i++)
                {
                    cout<<num[i]<<chs[i];
                }
                cout<<endl;
                
                /*
                SqStack OPTR,OPND ;
                int element=0 ;
                char OPTR_element ;
                int leftNum,rightNum ;
                InitStack(&OPTR);
                Push(&OPTR,'=');
                InitStack(&OPND);
                
                int t=0; 
                
                while('='!=chs[t]||'='!=GetTop(&OPTR,&OPTR_element))
                {
                    Push(&OPND,num[t]);
                    GetTop(&OPTR,&OPTR_element);
                    switch(Compare(OPTR_element,chs[t]))
                    { 
                        case '<' :
                    //栈顶元素优先级低                
                        Push(&OPTR,chs[t]);
                    //运算符进OPTR栈                
                        t++;
                        break ;
    
                        case '=' :
                            t++
                            break ; 
                        
                        case '>' :
                        //退栈,并将运算结果入栈                
                        PopOPTR(&OPTR,&OPTR_element);                
                        Pop(&OPND,&num[t-1]);                
                        Pop(&OPND,&num[t]);                
                        Push(&OPND,Calculate(num[t],OPTR_element,num[t+1]));
                        break ;                           
                    }//switch
                }//if
    
                cin>>result;
                if(value == result)
                {
                    cout<<"正确"<<endl;
                    T++;
                }
                else
                {
                    cout<<"错误"<<endl;
                    F++;
                    
                }
                cout<<"您做对"<<T<<"道题"<<endl;
                cout<<"您做错"<<F<<"道题"<<endl;
                */
            }
        }
    
    }

    运行结果截图:

    编程总结分析:

      单纯加减乘除部分完成较好,四则混合运算部分,没有完成结果校验的功能,查询了许多资料,还是没有理解怎么利用栈来保存结果,多数据结构还要认真复习。

     周活动总结表

    姓名:hy      日期:2016.3.26

    日期/任务 听课 编写程序 阅读课本 日总计
    星期日        
    星期一 120 50    
    星期二        
    星期三        
    星期四        
    星期五   120    
    星期六   150    
    周总计 120 320   440

    时间记录日志

    姓名:hy     日期:2016.3.26

    日期 开始时间 结束时间 中断时间 静时间 活动 备注   C     U  
    3.21 8:00 9:50 8:50-9:00 100 上课      
    15:00 16:40   100 设计思想+编程      
    3.25 20:00 23:20   380 编程      
    3.26 10:00 18:00 11:00-13:00 720 编程      

    缺陷记录日志

    学生:hy  日期:2016.3.26

    教员:王建民   程序号:03

    日期 编号 类型 引入阶段 排除阶段 修复时间 修复缺陷
    3.25 01 20 编译 编译 1  
      描述:符号不比配
      02 20 编译 编译 5  
      描述:除法需分情况讨论,否则出现错误
    3.26 03 20 编译 编译   待修复
    描述:加上判断结果后,题目变少,程序不运行
    04 20 编译 编译   待修复

    描述:栈清空时出现错误

                                               

  • 相关阅读:
    for循环中创建线程执行问题
    MySQL学习总结之路(第六章:表类型【存储引擎】的选择)
    Tensorflow的下载和安装
    C# 和 Python 的 hash_md5加密方法
    MySQL学习总结之路(第五章:函数)
    MySQL学习总结之路(第四章:运算符)
    MySQL学习总结之路(第三章:数据类型)
    MySQL学习总结之路(第二章:表)
    MySQL学习总结之路(服务与数据库管理)
    CSS居中的方式15种(水平垂直)
  • 原文地址:https://www.cnblogs.com/hyluckydog/p/5323384.html
Copyright © 2011-2022 走看看