问题:想输入二位数程序该如何改正,完整代码如下#include <stdio.h>

问题:想输入二位数程序该如何改正,现在输入10-1=输出为-59,完整代码如下

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 100    //顺序栈存储空间的初始分配址
#define OK  1
#define ERROR  0
#define OVERFLOW -2

typedef int  Status;
typedef char SElemType;

typedef struct
{
    char *base;      //栈底指针
    char *top;       //栈顶指针
    int stacksize;   //栈可用的最大容量
}SqStack;

Status InitStack(SqStack *S);//构造一个空栈s
Status Push(SqStack *S,char e);//插入元素e为新的栈顶元素
Status Pop(SqStack *S,char *e);//删除s的栈顶元素,用e返回其值
SElemType GetTop(SqStack S);//返回s的栈顶元素,不修改栈顶指针
Status In(char e);//判断读入字符是否为运算符
SElemType Precede(char a,char b);//比较运算符的优先级,a为纵轴值,b为横轴值
int Operate(int i,char theta,int j);//计算a(theta)b结果
char EvaluateExpression();//算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作数栈

int main()
{
    printf("%d",EvaluateExpression());
    return 0;
}

Status InitStack(SqStack *S)
{//构造一个空栈s
    S->base=(char *)malloc(MAXSIZE*sizeof(char));//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
    if(!S->base) exit(OVERFLOW);         //存储分配失败
    S->top=S->base;            //top初始为base,空栈
    S->stacksize=MAXSIZE;     //stacksize置为栈的最大容量MAXSIZE
    return OK;
}

Status Push(SqStack *S,char e)
{//插入元素e为新的栈顶元素
    if(S->top-S->base==S->stacksize) return ERROR;    //栈满
    *S->top++=e;           //元素e压入栈顶,栈顶指针加1
    return OK;
}

Status Pop(SqStack *S,char *e)
{//删除s的栈顶元素,用e返回其值
    if(S->top==S->base) return ERROR;   //栈空
    *e=*--S->top;    //栈顶指针减1,将栈顶元素赋给e
    return OK;
}     

SElemType GetTop(SqStack S)
{//返回s的栈顶元素,不修改栈顶指针
    if(S.top!=S.base)   //栈非空
    return *(S.top-1);   //返回栈顶元素的值,栈顶指针不变
}

Status In(char e) 
{//判断读入字符是否为运算符
    if(e=='+'||e=='-'||e=='*'||e=='/'||e=='('||e==')'||e=='=')
        return OK;//是
    else
        return ERROR;//不是
}

SElemType Precede(char a,char b) 
{//比较运算符的优先级,a为纵轴值,b为横轴值
    char f;
    if(a=='+'||a=='-')
    {
        if(b=='+'||b=='-'||b==')'||b=='=')
        f='>';
        else if(b=='*'||b=='/'||b=='(')
        f='<';
    }
    else if(a=='*'||a=='/')
    {
        if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='=')
        f='>';
        else if(b=='(')
        f='<';
    }
    else if(a=='(')
    {
        if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(')
        f='<';
        else if(b==')')
        f='=';
    }
    else if(a==')')
    {
        if(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='=')
        f='>';
    }
    else if(a=='=')
    {
        if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(')
        f='<';
        else if(b=='=')
        f='=';
    }
    return f;
}

int Operate(int i,char theta,int j) 
{//计算a(theta)b结果
    int result;
    switch(theta)   {
        case '+': result = i + j; break;
        case '-': result = i - j; break;
        case '*': result = i * j; break;
        case '/': result = i / j; break;
    }
    return result;
}
char EvaluateExpression()
{//算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作数栈
    SqStack OPND,OPTR;
    int ch,ch1; //把读入的字符转换为整数型,即ASCII表值
    char a,b,theta,x; //ch为当前读入字符, theta为运算符,x仅仅只是变量寄存弹出值,对计算表达式无影响
    InitStack(&OPND); //初始化OPND栈,寄存操作数和运算结果
    InitStack(&OPTR); //初始化OPTR栈,寄存运算符
    Push(&OPTR,'=');
    ch=getchar();
    while(ch!='='||GetTop(OPTR)!='=')
    {
        
        if(!In(ch))//ch不是运算符则进OPND栈
        {
            ch1=getchar();
            if(ch1>'9'||ch1<'0')  {Push(&OPND,ch-'0'); ch=ch1;
            }
            if(ch1>='0' && ch1<='9') {ch=10*(ch-'0')+(ch1-'0'); Push(&OPND,ch-'0'); ch=getchar();
            }
        }
        else
        {
            switch(Precede(GetTop(OPTR),ch))
            {//优先级选择
            case '<':
                Push(&OPTR,ch);
                ch=getchar();
                break;
            case '>':
                Pop(&OPTR,&theta);
                Pop(&OPND,&b);
                Pop(&OPND,&a);
                Push(&OPND,Operate(a,theta,b));
                break;
            case '=':
                Pop(&OPTR,&x);
                ch=getchar();
                break;
            }
        }
    }
    return GetTop(OPND);
}

四则运算可以看看这个,支持多位数、小数:https://blog.csdn.net/jerbo/article/details/130639967

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/889846
  • 以下回答由chatgpt基于相关博客总结生成:

    修改建议: 问题出在程序中读入了两位数时的处理,需要对输入的两位数做特殊的处理。我们可以使用scanf函数,通过对输入数字的格式进行限制,从而达到正确读入两位数的目的。具体实现方法是在格式串之前加上%2d,这样程序就会正确读取两位数。

    以下是修改后的代码:

    include

    int main() { int a, b; printf("请输入两个数字:"); scanf("%2d-%2d", &a, &b); printf("你输入的数字是 %d 和 %d\n", a, b); printf("它们的和是 %d\n", a + b); return 0; }

    注意,%2d 表示最多只读取两个数字。如果输入的不是两位数,scanf函数会停止读取,剩余的数字会留在输入缓冲区中,下一次读取时会继续读取,需要注意清空输入缓冲区。

    另外,如果输入的数字可能会超过99,可以使用int类型来存储,scanf函数会自动识别输入的数字类型并进行转换。