K&R练习4.5 math.h函数作用于C语言中的波兰语反向计算器问题

时间:2019-02-12 13:08:44

标签: c

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

#define MAXOP 100  /*Maximum number of operands and operators*/
#define NUMBER '0'   /*signal that a number was found*/
#define MATHLIB '1'

int getop(char[]);
void push(double);
double pop(void);

/*Reverse Polish Calculator*/
main()
{
int type;
double op2;
char s[MAXOP];

while ((type = getop(s)) != EOF)
{
    switch (type) {
    case NUMBER:
        push(atof(s));
        break;
    case MATHLIB:
        if (strcmp(s, "sin")==0)
            push(sin(pop()));
        else if (strcmp(s, "cos")==0)
            push(cos(pop()));
        else if (strcmp(s, "tan")==0)
            push(tan(pop()));
        else
            printf("Error: unknown command. (MATHLIB)");
        break;
    case '+':
        push(pop() + pop());
        break;
    case '-':
        op2 = pop();
        push(pop() - op2);
        break;
    case '*':
        push(pop()*pop());
        break;
    case '/':
        op2 = pop();
        if (op2 != 0.0)
            push(pop() / op2);
        else
            printf("Error: zero divisor\n");
        break;
    case '%':
        op2 = pop();
        if (op2 != 0.0)
            push(fmod(pop(),op2));
        else
            printf("Error: zero divisor\n");
        break;
    case '\n':
        printf("\t%.8g\n", pop());
        break;
    default:
        printf("error: unknown command DEFAULT %s\n", s);
        break;
    }
}
return 0;
}

#include <ctype.h>
#include <stdio.h>

#define NUMBER '0'
#define MATHLIB '1' 


int getch(void);
void ungetch(int);

/*getop : get next operator or numeric operand*/

int getop(char s[])
{
int i, c;

while ((s[0] = c = getch()) == ' ' || c == '\t')
    ;
s[1] = '\0';
if ((c != '.'&&c != '-')&&(c=='+'||c=='*'||c=='/'||c=='%'))    /*operand found*/
    return c;
i = 0;
if (isalpha(c))             //math function found.
{
    while (isalpha(s[++i] = c = getch()))
        ;
    s[i] = '\0';
    if (c != 'EOF')
        ungetch(c);
    return MATHLIB;
}
if (c == '-')
{
    if (!isdigit(c = getch()))
    {
        ungetch(c);
        return '-';
    }
    else
    {
        ungetch(c);
    }
}
if (isdigit(c))              /*number found*/
{                            
    {
        while (isdigit(s[++i] = c = getch()))
            ;
    }
    if (c == '.')
    {
        while (isdigit(s[++i] = c = getch()))
            ;
    }
    s[i] = '\0';
    if (c != EOF)
        ungetch(c);
    return NUMBER;
}

}

#include <stdio.h>
#define BUFSIZE 100

char buf[BUFSIZE];   /*buffer for ungetch*/
int bufp = 0;       /*next free position in buf*/

int getch(void)
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch(int c)
{
    if (bufp < BUFSIZE)
        buf[bufp++] = c;
    else
        printf("error:buffer full.\n");
}  

#include <stdio.h>
#define MAXVAL 100  /*maximum depth of val stack*/

int sp = 0;     /*next free stack position*/
double val[MAXVAL]; /*value stack*/

/*push : push f onto value stack*/

void push(double f)
{
    if (sp < MAXVAL)
        val[sp++] = f;
    else
        printf("error: stack full. cannot push %g\n", f);
}

/*pop: pop and return top value from stack*/
double pop(void)
{
    if (sp > 0)
        return val[--sp];
    else {
        printf("error: stack empty\n");
        return 0.0;
    }
}

我的道歉,用于不必要的长代码示例。我在编码方面还是很新的。 我尝试将它们放在单独的.c文件中以进行娱乐和练习。 问题是,在我针对ex 4-4进行修改之前,我的计算器工作正常。 然后,当我为ex 4.5对其进行修改时,添加了Math.h函数,例如sin,cos,tan, 某个地方出了问题,它根本无法运作。 所有输入都转到switch-> default-> printf(“错误:默认命令DEFAULT%s \ n”,s);

我全神贯注。 请赐教。 非常感谢。

1 个答案:

答案 0 :(得分:-1)

我发现我错了。

就是这一行。

config->app.php

原来是

config('app.jobTypes')

我只是毫无头绪地尝试了一下,然后发现了问题。