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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3096|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

C語言計(jì)算器代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:295949 發(fā)表于 2018-5-5 17:21 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
里面是我平常寫的計(jì)算器代碼
是上個(gè)假期不值得作業(yè)
運(yùn)行沒啥問題
也有注釋
沒有啥特別的希望可以幫助大家

單片機(jī)源程序如下:
  1. include <stdio.h>  
  2. #include <stdlib.h>  
  3. #define LEN 100  
  4. #define FLOAT 30///這兩個(gè)參數(shù)控制表達(dá)式最大長度  
  5. unsigned char left;  
  6. unsigned char right;///括號(hào)起始和結(jié)束  
  7. int opverify( char*s)///檢查運(yùn)算符是否有錯(cuò)誤的函數(shù)  
  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++)            ///右邊有數(shù)字  
  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--)          ///左邊有數(shù)字  
  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++)            ///右邊有數(shù)字  
  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)///檢查小數(shù)點(diǎn)是否有錯(cuò)誤的函數(shù)  
  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)///檢查括號(hào)是否有錯(cuò)誤的函數(shù)  
  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)///定位內(nèi)層配對(duì)括號(hào)起點(diǎn)和終點(diǎn)  
  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)///原始字符串分離成運(yùn)算符和編號(hào)數(shù)組+浮點(diǎn)數(shù)組  
  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)///運(yùn)算符處理函數(shù),負(fù)責(zé)處理符號(hào)以及處理一些不標(biāo)準(zhǔn)的寫法  
  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)///乘除法計(jì)算函數(shù)  
  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)///加減法計(jì)算函數(shù)  
  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)///中間層運(yùn)算函數(shù),不帶括號(hào)的計(jì)算函數(shù),可以處理無括號(hào)的表達(dá)式  
  296. {  
  297.     signprocess(s,num);  
  298.     printf("***正負(fù)號(hào)處理完畢***\n");  
  299.     multipledivide(s,num);  
  300.     printf("***乘除完畢***\n");  
  301.     addminus(s,num);  
  302.     printf("***加減完畢***\n");  
  303.     if(s[left]==40)  
  304.        {  
  305.             printf("***去括號(hào)***\n");  
  306.             s[left]=0;  
  307.        }  
  308.     if(s[right]==41)  
  309.         s[right]=0;///每次計(jì)算都將被處理的運(yùn)算數(shù)、運(yùn)算符、括號(hào)抹掉并在原位值寫入本次計(jì)算結(jié)果,這樣表達(dá)式越來越簡。  
  310. }  
  311. void caculate (char*s,float*num)///頂層運(yùn)算函數(shù),循環(huán)調(diào)用括號(hào)查找和無括號(hào)計(jì)算函數(shù),直到把括號(hào)消完  
  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)///顯示最終結(jié)果  
  319. {  
  320.     unsigned char i;  
  321.     for(i=0;i<LEN;i++)  
  322.         if(s[i]>=48)  
  323.         {  
  324.             printf("結(jié)果:%f",num[s[i]-48]);  
  325.             break;  
  326.         }  
  327. }  
  328. int main()///注意不要使用中文括號(hào)和小數(shù)點(diǎn)  
  329. {  
  330.     char wrongposition;///表達(dá)式錯(cuò)誤位置  
  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.     }///初始化部分結(jié)束  
  342.     printf("輸入表達(dá)式\n");  
  343.     scanf("%s",s);  
  344.     ///STEP2:表達(dá)式查錯(cuò)開始  
  345.     wrongposition=kuohaoverify(s);  
  346.     if(kuohaoverify(s)!=-1)  
  347.     {  
  348.        printf("括號(hào)錯(cuò)誤\n位置:%d\n",wrongposition);  
  349.        return 0;  
  350.     }  
  351.     printf("括號(hào)檢查完畢\n");  
  352.     wrongposition=dotverify(s);  
  353.     if(dotverify(s)!=-1)  
  354.     {  
  355.        printf("小數(shù)點(diǎn)錯(cuò)誤\n位置:%d\n",wrongposition);  
  356.        return 0;  
  357.     }  
  358.     printf("小數(shù)點(diǎn)檢查完畢\n");  
  359.     wrongposition=opverify(s);  
  360.     if(opverify(s)!=-1)  
  361.     {  
  362.        printf("運(yùn)算符錯(cuò)誤\n位置:%d\n",wrongposition);  
  363.        return 0;  
  364.     }  
  365.     printf("運(yùn)算符檢查完畢\n");  
  366.     ///表達(dá)式查錯(cuò)部分結(jié)束  
  367.     ///STEP3:開始處理表達(dá)式,數(shù)據(jù)與運(yùn)算符分離  
  368.     convert(s,num);  
  369.     printf("%s\n",s);  
  370.     for(i=0;i<FLOAT;i++)  
  371.         printf("%f  ",num[i]);  
  372.     printf("\n***數(shù)據(jù)與運(yùn)算符分離完畢***\n");  
  373.     printf("\n");  
  374.     ///表達(dá)式處理完成  
  375.     ///STEP4:開始計(jì)算  
  376.     caculate(s,num);  
  377.     display(s,num);  
  378.     return 0;  
  379. }  
復(fù)制代碼

所有資料51hei提供下載:
計(jì)算器代碼.rar (2.13 KB, 下載次數(shù): 8)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人性视频免费网站 | 黄色高清视频 | 亚洲综合色网 | 伊人99 | 国产欧美一区二区三区久久人妖 | 欧美一区二区三区在线视频 | 精品中文字幕一区二区 | av免费看在线 | 精品视频一区二区三区四区 | 久久免费视频1 | 日韩欧美不卡 | ririsao久久精品一区 | 91久久婷婷 | 日韩精品999 | 精品一区二区三区中文字幕 | 久久激情av | 国产一区在线免费观看视频 | 色狠狠桃花综合 | 在线免费观看黄a | 日韩一及片 | 久久毛片 | 亚洲人成人一区二区在线观看 | 一区二区三区在线免费看 | 蜜月va乱码一区二区三区 | 最近中文字幕免费 | av在线成人 | 黄色成人免费看 | 午夜视频一区 | 人人干人人看 | 亚洲欧美国产毛片在线 | 在线欧美a| 国产一区二区三区四区三区四 | 午夜三级视频 | 国产91 在线播放 | 91麻豆精品国产91久久久久久 | 亚洲高清在线 | 夜夜夜夜夜夜曰天天天 | 99精品久久久久久 | 久久99精品久久久久子伦 | 亚洲午夜精品视频 | 二区成人 |