练习4-5 给计算器程序增加访问sin、exp与pow等库函数的操作。

来源:互联网 发布:禁止软件打开 编辑:程序博客网 时间:2024/06/03 19:20

利用math.h的sin、exp、pow函数;利用string.h的strcmp函数比较;利用ctype.h的函数islower判断是否是小写字母。

#include <stdio.h>#include <stdlib.h>#include <math.h>#define MAXOP 100#define NUMBER '0'#define NAME 'a'int getop(char []);void push(double);double pop(void);double mathfnc(char s[]);main(){    int type;    double op2;    char s[MAXOP];    while((type=getop(s))!=EOF){        switch(type){        case NUMBER:            push(atof(s));            break;        case NAME:            mathfnc(s);            break;        case '+':            push(pop()+pop());            break;        case '*':            push(pop()*pop());            break;        case '-':            op2=pop();            push(pop()-op2);            break;        case '/':            op2=pop();            if(op2!=0.0)                push(pop()/op2);            else                printf("error: zero divisor\n");            break;        case '\n':            printf("\t%.8g\n",pop());            break;        default:            printf("error: unknown command %s\n",s);            break;        }    }    return 0;}#define MAXVAL 100int sp=0;double val[MAXVAL];void push(double f){    if(sp<MAXVAL)        val[sp++]=f;    else        printf("error: stack full,can't push %g\n",f);}double pop(void){    if(sp>0)        return val[--sp];    else{        printf("error: stack empty\n");        return 0.0;    }}#include <string.h>double mathfnc(char s[]){    double op2;    if(strcmp(s,"sin")==0)        push(sin(pop()));    else if(strcmp(s,"cos")==0)        push(cos(pop()));    else if(strcmp(s,"exp")==0)        push(exp(pop()));    else if(strcmp(s,"pow")==0){         op2=pop();         push(pow(pop(),op2));    }    else    printf("error: %s not supported\n",s);}#include <ctype.h>int getch(void);void ungetch(int);int bufp=0;int getop(char s[]){    int i,c;    while((s[0]=c=getch())==' '||c=='\t')        ;    s[1]='\0';    if(!isdigit(c)&&c!='.'&&!islower(c))        return c;    i=0;    if(islower(c)){        while(islower(s[++i]=c=getch()))        ;        s[i]='\0';        if(c!=EOF)           ungetch(c);        return NAME;    }    if(isdigit(c))        while(isdigit(s[++i]=c=getch()))        ;    if(c=='.')        while(isdigit(s[++i]=c=getch()))        ;    s[i]='\0';    if(c!=EOF)        ungetch(c);    return NUMBER;}#define BUFSIZE 100char buf[BUFSIZE];int getch(void){    return (bufp>0)? buf[--bufp]:getchar();}void ungetch(int c){    if(bufp>=BUFSIZE)        printf("ungetch: too many characters\n");    else        buf[bufp++]=c;}

以上程序在text4.3的基础上改进,答案程序在练习4-4基础上改进,略有差别。

0 0
原创粉丝点击