cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 21546|回复: 53

ES系列编程理论系统整理

[复制链接]
发表于 2009-10-17 21:22:50 | 显示全部楼层 |阅读模式
目录
第一章:一些数学函数的其他实现方法
第二章:电脑程序的ES风格
第三章:步入计算器
第四章:经验技巧总结
附录1:相关帖子索引
附录2:贡献者
多选投票: ( 最多可选 4 项 ), 共有 30 人参与投票 查看投票参与人
57.89% (22)
18.42% (7)
5.26% (2)
10.53% (4)
5.26% (2)
2.63% (1)
您所在的用户组没有投票权限

评分

参与人数 3金钱 +13 专家 +2 收起 理由
chsi + 1
xzxzxz + 3 期待。
991es82es + 10 + 1 好贴

查看全部评分

 楼主| 发表于 2009-10-17 21:23:11 | 显示全部楼层
第一章:一些数学函数的其他实现方法
函数名称函数说明实现方法
max(a,b)取a和b中的较大者
max(A,B)=(A+B+|A-B|)/2
max(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|)/2
min(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(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))+1
int(x)取x的整数部分,只适用于非负数int(X)=(1+X*10^-14-1)*10^14
frac(x)取x的小数部分frac(x)=x-int(x)
RanInt(A,B)产生从A(包含)到B(不含)的随机整数RandInt(A,B)=A+int(Ran#*(B-A))
待补充
回复

使用道具 举报

 楼主| 发表于 2009-10-17 21:23:33 | 显示全部楼层
第二章:电脑程序的ES风格
编程具有多样化的特点,例如要实现同一个功能可以使用不同的语句,以C++为例:
  1. int a=1;
复制代码
  1. int a;
  2. a=1;
复制代码
以上这两个语句的功能完全一样但是具体编程的时候究竟采用哪种方式取决于程序员编程的风格。我们这一章的目的就是介绍一下ES风格

我们下面就以C++为例,用例子说明什么叫ES风格:
一、循环语句
基本格式:中断语句+死循环
1.前置判断
标准程序:
  1. 1.int a=0,b=0;
  2. while(a<=100){
  3.      a++;
  4.      b=b+a;
  5. }
复制代码
ES风格的程序:
  1. int a=0;
  2. int b;
  3. while(1>0){//死循环
  4.     sqrt(100-x);//中断语句
  5.     a++;
  6.     b=b+a;
  7. }
复制代码
然后单步执行语句,直到调试器报告出错,要想知道b是多少在调试器中看。
2.后置判断
标准程序
  1. int a=0;
  2. int b;
  3. do{
  4.      a++;
  5.      b=b+a;
  6. }while(a<=100)
复制代码
ES风格程序
  1. int a=0;
  2. int b;
  3. while(1>0){//死循环
  4.    a++;
  5.    b=b+a;
  6.    sqrt(100-a);//中断语句
  7. }
复制代码
然后单步执行语句,直到调试器报告出错,要想知道b是多少在调试器中看。
二、条件赋值语句
1.条件赋值
if(条件) y=x;
转换为y=(x-y)*条件+y
标准程序:
  1. if(a>0) y=x;
  2. if(a>=0) y=x;
  3. if(b>0){
  4.    y=x;
  5.    c=x;
  6. }
复制代码
ES风格的程序:

  1. y=(x-y)*ispositive(a)+y
  2. y=(x-y)*isnotnegative(a)+y
  3. y=(x-y)*ispositive(b)+y
  4. c=(x-c)*ispositive(b)+c
复制代码
看到这里,大家可能要问,干吗这么麻烦?这是因为要使用计算器进行编程,ES风格的电脑编程是必备的素质。
2.逻辑运算(与或非)
与用乘,或用加,非用2^(条件)-1
标准程序
  1. !(x-3>0)
  2. x>3 && x<=5
  3. x>3||x<=5
复制代码
ES风格的程序
  1. 2^(ispositive(x-3))-1
  2. ispositive(ispositive(x-3)×isnotnegative(5-x))
  3. ispositive(ispositive(x-3)+isnotnegative(5-x))
复制代码
下面给出一个完整程序的例子:
标准程序:
  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4.    int a=0;
  5.    int b;
  6.    while(a<=100){
  7.       if (a-b/2>0) b=b+a;
  8.       a=a+1;
  9.    }
  10.    cout<<b;
  11.    return 0;
  12. }
复制代码
ES风格的程序:
  1. #include <iostream>
  2. #include <cmath>
  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.    while(1>0){
  13.       sqrt(100-a);
  14.       b=a*ispositive(a-b/2)+b;
  15.       a=a+1;
  16.       cout<<b<<endl;
  17.    }
  18.    return 0;
  19. }
  20. int sgn(double x){
  21.    return x/(abs(x)+10^-99);
  22. }
  23. double max(double a,double b){
  24.    return (a+b+abs(a-b))/2;
  25. }
  26. int isopsitive(double x){
  27.    return max(0,sgn(x));
  28. }
  29. //执行程序,当出现错误时查看屏幕,最后一个数就是最终的b
复制代码
回复

使用道具 举报

 楼主| 发表于 2009-10-17 21:23:54 | 显示全部楼层
第三章:步入计算器
在继续学习本章之前请先做一个小测验:
说明:本试题有两种题型理论题和操作题。理论题请不要用计算器,根据自己对计算器的了解作答;实验题请按照要求操作计算器。
===================================
1.(理论题)在计算器上输入“1+1:2+2”然后不断按【=】键会出现什么现象?
答案:屏幕交替显示2和4
A.这道题我会→继续做下一道题      B.这道题我不会→您的水平为1级
-------------------------------------------------------
2.(实验题)请在计算器上输入“1+1X:1+1Y”,要求在输入完成之前用冒号分隔的任一语句都不被执行。
典型错解:
按键步骤为:【1】【+】【1】【SHIFT】【RCL(STO)】【X】【左】【:】【1】 【+】【1】【SHIFT】【RCL(STO)】【Y
正确答案:
按键步骤为:【×】【1】【+】【1】【SHIFT】【RCL(STO)】【X】此时出现Syntax Error【AC】【左】【:】【1】 【+】【1】【SHIFT】【RCL(STO)】【Y】此时出现Syntax Error【左】【Del】
A.这道题我会做→继续做下一道题      B.这道题我不会→您的水平为2级
-------------------------------------------------------
3.(理论题)要用计算器计算1+2+3+4+……+100应该怎样做?
答案:
第一步、给A赋值为1,给B赋值为0。
第二步、按照第二题的要求输入A+BB:A+1A.
第三步、按199次【=】键。
A.这道题我会做→继续做下一道题       B.这道题我不会→您的水平为3级

第一节、计算器的入门(2、3级水平的读者跳过)
问:什么是冒号?怎么打出冒号?
答:冒号名字叫“多重计算算符”,它的输入方法是【ALPHA】【三次方】。在计算器中输入“Ans+1:Ans+2”然后不断按【=】键,仔细观察,你就知道冒号是干什么的了
第二节、“:”的应用(3级水平的读者跳过
通过冒号可以实现多重运算,因此冒号可以看成是C++中的分号,用于把各条语句隔开。在计算器打出一些语句然后用冒号把各个语句隔开,不断按等号键,实现的效果,就跟在电脑上单步执行程序的效果是一样的。但是赋值语句属于立即执行的语句,例如要执行1A只需按:【1】【SHIFT】【RCL(STO)】【负号(A)】赋值操作就会立即执行,而不用按完A后再按一遍等号,这就给在多重运算中打出赋值语句带来了麻烦下面介绍一下在多重运算中打出赋值语句的方法
先打一个语法错误,然后往下打例如要打1A2B3C,可以这样打:
1.
【×】()
2.
1】【STO】【A】出现syntax error,按【AC】【左】,输入冒号(:)
3.
2】【STO】【B】出现syntax error,按【AC】【左】,输入冒号(:)
4.
3】【STO】【C】出现syntax error,按【AC】【右】
5.
按几下【DEL】删掉“×”此时要打出的表达式已打出
第三节、从电脑程序到ES系列计算器程序。
所谓ES编程其实就是在fx-ES计算器中输入特定的算式来达到编程的目的。一段ES程序通常结构为:语句1:语句2:语句3:……:语句n
通过不断的循环及各种语句的组合来产生程序语句的效果。通常采用按【=】到Error的方式结束.
给一段电脑程序,只要满足如下条件就可以转换成计算器程序:
1.程序不是很长
2.没有循环语句嵌套
转换方法:
先将电脑程序改写成ES风格,然后根据ES风格的程序来写出计算器源代码。
下面我们将第二章末给出的程序转换成计算器程序:
改写为ES风格后程序主体部分如下:
  1. int a=0;
  2. int b;
  3. while(1>0){
  4.    sqrt(100-a);
  5.    b=a*ispositive(a-b/2)+b;
  6.    a=a+1;
  7.    cout<<b<<endl;
  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|+1×10^-99)+|x÷(|x|+1×10^-99)|)/2
