Nisy 发表于 2009-7-28 21:07:49

小型计算器源码(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;
}

evilknight 发表于 2009-7-28 21:09:19

我也发下我的垃圾代码!

boy 发表于 2009-7-29 22:31:21

膜拜。c++程序设计语言第六章那计算器都还没看懂..

evilknight 发表于 2009-7-29 22:34:56

小明又在装嫩了!
页: [1]
查看完整版本: 小型计算器源码(VC6)CPP版