⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.c.bak

📁 一个算计器的实现源码., 可以进行一般的运算
💻 BAK
字号:

/*
 * calculator.c               文件名
 * Original Author: zhough@ruijie.com.cn, 2007-8-15     最初作者,创建日期
 *   文件功能的简要说明
 * 
*

*/

#include <stdio.h>
#include <stdlib.h>       /* for atof() */
#include <ctype.h>




#define MAXOP 100      /* max size of operand or operator */
#define NUMBER '0'      /* signal that a number was found */
#define BUFSIZE 100
#define MAXVAL 100 /* maximum depth of val stack */


char buf[BUFSIZE]; /* buffer for ungetch */
int bufp = 0;
int sp = 0; /* next free stack position */
double val[MAXVAL]; /* value stack */

int getch(void);
void ungetch(int); /* getop: get next character or numeric operand */
int getop(char []); 
void push(double);
double pop(void);



main()
{
int type;
double op2;
char s[MAXOP];

while ((type = getop(s)) != EOF) 
	{
     switch (type) 
		 	{
           case NUMBER:
                  push(atof(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 '%':
                    op2=pop();
                    if(op2!=0.0)
                        push(fmod( pop(), pop2));  
                     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;
}


/* push: push f onto value stack */
void push(double f)
{
if (sp < MAXVAL)
val[sp++] = f;
else
printf("error: stack full, can't 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;
   }
}



/* getop: get next character or numeric operand */
  int getop(char s[])
 {
   int i, c;
   while ((s[0] = c = getch()) == ' ' || c == '\t')
              ;
    s[1] = '\0';
   if (!isdigit(c) && c != '.')
      return c; /* not a number */
    i = 0;
   if (isdigit(c)) /* collect integer part */
   while (isdigit(s[++i] = c = getch()))
            ;
   if (c == '.') /* collect fraction part */
 
   while (isdigit(s[++i] = c = getch()))
            ;
   s[i] = '\0';
   if (c != EOF)
   ungetch(c);
   return NUMBER;
 }


    void ungetch(int c) /* push character back on input */
   {
     if (bufp >= BUFSIZE)
       printf("ungetch: too many characters\n");
     else
       buf[bufp++] = c;
   }


    int getch(void) /* get a (possibly pushed-back) character */
   {
         return (bufp > 0) ? buf[--bufp] : getchar();
   }





















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -