鱼C论坛

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

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

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

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

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

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

#define INVALID                -0x7fffffff


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


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

        p = s;
        i = getnum( &p , 9 );
        if( i == INVALID ) {
                printf( "cuowu\n" );
        }
        else {
                printf("= %d = 0x%x\n" , i , i );
        }
        return 0;
}
char *skipspace( char *p )
{
        for( ; *p == ' '; p++ ) {}        /* スペースを読み飛ばす */
        return p;
}

int getnum( char **pp , int priority )
{
        char *p = *pp;
        int i = INVALID , j;
        p = skipspace( p );

        /* 単項演算子 */
        if( *p == '+' ) {
                p = skipspace( p + 1 );
                i = getnum( &p , 0 );
        }
        else if( *p == '-' ) {
                p = skipspace( p + 1 );
                i = getnum( &p , 0 );
                if( i != INVALID ) {
                        i = -i;
                }
        }
        else if( *p == '~' ) {
                p = skipspace( p + 1 );
                i = getnum( &p , 0 );
                if( i != INVALID ) {
                        i = ~i;
                }
        }
        else if( *p == '(' ) {        /* かっこ */
                p = skipspace( p + 1 );
                i = getnum( &p , 9 );
                if( *p == ')' ) {
                        p = skipspace( p + 1 );
                }
                else {
                        i = INVALID;
                }
        }
        else if( '0' <= *p && *p <= '9' ) { /* 数値 */
                i = strtol( p , &p , 0 );
        }
        else { /* エラー */
                i = INVALID;
        }

        [hide]/* 二項演算子 */
        for( ;; ) {
                if( i == INVALID ) {
                        break;
                }
                p = skipspace( p );
                if( *p == '+' && priority > 2 ) {
                        p = skipspace( p + 1 );
                        j = getnum( &p , 2 );
                        if( j != INVALID ) {
                                i += j;
                        }
                        else {
                                i = INVALID;
                        }
                }
                else if( *p == '-' && priority > 2 ) {
                        p = skipspace( p + 1 );
                        j = getnum( &p , 2 );
                        if( j != INVALID ) {
                                i -= j;
                        }
                        else {
                                i = INVALID;
                        }
                }
                else if( *p == '*' && priority > 1 ) {
                        p = skipspace( p + 1 );
                        j = getnum( &p , 1 );
                        if( j != INVALID ) {
                                i *= j;
                        }
                        else {
                                i = INVALID;
                        }
                }
                else if( *p == '/' && priority > 1 ) {
                        p = skipspace( p + 1 );
                        j = getnum( &p , 1 );
                        if( j != INVALID && j != 0 ) {
                                i /= j;
                        }
                        else {
                                i = INVALID;
                        }
                }
                else if( *p == '%' && priority > 1 ) {
                        p = skipspace( p + 1 );
                        j = getnum( &p , 1 );
                        if( j != INVALID && j != 0 ) {
                                i %= j;
                        }
                        else {
                                i = INVALID;
                        }
                }
                else if( *p == '<' && p[1] == '<' && priority > 3 ) {
                        p = skipspace( p + 2 );
                        j = getnum( &p , 3 );
                        if( j != INVALID && j != 0 ) {
                                i <<= j;
                        }
                        else {
                                i = INVALID;
                        }
                }
                else if( *p == '>' && p[1] == '>' && priority > 3 ) {
                        p = skipspace( p + 2 );
                        j = getnum( &p , 3 );
                        if( j != INVALID && j != 0 ) {
                                i >>= j;
                        }
                        else {
                                i = INVALID;
                        }
                }
                else if( *p == '&' && priority > 4 ) {
                        p = skipspace( p + 1 );
                        j = getnum( &p , 4 );
                        if( j != INVALID ) {
                                i &= j;
                        }
                        else {
                                i = INVALID;
                        }
                }
                else if( *p == '^' && priority > 5 ) {
                        p = skipspace( p + 1 );
                        j = getnum( &p , 5 );
                        if( j != INVALID ) {
                                i ^= j;
                        }
                        else {
                                i = INVALID;
                        }
                }
                else if( *p == '|' && priority > 6 ) {
                        p = skipspace( p + 1 );
                        j = getnum( &p , 6 );
                        if( j != INVALID ) {
                                i |= j;
                        }
                        else {
                                i = INVALID;
                        }
                }
                else {
                        break;
                }
        }
        p = skipspace( p );
        *pp = p;
        return i;
}[/hide]

此代码是 <30天自制操作系统> 一书中提取出来的.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-1 00:51:13 | 显示全部楼层
支持一个:lol::lol::lol::lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-29 13:10:24 | 显示全部楼层
过来看看  一起学习一起研究一下:smile:smile:smile:smile
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-1 09:47:31 | 显示全部楼层
我只是路过打酱油的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-5 15:13:54 From FishC Mobile | 显示全部楼层
看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

调试器单步了吗?不实践怎么出真知呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-21 18:09:30 | 显示全部楼层
好东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 21:37:23 | 显示全部楼层
好东西,支持楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-5 13:41:55 | 显示全部楼层
感谢分享!努力学习!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 13:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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