该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
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
柜里猫