第20届国际C语言代码大赛《科学计算器》代码分析
见: http://blog.csdn.net/liangbch/article/details/7514743
总的说来,这个递归的小程序是超级复杂,要想完全分析清楚,绝非易事。这里只能找出关键点,来各个击破。
1. 在程序中,经常看见连续的~,在该程序中,偶数个~等于与0,可删除之,奇数个波浪线等于-1,不可删除。
2. 对于表达的分析部分,对于 函数名称 与数学函数的映射,是通过一个hash函数来完成的。其等价的哈希函数如下
int math_func_hash(char ch)
{
char c=(ch * (int) 11 / 26 + 222 / 31 ) & 15;
int b=(ch % 21 + 7) % 9 * (3 * 367 >> c & 1);
return b;
}
在这个函数中,26个小写英文字母(也包括‘-’和‘/’)字母与key的映射关系如下
a->2,
b->3,
c->4,
p->5,
y->5,
q->6,
z->6,
f->7,
i->7,
g->8,
j->8,
'-’-> 1
'/' -> 3
其余字母,统统映射为0,当key为0时,不做任意处理。这个hash表是经过精心设计的。以下几个函数和运算符号中,每个函数中仅仅有一个字母的key不为0,且这几个字母(key值不为0的字母)对应的key互不相同,这样,函数名和key就建立起一个一一映射。根据key的值决定那个数学函数。
key=1,调用'-',
key=2,调用'tan'函数,
key=3,调用'/‘
key=4,调用'cos‘
key=5,调用'exp‘
key=6,调用'sqrt‘
key=7,调用'sin‘
key=8,调用'log‘.