小型计算器源码(VC6)CPP版
大致就是这个样子的 属于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={
// +-*/()#
/* + */ 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;
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];
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;
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;
} 我也发下我的垃圾代码! 膜拜。c++程序设计语言第六章那计算器都还没看懂.. 小明又在装嫩了!
页:
[1]