鱼C论坛

 找回密码
 立即注册
查看: 5083|回复: 9

200行不到的代码,一个很强大的计算器,带括号的四则运算,左移,右移,按位操作

[复制链接]
发表于 2015-10-29 09:45:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 错过会难过 于 2015-10-31 10:13 编辑
  1. #include <iostream>
  2. using namespace std;

  3. #define INVALID                -0x7fffffff


  4. char *skipspace( char *p );
  5. int getnum( char **pp , int priority );


  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8.         int i;
  9.         char s[30] ="(1+2)*2+1", *p;

  10.         p = s;
  11.         i = getnum( &p , 9 );
  12.         if( i == INVALID ) {
  13.                 printf( "cuowu\n" );
  14.         }
  15.         else {
  16.                 printf("= %d = 0x%x\n" , i , i );
  17.         }
  18.         return 0;
  19. }
  20. char *skipspace( char *p )
  21. {
  22.         for( ; *p == ' '; p++ ) {}        /* スペースを読み飛ばす */
  23.         return p;
  24. }

  25. int getnum( char **pp , int priority )
  26. {
  27.         char *p = *pp;
  28.         int i = INVALID , j;
  29.         p = skipspace( p );

  30.         /* 単項演算子 */
  31.         if( *p == '+' ) {
  32.                 p = skipspace( p + 1 );
  33.                 i = getnum( &p , 0 );
  34.         }
  35.         else if( *p == '-' ) {
  36.                 p = skipspace( p + 1 );
  37.                 i = getnum( &p , 0 );
  38.                 if( i != INVALID ) {
  39.                         i = -i;
  40.                 }
  41.         }
  42.         else if( *p == '~' ) {
  43.                 p = skipspace( p + 1 );
  44.                 i = getnum( &p , 0 );
  45.                 if( i != INVALID ) {
  46.                         i = ~i;
  47.                 }
  48.         }
  49.         else if( *p == '(' ) {        /* かっこ */
  50.                 p = skipspace( p + 1 );
  51.                 i = getnum( &p , 9 );
  52.                 if( *p == ')' ) {
  53.                         p = skipspace( p + 1 );
  54.                 }
  55.                 else {
  56.                         i = INVALID;
  57.                 }
  58.         }
  59.         else if( '0' <= *p && *p <= '9' ) { /* 数値 */
  60.                 i = strtol( p , &p , 0 );
  61.         }
  62.         else { /* エラー */
  63.                 i = INVALID;
  64.         }

  65.         [hide]/* 二項演算子 */
  66.         for( ;; ) {
  67.                 if( i == INVALID ) {
  68.                         break;
  69.                 }
  70.                 p = skipspace( p );
  71.                 if( *p == '+' && priority > 2 ) {
  72.                         p = skipspace( p + 1 );
  73.                         j = getnum( &p , 2 );
  74.                         if( j != INVALID ) {
  75.                                 i += j;
  76.                         }
  77.                         else {
  78.                                 i = INVALID;
  79.                         }
  80.                 }
  81.                 else if( *p == '-' && priority > 2 ) {
  82.                         p = skipspace( p + 1 );
  83.                         j = getnum( &p , 2 );
  84.                         if( j != INVALID ) {
  85.                                 i -= j;
  86.                         }
  87.                         else {
  88.                                 i = INVALID;
  89.                         }
  90.                 }
  91.                 else if( *p == '*' && priority > 1 ) {
  92.                         p = skipspace( p + 1 );
  93.                         j = getnum( &p , 1 );
  94.                         if( j != INVALID ) {
  95.                                 i *= j;
  96.                         }
  97.                         else {
  98.                                 i = INVALID;
  99.                         }
  100.                 }
  101.                 else if( *p == '/' && priority > 1 ) {
  102.                         p = skipspace( p + 1 );
  103.                         j = getnum( &p , 1 );
  104.                         if( j != INVALID && j != 0 ) {
  105.                                 i /= j;
  106.                         }
  107.                         else {
  108.                                 i = INVALID;
  109.                         }
  110.                 }
  111.                 else if( *p == '%' && priority > 1 ) {
  112.                         p = skipspace( p + 1 );
  113.                         j = getnum( &p , 1 );
  114.                         if( j != INVALID && j != 0 ) {
  115.                                 i %= j;
  116.                         }
  117.                         else {
  118.                                 i = INVALID;
  119.                         }
  120.                 }
  121.                 else if( *p == '<' && p[1] == '<' && priority > 3 ) {
  122.                         p = skipspace( p + 2 );
  123.                         j = getnum( &p , 3 );
  124.                         if( j != INVALID && j != 0 ) {
  125.                                 i <<= j;
  126.                         }
  127.                         else {
  128.                                 i = INVALID;
  129.                         }
  130.                 }
  131.                 else if( *p == '>' && p[1] == '>' && priority > 3 ) {
  132.                         p = skipspace( p + 2 );
  133.                         j = getnum( &p , 3 );
  134.                         if( j != INVALID && j != 0 ) {
  135.                                 i >>= j;
  136.                         }
  137.                         else {
  138.                                 i = INVALID;
  139.                         }
  140.                 }
  141.                 else if( *p == '&' && priority > 4 ) {
  142.                         p = skipspace( p + 1 );
  143.                         j = getnum( &p , 4 );
  144.                         if( j != INVALID ) {
  145.                                 i &= j;
  146.                         }
  147.                         else {
  148.                                 i = INVALID;
  149.                         }
  150.                 }
  151.                 else if( *p == '^' && priority > 5 ) {
  152.                         p = skipspace( p + 1 );
  153.                         j = getnum( &p , 5 );
  154.                         if( j != INVALID ) {
  155.                                 i ^= j;
  156.                         }
  157.                         else {
  158.                                 i = INVALID;
  159.                         }
  160.                 }
  161.                 else if( *p == '|' && priority > 6 ) {
  162.                         p = skipspace( p + 1 );
  163.                         j = getnum( &p , 6 );
  164.                         if( j != INVALID ) {
  165.                                 i |= j;
  166.                         }
  167.                         else {
  168.                                 i = INVALID;
  169.                         }
  170.                 }
  171.                 else {
  172.                         break;
  173.                 }
  174.         }
  175.         p = skipspace( p );
  176.         *pp = p;
  177.         return i;
  178. }[/hide]

  179. 此代码是 <30天自制操作系统> 一书中提取出来的.
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-1 00:51:13 | 显示全部楼层
支持一个:lol::lol::lol::lol:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-29 13:10:24 | 显示全部楼层
过来看看  一起学习一起研究一下:smile:smile:smile:smile
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-1 09:47:31 | 显示全部楼层
我只是路过打酱油的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-5 15:13:54 From FishC Mobile | 显示全部楼层
看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-7 10:05:56 | 显示全部楼层

调试器单步了吗?不实践怎么出真知呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-21 00:54:06 | 显示全部楼层

看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-21 18:09:30 | 显示全部楼层
好东西
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 21:37:23 | 显示全部楼层
好东西,支持楼主
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-5 13:41:55 | 显示全部楼层
感谢分享!努力学习!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-13 11:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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