鱼C论坛

 找回密码
 立即注册
查看: 2784|回复: 4

帮忙编译一下,只有一处错误但是找不到

[复制链接]
发表于 2014-4-21 21:42:25 | 显示全部楼层 |阅读模式
5鱼币
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT  20
#define MAXBUFFER       20


typedef struct
{
    float *base;
    float *top;
    int stackSize;
}FStack;

typedef struct
{
        char *base;
        char *top;
        int stackSize;
}CStack;

FStack OPND;
CStack OPTR;

void InitStack_Float(FStack *s)
{
        s->base = (float *)malloc(STACK_INIT_SIZE * sizeof(float));
        if( !s->base )
                exit(0);

        s->top = s->base;
        s->stackSize = STACK_INIT_SIZE;
}

void InitStack_Char(CStack *s)
{
        s->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
      if( !s->base )
                exit(0);

        s->top = s->base;
        s->stackSize = STACK_INIT_SIZE;
}

void Push_F(FStack *s, float e)
{
        if( s->top - s->base >= s->stackSize )
        {
                s->base = (float *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(float));
                if( !s->base )
            exit(0);

                s->top = s->base + s->stackSize;
                s->stackSize = s->stackSize + STACKINCREMENT;
        }

        *(s->top) = e;     
        s->top++;
}

void Push_C(CStack *s,char e)
{
        if( s->top - s->base >= s->stackSize )
        {
                s->base = (char *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(char));
                if( !s->base )
            exit(0);

                s->top = s->base + s->stackSize;
                s->stackSize = s->stackSize + STACKINCREMENT;
        }

        *(s->top) = e;     
        s->top++;
}

void Pop_F(FStack *s, float *e)
{
    if( s->top == s->base )
        return;

    *e = *--(s->top);   
}

void Pop_C(CStack *s, char *e)
{
    if( s->top == s->base )
        return;

    *e = *--(s->top);   
}

int in(char ch)
{
        return (ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}

int StackLen(FStack s)
{
    return (s.top - s.base);
}

float GetTop_F(FStack s) //取栈顶元素
{
        float e;
        if(s.top == s.base)
        {
                return 0;
        }
        e = *(s.top - 1);
        return e;
}

char GetTop_C(CStack s)
{
        char e;
        if(s.top == s.base)
        {
                return 0;
        }
        e = *(s.top - 1);
        return e;
}

char Precede(char theta1,char theta2)  //运算符优先级
{
        int a,b;
        switch(theta1)
        {
        case'=':
                a=0;
                break;
        case'(':
                a=1;
                break;
        case'+':
        case'-':
                a=3;
                break;
                case'*':
                case'/':
                case'%':
                a=5;
                break;
                case')':
                a=6;
                break;
        }
        switch(theta2)
        {
        case'=':
                b=0;
                break;
        case'(':
                b=6;
                break;
                case'+':
                case'-':
                b=2;
                break;
        case'*':
        case'/':
        case'%':
                b=4;
                break;
        case')':
                b=1;
                break;
        }
        if(a<b)
                return '<';
        if(a==b)
                return'=';
        if(a>b)
                return '>';
}

float Operators(float a,char c,float b)
{
        float value;
        switch(c)
        {
        case'+':
                value = a + b;
                break;
        case'-':
                value = a - b;
                break;
        case'*':
                value = a * b;
                break;
        case'/':
                value = a / b;
                break;
        }
        return value;
}

float EvalueteExpression()
{
        char c,theta,x;
        float a,b;
        c = getchar();
        while(c!='#'||GetTop_C(OPTR)!='#')
        {
                if(!in(c))
                {
                        Push_F(&OPND,c);
                        c = getchar();
                }
                else
                {
                switch(Precede(GetTop_C(OPTR),c))
                {
                case'<':
                        Push_C(&OPTR,c);
                        c = getchar();
                        break;
                case'=':
                        Pop_C(&OPTR,&x);
                        c = getchar();
                        break;
                case'>':
                        Pop_C(&OPTR,&theta);
                        Pop_F(&OPND,&b);
                        Pop_F(&OPND,&a);
                        Push_F(&OPND,Operators(a,theta,b));
                }
        }
        return GetTop_F(OPND);
}

int main()
{
        printf("请输入正确的表达式以'#'结尾:  \n");
        InitStack_Char(&OPTR);
        Push_C(&OPTR,'#');
        InitStack_Float(&OPND);
       
        printf("表达式结果为: %f",EvalueteExpression());
       
        return 0;
}


error C2143: syntax error : missing ';' before 'type'

最佳答案

查看完整内容

1. EvalueteExpression 这个函数 少了一个 } 2. EvalueteExpression 中 return GetTop_F(OPND);放到 }外面。目前你这个return是在while循环里的。 3. Precede这个函数里改成这样可以确定有返回值。虽然不改也可以正常运行,但这是一个比较好的习惯吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-21 21:42:26 | 显示全部楼层
1. EvalueteExpression 这个函数 少了一个 }

