close

/*
 程式檔名 : dc.c         (仿unix命令dc, 後置式計算機)
 功能說明 : desk caculator
 initial coding by Mike Wang
 設 計 者 :  (筆名)王駿(Mike Wang)
 免費參考: This library is free software.

Example1:Type '2 3* 4 5* +p' for computing '(2*3)+(4*5)'

註: unix命令 "dc" 的功能可以計算出 100! (=100*99*98*...*3*2*1),

       有興趣者可以設計看看.

*/


#include
#include
double cdecl sqrt(double);
#define MAXSTACK 200
int stack;
main()
{
 char c;
 int nflag, i;
 long num, nn[MAXSTACK+1], z[26];
 /*msg();*/
 for(i=0;i<26;i++) z[i] = 0L;
 stack = 0;
 num = 0L;
 nflag = 0;
 while(c=getchar()) {
  if(c>='0' && c<='9') {
   num = num * 10L + (long)(c - '0');
   nflag = 1;
   continue;
  }
  else switch(nflag) {
    case 1:
     if(!overflow())
      nn[++stack] = num;
     num = 0L;
     break;
    case 2:
     if(c>='a'&&c<='z'&&stack>=0) {
      z[c-'a'] = nn[stack];
      stack--;
      nflag = 0;
      continue;
     }
     break;
    case 3:
     if(c>='a'&&c<='z') {
      if(!overflow())
       nn[++stack] = z[c-'a'];
      nflag = 0;
      continue;
     }
     break;
   }
  nflag = 0;

  switch(c) {
  case '+':
   if(stack > 1) {
    stack--;
    nn[stack] += nn[stack+1];
   }
   break;
  case '-':
   if(stack > 1) {
    stack--;
    nn[stack] -= nn[stack+1];
   }
   break;
  case '*':
   if(stack > 1) {
    stack--;
    nn[stack] *= nn[stack+1];
   }
   break;
  case '/':
   if(stack > 1) {
    stack--;
    nn[stack] /= nn[stack+1];
   }
   break;
  case '%':
   if(stack > 1) {
    stack--;
    nn[stack] %= nn[stack+1];
   }
   break;
  case 'v':
   if(stack > 0) {
    printf("sqrt(%ld) = %f\n",
     nn[stack], sqrt((double)nn[stack]));
   }
   break;
  case '^':
   if(stack > 1) {
    stack--;
    num = 1L;
    for(i=0;i     nn[stack] = num;
    num = 0L;
   }
   break;
  case 'p':
   printf("nn[%02d]=%9ld\n",
    stack, nn[stack]);
   break;
  case 'd':
   if(stack > 0) {
    if(!overflow()) {
     stack++;
     nn[stack] = nn[stack-1];
    }
   }
   break;
  case 'f':
   for(i=1;i<=stack;i++) printf("nn[%02d]=%9ld\n",
    i, nn[i]);
   num = 0L;
   for(i=1;i<=stack;i++) num += nn[i];
   printf("----------------\n");
   printf("sum   =%9ld\n", num);
   num = 0L;
   break;
  case 'c':
   stack = 0;
   break;
  case 's':
   nflag = 2;
   break;
  case 'l':
   nflag = 3;
   break;
  case '?':
   msg();
   break;
  case 'q':
   exit(0);
  }
 }
}
overflow()
{
 if(stack < MAXSTACK) return(0);
 printf("\tStack over flow !\7\n");
 return(-1);
}
msg()
{
 printf("\n\n\
========= desk caculator =========\n\
0~9 push a number into stack\n\
+ add nn[stack] to nn[stack-1], stack = stack - 1;\n\
- sub\n\
* mult\n\
/ devide\n\
%c remain\n\
^ power\n\
v print sqrt(nn[stack])\n\
d duplicates\n\
p print last\n\
f print all & sum\n\
c clear\n\
sa~sz save into buffer\n\
la~lz load from buffer\n\
? print this message\n\
q quit\n\
=========== by Mike Wang ==========\n", '%');
}

arrow
arrow
    全站熱搜

    tools241 發表在 痞客邦 留言(0) 人氣()