| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 507 人关注过本帖
标题:后缀表达式计算(逆波兰)的程序代码问题
取消只看楼主 加入收藏
touchsa
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-5-9
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
后缀表达式计算(逆波兰)的程序代码问题
我这有段完整可运行的C代码,是用来计算后缀表达式用的,但我看不太懂。每条代码后有我的注释和问题,希望有人帮忙回答。

介绍如下:
一般我们计算输入表达式是这样的,2+3 回车,结果为5
但是这段程序,输入是这样的,2 3 + 回车,结果还是为5;2 3 *回车,结果为6;2 3 / 回车,结果为0.666;2 3 pow 回车,结果为8。就相当于把计算符号放到数字后面了。

******************************************************************************************
******************************************************************************************
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<math.h>

typedef struct          //定义一个结构体
{
    char * opstr;          //定义一个字符指针
    double (* opfun)(double *);   //(* opfun)(double *)这是啥意思?
    int argc;                   //定义一个argc整型
}OP_MAP;                         //后缀是干啥的?

double my_add(double * data);   // 这定义的是啥变量,括号里定义了一个指针?
double my_sub(double * data);
double my_mul(double * data);
double my_div(double * data);
double my_sin(double * data);
double my_cos(double * data);
double my_pow(double * data);

OP_MAP map[] = {            //这是啥用法,定义一个数组?
    {"+",    my_add, 2},    //一个数组里{ }里加{ }的用法是怎样的?里面的内容是符号,符号英文,计算数字个数?
    {"-",    my_sub, 2},
    {"*",    my_mul, 2},
    {"/",    my_div, 2},
    {"sin",  my_sin, 1},
    {"cos",  my_cos, 1},
    {"pow",  my_pow, 2},
};

void cal(char * opstr, double * data, int * count);   //定义一个cal函数

int main()                     //主函数
{
    char str[1024], opstr[1024], *p, *pe; //定义数组str,opstr,指针p,指针pe
    double data[1024] = {0}, val;    //定义数组data第1024个数为0,还是全部为零?定义double变量val
    int count;   //定义整形变量count,干吗的?
   
    for(; gets(str) != NULL && *str != '\0'; printf("%f\n", data[count - 1]))//这个for循环开始,求详细注释指导!gets(str)是什么意思?*str呢?data[count-1]是最后的计算结果吗?
    for(count = 0, p = str;; p = pe)   //求每个变量含义的注释啊 T_T
    {
        while(isspace(*p)) p++;   //isspace,检查ch是否是空格符和跳格符(控制字符)或换行符
        if(*p == '\0') break;    //如果是'\0',跳出。‘\0’是啥意思,空格?还是0?
        val = strtod(p, &pe);   //strtod(将字符串转换成浮点数),怎么用的?
        if(p != pe)          //p和pe代表啥?
        {
            data[count++] = val; //干啥用的?
        }
        else
        {
            sscanf(p, "%s", opstr);   //sscanf,从一个字符串中读进与指定格式相符的数据,怎么读?
            pe = p + strlen(opstr);   //啥意思?
            cal(opstr, data, &count); //代入cal函数
        }
    }
   
    return 0;
}

void cal(char * opstr, double * data, int * count)  //cal函数定义
{
    int i, offset;//定义整型变量i,offset,后者代表啥?
    for(i = 0; i < sizeof(map) / sizeof(OP_MAP); i++)  //map是啥,上面那几个大括号么?
        if(strcmp(opstr, map[i].opstr) == 0)//opstr, map[i].opstr是啥,相等代表啥?
        {
            offset = *count - map[i].argc; //   啥减啥,等于啥?
            if(offset < 0) return;           //offset<0代表啥?
            data[offset] = map[i].opfun(data + offset);  //这是啥意思。
            *count = offset + 1;    //同上。。
        }
}

double my_add(double * data)   //这个是函数?怎么和前边联系起来。
{
    return data[0] + data[1];  //加法
}

double my_sub(double * data)   
{
    return data[0] - data[1];  //减法
}

double my_mul(double * data)
{
    return data[0] * data[1];  //乘法
}

double my_div(double * data)
{
    return data[0] / data[1];    //除法
}

double my_sin(double * data)
{
    return sin(data[0]);           //sin的计算,他咋实现sin计算的?是包括在<math.h>头文件里吗?
}

double my_cos(double * data)
{
    return cos(data[0]);       //cos的计算
}

double my_pow(double * data)      //指数运算
{
    return pow(data[0], data[1]);
}
搜索更多相关主题的帖子: 表达式 
2014-05-12 04:49
touchsa
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-5-9
收藏
得分:0 
回复 2 楼 kwxx
C课程
2014-05-13 16:06
touchsa
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-5-9
收藏
得分:0 
回复 3 楼 ying8501
恩好的
2014-05-13 16:07
touchsa
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-5-9
收藏
得分:0 
回复 4 楼 top398
恩谢谢~
2014-05-13 16:07
快速回复:后缀表达式计算(逆波兰)的程序代码问题
数据加载中...
 
   



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

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