久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3096|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久亚洲视频 | 亚洲视频一区二区三区 | 亚洲欧美精 | 蜜桃传媒一区二区 | 亚洲欧洲精品在线 | 国产一区二区三区视频在线观看 | caoporn免费在线视频 | 午夜网| 日朝毛片 | 精品小视频 | 福利视频网| 一级免费黄色 | 性视频一区 | 91在线精品视频 | 国产精品国产亚洲精品看不卡15 | 成人精品一区二区三区中文字幕 | 亚洲成人中文字幕 | 一级二级三级黄色 | 91久久久久久久久久久 | 刘亦菲国产毛片bd | 91欧美精品成人综合在线观看 | 欧美一区二区三区 | 国产97久久 | 欧美在线视频一区二区 | 国产在线播 | 亚洲精品视频在线播放 | 国产精品视频yy9299一区 | 欧美色a v | 最近中文字幕第一页 | 99re视频这里只有精品 | 久久免费看 | 午夜爽爽爽男女免费观看 | 日韩成人精品在线 | 男人天堂手机在线视频 | 国产精品久久久久一区二区三区 | 成人一级黄色毛片 | 欧美mv日韩mv国产网站91进入 | 四虎伊人 | 亚洲精品一二三 | 久久精品一区二区三区四区 | 国产小视频在线观看 |