• 大小: 10KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-15
  • 语言: C/C++
  • 标签:   

资源简介

利用栈求表达式的值,可供小学生作业,并能给出分数。 要求:建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后 的评价。

资源截图

代码片段和文件信息

#include 
#include 
#include 
int N;  //定义全局变量,表示试题库试题数量
typedef struct
{
    char a[100];
    int result;
}Shiti;  //试题数据类型
typedef struct
{
    int *base*top;
    int size;
}Num; //数字栈
typedef struct
{
    char *base*top;
    int size;
}Oper;  //运算符栈

int NumInitStack(Num *S1)  //构造数字栈
{
    S1->base=(int *)malloc(100*sizeof(int));
    if(!S1->base)
    {
        printf(“申请内存失败!\n“);
        return 0;
    }
    S1->top=S1->base;
    S1->size=100;
    return 1;
}

int OperInitStack(Oper *S2)  //构造运算符栈
{
    S2->base=(char *)malloc(100*sizeof(char));
    if(!S2->base)
    {
        printf(“申请内存失败!\n“);
        return 0;
    }
    S2->top=S2->base;
    S2->size=100;
    return 1;
}

int NumGetTop(Num *S1)  //得到数字栈栈顶元素
{
    int e1;
    if((*S1).top==(*S1).base)
        return 0;
    e1=*((*S1).top-1);
        return e1;
}

char OperGetTop(Oper *S2)  //得到运算符栈栈顶元素
{
    char e2;
    if((*S2).top==(*S2).base)
        return 0;
    e2=*((*S2).top-1);
        return e2;
}

void NumPush(Num *S1int e1)  //数字栈压栈
{
    *(*S1).top++=e1;
}

void OperPush(Oper *S2char e2)  //运算符栈压栈
{
    *(*S2).top++=e2;
}

int NumPop(Num *S1)  //数字栈弹栈
{
    int e1;
    if((*S1).top==(*S1).base)
        return 0;
    e1=*--(*S1).top;
        return e1;
}

char OperPop(Oper *S2)  //运算符栈弹栈
{
    char e2;
    if((*S2).top==(*S2).base)
        return 0;
    e2=*--(*S2).top;
        return e2;
}

char Precede(char achar b)  //判断运算符优先级
{
    int ij;
    char Table[8][8]={{‘ ‘‘+‘‘-‘‘*‘‘/‘‘(‘‘)‘‘=‘}
                   {‘+‘‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘>‘}
                   {‘-‘‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘>‘}
                   {‘*‘‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘>‘}
                   {‘/‘‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘>‘}
                   {‘(‘‘<‘‘<‘‘<‘‘<‘‘<‘‘=‘‘ ‘}
                   {‘)‘‘>‘‘>‘‘>‘‘>‘‘ ‘‘>‘‘>‘}
                   {‘=‘‘<‘‘<‘‘<‘‘<‘‘<‘‘ ‘‘=‘}};  //优先级表格
    for(i=0;i<8;i++)
        if(Table[0][i]==a)  //纵坐标寻找
            break;
    for(j=0;j<8;j++)  //横坐标寻找
        if(Table[j][0]==b)
            break;
    return Table[j][i];
}

int Operate(int achar thetaint b)  //计算二元表达式的值
{
    int c;
    if(theta==‘+‘)
        c=a+b;
    else if(theta==‘-‘)
        c=a-b;
    else if(theta==‘*‘)
        c=a*b;
    else
        c=a/b;
    return c;
}

int IsOper(char ch)  //判断字符ch是否为运算符
{
    char ptr[10]={‘+‘‘-‘‘*‘‘/‘‘(‘‘)‘‘=‘};
    int i;
    for(i=0;i<7;i++)
    {
        if(ch==ptr[i])
            return 1;
    }
    return 0;
}

int Result(char a[]Num *numOper *oper)  //计算表达式的结果
{
    char theta;
    int bdk=0i=0j=0num2=0;
    NumInitStack(num);  //构造数字栈
    OperInitStack(oper);  //构造运算符栈
    OperPush(oper‘=‘);  //将“=“压到栈底
    while(a[i]!=‘=‘||OperGetTop(oper)!=‘=‘)
    {
        //对表达式a进行计算
        if(a[i]>=‘0‘&&a[i]<=‘9‘)
        {
            //字符是数字
      

评论

共有 条评论