| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1578 人关注过本帖
标题:一个简单的计算器程序
只看楼主 加入收藏
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
结帖率:96.43%
收藏
 问题点数:0 回复次数:2 
一个简单的计算器程序
这是别人写的一个简单的计算器,我看了半天,都会默写了,却还是看不懂,能不能讲一下原理

程序代码:
#include <stdio.h>
char token;

/*定义程序要使用到的一些函数*/
void match( char expectedToken ) /*对当前的标志进行匹配*/
{
    if( token == expectedToken ) token = getchar(); /*匹配成功,获取下一个标志*/
    else 
    {       
        printf("cannot match\n");
        exit(1); /*匹配不成功,退出程序*/
    }
}

int low( void )/*用于计算表达式中级别最低的运算*/
{
    int result = mid(); /*计算比加减运算优先级别高的部分*/
    while(( token == '+' ) || ( token == '-' ))
        if ( token == '+')
        {
            match('+');     /*进行加法运算*/
            result += mid();
            break;
        }
        else if ( token == '-')
        {
            match('-');    /*进行减法运算*/
            result -= mid(); 
            break;
        }
    return result;
}

int mid( void )/*用于计算表达式中级别较高的运算*/
{
    int div; /*除数*/
    int result = high();   /*计算比乘除运算优先级别高的部分*/
    while(( token == '*' ) || ( token == '/' ))
        if ( token == '*')
        {
            match('*');  /*进行乘法运算*/
            result *= high();
            break;    
        }
        else if (token == '/')
        {
            match('/');   /*进行除法运算*/
            div = high();
            if( div == 0 ) /*需要判断除数是否为0*/
            {
                printf( "除数为0.\n" );
                  exit(1);
            }
            result /= div; 
            break;
        }
    return result;
}

int high( void )/*用于计算表达式中级别最高的运算,即带()的运算*/
{
    int result; 
    if( token == '(' ) /*带有括号的运算*/
    {
        match( '(' );
        result = low();/*递归计算表达式*/
        match(')');
    }
    else if ( token>= '0'&&token<='9' ) /*实际的数字*/
    {
        ungetc( token, stdin ); /*将读入的字符退还给输入流,为读取整个数*/
        scanf( "%d", &result ); /*读出数字*/
        token = getchar();  /*读出当前的标志*/
    }
    else
    {
         printf("The input has unexpected char\n"); /*不是括号也不是数字*/
         exit(1);
    }
    return result;
}


main()
{   
    int result;  /*运算的结果*/                   
    printf("*****************************************\n");
    printf("**Welcome to use this simple calculator**\n"); 
    printf("**Please input a multinomial like      **\n");
    printf("**                    6-3*(5-1)/2+14/7 **\n");
    printf("*****************************************\n");
    token = getchar(); /*载入第一个符号*/
    
    result = low(); /*进行计算*/
    if( token == '\n' ) /* 是否一行结束 */
        printf( "The answer is : %d\n", result );
    else 
    {
        printf( "Unexpected char!");
        exit(1); /* 出现了例外的字符 */
    }
    scanf("%d",result);
    return 0;
}
搜索更多相关主题的帖子: token printf int 运算 result 
2019-02-18 16:05
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
突然发现这程序有个bug:连续加减或连续乘除时算不出来,已修复
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

void check_scanf_newtoken(char);
double low(void);
double mid(void);
double high(void);

char TOKEN;

int main(void)
{
    while (1)
    {
        while (isspace(TOKEN = getchar()));

        double result = low();

        if (TOKEN == '\n')
            printf("result = %g\n", result);
        else
            printf("格式错误\n");
    }

    system("pause");

    return 0;
}

void check_scanf_newtoken(char expectedtoken)
{
    if (TOKEN == expectedtoken)
        while (isspace(TOKEN = getchar()) && TOKEN != '\n');
    else
        exit(1);
}

double low(void)
{
    double result = mid();

    if (TOKEN == '+')
    {
        check_scanf_newtoken('+');
        result += low();
    }
    else if (TOKEN == '-')
    {
        check_scanf_newtoken('-');
        result -= low();
    }

    return result;
}

double mid(void)
{
    double result = high();

    if (TOKEN == '*')
    {
        check_scanf_newtoken('*');
        result *= mid();
    }
    else if (TOKEN == '/')
    {
        check_scanf_newtoken('/');
        double divisor = mid();
        if (divisor > -1e-6 && divisor < 1e-6)
            exit(1);
        result /= divisor;
    }

    return result;
}

double high(void)
{
    double result;

    if (TOKEN == '(')
    {
        check_scanf_newtoken('(');
        result = low();
        check_scanf_newtoken(')');
    }
    else if (TOKEN >= '0' && TOKEN <= '9')
    {
        ungetc(TOKEN, stdin);
        scanf("%lf", &result);
        check_scanf_newtoken(TOKEN);
    }
    else
        exit(1);

    return result;
}
2019-02-18 21:01
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
感觉多看些时间也能看明白,就这样吧
2019-02-18 21:01
快速回复:一个简单的计算器程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018892 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved