1、第一章:一些数学函数的其他实现方法函数名称 函数说明 实现方法max(a,b) 取 a 和 b 中的较大者 max(A,B)=(A+B+|A-B|)/2max(a,b,c) 取 a,b,c 中最大者 max(a,b,c)=max(a,max(b,c)min(a,b) 取 a 和 b 中的较小者 min(A,B)=(A+B-|A-B|)/2min(a,b,c) 取 a,b,c 中最小者 min(a,b,c)=min(a,min(b,c)sgn(x)当 x 为正数时 sgn(x)为 1,当x 为负数时 sgn(x)为-1,当x=0 时 sgn(x)=0。注意不适合绝对值小于 10-85 的数sgn
2、(X)=X/(|X|+1*10-99)sgnerr(x)当 x 为正数时 sgnerr(x)为1,当 x 为负数时 sgnerr(x)为-1,当 x=0 时出现 Math Errorsgnerr(X)=X/|X|ispositive(x)当 x 为正数时 ispositive(x)为 1,当 x 为负数或零时ispositive(x)为 0ispositive(x)=max(0,sgn(x)isnotnegative(x)当 x 为正数或 0 时isnotnegative(x)为 1,当 x为负数时 isnotnegative(x)为 0isnotnegative(x)=min(0,sgn(x
3、)+1int(x)取 x 的整数部分,只适用于非负数 int(X)=(1+X*10-14-1)*1014 frac(x) 取 x 的小数部分 frac(x)=x-int(x)RanInt(A,B)产生从 A(包含)到 B(不含)的随机整数 RandInt(A,B)=A+int(Ran#*(B-A)第二章:电脑程序的 ES 风格编程具有多样化的特点,例如要实现同一个功能可以使用不同的语句,以 C+为例: 1. int a=1;复制代码1. int a;2. a=1;复制代码以上这两个语句的功能完全一样但是具体编程的时候究竟采用哪种方式取决于程序员编程的风格。我们这一章的目的就是介绍一下 ES 风
4、格我们下面就以 C+为例,用例子说明什么叫 ES 风格:一、循环语句基本格式:中断语句+死循环1.前置判断标准程序: 1. 1.int a=0,b=0; 2. while(a0)/死循环4. sqrt(100-x);/中断语句5. a+;6. b=b+a;7. 复制代码然后单步执行语句,直到调试器报告出错,要想知道 b 是多少在调试器中看。2.后置判断标准程序 1. int a=0;2. int b;3. do4. a+;5. b=b+a;6. while(a0)/死循环4. a+;5. b=b+a;6. sqrt(100-a);/中断语句7. 复制代码然后单步执行语句,直到调试器报告出错,要
5、想知道 b 是多少在调试器中看。二、条件赋值语句1.条件赋值if(条件) y=x;转换为 y=(x-y)*条件+y标准程序: 1. if(a0) y=x;2. if(a=0) y=x;3. if(b0)4. y=x;5. c=x;6. 复制代码ES 风格的程序: 1. y=(x-y)*ispositive(a)+y2. y=(x-y)*isnotnegative(a)+y3. y=(x-y)*ispositive(b)+y4. c=(x-c)*ispositive(b)+c复制代码看到这里,大家可能要问,干吗这么麻烦?这是因为要使用计算器进行编程,ES 风格的电脑编程是必备的素质。2.逻辑运算
6、(与或非)与用乘,或用加,非用 2(条件)-1标准程序 1. !(x-30)2. x3 3. int main()4. int a=0;5. int b;6. while(a0) b=b+a;8. a=a+1;9. 10. cout2. #include 3. using std:cout;4. using std:abs();5. using std:sqrt();6. int sgn(double);7. double max(double,double);8. int ispositive(double);9. int main()10. int a=0;11. int b;12. wh
7、ile(10)13. sqrt(100-a);14. b=a*ispositive(a-b/2)+b;15. a=a+1;16. cout0)4. sqrt(100-a);5. b=a*ispositive(a-b/2)+b;6. a=a+1;7. coutbendl;8. 复制代码首先要做的事就是给 a 和 b 赋值为 0其次就是要把 ispositive(x)转换为计算器能识别的语言:ispositive(x)=max(0,sgn(x)=(0+sgn(x)+|0-sgn(x)|)/2=(sgn(x)+|sgn(x)|)/2=(x(|x|+110-99)+|x(|x|+110-99)|)/2
8、然后把 ispositive(x)代入表达式 b=a*ispositive(a-b/2)+b得 a(a-b2)(|(a-b2)|+110-99)+|(a-b2)(|(a-b2)|+110-99)|)2b所以,要输入计算器的表达式为:(100-a):a(a-b2)(|(a-b2)|+110-99)+|(a-b2)(|(a-b2)|+110-99)|)2b:a+1a输入完成后狂按等号键就行了第四章:经验技巧总结由于 ES 系列不是可编程计算器,所以 ES 系列编程后很多缺点:1.不能保存2.程序不能太长改进方法:灵活选择函数,例如当能保证 x0 时可以用 sgnerr(x)代替 sgn(x),因为
9、 sgnerr(x)比 sgn(x)更简捷3.要按的等号太多改进方法:乘零法,Pol-Rec 组合赋值法乘零法:改进前: 1. (100-A):sin(30A)+XX:A+1A复制代码改进后: 1. (100-A)0+sin(30A)+XX:A+1A复制代码少按了 100 次等号。Pol-Rec 组合赋值法:原理:Pol(x,y)将直角坐标转换成极坐标,其结果 r 是存在 X 里, 存在存储器 Y 里,Rec(r,)将极坐标转换成直角坐标,其结果 X 存在 X 里,Y 存在 Y 里,也就是说,执行这两个函数会进行赋值操作(而且同时进行两个!),于是可以将赋值语句集成到这两个函数中。例:改进前: 1. X+1X:Y+2Y复制代码改进后: 1. Rec(Pol(X+1,Y+2),Y)复制代码按等号的次数少了一半乘零法与 Pol-Rec 组合赋值法的综合应用实例:改进前: 1. (100-A):sin(30A)+XX:A+1A复制代码改进后: 1. (100-A)0+Rec(Pol(sin(30A)+X,Y),Y)0+A+1A复制代码按等号的次数少了三分之二4.运算速度慢改进方法:合理选用中断语句,例如排列组合就比根号运算速度快例:改进前: 1. (100-A):sin(30A)+XX:A+1A复制代码改进后: 1. (100-A)C1:sin(30A)+XX:A+1A复制代码