hp39gs吧 关注:898贴子:3,326

HP39gs 从入门到精通(完全教程)

取消只看楼主收藏回复

本帖旨在帮助对HP39gs使用存在疑惑的同学们, 楼主还是学生党, 计划一周更新一次,所以欢迎大家跟帖补充。


IP属地:福建1楼2017-05-03 22:15回复
    part 1 第一部分 外形与配置
    一. CPU
    HP39gs的cpu采用了Samsung公司基于ARM公司的ARM920T处理器核设计的S3C2410处理器(某基百科),网上也有说使用48MHz的"ARM9"处理器的(某度)(两种意见姑且用作参考), 但是HP39gs运行于虚拟机环境下,整体效率是低于9860、TI86, 甚至5800p的。不过,作为一部成本至多40元的图形计算器, 能做到目前的速度也是不容易了。(在下是花50块软妹币(RMB)买到的,品质优良)
    二. 内存
    HP39gs的固件(可擦写只读存储)保存在sst公司出品的MPF Flash闪存器件中, 而用户数据则保存在一块SRAM芯片里, 根据SRAM的设计特性, 一旦断电, 用户数据将丢失。
    实际可用内存为200kb, 是商家宣传的4/5。
    三. 键位
    HP39gs的键位设计采用与科学计算器截然不同的按键布局(其他图形计算器大概也一样), 惯用科学计算器的同学们初入手时可能会非常不习惯,特别需要指出, HP39gs的同一个按键的“shift”功能与“alpha”功能一个处于上方,一个处于下方, 非常反人类,只能慢慢去习惯了。
    HP39gs的按键除了“on”与上下左右键之外,全部向外倾斜大约15度, 而且手感较硬,有种似胶非胶的触感, 用久了手会有些酸,但是比起软绵绵的科学计算器来非常有质感。
    有些习惯上的不同, 在这稍微解释一下:
    1.四则运算
    + - * / 四个键都位于右手边, 以 / * + -的顺序依次排下来。
    2.三角函数
    sin cos tan 位于从下往上数第六行,可用shift功能召唤反三角函数。
    3.对数
    三角函数的左边。(log默认以10为底数,具体运算可用对数的运算法则来达到目的)
    4.指数
    三角函数的正下方, 即第五行处。
    5.负号
    “2”的正下方(不会有人找不到负号吧?)
    6.shift功能与alpha功能
    看见键盘上的蓝色小字和黑色小字了吗?先按一下shift或alpha(可放开),然后再按相应的按键就可以了。
    (黑字对应黑字底下的键,蓝字对应蓝字上面的键)
    7.几个看似深奥的功能键
    首先是最上方的小紫键,一共六个, 开机时对应屏幕最下方的六个黑方块,在不同的界面发挥不同的作用。如主界面出现的sto>意为将内容存入某处(这个“某处”由">"后的变量名决定),而program界面的这个位置则显示了Edit, 即打开并编辑。简而言之,屏幕上写了什么,小紫键就代表什么。
    其次是下面最怪的六个键
    “symb”是symbol的缩写,一般用于打开当前程序的表达式输入界面,如在function中输入函数表达式。
    “plot”意即绘图, 在绝大多数程序中用于打开坐标系进行绘图(需先输入表达式)
    “num”即number的缩写, 可以显示有关数值的内容。
    “home”是回到主界面,好多人不会这一招就到处按,弄到找不到主界面,关机了又打开还不是主界面,急得满地打滚。
    “aplet”是应用程序的意思, 你可以在这找到更多功能。
    “views”意即视图,没有卵用。
    四. 接口
    HP39gs采用五针USB接口,另带10101COM通信接口(用于计算器间共享数据,但是基本买不到连接线了),
    可以用充电宝或者充电器供电(只要有带USB输出口),个人建议用一个充电宝供电(电池很贵,当然土豪随意)
    五.电源
    电池用7号,四节, memory backup的电池要用2032的3V纽扣电池(电池牌子无所谓,稳定就可以)
    推荐使用外接电源,HP39gs是如假包换的电老虎,两周换一次电池不是梦想。
    还有一件事,有时候会出现外接电源后Memory clear的现象,不是记忆卡坏了(真坏了断电几小时一般又会好过来), 就是充电宝用了什么闪充,最好试试别的充电宝。
    六.屏
    HP39gs的屏幕使用131*64的规格,不包括上方状态条。
    OKEY,以上就是在下一晚上的工作成果, 2017年五月六号在下将带来入门级的Part 2——基本操作,敬请期待!
    柜里猫
    2017年5月4日01:05:46


    IP属地:福建2楼2017-05-04 01:03
    收起回复
      Part 2 第二部分 基本操作
      一. 开关机
      HP39gs的用户大多使用过科学计算器, 刚使用图形计算器时会习惯性地想按右上角的那个键来开机,结果开不了,急得满地打滚,关机也是类似情况。不过过了一会自己都觉得好笑,“on”被藏在了左下角。关机则需要先按shift,再按on。
      二. 模式调节
      终于进到梦寐以求的主界面了,小试一下计算器的能力吧。出来的都什么东西?

      和自己想的完全不一样。
      上面的计算都是对的, 只是计算模式不是自己以为的那种而已。要得到预期的结果,首先要把计算模式调到自己预期的样子。home键的shift功能就是角度单位、结果格式和小数点格式的调节。如图所示:



      最常用的角度单位是Degrees角度制, 上了高中的同学可能会更多地用到Radians弧度制。
      按下CHOOS对应的小紫键, 选择需要的单位制即可。对于number format和decimal mark也是一样的。

      number format的情况有些复杂,在此长话短说(chen ji tou lan)
      1.fixed
      输出可自定精度的小数(唯一能让计算结果总是不省略小数点前的0的格式)
      后面的数值即为精度, 可以用Edit直接输入,也可以用CHOOS选择。
      2.Scientific
      科学记数法。输出标准的科学记数法格式。数值是保留的小数数位。
      3.Engineering
      工程单位制。输出以E3*n(10的3*n次方,其中n为整数)结尾的工程单位制格式。
      4.fraction
      不少人梦寐以求的分数格式,数值是表示分母的数字个数加分子的数字个数的大概数值,不好控制,而且加上根号候情况更加复杂,这也是HP39gs的局限所在。
      5.mixed fraction
      混合分数制。把结果表示为一个整数加一个真分数的格式。受限于fraction的不精确性,mixed fraction同样不好用。
      6.standard
      计算器的标准输出。
      三.输入输出规则
      1.线性输入
      HP39gs使用的是看似落后的线性输入,对比于自然输入非常的反人类。主要原因在于,HP39gs使用的编辑栏是一个名叫Editline的特殊程序,既然是程序, 那么就有程序的局限性。 首先,任何的输入都是在写程序,所以只能像写文本文件一样线性地写入表达式;其次,因为是在写程序, 所以输入的表达式被叫做源代码, 在计算前要先经过编译,这也造成了HP39gs计算缓慢的假象。不过,编译过一次的程序再次运行就无需再次编译了,速度会快上至少四分之一秒,即使是对简单的加减法也是如此。
      同样的,程序也有程序的优势,那就是可以输入极长的表达式,只要结果控制在9.9E499之内,理论上可以输入无限长的表达式(当然,只是理论上,实际还受到编译及计算速度和内存的限制,一条1.5kb的表达式(1*1*1……)就花去了50秒编译及运行,编译后占了5.2KB空间。)(没控制结果大小的话会用英文提示语法错误)

      还有,既然是程序,那么就可以直接输入代码(输进去就可以运行了)。具体的实现我会在后面的某个讲解中写出。
      线性输入的诀窍在于:多尝试和多使用括号。有不清楚之处既可通过尝试来确定运算规则, 也可使用括号来人为规定运算优先级。
      还有一件事, 如果对任何运算符(如级数求和∑),那么可以调用“2”的shift功能SYNTAX。在编辑栏中输入按下shift后按“2”出现的HELPWITH 加上不了解的运算符(不要带其他符号!如输入 “HELPWITH ∑(” 就会被提示语法错误)
      2.显示规则
      与输入相称,显示也是线性的。不过,按下Enter后出现了不同的情况:

      表达式是随意写的,重点在下面:

      按下show后:

      显示出了比弱智的线性输入复杂得多的自然输入。可以用它来判断自己的意图是否被计算器正确理解。
      3.编辑文本文件
      澄清一点,在HP39gs中,所有存在输入条件的操作均为编辑文本文件。
      用“0”的shift功能可以打开notepad记事本功能, 一般第一次打开会发现里面空无一物,就像打开一个空文件夹。
      按下NEW来新建一个文件(一旦新建,文件名就无法更改) ,命名后会自动跳转到编辑界面。
      键“A-Z"可以切换到字母输入模式,这样就不用反复按alpha键了。
      vars的shift功能 “chars” 可以
      键盘上的del键默认删除光标指向的后方字符, 而虚拟键BKSP则是删除前一个,与电脑键盘的设置是一样的。(很奇怪吧,我们一直说着“删除”(delete)却一直用着相反的“退格”(backspace))
      要是整篇都不要了,可以调用del的shift功能“clear”,确认后就可以删除全文。
      还有一个特殊方法,最好只在紧急情况下使用。如果手滑(shoujian)误删了需要的数据,又没有备份的话,请在0.2秒内把电源切断,使计算器来不及存档就关机,有一定几率能挽回数据(只能说有几率)。
      vars里提供了拷贝(复制粘贴)的功能,在左边的菜单里找到notepad,移到右边选中需要的文件,切换到value模式(这步比较重要,最好先做), 按ok或enter均可,就复制到当前输入环境下了(编辑文本、写程序、输入数值等等,只要有输入条件存在,都可以用)。写大且有重复性的文件时,适宜用这种方法。
      4.读写变量、表单、矩阵、图像
      (1)变量
      HP39gs提供27个方便存储使用的变量,包括26个大写字母和角变量θ。
      存储:可以使用sto将数值输入变量中,这也是最简单的方法。也可以在for循环中用赋值符 “=” 来直接赋值
      如果要在程序中给变量赋值的话,可以使用prompt语句(比如prompt A)。
      使用:直接把变量当常数用就可以了(比如当A = 1时,A+1和1+1是等效的)。
      (2)表单
      HP39gs提供10个表变量(每个都有任意大),编号为L1,L2…L0.
      在表单中写内容时,要用诸如【1,3,5,7,9】的形式来表示这是一个表(否则会英语提示类型错误)
      sto同样可以用于表的写入。
      除此之外,prompt语句也可用于写表。无论如何,格式一定要严谨。
      使用:同上
      (4)矩阵
      矩阵类似于表单,要在用n - 1个“,”隔开的n个表单形成的表达式的外面加上大括号。
      储用:同上。
      基本操作到这算完了,编写小文大约用了6个小时,在下一边实验一边争取给出精确回答。按惯例(也没形成几天),新的内容Part 3将在2017年5月13日星期六继续发布,感谢关注!
      还有, 因为在下个人的怠惰,导致Part 2发布超时将近4小时30分钟,在此衷心抱歉!
      柜里猫
      2017年5月7日04:28:28


      IP属地:福建4楼2017-05-07 04:26
      收起回复
        Part 3. 应用简易入门
        引言
        这次发帖比较迟,一是因为作业多, 二是因为在下比较懒,时间安排不合理,在此先向大家道歉。
        所谓简易,是相对以后将要陆续发出的应用精通部分而言的, 比起前两个部分会简单肤浅一些,请需要详细用法的同学们直接询问或者耐心等待后继的部分。
        一.function
        各界面介绍
        (1).symb
        symb是symbol的简称,意为标志,打开后是键入表达式的界面。
        在这个界面中, 最多可以输入10个表达式。表达式的输入使用Editline程序(即输入栏), 既可以按Edit来唤出输入栏, 也可以直接输入(输入栏会自己跳出来)。
        eval键是evaluate的缩写, 可以把表达式简单化简(把12*3化简成36之类的)
        (2).plot
        这里是图形计算器名字的来源:图形绘制界面。在symb输入的表达式会在这里进行绘制。
        zoom是用来调整图形缩放比的菜单。
        zoom中的box是选定一个矩形区域进行绘制。
        zoom中的in和out是放大和缩小绘制区域的大小。
        zoom中的decimal是选用浮点数作为单位长度, 可以用来快速回到默认的缩放比。
        un-zoom则是取消之前的zoom指令。
        trace是让光标始终跟随图像。
        goto是让光标跳到指定的x坐标处。
        fcn里有求根、求交点等等功能。
        (3).num
        这里只与数值有关, 有多排数值,第一排是x值,其余的是对应的y值。
        zoom的用法与plot中类似。
        big是用大字体。
        可以通过输入栏跳到指定的x值。
        二.slove
        1.各界面介绍
        (1).symb
        同于function
        (2).plot
        zoom同于function
        goto同于function
        menu同于function
        由于重点在num上,所以fcn等功能都被省略了。
        (3).num
        在此只介绍info和slove
        slove可以解出与当前x值最接近的解, 所以要得出全部解就需要手动调节x值。双击slove可以看到解析过程。
        info可以显示解的情况, 看出是交点解还是极值解。(没有交点时会给出极值解,如x平方等于-1会给出x=0)
        2. 计算方式
        计算方式一目了然, 采用的是二分逼近和取大约值的方法。
        三.liner slover
        1.界面
        线性解算器只有一个界面, 有2*2和3*3两个模式。
        2.计算方式
        公式法。把输入数据代入公式中,得出结果。
        四.polar
        极坐标,似于function。
        五.triangle slove
        三角解算器。同样,只有一个界面,使用公式法。解出的条件有:角边角、角角边、边角边。
        六.statistics
        统计。在此只讲解num界面。
        输入同于function的num界面。
        ins是在数列的末尾插入一个0。
        sort可以对选中的数列进行排序。A开头的排序方法是升序,D开头的排序方法是降序。
        常用的应用到这就讲完了,在下个人觉得写得比较少,遗漏的点很多,有讲得不通之处, 欢迎各位指出。
        还有一件事,有个叫6666辛苦吧的家伙在各个吧里大发水贴,发过的78个贴基本都是水贴,最近竟然发到hp39gs吧里了,希望大家一起抵制这种行为,还网友们一个干净的讨论空间。
        证据如下:

        柜里猫
        2017年5月14日13:52:21


        IP属地:福建9楼2017-05-14 13:55
        收起回复
          这几周发帖晚了,非常抱歉。上周没有把稿子写完,觉得将就着发非常影响质量,就没有发帖,但是最后又忘记过来解释一番,真是非常惭愧。不过,今天在下将补回之前的工作,带来这一期的part 4。


          IP属地:福建11楼2017-05-28 19:21
          回复
            part 4 提示语句 (prompt)
            引言-----
            图形计算器的一个重要功能就是编程,可以说,图形计算器几乎一切的主要功能都是通过编程实现的。图形计算器的编程能力来自较大的内存和附带的编译能力。
            对于编程界的新手和不熟悉HP-BASIC的玩家来说, 最好的入门方法就是学习prompt。prompt语句可以实现人机之间比较密切的交互,编的好的话会很有趣味性。
            对于想要成为编程界的大牛的同学来说,有一条必须遵循的定律:多练习。对于任何语言,这条定律都成立。每个
            大牛都是从反复磨练中成长起来的。所以,保持谦逊,遇见不会的知识就多学多练吧。在下也不过是一个略微有心的初学者,离真正的大牛还差很远很远。
            好了,接下来是正文。
            1.beep语句
            HP39gs自带了一个蜂鸣器,可以发出1-15000Hz,时长灵敏度在0.001秒的振动声(不过,到了极限状态下声音会失真,而且有时不能发挥出全部能力)。用来控制这个蜂鸣器的语句就是beep。beep语句的最大用处就是证明计算器不是个哑巴。
            beep的用法如下:BEEP x;y: 其中x是指频率,y是指时长。
            入门到这就结束了,可以用这个来震惊一下同学。
            但是这样只能小小震惊一下,要娱乐自己的话,还需要一点点小技巧。
            比如,beep语句也接受变量,可以用诸如A、S、D、F、G、H等等变量(事实上用数组中的变量和矩阵中的变量来控制也是可以的,比如BEEP L1(1);M1(2,3):只要有数据在就可以运行。)(之前没有讲清楚,深感抱歉,表单也可以叫数组,而且数组是我比较习惯的叫法;矩阵和数组中的单元可以分别用Ln(i)和Mn(i,j)来表示,其中n,i和j是大于0的整数,且n,i,j表示的东西要有意义)。
            再比如,控制beep语句也可以用循环。好的控制可以在不破坏音韵美的前提下节约大量代码和运行空间。
            1000 > i (没有sto键,只好用大于号代替,在计算器上要用sto键。)
            while i ≠ 0
            BEEP i*10;0.1:
            i - 1 > i:
            在原理上相当于一段1000行的代码,在用了循环后代码体积小了250倍,如果不用的话是难以想象的。
            还有一件事,只写出声的代码会让音乐显得急促,如果不是确实用意的话,要用频率较低的语句隔开来。一般是用频率在50Hz的beep语句,用0Hz不会有效果。)
            2.choose语句
            choose语句是一个在下尚且不能掌握的语句,在此只能姑且讲讲。
            用法比较奇怪: CHOOSE X;“title”;“asdf”;“zxcv”:
            x是要读入用户的选择的变量,title是选择窗口的标题, asdf和zxcv则是选项。按照样例,用户选择asdf的话,XX将会为1,选zxcv的话X会为2。
            看起来在下好像会一点点,但是这只是表象。实际使用的时候,出现了各种各样的bug。有时候在编译时就报错,原因只是用了一个“暗中不能使用”的变量(语法完全正确,变量也没有问题,但是莫名错误),或者唤出选择框时没有办法选择(跟看MSGBOX一样,浑身难受),要不就是选了之后语句没给变量赋值,如此这般一大堆bug,真正成功的只有两次而已。
            3.clrvar 语句
            这个比较简单,是用来清空变量的。对于简单的变量可以用直接赋值为0的方法,但是对数组、矩阵就不方便,因为empty是不可以直接赋值进去的。用clrvar可以把单个变量赋值为0,把数组和矩阵赋值为empty,但是不能把数组和矩阵中的变量清空。
            4.disp 语句
            可以用诸如 DISP n;“asdfzxcv”:的形式在第n行写下“asdfzxcv”。n的范围限制在1-7,小于1的n值会视同于1,大于7的n值会视同于7;。
            5.dispxy 语句
            可以用 DISPXY x;y;n;“asdfzxc”的形式写在屏幕上,x,y是指坐标,n是放大x,y的倍数。这个语句不太好控制,在下没有在程序中用过。
            6.disptime
            这是用msgbox的形式显示当前时间。可以用给DATE、TIME变量赋值的方法设置系统时间。
            7.editmat
            打开编辑矩阵的界面。
            8.freeze
            暂停计算器的工作,直到有输入为止。
            9.getkey
            用 GETKEY X:的方法来输入一个键。但是输入的并不是键上写的,而是键位的编号。键位从左上编到右下,越来越大,如左上第一个键为11.1,第二个键为12.1,“7”键为72.1,enter键为15.1 。
            10.prompt
            这个语句是比较方便的输入语句,用 prompt x:就可以了。但是不能用来输入给数组和矩阵。
            系出同源的input也有一样的缺陷。
            11.input
            input x;“title”;“asdf”;“asdfzxcv”;0;
            title是输入界面的标题,asdf是输入框前的提示,asdfzxcv是输入框最下方的提示,0则是默认值(一定要写)。
            这是比较个性化的输入方式。
            12.msgbox
            msgbox “asdfzxcv”:以一个灵活的信息框来显示信息,可以适应不同的文本长度。
            13.wait
            wait t: t是以秒为单位的时间,计算器将以运行循环的方法来消磨指定的时间,放到频率更高的设备上可能会快到或者慢到令人难以忍受。
            提示语句的介绍到这算完了,不过,有几个练习布置给大家,看需要选做吧。
            1.娃娃国
            这是一段比较长的音频文件,编写尤需耐心。出处是周杰伦的《麦芽糖》(2007世界巡回演唱会)3:01-3:20的一小段。
            例程:
            FOR B=0 TO 1 STEP 1;
            FOR A=0 TO 1 STEP 1;
            BEEP 1700;0.1:
            BEEP 50;0.1:
            BEEP 1700;0.1:
            BEEP 50;0.1:
            BEEP 1300+1000*A;0.2:
            BEEP 50;0.2:
            END:
            BEEP 2900;0.1:
            BEEP 50;0.1:
            BEEP 2400;0.1:
            BEEP 50;0.1:
            BEEP 2000;0.1:
            BEEP 50;0.1:
            BEEP 2000;0.1:
            BEEP 50;0.1:
            BEEP 2400;0.4:
            BEEP 50;0.3:
            BEEP 2300;0.1:
            BEEP 50;0.1:
            BEEP 2300;0.1:
            BEEP 50;.1:
            BEEP 2000;.1:
            BEEP 50;.1:
            BEEP 2000;.1:
            BEEP 50;.1:
            BEEP 1600;.1:
            BEEP 50;.1:
            BEEP 1600;.1:
            BEEP 50;.1:
            BEEP 1400;.2:
            BEEP 50;.2:
            BEEP 1500;.1:
            BEEP 50;.1:
            BEEP 1200;.1:
            BEEP 50;.1:
            BEEP 1700;.1:
            BEEP 50;.1:
            BEEP 1500;.1: BEEP 50;.1:
            BEEP 1600;.4:
            BEEP 50;.3:
            END:
            2.lock
            一个锁。要求输入正确的密码。(例程用到了循环,用于防止乱按中意外解锁,但是目前的标准不要求这么严密)
            例程:
            WHILE 1
            REPEAT
            MSGBOX "ENTER THE CODE.":
            PROMPT K:
            IF K==123698745
            THEN
            BEEP 2500;0.2:
            BREAK:
            ELSE
            BEEP 50;0.2:
            MSGBOX "ERROR":
            CONTINUE:
            END:
            END:
            THEN
            DISP 1;"NO WAY!":
            RUN LOCK:
            END:
            THEN
            RUN LOCK:
            密码为k的值。
            3.time
            计算时间的小程序,记录开始的时间,输出经过的时间。
            例程(坏了):
            MSGBOX "START?":
            MSGBOX "PRESS ON TO STOP":
            TIME咥:
            INT(A)哘:
            INT((A-Q)*100)哛:
            INT((A-Q-R/100)*10000)哠:
            3600*Q+60*R+S咶:
            IFERR
            WHILE 1
            REPEAT INT(TIME)咷:
            INT((TIME-G)*100)咹:
            INT((TIME-G-H/100)*10000)咺:
            3600*(G-Q)+60*(H-R)+I-S哯:
            3600*G+60*H+I咵:
            DISP 2;Z:
            END:
            THEN
            E-F咼:
            MSGBOX
            (J-(J MOD 3600))/3600 " h "
            ((J MOD 3600)-(J MOD 60))/60 " m " (J MOD 3600) MOD 60 " s ":
            2017年5月29日00:18:06
            柜里猫


            IP属地:福建12楼2017-05-29 00:16
            收起回复
              新的part4已经发表了,但是因为篇末写了三个例程,大量的代码导致帖子被系统删除了。申诉业已提出,两三天内应该就能恢复,到时还请各位观赏。part4是关于提示语句prompt的,可以说是编程的第一步,接下来的事情就将变得有趣了。
              还有,小升初考试将近,在下要花较长时间备考,后面的帖子最迟可能会拖延到暑假,发帖有不准时处,请多多见谅。


              IP属地:福建14楼2017-05-29 20:08
              收起回复
                Part 5 HP39gs的内存控制
                引言------
                HP39gs的运行速度不高是有多方面的原因的, 其重点之一在于HP39gs对内存的控制。在下在使用过程中发现了一些奇特的现象,并且推出了一些不知正确与否的结论,权供参考。
                1.HP39gs有两种不同的存储分区。在编辑文本、数据时拔下计算器的电源,那么再次打开文件时,我们会发现更改丢失了,一切还是原来的样子。这说明HP39gs并不会直接修改原文件,而是先将原文件复制到某个地方,在修改完成后用新文件覆盖原文件。所以,HP39gs至少在形式上有两种大的分区,类似于电脑的“硬盘”和“内存”。
                2.两种分区间并无固定界限,意即两分区使用同一块空间。我们先用较大的数据填满内存的大部分空间(余下10k左右),此时,对于一个略大于剩余空间的文件的操作将无法正常进行。这可以说明没有一个分区是独占一块确定区域的,否则填塞绝大部分空间的操作将无法进行,且文件将可以正常操作。
                3.每一个功能都有属于自己的、动态分配的空间。在对list的操作中可以发现,HP39gs并没有给每一个list分配确定的空间,因为每一个list都可以各自大过内存的十分之一,事先分配固定空间显然是不可能的。还有,如果内存中有一个很大的文件(比如一个150k的list),接下来在list中几乎所有的操作都会变慢,不过这并不影响matrix或主页面的操作快慢。所以,似乎每个功能都有自己的一块没有事先确定大小的空间,并且会在自己的空间里划分“磁盘”和“内存”。
                4.内存取向的程序自编会比用Editline快得多。内存取向,意即“需要大量操作内存”,区别于“cpu取向”。在下在SST39VF800A(即HP39gs所使用的内存)的技术资料中获悉, 内存对系统读写的操作进行了优化, 而Editline好像用了什么不为人知的技术把内存的努力给磨蹭没了。不过,主要依赖计算的程序用Editline和自编的速度是一样的。
                这一部分到这就结束了。在下个人觉得在这个地方插入介绍关于内存的东西有点奇怪,不过此时不讲的话,后面的一些内容就会有点奇怪了。还有,这是在下迄今写过的最没把握的一篇,结论基本都是基于不准确的推测,一想到要发出去就有些汗颜。在此预先领下各种大神们可能给出的指教,毕竟在下确实看不懂那些资料。
                2017年7月31日18点14分
                柜里猫


                IP属地:福建26楼2017-07-31 18:16
                收起回复
                  Part 6 Loop循环语句
                  引言: 机器最擅长的事情就是重复工作,而能够命令机器陷入循环的编程语句就叫做循环语句。循环语句是每种语言都必不可少的,用好循环语句能节省大量代码。
                  本部分的知识比较基础,老司机可以略过。
                  (一).语法
                  1. for语句
                  FOR A=1 TO 10 STEP 1; //循环头
                  B+1->B: //循环体
                  END:
                  这样书写会使B+1->B:被执行十遍(从A=1到A=10共十遍),"STEP 1"可以省略(不写时默认STEP=1),但是当你希望控制循环的变量A以你想要的方式变化时,步长常量STEP就应显式写出。循环体每被执行一遍,A就会被加上STEP的值(比如当STEP=-1时,A每次被加上-1,即A减1),直到A逾越TO所规定的循环界限为止。‘TO’这个词表述得非常暧昧,可以理解为“大于等于”(当A比TO大时),也可以理解为“小于等于”(当A比TO小时),翻译成汉语应该是“当A满足A大于等于(或小于等于)TO规定的值时,循环条件成立”(其实就是人类理解的问题,机器才不会想那么多)。当然,如果STEP使得A向TO所期望的反方向变化的话,循环就没完了。
                  如果STEP为0会怎么样?除非A和TO都为0,否则循环一遍也不会被执行。
                  2.while语句
                  1->A:
                  WHILE A<10 //循环头
                  REPEAT //官方废话
                  A+1->A: //循环体
                  END:
                  while倒像是更自由化的for循环,循环的执行条件、循环变量的改变量(步长)是什么形式全部由你来定,所以大可以在循环中安插复杂的算法来确定循环什么时候停(与for不同,for中的STEP是在循环头唯一确定的常量)。也正因如此,犯错的几率也比用for高得多。在下看那句官废不爽很久了,好几次都在那里报错。
                  3.DO-UNTIL语句
                  在C和C++中被称作DO-WHILE的语句在HP-BASIC中以惊人的相似度出现。此语句的出现主要是为了能在某些状况下以较通顺和简洁的逻辑来写循环。
                  1->A:
                  DO
                  A+1->A:
                  UNTIL A>10:
                  END: //这时候end反而成了官废
                  这个比起while来就简洁多了。但是,until的不等号方向很容易反(在下实验的时候就写反了,A加到两百多万才反应过来)。此外,作为语(guan)法(fei)的一部分,end最好不要漏写。
                  (二).练习
                  1.有一个数学运算符叫Σ,在HP39gs中的用法是这样:
                  Σ(A=1,100,5*A+1)
                  有没有觉得和哪个语句很像?
                  这个读作sigma,在Editline里跑得比手写循环快得多。但是为了加深对它的印象,我们不妨写个程序来实现它。(要稍微能变通一点,加上输入和输出)
                  例程:
                  0->S:
                  INPUT N; "START" ; "START:" ; ""; 0:
                  INPUT M;"END" ; " END: " ; "" ; 0:
                  FOR A=N TO M STEP (N<=M)(这个不等式不是注释!!)
                  S +5*A + 1-> S:
                  END:
                  MSGBOX S:
                  此程序仅在M、N均为0时失效。
                  2.不用branch的低配版钢琴
                  之前在网上看到有玩家用IF、循环和BEEP做出钢琴的。其实,爱音乐何必受此羁绊?代码五行足矣。
                  例程:
                  WHILE 1
                  REPEAT
                  GETKEY B:
                  BEEP B²/4;0.1:
                  END:
                  调节分母大小可出不同音调,狂戳“on”即可安全退出,方便快捷,进退自如,实用到上天的程序!
                  在下最近一段时间受军训和夏令营所困,摸不着电脑,所以发帖晚了,在此向诸君道歉,并将少发的部分一并奉上。
                  2017年9月2日 23点19分
                  柜里猫


                  IP属地:福建27楼2017-09-02 23:19
                  回复
                    还有一件事,在此补上CHOOSE的正确用法(在下终于搞懂错在什么地方了)
                    1->A:
                    CHOOSE A; "LUCKY NUMBER" ; " 1 " ; " 2 " ; " 3 " ; " 4 ":
                    LUCKY NUMBER 是选择框的标题,1、2、3、4则是可供选择的选项。1-> A非常重要,A的初始值就是选择时高亮条的初始位置。
                    当A=0时,将不会有高亮条出现(选不了),当A比选项个数大时,整个语句就无法运行。
                    选完后,A的值就是选的那个选项的编号(和它内容无关)。


                    IP属地:福建28楼2017-09-02 23:27
                    收起回复
                      Part 7 branch分支语句
                      引言:branch语句在任何语言中都是相当重要的语句,起码是数一数二的。同样,掌握的简单程度也是数一数二的。
                      (一).语法
                      1.if语句
                      1->A:
                      IF A == 2
                      THEN
                      MSGBOX "2":
                      ELSE
                      MSGBOX "MDZZ":
                      END:
                      按照以上所写,您一定会看到马岛战争的有关信息。if语句是最基本的逻辑分支结构,可以说是学HP-BASIC的人必会的知识点。
                      介绍一个计算机学的概念:左值和右值。左值可以理解为能被修改的对象,右值可以理解为常数值。比如,在A==2这个表达式中,A是一个左值,而2是一个右值。再比如,在1->A中,A是左值,1是右值。广义上来讲,连“MDZZ”也能被理解为一个右值。
                      这就引来一个风险。比如,若不慎把“==”写作“=”,在某些语言中就会出现难以觉察的错误,因为“=”可做“赋值”解(像for中的A=1一样)。在这种情况下,最好养成在比较的时候左值写右边,右值写左边的习惯(2==A),这样在出错的时候就好找多了。(在HP-BASIC中倒是没差)。
                      2.case语句
                      CASE
                      IF A==1
                      THEN
                      MSGBOX "非":
                      END
                      IF A==2
                      THEN
                      MSGBOX "常":
                      END
                      IF A==3
                      THEN
                      MSGBOX "烦":
                      END
                      IF A==4
                      THEN
                      MSGBOX "琐"
                      END:
                      CASE就是if-else的另一种写法,本质上是没有差别的。在下莫名讨厌CASE语句,不知道是什么原因。
                      3.iferr语句
                      iferr的语法与if相同,但是逻辑相反。和DO-UNTIL类似,也是为了逻辑的简洁通顺才出现的。
                      4.run和stop
                      run提供了一个远比其他语言方便(好像没有什么可比性)的文件打开方式。
                      RUN "PIANO":
                      这样就打开了PIANO程序。在PIANO结束后,将跳转回来,接着运行run的后面的部分。
                      stop则是马上结束当前的所有进程,回到主界面。
                      run为HP39gs提供了很多的可能性,比如递归,比如多文件的程序(像各种比较大的游戏)、比如同一代码的重用,各种各样的东西都因run语句而得以实现。
                      (二).练习
                      1.辗转相除法
                      给定正整数A、B,求A、B的Gcd(最大公因数)
                      这是一个在计算机界非常有名的算法,如果是搞算法竞赛的人——可以毫不夸张地说——全都会。
                      例程:
                      PROMPT A:
                      PROMPT B:
                      WHILE A/B //计算机科学中非0为真,但是这个表达式只能在有保留小数时用
                      REPEAT
                      B->C:
                      A MOD B->B:
                      C->A:
                      END:
                      MSGBOX B:
                      2.猜数游戏
                      随机一个数,让玩家猜。如果猜大了或者猜小了,提示玩家。猜中了可以获得精美昂贵的礼品(玩家自己筹备)。
                      HP39gs内置了随机数生成器RANDOM,直接把它当常量用即可。
                      例程:
                      0->B:
                      0->D:
                      RANDOM->C:
                      WHILE B≠1
                      REPEAT
                      D + 1-> D:
                      PROMPT A:
                      IF A > C:
                      THEN
                      MSGBOX "TOO BIG":
                      ELSE
                      IF A < C
                      THEN
                      MSGBOX "TOO SMALL":
                      ELSE
                      MSGBOX "YOU GOT IT! " D " STEPS":
                      1-> B:
                      END:
                      END:
                      这是一个很棒的消遣,配合零食或者小视频或者各种可以用次计算的活动效果更佳。
                      2017年9月3日01点12分
                      柜里猫


                      IP属地:福建29楼2017-09-03 01:12
                      收起回复
                        Part 8 绘图
                        引言:绘图计算器的屏幕宽大,适于绘制各种图像,吧里也有用hp39gs绘图的大佬发的帖,好像很有趣。
                        还有,part8主要针对在屏幕上用语句画图以及在SKETCH里用光标画图。至于在应用里的plot里画图,这里暂且不表。
                        (一).相关变量
                        按下vars键就能打开vars菜单,我们能在其中找到许多关于图形绘制的变量。这些变量对绘图工作有很大帮助。
                        1.存贮图像信息的变量
                        G1到G0和Page以特殊格式(MAKEGROB语句)贮存图像。其中Page代表当前显示在SKETCH界面的图像。因此,当要查看贮存在G1-G0里的图像时,可以先把它赋给Page,然后再打开SKETCH查看。
                        2.控制屏幕缩放比的变量
                        Xmax、Ymax、Xmin、Ymin是用于控制屏幕缩放比的变量,分别代表屏幕的上下左右顶点的那个像素在坐标系里的位置。hp39gs的默认设置是将屏幕置于x∈±6.5,y∈±3.1的地方。我们在自己绘图时可以将Xmin、Ymin设为0,
                        将Xmax设为131,将Ymax设为64,这样就能把屏幕放在第一象限,而且每个像素都有整数坐标,便于操作。如果不慎设了奇怪的数值,又不想慢慢改回来,可以用function的plot的zoom里的decimal选项改回来。
                        顺带说一句,当Xmin>Xmax或Ymin>Ymax时,两者会互换数值。
                        (二).Drawing语句
                        1.arc语句 ARC 1;2;3;1;π:这个语句表达的是:以(1,2)为圆心,3为半径,从弧度1开始画一个弧度为π的圆。
                        2.box BOX 1;2;3;4:这是在画一个以(1,2)(3,4)为对角的矩形。
                        3.erase ERASE:将屏幕清空。这个语句比较常用。
                        4.freeze FREEZE:冻住不许走。这个语句也很常用,冻住之后按任意键继续。
                        5.line LINE 1;2;3;4: 将点(1,2)和点(3,4)连起来。
                        6.tline TLINE 1;2;3;4:将点(1,2)和点(3,4)之间的所有点换成另一种颜色(白变黑,黑变白);
                        7.pixoff 与 pixon PIXON 1;2:将点(1,2)变为黑色。pixoff同理。
                        这些语句可以对图像进行非常基本的操作,就像手工画图一样,观赏性强但是速度不快。
                        freeze的用途超越了画图,广泛运用在人类的反应赶不上计算器的地方(虽然这台计算器通常慢得让人着急)。
                        (三).Graphic语句
                        1.display-> DISPLAY->G1:这个语句可以将当前屏幕存到G1变量中。通常在程序中使用,和截屏并没有什么差别。
                        2.->display ->DISPLAY G1:这个语句可以将G1呈现在屏幕上。搭配erase和freeze更佳。
                        3.在下并不清楚->GROB是用来做什么的,在查阅hp39gs的说明书后仍旧不懂。
                        3.grobnot GROBNOT G1:可以讲G1的每个像素的颜色都反过来并保存(简单来说就是反色)。
                        4.grobor GROBOR G1;(0,0);G0:用or关系把G0叠加到G1的(0,0)上(即把G0的左上角放在G1显示出来时的(0,0)位置,只要是重合处并且在G0或G1中是黑色的地方都将其涂黑)。
                        5.grobxor GROBXOR G1;(0,0);G0;同grobor ,但是逻辑关系变为xor,重合且黑色的地方将被涂为白色。
                        6.makegrob MAKEGROB G1;131;64;151D5FAB15A1DF5B15……:将那一大堆十六进制数字存入以131为长,64为宽的G1中。正常人不会去操作这个的吧......
                        7.->PLOT 和PLOT->的用法和1、2的display差不多,但是它们所保存的是plot的图像。
                        (四)有趣的小程序
                        131->Xmax:
                        0->Ymin:
                        0->Xmin:
                        64->Ymax:
                        WHILE 1
                        REPEAT
                        TLINE 131*RANDOM;64*RANDOM;131*RANDOM;64*RANDOM:
                        END:
                        可以在计算器屏幕上乱画。用模拟器的最高速运行别有一番风味。
                        在下被禁网很久(实际上每两周有半个小时可以上网,但是显然可以忽略不计),导致最近几个月没有时间更新,在下深感抱歉。还有大家仿佛挺挂念在下断更数月的文章,在下在此表示感谢。不过最近有可能会再断更一段时间,毕竟这次也只是趁着寒假间隙发的。总之,今后随缘更新吧。感谢。
                        2018年2月25日04点04分
                        柜里猫


                        IP属地:福建33楼2018-02-25 04:04
                        收起回复
                          感谢大家的持续关注。虽然在下不久前遇到了一些“网络问题”,但是还是会努力下去啊!φ(゜▽゜*)♪
                          hp39gs的矩阵功能丰富,图形计算器的内存和计算力优势在这里能得到充分体现。
                          所以在下会在最近去了解一下相关的内容,Part9大概就是关于矩阵的教程了。
                          ps:在下目前对矩阵的认识:“二维数组?不然是什么?(*゜—゜*)??”。


                          IP属地:福建36楼2018-03-02 23:45
                          回复
                            在下最近刚发现微积分功能的用法。
                            按照HELPWITH说明的用法,在主界面输入dx(x^2),得出的结果是0。同样,输入其他的表达式得出的结果都是其在0处的导数值。
                            但是,dx()其实不是在主界面上这样使用的。打开function,绘制dx(x^4-2x),可以看见计算器绘制出了该函数的导数图像
                            总之不是很方便啦。
                            要在主界面上使用d来求导,需要使用一种叫形式名的超高级技术

                            大概就是这样。
                            在下之后的教程是不是该加点图呢(沉思+1s)


                            IP属地:福建42楼2018-03-16 13:06
                            回复(5)
                              在下有点更不动了。之前去看了说明书,发现这个帖子存在的意义不是很大,而且之前话又说得太满,其实最多只能做到比入门高一点,又不会真有人有那个耐心去学计算器的编程。大概再也更不动了吧,大概。(可能只是在下很懒而已,但是在下现在已经没什么能用的空闲时间了,何况帖子的内容被说明书大面积覆盖,食之无味弃之可惜。)但是大家的留言在下还会认真回复的,唯有这点热情在下尚未消退。


                              IP属地:福建51楼2018-11-10 23:50
                              收起回复