K & R использует 4.5 математических функций для задачи на польском обратном калькуляторе в C - PullRequest
0 голосов
/ 12 февраля 2019
#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, где-то что-то пошло не так и не будет работать вообще.Все входы идут для переключения -> default -> printf («ошибка: неизвестная команда DEFAULT% s \ n», s);

Я в полной потере.Пожалуйста, просветите меня.Большое спасибо.

1 Ответ

0 голосов
/ 12 февраля 2019

Я нашел, где я был не прав.

Это была эта строка.

if ((c != '.'&&c != '-') && (c == '+' || c == '*' || c == '/' || c == '%'))

Первоначально

if (!isdigit(c)&&(c != '.'&&c != '-'))

Я просто попробовал это без подсказки и нашелпроблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...