找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2696|回复: 0
打印 上一主题 下一主题
收起左侧

C语言计算器代码

[复制链接]
跳转到指定楼层
楼主
ID:295949 发表于 2018-5-5 17:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
里面是我平常写的计算器代码
是上个假期不值得作业
运行没啥问题
也有注释
没有啥特别的希望可以帮助大家

单片机源程序如下:
  1. include <stdio.h>  
  2. #include <stdlib.h>  
  3. #define LEN 100  
  4. #define FLOAT 30///这两个参数控制表达式最大长度  
  5. unsigned char left;  
  6. unsigned char right;///括号起始和结束  
  7. int opverify( char*s)///检查运算符是否有错误的函数  
  8. {  
  9.     unsigned char i,flagl=0,flagr=0;  
  10.     int a;  
  11.     for(i=0;i<LEN;i++)  
  12.     {  
  13.         if(s[i]==43||s[i]==45)  
  14.         {  
  15.             flagr=0;  
  16.             for(a=i+1;a<LEN;a++)            ///右边有数字  
  17.             {  
  18.                 if(s[a]==46||(s[a]>=48&&s[a]<=57)||s[a]==40)  
  19.                 {  
  20.                     flagr=1;  
  21.                     break;  
  22.                 }  
  23.                 if(s[a]==42||s[a]==47||s[a]==41)  
  24.                 {  
  25.                     return i;  
  26.                 }  
  27.             }  
  28.             if(flagr==0)  
  29.                 return i;  
  30.         }  
  31.         if(s[i]==42||s[i]==47)  
  32.         {  
  33.             flagl=0;flagr=0;  
  34.             for(a=i-1;i>=0;a--)          ///左边有数字  
  35.             {  
  36.                 if(s[a]==46||(s[a]>=48&&s[a]<=57)||s[a]==41)  
  37.                 {  
  38.                     flagl=1;  
  39.                     break;  
  40.                 }  
  41.                 if(s[a]==42||s[a]==47||s[a]==40)  
  42.                 {  
  43.                     return i;  
  44.                 }  
  45.             }  
  46.             for(a=i+1;a<LEN;a++)            ///右边有数字  
  47.             {  
  48.                 if(s[a]==46||(s[a]>=48&&s[a]<=57)||s[a]==40)  
  49.                 {  
  50.                     flagr=1;  
  51.                     break;  
  52.                 }  
  53.                 if(s[a]==42||s[a]==47||s[a]==41)  
  54.                 {  
  55.                     return i;  
  56.                 }  
  57.             }  
  58.             if(flagl==0||flagr==0)  
  59.                 return i;  
  60.         }  
  61.     }  
  62.     return -1;  
  63. }  
  64. int dotverify( char*s)///检查小数点是否有错误的函数  
  65. {  
  66.     unsigned char i,dotcount,numcount;  
  67.     for(i=0;i<LEN;i++)  
  68.     {  
  69.         if(s[i]==46||(s[i]>=48&&s[i]<=57))  
  70.         {  
  71.             dotcount=0;  
  72.             numcount=0;  
  73.             while(1)  
  74.             {  
  75.                 if(s[i]==46)  
  76.                     {  
  77.                         dotcount++;  
  78.                         i++;  
  79.                         continue;  
  80.                     }  
  81.                 if(s[i]>=48&&s[i]<=57)  
  82.                     {  
  83.                         numcount++;  
  84.                         i++;  
  85.                         continue;  
  86.                     }  
  87.                 break;  
  88.             }  
  89.             if(dotcount>1||numcount==0)  
  90.                 {  
  91.                     while(s[i]!=46)  
  92.                         i--;  
  93.                     return i;  
  94.                 }  
  95.         }  
  96.     }  
  97.     return -1;  
  98. }  
  99. int kuohaoverify( char*s)///检查括号是否有错误的函数  
  100. {  
  101.     unsigned char i;  
  102.     char wrongposition=0;  
  103.     int flag=0;  
  104.     for(i=0;i<LEN;i++)  
  105.     {  
  106.         if(i>0)  
  107.             if(s[i-1]==40&&s[i]==41)  
  108.             return wrongposition;  
  109.         if(s[i]==40)  
  110.             flag++;  
  111.         if(s[i]==41)  
  112.             flag--;  
  113.         if(flag<0)  
  114.             return wrongposition;  
  115.         if(s[i]!=0)  
  116.             wrongposition++;  
  117.     }  
  118.     if(flag==0)  
  119.         return -1;  
  120.     return wrongposition;  
  121. }  
  122. int kuohaolocater( char*s)///定位内层配对括号起点和终点  
  123. {  
  124.     unsigned char i;  
  125.     for(i=0;i<LEN;i++)  
  126.     {  
  127.         if(s[i]==40)  
  128.             left=i;  
  129.         if(s[i]==41)  
  130.         {  
  131.             right=i;  
  132.             return 1;  
  133.         }  
  134.   
  135.     }  
  136.     return 0;  
  137. }  
  138. void convert( char*s,float*num)///原始字符串分离成运算符和编号数组+浮点数组  
  139. {  
  140.     int source=LEN-1,target=LEN-2;  
  141.     unsigned char count=0;  
  142.     while(s[source]==0)  
  143.         source--;  
  144.     count=target-source;  
  145.     while(source>=0)  
  146.     {  
  147.         s[target]=s[source];  
  148.         target--;  
  149.         source--;  
  150.     }  
  151.     for(source=0;source<count;source++)  
  152.         s[source]=0;  
  153.     source=count;target=0;count=0;  
  154.     while(source<LEN)  
  155.     {  
  156.         if(s[source]==46||(s[source]>=48&&s[source]<=57))  
  157.         {  
  158.             num[count]=(float)atof(s+source);  
  159.             s[target]=48+count;  
  160.             count++;  
  161.             source++;  
  162.             target++;  
  163.             while(s[source]==46||(s[source]>=48&&s[source]<=57))  
  164.                 source++;  
  165.             continue;  
  166.         }  
  167.          if(s[source]==41&&(s[source+1]==46||(s[source+1]>=48&&s[source+1]<=57)))  
  168.         {  
  169.             s[target]=s[source];  
  170.             target++;  
  171.             source++;  
  172.             s[target]=42;  
  173.             target++;  
  174.             continue;  
  175.         }  
  176.         if(s[source]==40&&(s[source-1]==46||(s[source-1]>=48&&s[source-1]<=57)))  
  177.         {  
  178.             s[target]=42;  
  179.             target++;  
  180.         }  
  181.         s[target]=s[source];  
  182.         target++;  
  183.         source++;  
  184.     }  
  185.     for(source=target;source<LEN;source++)  
  186.         s[source]=0;  
  187. }  
  188. void signprocess(char *s,float*num)///运算符处理函数,负责处理符号以及处理一些不标准的写法  
  189. {  
  190.     unsigned char flagl;  
  191.     int a,i;  
  192.     for(i=right;i>=left;i--)  
  193.     {  
  194.         if(s[i]==43||s[i]==45)  
  195.         {  
  196.             flagl=0;  
  197.             for(a=i-1;a>=left;a--)          ///zuobianyoushuzi  
  198.             {  
  199.                 if(s[a]>=48)  
  200.                 {  
  201.                     flagl=1;  
  202.                     break;  
  203.                 }  
  204.                 if(s[a]>=40&&s[a]<=47)  
  205.                 {  
  206.                     break;  
  207.                 }  
  208.             }  
  209.             if(flagl==0)  
  210.             {  
  211.                 if(s[i]==43)  
  212.                     s[i]=0;  
  213.                 if(s[i]==45)  
  214.                 {  
  215.                     s[i]=0;  
  216.                     for(a=i+1;;a++)  
  217.                     if(s[a]>=48)  
  218.                     {  
  219.                         num[s[a]-48]=-num[s[a]-48];  
  220.                         break;  
  221.                     }  
  222.                 }  
  223.             }  
  224.         }  
  225.     }  
  226. }  
  227. void multipledivide(char *s,float*num)///乘除法计算函数  
  228. {  
  229.     unsigned char i,flagl,flagr,a;  
  230.     for(i=left+1;i<right;i++)  
  231.     {  
  232.         if(s[i]==42||s[i]==47)  
  233.         {  
  234.             for(a=i+1;;a++)  
  235.               if(s[a]>=48)  
  236.                 {  
  237.                     flagr=s[a]-48;  
  238.                     break;  
  239.                 }  
  240.             for(a=i-1;;a--)  
  241.               if(s[a]>=48)  
  242.                 {  
  243.                     flagl=s[a]-48;  
  244.                     break;  
  245.                 }  
  246.             if(s[i]==42)  
  247.             {  
  248.                 num[flagr]=num[flagl]*num[flagr];  
  249.                 s[a]=0;  
  250.                 s[i]=0;  
  251.             }  
  252.             if(s[i]==47)  
  253.             {  
  254.                 num[flagr]=num[flagl]/num[flagr];  
  255.                 s[a]=0;  
  256.                 s[i]=0;  
  257.             }  
  258.         }  
  259.     }  
  260. }  
  261. void addminus(char*s,float*num)///加减法计算函数  
  262. {  
  263.     unsigned char i,flagl,flagr,a;  
  264.     for(i=left+1;i<right;i++)  
  265.     {  
  266.         if(s[i]==43||s[i]==45)  
  267.         {  
  268.             for(a=i+1;;a++)  
  269.               if(s[a]>=48)  
  270.                 {  
  271.                     flagr=s[a]-48;  
  272.                     break;  
  273.                 }  
  274.             for(a=i-1;;a--)  
  275.               if(s[a]>=48)  
  276.                 {  
  277.                     flagl=s[a]-48;  
  278.                     break;  
  279.                 }  
  280.             if(s[i]==43)  
  281.             {  
  282.                 num[flagr]=num[flagl]+num[flagr];  
  283.                 s[a]=0;  
  284.                 s[i]=0;  
  285.             }  
  286.             if(s[i]==45)  
  287.             {  
  288.                 num[flagr]=num[flagl]-num[flagr];  
  289.                 s[a]=0;  
  290.                 s[i]=0;  
  291.             }  
  292.         }  
  293.     }  
  294. }  
  295. void singlecacu(char*s,float*num)///中间层运算函数,不带括号的计算函数,可以处理无括号的表达式  
  296. {  
  297.     signprocess(s,num);  
  298.     printf("***正负号处理完毕***\n");  
  299.     multipledivide(s,num);  
  300.     printf("***乘除完毕***\n");  
  301.     addminus(s,num);  
  302.     printf("***加减完毕***\n");  
  303.     if(s[left]==40)  
  304.        {  
  305.             printf("***去括号***\n");  
  306.             s[left]=0;  
  307.        }  
  308.     if(s[right]==41)  
  309.         s[right]=0;///每次计算都将被处理的运算数、运算符、括号抹掉并在原位值写入本次计算结果,这样表达式越来越简。  
  310. }  
  311. void caculate (char*s,float*num)///顶层运算函数,循环调用括号查找和无括号计算函数,直到把括号消完  
  312. {  
  313.     while(kuohaolocater(s))  
  314.         singlecacu(s,num);  
  315.     left=0;right=LEN-1;  
  316.     singlecacu(s,num);  
  317. }  
  318. void display(char*s,float*num)///显示最终结果  
  319. {  
  320.     unsigned char i;  
  321.     for(i=0;i<LEN;i++)  
  322.         if(s[i]>=48)  
  323.         {  
  324.             printf("结果:%f",num[s[i]-48]);  
  325.             break;  
  326.         }  
  327. }  
  328. int main()///注意不要使用中文括号和小数点  
  329. {  
  330.     char wrongposition;///表达式错误位置  
  331.     unsigned char i;  
  332.      char s[LEN];///STEP1:初始化部分开始  
  333.      for(i=0;i<LEN;i++)  
  334.     {  
  335.         s[i]=0;  
  336.     }  
  337.     float num[FLOAT];  
  338.     for(i=0;i<FLOAT;i++)  
  339.     {  
  340.         num[i]=0;  
  341.     }///初始化部分结束  
  342.     printf("输入表达式\n");  
  343.     scanf("%s",s);  
  344.     ///STEP2:表达式查错开始  
  345.     wrongposition=kuohaoverify(s);  
  346.     if(kuohaoverify(s)!=-1)  
  347.     {  
  348.        printf("括号错误\n位置:%d\n",wrongposition);  
  349.        return 0;  
  350.     }  
  351.     printf("括号检查完毕\n");  
  352.     wrongposition=dotverify(s);  
  353.     if(dotverify(s)!=-1)  
  354.     {  
  355.        printf("小数点错误\n位置:%d\n",wrongposition);  
  356.        return 0;  
  357.     }  
  358.     printf("小数点检查完毕\n");  
  359.     wrongposition=opverify(s);  
  360.     if(opverify(s)!=-1)  
  361.     {  
  362.        printf("运算符错误\n位置:%d\n",wrongposition);  
  363.        return 0;  
  364.     }  
  365.     printf("运算符检查完毕\n");  
  366.     ///表达式查错部分结束  
  367.     ///STEP3:开始处理表达式,数据与运算符分离  
  368.     convert(s,num);  
  369.     printf("%s\n",s);  
  370.     for(i=0;i<FLOAT;i++)  
  371.         printf("%f  ",num[i]);  
  372.     printf("\n***数据与运算符分离完毕***\n");  
  373.     printf("\n");  
  374.     ///表达式处理完成  
  375.     ///STEP4:开始计算  
  376.     caculate(s,num);  
  377.     display(s,num);  
  378.     return 0;  
  379. }  
复制代码

所有资料51hei提供下载:
计算器代码.rar (2.13 KB, 下载次数: 8)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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