然后把ispositive(x)代入表达式b=a*ispositive(a-b/2)+b
a×((a-b÷2)÷(|(a-b÷2)|+1×10^-99)+|(a-b÷2)÷(|(a-b÷2)|+1×10^-99)|)÷2→b
所以,要输入计算器的表达式为:
√(100-a):a×((a-b÷2)÷(|(a-b÷2)|+1×10^-99)+|(a-b÷2)÷(|(a-b÷2)|+1×10^-99)|)÷2→b:a+1→a
输入完成后狂按等号键就行了
回复

使用道具 举报

 楼主| 发表于 2009-10-17 21:24:18 | 显示全部楼层
第四章:经验技巧总结
由于ES系列不是可编程计算器,所以ES系列编程后很多缺点:
1.不能保存
2.程序不能太长
改进方法:灵活选择函数,例如当能保证x≠0时可以用sgnerr(x)代替sgn(x),因为sgnerr(x)比sgn(x)更简捷
3.要按的等号太多
改进方法:乘零法,Pol-Rec组合赋值法
乘零法:
改进前:
  1. √(100-A):sin(30×A)+X→X:A+1→A
复制代码

改进后:
  1. √(100-A)×0+sin(30×A)+X→X:A+1→A
复制代码

少按了100次等号。
Pol-Rec组合赋值法:
原理:
Pol(x,y)将直角坐标转换成极坐标,其结果r是存在X里,θ存在存储器Y里,Rec(r,θ)将极坐标转换成直角坐标,其结果X存在X里,Y存在Y里,也就是说,执行这两个函数会进行赋值操作(而且同时进行两个!),于是可以将赋值语句集成到这两个函数中。
例:
改进前:
  1. X+1→X:Y+2→Y
复制代码
改进后:
  1. Rec(Pol(X+1,Y+2),Y)
复制代码
按等号的次数少了一半
乘零法与Pol-Rec组合赋值法的综合应用实例:
改进前:
  1. √(100-A):sin(30×A)+X→X:A+1→A
复制代码
改进后:
  1. √(100-A)×0+Rec(Pol(sin(30×A)+X,Y),Y)×0+A+1→A
复制代码

按等号的次数少了三分之二
4.运算速度慢
改进方法:合理选用中断语句,例如排列组合就比根号运算速度快
例:
改进前:
  1. √(100-A):sin(30×A)+X→X:A+1→A
复制代码

改进后:
  1. (100-A)C1:sin(30×A)+X→X:A+1→A
复制代码
回复

使用道具 举报

 楼主| 发表于 2009-10-17 21:24:35 | 显示全部楼层
