- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
大致就是这个样子的 属于Demo版 没有对输入做过多的检测
支持 + - * / ( ) 输入格式如下:
- // mc.cpp : Defines the entry point for the console application.
- //
- // 小计算器逻辑演示程序
- // NiCool 09.07.28
- //
- #include "stdafx.h"
- #include "stack.h"
- #include "string.h"
- #include <stdlib.h>
- #include <math.h>
- int SignTab[7][7]={
- // + - * / ( ) #
- /* + */ 1, 1,-1,-1,-1, 1, 1,
- /* - */ 1, 1,-1,-1,-1, 1, 1,
- /* * */ 1, 1, 1, 1,-1, 1, 1,
- /* / */ 1, 1, 1, 1,-1, 1, 1,
- /* ( */-1,-1,-1,-1,-1, 0, 2,
- /* ) */ 1, 1, 1, 1, 1, 1, 1,
- /* # */-1,-1,-1,-1,-1, 2, 0,
- };
- double add(double a,double b){return a+b;}
- double sub(double a,double b){return a-b;}
- double mul(double a,double b){return a*b;}
- double divv(double a,double b){return a/b;}
- double (*f[])(double,double)={add,sub,mul,divv};
- Stack * spn;
- Stack * sps;
- char * strsign="+-*/()#.1234567890";
- char * strsign1="+-*/()#";
- int JiSuan(char * str)
- {
- int i,j,k=0;
- int nStrlen=strlen(str);
- int nSignlen=strlen(strsign);
- int nSignlen1=strlen(strsign1);
- char buffer[50];
- double fNum;
- double fa,fb;
- int nTrue;
- int nSign;
-
- for(i=0;i<nStrlen;i++)
- {
- for(j=0;j<=nSignlen;j++)
- {
- if(*(str+i)==*(strsign+j))
- {
- if(j<nSignlen1)
- {
- *(buffer+k)='\0';
- k=0;
- if(*buffer)
- {
- fNum=atof(buffer);
- Push(spn,fNum);
- }
- nTrue=1;
- while(nTrue)
- {
- GetTop(sps,&fNum); // 这里一定要用double的变量来取值
- nSign=SignTab[(int)fNum][j];
- switch(nSign)
- {
- case -1:
- {
- Push(sps,(double)j);
- nTrue=0;
- break;
- }
- case 0:
- {
- Pop(sps,&fNum);
- nTrue=0;
- break;
- }
- case 1:
- {
- if(IsEmpty(spn)) // 对符号的检测方法一
- {
- printf("err spn empty!");
- return 0;
- }
- Pop(spn,&fb);
- if(IsEmpty(spn))
- {
- printf("err spn empty!");
- return 0;
- }
- Pop(spn,&fa);
- if(IsEmpty(sps))
- {
- printf("err sps empty!");
- return 0;
- }
- Pop(sps,&fNum);
- // 除0的检测
- if((int)fNum==3 && (int)fb==0)
- {
- printf("err /0!");
- return 0;
- }
- Push(spn,f[(int)fNum](fa,fb));
- break;
- }
- case 2:
- {
- printf("err !");
- return 0;
- }
- }
- }
- break;
- }
- if(j>=nSignlen1)
- {
- *(buffer+k++)=*(str+i);
- break;
- }
- }
- if(j==nSignlen) // 特殊符号的处理
- {
- printf("err '%c' \r\n",*(str+i));
- return 0;
- }
- }
- }
- if(IsEmpty(sps))
- {
- GetTop(spn,&fNum);
- printf(" = %.2f ",fNum);
- }
- else
- {
- printf("err last!");
- return 0;
- }
- return 1;
- }
- int main(int argc, char* argv[])
- {
- char str[100];
- char * strend="#";
- spn=CreateStack(50);
- if(!spn)return 0;
- sps=CreateStack(50);
- if(!sps)return 0;
- scanf("%99s",str);
- strcat(str,strend);
- Push(sps,(double)6);
- JiSuan(str);
- DestroyStack(spn);
- DestroyStack(sps);
- return 0;
- }
复制代码 |
|