飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2933|回复: 3

[C/C++] 小型计算器源码(VC6)CPP版

[复制链接]

该用户从未签到

发表于 2009-7-28 21:07:49 | 显示全部楼层 |阅读模式
大致就是这个样子的 属于Demo版 没有对输入做过多的检测

支持 + - * / ( )  输入格式如下:

0.GIF


  1. // mc.cpp : Defines the entry point for the console application.
  2. //
  3. //   小计算器逻辑演示程序
  4. //   NiCool 09.07.28
  5. //

  6. #include "stdafx.h"
  7. #include "stack.h"
  8. #include "string.h"
  9. #include <stdlib.h>
  10. #include <math.h>

  11. int SignTab[7][7]={
  12. //      +  -  *  /  (  )  #
  13. /* + */ 1, 1,-1,-1,-1, 1, 1,      
  14. /* - */ 1, 1,-1,-1,-1, 1, 1,
  15. /* * */ 1, 1, 1, 1,-1, 1, 1,        
  16. /* / */ 1, 1, 1, 1,-1, 1, 1,   
  17. /* ( */-1,-1,-1,-1,-1, 0, 2,   
  18. /* ) */ 1, 1, 1, 1, 1, 1, 1,   
  19. /* # */-1,-1,-1,-1,-1, 2, 0,   
  20. };

  21. double add(double a,double b){return a+b;}
  22. double sub(double a,double b){return a-b;}
  23. double mul(double a,double b){return a*b;}
  24. double divv(double a,double b){return a/b;}

  25. double (*f[])(double,double)={add,sub,mul,divv};

  26. Stack * spn;
  27. Stack * sps;

  28. char * strsign="+-*/()#.1234567890";
  29. char * strsign1="+-*/()#";

  30. int JiSuan(char * str)
  31. {
  32.     int i,j,k=0;
  33.     int nStrlen=strlen(str);
  34.     int nSignlen=strlen(strsign);
  35.     int nSignlen1=strlen(strsign1);

  36.     char buffer[50];
  37.     double fNum;
  38.     double fa,fb;

  39.     int nTrue;
  40.     int nSign;
  41.    

  42.     for(i=0;i<nStrlen;i++)
  43.     {
  44.         for(j=0;j<=nSignlen;j++)
  45.         {
  46.             if(*(str+i)==*(strsign+j))
  47.             {
  48.                 if(j<nSignlen1)
  49.                 {
  50.                     *(buffer+k)='\0';
  51.                     k=0;
  52.                     if(*buffer)
  53.                     {
  54.                         fNum=atof(buffer);
  55.                         Push(spn,fNum);
  56.                     }
  57.                     nTrue=1;
  58.                     while(nTrue)
  59.                     {
  60.                         GetTop(sps,&fNum);              // 这里一定要用double的变量来取值
  61.                         nSign=SignTab[(int)fNum][j];
  62.                         switch(nSign)
  63.                         {
  64.                             case -1:
  65.                                 {
  66.                                     Push(sps,(double)j);
  67.                                     nTrue=0;
  68.                                     break;
  69.                                 }
  70.                             case 0:
  71.                                 {
  72.                                     Pop(sps,&fNum);
  73.                                     nTrue=0;
  74.                                     break;
  75.                                 }
  76.                             case 1:
  77.                                 {
  78.                                     if(IsEmpty(spn))  // 对符号的检测方法一
  79.                                     {
  80.                                         printf("err spn empty!");
  81.                                         return 0;
  82.                                     }
  83.                                     Pop(spn,&fb);
  84.                                     if(IsEmpty(spn))
  85.                                     {
  86.                                         printf("err spn empty!");
  87.                                         return 0;
  88.                                     }
  89.                                     Pop(spn,&fa);
  90.                                     if(IsEmpty(sps))
  91.                                     {
  92.                                         printf("err sps empty!");
  93.                                         return 0;
  94.                                     }
  95.                                     Pop(sps,&fNum);
  96.                                     // 除0的检测
  97.                                     if((int)fNum==3 && (int)fb==0)
  98.                                     {
  99.                                         printf("err /0!");
  100.                                         return 0;
  101.                                     }
  102.                                     Push(spn,f[(int)fNum](fa,fb));
  103.                                     break;
  104.                                 }
  105.                             case 2:
  106.                                 {
  107.                                     printf("err !");
  108.                                     return 0;
  109.                                 }
  110.                         }
  111.                     }
  112.                     break;
  113.                 }
  114.                 if(j>=nSignlen1)
  115.                 {
  116.                     *(buffer+k++)=*(str+i);
  117.                     break;
  118.                 }
  119.             }
  120.             if(j==nSignlen) // 特殊符号的处理
  121.             {
  122.                 printf("err '%c' \r\n",*(str+i));
  123.                 return 0;
  124.             }
  125.         }
  126.     }

  127.     if(IsEmpty(sps))
  128.     {
  129.         GetTop(spn,&fNum);
  130.         printf(" = %.2f ",fNum);
  131.     }
  132.     else
  133.     {
  134.         printf("err last!");
  135.         return 0;
  136.     }
  137.     return 1;
  138. }

  139. int main(int argc, char* argv[])
  140. {
  141.     char str[100];
  142.     char * strend="#";
  143.     spn=CreateStack(50);
  144.     if(!spn)return 0;
  145.     sps=CreateStack(50);
  146.     if(!sps)return 0;
  147.     scanf("%99s",str);
  148.     strcat(str,strend);
  149.     Push(sps,(double)6);
  150.     JiSuan(str);
  151.     DestroyStack(spn);
  152.     DestroyStack(sps);
  153.     return 0;
  154. }
复制代码
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-11-16 14:28
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2009-7-28 21:09:19 | 显示全部楼层
    我也发下我的垃圾代码!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-7-29 22:31:21 | 显示全部楼层
    膜拜。c++程序设计语言第六章那计算器都还没看懂..
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-11-16 14:28
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2009-7-29 22:34:56 | 显示全部楼层
    小明又在装嫩了!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表