zh080223 2022-11-09 15:53 采纳率: 83.3%
浏览 83
已结题

c语言计算器程序的问题

问题遇到的现象和发生背景

C语言计算器

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

typedef struct{
    int data[100];
    int top;
}StackData;

typedef struct{
    char symbol[100];
    int top;
}StackSymbol;

void InitData(StackData* pStackData);      
void InitSymbol(StackSymbol* pStackSymbol);     
void PushData(StackData* pStackData,int num);      
void PushSymbol(StackSymbol* pStackSymbol,char fuhao);
int GetData(StackData* pStackData);
char GetSymbol(StackSymbol* pStackSymbol);
int PopData(StackData* pStackData);
char PopSymbol(StackSymbol* pStackSymbol);
int Judge(char x);
int Culculate(int x1,int x2,char s);

void InitData(StackData* pStackData){
    pStackData->top=-1;
}

void InitSymbol(StackSymbol* pStackSymbol){
    pStackSymbol->top=-1;
}

void PushData(StackData* pStackData,int num){
    pStackData->top++;
    pStackData->data[pStackData->top]=num; 
}

void PushSymbol(StackSymbol* pStackSymbol,char fuhao){
    pStackSymbol->top++;
    pStackSymbol->symbol[pStackSymbol->top]=fuhao;
}

int GetData(StackData* pStackData){
    return pStackData->data[pStackData->top];
}

char GetSymbol(StackSymbol* pStackSymbol){
    return pStackSymbol->symbol[pStackSymbol->top];
}

int PopData(StackData* pStackData){
    int i;
    i=pStackData->data[pStackData->top];
    pStackData->top--;
    return i; 
}

char PopSymbol(StackSymbol* pStackSymbol){
    char a;
    a=pStackSymbol->symbol[pStackSymbol->top];
    pStackSymbol->top--;
    return a;
}

int Judge(char x){
    if(x=='('){
        return 1;
    }
    else if(x=='+'||x=='-'){
        return 2;
    }
    else if(x=='*'||x=='/'){
        return 3;
    }
    else if(x==')'){
        return 4;
    } 
}

int Culculate(int x1,int x2,char s){
    int result;
    switch(s){
        case '+':{
            result=x1+x2;
            break;
        }
        case '-':{
            result=x1-x2;
            break;
        }
        case '*':{
            result=x1*x2;
            break;
        }
        case '/':{
            result=x1/x2;
            break;
        }
    }
    return result;
}

int main(){
    StackData *data;
    StackSymbol *symbol;
    InitData(data);
    InitSymbol(symbol);
    int a=0,b=0,result=0,x1,x2;
    char y;
    char s[100]={0};
    char *str=(char *)malloc(sizeof(char)*200);
    while((y=getchar())!='\n'){
        str[a]=y;
        a++;
    }
    str[a]='\0';
    for(a=0;str[a]!='\0';a++){
        if(a==0&&str[a]=='-'){
            s[b++]=str[a];
        }
        else if(str[a]=='('&&str[a+1]=='-'){
            a++;
            s[b++]=str[a++];
            while(str[a]>='0'&&str[a]<='9'){
                s[b]=str[a];
                b++;
                a++;
            }
            PushData(data,atoi(s));
            while(b>0){
                s[b]=0;
                b--;
            }
            if(str[a]!=')'){
                a--;
                PushSymbol(symbol,'(');
            }
        }
        else if(str[a]>='0'&&str[a]<='9'){
            while(str[a]>='0'&&str[a]<='9'){
            s[b]=str[a];
            b++;
            a++;    
            }
            PushData(data,atoi(s));
            while(b>0){
                s[b]=0; 
                b--;
            }
            a--;
        }
        else{
            if(symbol->top==-1){
                PushSymbol(symbol,str[a]);
            }
            else if(Judge(str[a])==1){
                PushSymbol(symbol,str[a]);
            }
            else if(Judge(str[a])==2){
                if(Judge(GetSymbol(symbol))==1){
                    PushSymbol(symbol,str[a]);
                }
                else if(Judge(GetSymbol(symbol))==2){
                    while(symbol->top>=0&&data->top>=1){
                        x2=PopData(data);
                        x1=PopData(data);
                        result=Culculate(x1,x2,PopSymbol(symbol));
                        PushData(data,result);
                    }
                    PushSymbol(symbol,str[a]);
                }
                else if(Judge(GetSymbol(symbol))==3){
                    while(symbol->top>=0&&data->top>=1){
                        x2=PopData(data);
                        x1=PopData(data);
                        result=Culculate(x1,x2,PopSymbol(symbol));
                        PushData(data,result);
                    }
                    PushSymbol(symbol,str[a]);
                }
            }
            else if(Judge(str[a])==3){
                if(Judge(GetSymbol(symbol))==1){
                    PushSymbol(symbol,str[a]);
                }
                else if(Judge(GetSymbol(symbol))==2){
                    PushSymbol(symbol,str[a]);
                }
                else if(Judge(GetSymbol(symbol))==3){
                    while(symbol->top>=0&&data->top>=1){
                        x2=PopData(data);
                        x1=PopData(data);
                        result=Culculate(x1,x2,PopSymbol(symbol));
                        PushData(data,result);
                    }
                    PushSymbol(symbol,str[a]);
                }
            }
            else if(Judge(str[a])==4){
                do{
                    x2=PopData(data);
                    x1=PopData(data);
                    result=Culculate(x1,x2,PopSymbol(symbol));
                    PushData(data,result);
                }while(Judge(GetSymbol(symbol))!=1);
                PopSymbol(symbol);
            }
        }
    }
    free(str);
    while(symbol->top!=-1){
        x2=PopData(data);
        x1=PopData(data);
        result=Culculate(x1,x2,PopSymbol(symbol));
        PushData(data,result);
    }
    printf("%d",data->data[0]);
    return 0;
    
}
运行结果及报错内容

运行后直接结束,如何正常运行,并实现乘方和调试功能

  • 写回答

4条回答 默认 最新

  • 关注

    main函数中的data和symbol都没初始化,改成下面的

    StackData data;
    StackSymbol symbol;
    InitData(&data);
    InitSymbol(&symbol);
    
    

    PushData()等函数传参的时候,data都改成 &data , symbol都改成&symbol

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月18日
  • 已采纳回答 11月10日
  • 创建了问题 11月9日

悬赏问题

  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用