鱼C论坛

 找回密码
 立即注册
查看: 2676|回复: 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这个函数里
  1. if(a<b)
  2.                 return '<';
  3.         if(a==b)
  4.                 return'=';
  5.         if(a>b)
  6.                 return '>';
复制代码
改成
  1. if(a<b)
  2.                 return '<';
  3.         else if(a==b)
  4.                 return'=';
  5.         else
  6.                 return '>';
复制代码
这样可以确定有返回值。虽然不改也可以正常运行,但这是一个比较好的习惯吧。

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

使用道具 举报

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

使用道具 举报

发表于 2014-4-22 22:49:44 | 显示全部楼层
改完了,几个简单的语法错误

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <stdlib.h>

  4. #define STACK_INIT_SIZE 100
  5. #define STACKINCREMENT  20
  6. #define MAXBUFFER       20


  7. typedef struct
  8. {
  9.     float *base;
  10.     float *top;
  11.     int stackSize;
  12. }FStack;

  13. typedef struct
  14. {
  15.         char *base;
  16.         char *top;
  17.         int stackSize;
  18. }CStack;

  19. FStack OPND;
  20. CStack OPTR;

  21. void InitStack_Float(FStack *s)
  22. {
  23.         s->base = (float *)malloc(STACK_INIT_SIZE * sizeof(float));
  24.         if( !s->base )
  25.                 exit(0);

  26.         s->top = s->base;
  27.         s->stackSize = STACK_INIT_SIZE;
  28. }

  29. void InitStack_Char(CStack *s)
  30. {
  31.         s->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
  32.       if( !s->base )
  33.                 exit(0);

  34.         s->top = s->base;
  35.         s->stackSize = STACK_INIT_SIZE;
  36. }

  37. void Push_F(FStack *s, float e)
  38. {
  39.         if( s->top - s->base >= s->stackSize )
  40.         {
  41.                 s->base = (float *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(float));
  42.                 if( !s->base )
  43.             exit(0);

  44.                 s->top = s->base + s->stackSize;
  45.                 s->stackSize = s->stackSize + STACKINCREMENT;
  46.         }

  47.         *(s->top) = e;     
  48.         s->top++;
  49. }

  50. void Push_C(CStack *s,char e)
  51. {
  52.         if( s->top - s->base >= s->stackSize )
  53.         {
  54.                 s->base = (char *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(char));
  55.                 if( !s->base )
  56.             exit(0);

  57.                 s->top = s->base + s->stackSize;
  58.                 s->stackSize = s->stackSize + STACKINCREMENT;
  59.         }

  60.         *(s->top) = e;     
  61.         s->top++;
  62. }

  63. void Pop_F(FStack *s, float *e)
  64. {
  65.     if( s->top == s->base )
  66.         return;

  67.     *e = *--(s->top);   
  68. }

  69. void Pop_C(CStack *s, char *e)
  70. {
  71.     if( s->top == s->base )
  72.         return;

  73.     *e = *--(s->top);   
  74. }

  75. int in(char ch)
  76. {
  77.         return (ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
  78. }

  79. int StackLen(FStack s)
  80. {
  81.     return (s.top - s.base);
  82. }

  83. float GetTop_F(FStack s) //取栈顶元素
  84. {
  85.         float e;
  86.         if(s.top == s.base)
  87.         {
  88.                 return 0;
  89.         }
  90.         e = *(s.top - 1);
  91.         return e;
  92. }

  93. char GetTop_C(CStack s)
  94. {
  95.         char e;
  96.         if(s.top == s.base)
  97.         {
  98.                 return 0;
  99.         }
  100.         e = *(s.top - 1);
  101.         return e;
  102. }

  103. char Precede(char theta1,char theta2)  //运算符优先级
  104. {
  105.         int a,b;
  106.         switch(theta1)
  107.         {
  108.         case'=':
  109.                 a=0;
  110.                 break;
  111.         case'(':
  112.                 a=1;
  113.                 break;
  114.         case'+':
  115.         case'-':
  116.                 a=3;
  117.                 break;
  118.                 case'*':
  119.                 case'/':
  120.                 case'%':
  121.                 a=5;
  122.                 break;
  123.                 case')':
  124.                 a=6;
  125.                 break;
  126.         }
  127.         switch(theta2)
  128.         {
  129.         case'=':
  130.                 b=0;
  131.                 break;
  132.         case'(':
  133.                 b=6;
  134.                 break;
  135.                 case'+':
  136.                 case'-':
  137.                 b=2;
  138.                 break;
  139.         case'*':
  140.         case'/':
  141.         case'%':
  142.                 b=4;
  143.                 break;
  144.         case')':
  145.                 b=1;
  146.                 break;
  147.         }
  148.         if(a<b)
  149.                 return '<';
  150.         else if(a==b)
  151.                 return'=';
  152.         else
  153.                 return '>';

  154. }

  155. float Operators(float a,char c,float b)
  156. {
  157.         float value;
  158.         switch(c)
  159.         {
  160.         case'+':
  161.                 value = a + b;
  162.                 break;
  163.         case'-':
  164.                 value = a - b;
  165.                 break;
  166.         case'*':
  167.                 value = a * b;
  168.                 break;
  169.         case'/':
  170.                 value = a / b;
  171.                 break;
  172.         }
  173.         return value;
  174. }

  175. float EvalueteExpression()
  176. {
  177.         char c,theta,x;
  178.         float a,b;
  179.         c = getchar();
  180.         while(c!='#'||GetTop_C(OPTR)!='#')
  181.         {
  182.                 if(!in(c))
  183.                 {
  184.                         Push_F(&OPND,c);
  185.                         c = getchar();
  186.                 }
  187.                 else
  188.                 {
  189.                 switch(Precede(GetTop_C(OPTR),c))
  190.                 {
  191.                 case'<':
  192.                         Push_C(&OPTR,c);
  193.                         c = getchar();
  194.                         break;
  195.                 case'=':
  196.                         Pop_C(&OPTR,&x);
  197.                         c = getchar();
  198.                         break;
  199.                 case'>':
  200.                         Pop_C(&OPTR,&theta);
  201.                         Pop_F(&OPND,&b);
  202.                         Pop_F(&OPND,&a);
  203.                         Push_F(&OPND,Operators(a,theta,b));
  204.                 }
  205.         }
  206.         
  207.         }
  208.         return GetTop_F(OPND);
  209. }

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 01:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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