2. EvalueteExpression 中 return GetTop_F(OPND);放到 }外面。目前你这个return是在while循环里的。
3. Precede这个函数里
if(a<b)
                return '<';
        if(a==b)
                return'=';
        if(a>b)
                return '>';
改成
if(a<b)
                return '<';
        else if(a==b)
                return'=';
        else 
                return '>';
这样可以确定有返回值。虽然不改也可以正常运行,但这是一个比较好的习惯吧。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-22 12:11:57 | 显示全部楼层
没人啊!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-22 22:49:44 | 显示全部楼层
改完了,几个简单的语法错误
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT  20
#define MAXBUFFER       20


typedef struct
{
    float *base;
    float *top;
    int stackSize;
}FStack;

typedef struct
{
        char *base;
        char *top;
        int stackSize;
}CStack;

FStack OPND;
CStack OPTR;

void InitStack_Float(FStack *s)
{
        s->base = (float *)malloc(STACK_INIT_SIZE * sizeof(float));
        if( !s->base )
                exit(0);

        s->top = s->base;
        s->stackSize = STACK_INIT_SIZE;
}

void InitStack_Char(CStack *s)
{
        s->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
      if( !s->base )
                exit(0);

        s->top = s->base;
        s->stackSize = STACK_INIT_SIZE;
}

void Push_F(FStack *s, float e)
{
        if( s->top - s->base >= s->stackSize )
        {
                s->base = (float *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(float));
                if( !s->base )
            exit(0);

                s->top = s->base + s->stackSize;
                s->stackSize = s->stackSize + STACKINCREMENT;
        }

        *(s->top) = e;     
        s->top++;
}

void Push_C(CStack *s,char e)
{
        if( s->top - s->base >= s->stackSize )
        {
                s->base = (char *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(char));
                if( !s->base )
            exit(0);

                s->top = s->base + s->stackSize;
                s->stackSize = s->stackSize + STACKINCREMENT;
        }

        *(s->top) = e;     
        s->top++;
}

void Pop_F(FStack *s, float *e)
{
    if( s->top == s->base )
        return;

    *e = *--(s->top);   
}

void Pop_C(CStack *s, char *e)
{
    if( s->top == s->base )
        return;

    *e = *--(s->top);   
}

int in(char ch)
{
        return (ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}

int StackLen(FStack s)
{
    return (s.top - s.base);
}

float GetTop_F(FStack s) //取栈顶元素
{
        float e;
        if(s.top == s.base)
        {
                return 0;
        }
        e = *(s.top - 1);
        return e;
}

char GetTop_C(CStack s)
{
        char e;
        if(s.top == s.base)
        {
                return 0;
        }
        e = *(s.top - 1);
        return e;
}

char Precede(char theta1,char theta2)  //运算符优先级
{
        int a,b;
        switch(theta1)
        {
        case'=':
                a=0;
                break;
        case'(':
                a=1;
                break;
        case'+':
        case'-':
                a=3;
                break;
                case'*':
                case'/':
                case'%':
                a=5;
                break;
                case')':
                a=6;
                break;
        }
        switch(theta2)
        {
        case'=':
                b=0;
                break;
        case'(':
                b=6;
                break;
                case'+':
                case'-':
                b=2;
                break;
        case'*':
        case'/':
        case'%':
                b=4;
                break;
        case')':
                b=1;
                break;
        }
        if(a<b)
                return '<';
        else if(a==b)
                return'=';
        else
                return '>';

}

float Operators(float a,char c,float b)
{
        float value;
        switch(c)
        {
        case'+':
                value = a + b;
                break;
        case'-':
                value = a - b;
                break;
        case'*':
                value = a * b;
                break;
        case'/':
                value = a / b;
                break;
        }
        return value;
}

float EvalueteExpression()
{
        char c,theta,x;
        float a,b;
        c = getchar();
        while(c!='#'||GetTop_C(OPTR)!='#')
        {
                if(!in(c))
                {
                        Push_F(&OPND,c);
                        c = getchar();
                }
                else 
                {
                switch(Precede(GetTop_C(OPTR),c))
                {
                case'<':
                        Push_C(&OPTR,c);
                        c = getchar();
                        break;
                case'=':
                        Pop_C(&OPTR,&x);
                        c = getchar();
                        break;
                case'>':
                        Pop_C(&OPTR,&theta);
                        Pop_F(&OPND,&b);
                        Pop_F(&OPND,&a);
                        Push_F(&OPND,Operators(a,theta,b));
                }
        }
        
        }
        return GetTop_F(OPND);
}

int main(){
        printf("请输入正确的表达式以'#'结尾:  \n");
        InitStack_Char(&OPTR);
        Push_C(&OPTR,'#');
        InitStack_Float(&OPND);
        
        printf("表达式结果为: %f",EvalueteExpression());
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-23 20:41:03 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-1 20:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表