/*
程式檔名 : 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", '%');
}
留言列表