m0_62746615 2022-11-02 20:34 采纳率: 85%
浏览 102
已结题

如何输入多组字符串数据

img

现在只能输入一组数据,输出一组数据
怎样才能
输入
5+(102)-6
8
(999+1)
1+5/(1-1)
7*2^3
输出
19
8000
INVALID
56

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#define MAXSIZE 100000

typedef struct
{
    float data[MAXSIZE];
    int top;
}number;

typedef struct
{
    char data[MAXSIZE];
    int top;
}sign;
void InitNumber(number* stack)
{
    stack->top = 0;
}
void GetTopNumber(number stack, float* e)
{
    if (stack.top == 0) return;
    else *e = stack.data[stack.top - 1];
}
void PushNumber(number* stack, float e)
{
    if (stack->top >= MAXSIZE) return;
    else stack->data[stack->top++] = e;
}

void PopNumber(number* stack, float* e)
{
    if (stack->top == 0) return;
    else *e = stack->data[--stack->top];
}

void InitSign(sign* stack)
{
    stack->top = 0;
}
void GetTopSign(sign stack, char* e)
{
    if (stack.top == 0) return;
    else *e = stack.data[stack.top - 1];
}

void PushSign(sign* stack, char e)
{
    if (stack->top >= MAXSIZE) return;
    else
    {
        stack->data[stack->top] = e;
        stack->top++;
    }
}
void PopSign(sign* stack, char* e)
{
    if (stack->top == 0) return;
    else *e = stack->data[--stack->top];
}
void Calculate(number* stack, char e)
{
    float num1, num2, result;
    PopNumber(stack, &num2);
    PopNumber(stack, &num1);
    switch (e)
    {
    case '+':
        result = num1 + num2;
        PushNumber(stack, result);
        break;
    case '-':
        result = num1 - num2;
        PushNumber(stack, result);
        break;
    case '*':
        result = num1 * num2;
        PushNumber(stack, result);
        break;
    case '/':
        if (num2 == 0) printf("INVALID");
        else
        {
            result = num1 / num2;
            PushNumber(stack, result);
            break;
        }
    case '^':
        result = pow(num1, num2);
        PushNumber(stack, result);
        break;
    }
}


number Num;
sign sig;
char expression[MAXSIZE];

int main()
{
    gets(expression);
    int length;
    length = strlen(expression);
    int i;
    float en, n;
    char es;
    InitNumber(&Num);
    InitSign(&sig);
    for (i = 0; i < length; i++)
    {
        if (expression[i] >= '0' && expression[i] <= '9')
        {
            n = expression[i] - '0';
            while (expression[i + 1] != '\0')
            {
                if (expression[i + 1] >= '0' && expression[i + 1] <= '9')
                {
                    n = n * 10 + expression[i + 1] - '0';
                    ++i;
                }
                else break;
            }
            PushNumber(&Num, n);
        }
        else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/' || expression[i] == '^' || expression[i] == '(' || expression[i] == ')')
        {
            switch (expression[i])
            {
            case '+':
                if (sig.data[sig.top - 1] != '+' && sig.data[sig.top - 1] != '-' && sig.data[sig.top - 1] != '*' && sig.data[sig.top - 1] != '/' && sig.data[sig.top - 1] != '^')
                    PushSign(&sig, '+');
                else
                {
                    while (sig.top > 0 && sig.data[sig.top - 1] != '(')
                    {
                        PopSign(&sig, &es);
                        Calculate(&Num, es);
                    }
                    PushSign(&sig, '+');
                }
                break;
            case '-':
                if (sig.data[sig.top - 1] != '+' && sig.data[sig.top - 1] != '-' && sig.data[sig.top - 1] != '*' && sig.data[sig.top - 1] != '/' && sig.data[sig.top - 1] != '^')
                    PushSign(&sig, '-');
                else
                {
                    while (sig.top > 0 && sig.data[sig.top - 1] != '(')
                    {
                        PopSign(&sig, &es);
                        Calculate(&Num, es);
                    }
                    PushSign(&sig, '-');
                }
                break;
            case '*':
                if (sig.data[sig.top - 1] != '*' && sig.data[sig.top - 1] != '/' && sig.data[sig.top - 1] != '^')
                    PushSign(&sig, '*');
                else
                {
                    while (sig.top > 0 && sig.data[sig.top - 1] != '(')
                    {
                        PopSign(&sig, &es);
                        Calculate(&Num, es);
                    }
                    PushSign(&sig, '*');
                }
                break;
            case '/':
                if (sig.data[sig.top - 1] != '*' && sig.data[sig.top - 1] != '/' && sig.data[sig.top - 1] != '^')
                    PushSign(&sig, '/');
                else
                {
                    while (sig.top > 0 && sig.data[sig.top - 1] != '(')
                    {
                        PopSign(&sig, &es);
                        Calculate(&Num, es);
                    }
                    PushSign(&sig, '/');
                }
                break;
            case '^':
                if (sig.data[sig.top - 1] != '^')
                    PushSign(&sig, '^');
                else
                {
                    while (sig.top > 0 && sig.data[sig.top - 1] != '(')
                    {
                        PopSign(&sig, &es);
                        Calculate(&Num, es);
                    }
                    PushSign(&sig, '^');
                }
            case '(':
                PushSign(&sig, '(');
                break;
            case ')':
                while (sig.data[sig.top - 1] != '(')
                {
                    PopSign(&sig, &es);
                    Calculate(&Num, es);
                }
                PopSign(&sig, &es);
            }
        }
    }
    while (sig.top > 0)
    {
        PopSign(&sig, &es);
        Calculate(&Num, es);
    }
    GetTopNumber(Num, &en);
    
    printf("%.0f\n", en);
    return 0;
}




