软件工程个人作业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 编译 编译   待修复

描述:栈清空时出现错误

                                           

原文地址:https://www.cnblogs.com/hyluckydog/p/5323384.html