附录1:相关帖子索引
讨论帖:
http://www.cncalc.org/thread-148-1-1.html  使用fx-es实现简单编程 by zasdfgbnm
http://www.cncalc.org/thread-1549-1-1.html  呼吁:编程爱好者集中力量寻找计算机到计算器的通用转换方法 by zasdfgbnm
http://www.cncalc.org/thread-487-1-1.html   对于有人说82ES编程的想法 by 殘殺的風
总结帖:
http://www.cncalc.org/thread-1584-1-1.html    ES编程基础教程 by hcz
http://www.cncalc.org/thread-1173-1-1.html    ES山寨编程集合 by hcz
http://www.cncalc.org/thread-922-1-1.html   fx-es编程想法的一些应用 by hcz
成果发布贴:
http://www.cncalc.org/thread-148-1-1.html  使用fx-es实现简单编程 by zasdfgbnm
http://www.cncalc.org/thread-1042-1-1.html  ES编程想法—解方程 by hcz
回复

使用道具 举报

 楼主| 发表于 2009-10-17 21:24:57 | 显示全部楼层
附录2:贡献者
科研人员:
hcz:
研究领域:编程应用领域、编程理论
frac(x)、int(x)、一些程序实例(随机正整数、解方程、微积分、整除取余、取整取零、Rec法最大公因数)。
shyc2001:
研究领域:编程理论
乘零法、提出运用排列组合提高运算速度。
zasdfgbnm:
研究领域:编程理论
提出了ES程序的基本结构(中断语句+赋值语句+狂按等号键)、系统地提出条件赋值语句方法(条件赋值、逻辑运算与或非、sgn(x),ispositive(x),isnotnegative(x))、max(a,b)、min(a,b)、sgn(x)、Pol-Rec组合赋值、RanInt(A,B)。
文章贡献:
hcz:
本文第三章第三节开头以及部分专有名词参考hcz帖子
回复

使用道具 举报

发表于 2009-10-18 13:54:22 | 显示全部楼层
顶起。。。不过这又勾起了我和Bruce等人惨痛的NOIP回忆。。。。。。
回复

使用道具 举报

 楼主| 发表于 2009-10-18 14:21:17 | 显示全部楼层
你参加的是全国决赛吗?
回复

使用道具 举报

发表于 2009-10-18 14:40:46 | 显示全部楼层
初赛。。。
回复

使用道具 举报

发表于 2009-10-18 16:02:34 | 显示全部楼层
顶了

参加过NOIP。。两年两个三等奖。。=.=。。。。晕
回复

使用道具 举报

 楼主| 发表于 2009-10-18 16:23:45 | 显示全部楼层
我参加物理竞赛今年省一等奖,保送哦
回复

使用道具 举报

发表于 2009-10-18 16:26:12 | 显示全部楼层
强。。!
回复

使用道具 举报

 楼主| 发表于 2009-10-18 17:49:49 | 显示全部楼层
好啦完工了
回复

使用道具 举报

 楼主| 发表于 2009-10-18 17:50:18 | 显示全部楼层
看完以后一定不要在懂不懂的地方投一票啊
回复

使用道具 举报

发表于 2009-11-7 21:40:05 | 显示全部楼层
= = 我还是太弱了。。。。。谁能告诉我计算机的那个那个是干嘛的呢。。。。。
回复

使用道具 举报

发表于 2009-11-8 02:16:05 | 显示全部楼层
好帖
顶一下
回复

使用道具 举报

发表于 2009-11-8 15:15:36 | 显示全部楼层
有空学习下,感谢楼主的辛勤工作
回复

使用道具 举报

 楼主| 发表于 2009-11-8 18:36:38 | 显示全部楼层
= = 我还是太弱了。。。。。谁能告诉我计算机的那个那个是干嘛的呢。。。。。
ailiyamiyacus 发表于 2009-11-7 21:40
请把问题说清楚点
回复

使用道具 举报

 楼主| 发表于 2009-11-14 21:51:26 | 显示全部楼层
2009-11-14 21:50
更新:
使用hcz更加简洁的成果代替了原有的int(x)以及frac(x),运算速度大大提高,式子长度大大缩短
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|cnCalc计算器论坛

GMT+8, 2024-4-16 18:36 , Processed in 0.120867 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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