而且好多输出是错的
求指正

  • 写回答

3条回答 默认 最新

  • 关注

    计算器程序。
    运行结果:

    img

    代码修改如下:

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define STACK_INIT_SIZE 1000 //存储空间初始分配量 
    #define STACKINCREMENT 100 //分配增量
    typedef int Status;
    typedef char ElemType;
    typedef int Datatype;  //数据类型
    typedef struct {
        ElemType* base;
        ElemType* top;
        int stacksize;
    }OPTRStack;
    
    typedef struct {
        Datatype* base;
        Datatype* top;
        int stacksize;
    }OPNDStack;
    
    //定义幂函数
    int pow_m(int a, int b)
    {
        int s = 1;
        int i = 0;
        for (i = 0; i < b; i++)
            s *= a;
        return s;
    }
    
    Status InitStackOPTR(OPTRStack& s) {
        s.base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
        if (!s.base) {
            exit(1);
        }
        s.top = s.base;
        s.stacksize = STACK_INIT_SIZE;
        return 0;
    }//
    
    Status InitStackOPND(OPNDStack& s) {
        s.base = (Datatype*)malloc(STACK_INIT_SIZE * sizeof(Datatype));
        if (!s.base) {
            exit(1);
        }
        s.top = s.base;
        s.stacksize = STACK_INIT_SIZE;
        return 0;
    }//
    
    ElemType GetTopOPTR(OPTRStack s) {//获取栈顶元素 
        ElemType e;
        if (s.top == s.base) {
            return 0;
        }
        e = *(s.top - 1);
        return e;
    }
    
    Datatype GetTopOPND(OPNDStack s) {//获取栈顶元素 
        Datatype e;  //MOD  
        if (s.top == s.base) {
            return 0;
        }
        e = *(s.top - 1);
        return e;
    }
    
    
    void PushOPTR(OPTRStack& s, ElemType e) {//插入元素e为新的栈顶元素 
    
        if (s.top - s.base >= s.stacksize) {//如果栈满,扩充空间 
            s.base = (ElemType*)realloc(s.base, (s.stacksize + STACKINCREMENT) * sizeof(ElemType));
            if (!s.base) {
                exit(1);
            }
            s.top = s.base + s.stacksize;
            s.stacksize += STACKINCREMENT;
        }
        *s.top++ = e;//赋值后栈顶指针+1 
    }
    
    void PushOPND(OPNDStack& s, Datatype e) {//插入元素e为新的栈顶元素   
    
        if (s.top - s.base >= s.stacksize) {//如果栈满,扩充空间 
            s.base = (Datatype*)realloc(s.base, (s.stacksize + STACKINCREMENT) * sizeof(Datatype));
            if (!s.base) {
                exit(1);
            }
            s.top = s.base + s.stacksize;
            s.stacksize += STACKINCREMENT;
        }
        *s.top++ = e;//赋值后栈顶指针+1 
    }
    ElemType PopOPTR(OPTRStack& s) {//删除栈顶元素 
        ElemType e;
        if (s.top == s.base) {
            return 1;
        }
        e = *--s.top;//栈顶指针-1,给e赋值 
        return 0;
    }
    
    Status PopOPND(OPNDStack& s) {//删除栈顶元素 
        Datatype e;
        if (s.top == s.base) {
            return 1;
        }
        e = *--s.top;//栈顶指针-1,给e赋值 
        return 0;
    }
    
    Status In_sign(ElemType c) {
        if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '[' || c == ']' || c == '^')
            return 1;
        else
            return 0;
    }
    Status In_Num(ElemType e) {
        if (e >= '0' && e <= '9')
            return 1;
        else
            return 0;
    }
    Status Precede(ElemType op) {//存储函数的优先级
        switch (op) {
        case'+':
        case'-':
            return 1;
        case'*':
        case'/':
            return 2;
        case'^':
            return 3;
        case'(':
        case'[':
            return 4;
        case')':
        case']':
            return 0;
        }
    }
    
    Status arity(ElemType x) {//存储运算符的元数
        switch (x) {
        case'+':
        case'-':
        case'*':
        case'/':
        case'^':
            return 2;
        case'(':
        case')':
        case'[':
        case']':
            return 0;
        }
    }
    Datatype Operate(Datatype a, ElemType x, Datatype b) {//进行运算的函数 
        if (arity(x) == 2) {
            switch (x) {
            case '+':
                return a + b;
            case '-':
                return a - b;
            case '*':
                return a * b;
            case '/':
                return a / b;
            case'^':
                return pow_m(a, b);
            }
        }
    }//Operate
    
    Status check(ElemType left, ElemType right) {
        if (left == '(' && right == ')')
            return 1;
        else if (left == '[' && right == ']')
            return 1;
        else
            return 0;
    }//判断括号
    
    Status emptyOPND(OPNDStack s) {
        if (s.top == s.base || s.top < s.base)
            return 0;
        else
            return 1;
    }//判断栈是否为空
    
    Status emptyOPTR(OPTRStack s) {
        if (s.top == s.base || s.top < s.base)
            return 0;
        else
            return 1;
    }//判断栈是否为空
    
    //计算一条表达式
    int CaculateAll(char* s) {
        OPTRStack OPTR, BRACKETS;//OPTR:运算符栈 OPND:运算数栈 BRACKETS:括号栈
        OPNDStack OPND;
        ElemType theta;
        InitStackOPTR(OPTR);
        InitStackOPND(OPND);
        InitStackOPTR(BRACKETS);
        Status len, n;
        
        len = strlen(s);
        s[len] = '#';
        len++;
        Status i;
        Datatype a, b, c = 0;
        for (i = 0; i < len; i++) {
            if (s[i] == '(' || s[i] == '[') {
                PushOPTR(BRACKETS, s[i]);
            }
            else if (s[i] == ')' || s[i] == ']') {
                if (check(GetTopOPTR(BRACKETS), s[i]) == 1) {
                    PopOPTR(BRACKETS);
                }
                else
                {
                    //printf("ERROR_02"); //括号不匹配
                    return 0;
                }
            }
        }//判断括号是否匹配
        for (i = 0; i < len - 1; i++) {
            if (In_sign(s[i]) == 0 && In_Num(s[i]) == 0 && s[i] != '.') {
                //printf("ERROR_02"); //输入非法
                return 0;
            }//判断是否是数字和运算符号
        }
        i = 0;
        if (s[0] == '+' || s[0] == '-' || s[0] == '*' || s[0] == '/' || s[0] == '^' /* || s[0] == '.'*/) {
            //printf("ERROR_02");
            return 0;
        }
        while (s[i] != '#') {
            Datatype x = 0;
            if (In_Num(s[i]) == 1) {
                while (s[i] >= '0' && s[i] <= '9') {
                    x *= 10;
                    x += s[i++] - '0';
                }
                /*if (s[i] == '.') {  //小数部分
                    double d = 0.1;
                    i++;
                    while (s[i] >= '0' && s[i] <= '9') {
                        x += ((s[i] - '0') * d);
                        d *= 0.1;
                        i++;
                    }
                }*/
                PushOPND(OPND, x);
                continue;
            }
            else {
                ElemType theta = s[i];
                while (emptyOPTR(OPTR) == 1 && Precede(GetTopOPTR(OPTR)) >= Precede(s[i])) {
                    if (arity(GetTopOPTR(OPTR)) == 2) {
                        a = GetTopOPND(OPND);
                        PopOPND(OPND);
                        b = GetTopOPND(OPND);
                        PopOPND(OPND);
                        if (a == 0 && GetTopOPTR(OPTR) == '/')
                        {
                            printf("INVALID\n");
                            return 0;
                        }
                        c = Operate(b, GetTopOPTR(OPTR), a);
                        PushOPND(OPND, c);
                        PopOPTR(OPTR);
                    }
                    else {
                        break;
                    }
                }
                if (Precede(theta) == 0 && Precede(GetTopOPTR(OPTR)) == 4) {
                    PopOPTR(OPTR);
                }
                if (Precede(theta) != 0) {
                    PushOPTR(OPTR, theta);
                }
                i++;
            }
        }
        while (emptyOPTR(OPTR) == 1) {
            a = GetTopOPND(OPND);
            PopOPND(OPND);
            b = GetTopOPND(OPND);
            PopOPND(OPND);
            if (a == 0 && GetTopOPTR(OPTR) == '/')
            {
                printf("INVALID\n");
                return 0;
            }
            c = Operate(b, GetTopOPTR(OPTR), a);
            PushOPND(OPND, c);
            PopOPTR(OPTR);
        }
        printf("%d\n", GetTopOPND(OPND));
        return 1;
    }
    
    int main()
    {
        char all[100][100] = { 0 }; //保存所有的公式 ,长度根据需要调整
        int nmb = 0, i = 0;
        while (scanf("%s", all[nmb]) != EOF)
            nmb++;
        for (i = 0; i < nmb; i++)
            CaculateAll(all[i]);
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月8日
  • 已采纳回答 11月3日
  • 修改了问题 11月3日
  • 创建了问题 11月2日

悬赏问题

  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