练习 4-10 另一种方法是通过 getline 函数读入整个输入行,这种情况下可以不使用 getch 与 ungetch 函数

#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAXOP 100
#define NUMBER 0
#define REFRESH -1
#define IDENTIFIE 1
#define MAXNAME 32
#define MAXARR 30


/*Stat creation 2017.11.5 */
struct variables{
   char names[MAXNAME];
   double val;
};
int getlines(char *s,int);
int charcyp(char *,char *);
void clearemptys2(struct variables *s);
void machfuncs(char *s,struct variables *t);
void variablecyps(struct variables *t,char *s);
void push(double);
double pop(void);


int indexs = 0; /*character string index*/
int pos = 0; /* array index */
struct variables last;


int main(void)
{
   int type;
   double op2;
   char s[MAXOP];
   char cyps[MAXOP];
   struct variables arrays[MAXARR];


   clearemptys2(arrays);
   while(getlines(s,MAXOP) > 0)
   {
      while((type = charcyp(s,cyps)) != REFRESH )
      {
 switch(type)
 {
 case NUMBER:
    push(atof(cyps));
    break;
 case IDENTIFIE:
         machfuncs(cyps,arrays);
  break;
 case '+':
         push(pop()+pop());
         indexs++;
    break;
 case '*':
    push(pop()*pop());
    indexs++;
    break;
 case '-':
         op2 = pop();
         push(pop()-op2);
         indexs++;
    break;
 case '/':
         op2 = pop();
    if(op2)
   push(pop()/op2);
    else
   printf("Error:divisior by zero!\n");
indexs++;
    break;
 case '%':
         op2 = pop();
         if(op2)
            push(fmod(pop(),op2));
         else
            printf("Error:division by zero!\n");
         indexs++;
         break;
 case '=':
         arrays[pos].val = pop();
         push(arrays[pos].val);
         indexs++;
         break;
      case '\n':
    last.val = pop();
         printf("\t%.8g\n",last.val);
         indexs++;
         break;
 case '~':
         clearemptys2(arrays);
indexs++;
         break;
      default:
         printf("Error: unknow command %s!\n",cyps);
         indexs++;
         break;
 }
 }
 indexs = 0;
   }


   return 0;
}


int getlines(char *s,int lim)
{
   int i,c;


   i = 0;
   while(i < lim -1 && (c = getchar()) != EOF && c != '\n' )
      s[i++] = c;
   if(c == '\n')
        s[i++] = c;
   s[i] = '\0';
   return i;
}
int charcyp(char *s,char *t)
{
    int i,c;


i = 0;
while(s[indexs] == ' ' || s[indexs] == '\t' )
  indexs++;
if(!isdigit(s[indexs]) && s[indexs] != '.' && s[indexs] != '-')
    {
  if(isalpha(s[indexs]))
  {
     while(isalpha(t[i] = s[indexs]))
 {
    i++;
indexs++;
 }
 t[i] = '\0';
 return IDENTIFIE;
  }
  if('\0' == s[indexs])
     return REFRESH;
  return s[indexs];
}
    if(s[indexs] == '-')
    {
  c = indexs;
  if(!isdigit(s[++c]) && s[c] != '.')
     return s[indexs];
       t[i]  = s[indexs];
  indexs++;
  i++;
    }
    if(isdigit(s[indexs]))
  while(isdigit(t[i] = s[indexs]))
       {
           i++;
           indexs++;
       }
    if(s[indexs] == '.')
    {
       t[i] = s[indexs];
       while(isdigit(t[++i] = s[++indexs]))
           ;
    }
    t[i] = '\0';
    return NUMBER;
}


void machfuncs(char *s,struct variables *t)
{
   double op;


   if(!strcmp(s,"sin"))
      push(sin(pop()));
   else if(!strcmp(s,"cos"))
      push(sin(pop()));
   else if(!strcmp(s,"exp"))
      push(exp(pop()));
   else if(!strcmp(s,"pow"))
   {
      op = pop();
      push(pow(pop(),op));
   }
   else
      variablecyps(t,s);
}


void variablecyps(struct variables *t1,char *s1)
{
   int i;


   i = 0;
   while(t1[i].names[0] != '\0' && i < MAXARR)
   {
      if(!strcmp(t1[i].names,s1))
 {
         pos = i;
    return ;
 }
      i++;
   }
   strcpy(t1[i].names,s1);
   strcpy(last.names,s1);
   pos = i;
}


void clearemptys2(struct variables *s)
{
   int i;


   for(i = 0; i < MAXNAME; i++)
   {
      s[i].names[0] = '\0';
      s[i].val = 0.0;
   }
}




#define MAXSTACK 100
double array[MAXSTACK];
int size = 0;


void push(double x)
{
   if(size >= MAXSTACK)
     printf("Error: Stack full,can't push %g\n",x);
   else
     array[size++] = x;
}
double pop(void)
{
   if(size > 0)
     return array[--size];
   else{
     printf("error: stack empty!\n");
     return 0.0;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值