HP Prime for All
English
Русский
Author: Edward Shore (original article)
These two programs for the HP Prime illustrate the use of DRAWMENU and MOUSE.
Using DRAWMENU to draw a customized menu.
Functions featured:
Input: EC(argument)
The argument needs to be appropriate type of what you want to do.
head
and tail
: the argument needs to be a list.l2norm
: the argument needs to be a vector.ker
and SPECRAD
: the argument needs to be matrixeven
: we need an integerExamples:
EC({7,8,9})
, choosing head
will return {7}
while tail
returns {8,9}
.EC([7,2,6,9])
while choosing l2norm
returns √170
.EC([[1,4],[-3,-12]])
while choosing ker
returns [[4, -1]]
.EC([[1, 4],[-3, -12]])
while choosing SPECRAD
returns 13.0384048104
(approximately)
For even
, a result of 1
indicates that the number is even and 0
if the number is odd.
Program
EXPORT EC(x)
BEGIN
// CAS Custom Menu
// EWS 2014-04-20
LOCAL m, m1, mx, my;
WHILE MOUSE(1) ≥ 0 DO END;
RECT;
TEXTOUT_P("Choose the function.", 1, 1, 4);
TEXTOUT_P("head: 1st element of a list", 1, 18, 4);
TEXTOUT_P("tail: all elements of a list except the 1st", 1, 35, 4);
TEXTOUT_P("l2norm: L-2 norm of a vector", 1, 52, 4);
TEXTOUT_P("ker: kernel of a matrix", 1, 69, 4);
TEXTOUT_P("SPECRAD: spectral radius of a matrix", 1, 86, 4);
TEXTOUT_P("even: is the number even?", 1, 103, 4);
DRAWMENU("head", "tail", "l2norm", "ker", "SPECRAD", "even");
REPEAT
m := MOUSE;
m1 := m(1);
UNTIL SIZE(m1) > 0;
mx := m1(1);
my := m1(2);
IF my ≥ 220 AND my ≤ 239 THEN
IF mx ≥ 0 AND mx ≤ 51 THEN
RETURN SUB(x, 1, 1);
END;
IF mx ≥ 53 AND mx ≤ 104 THEN
RETURN SUB(x, 2, SIZE(x));
END;
IF mx ≥ 106 AND mx ≤ 157 THEN
RETURN exact(ABS(x));
END;
IF mx ≥ 159 AND mx ≤ 210 THEN
RETURN ker(x);
END;
IF mx ≥ 212 AND mx ≤ 263 THEN
RETURN CAS.SPECNORM(x);
END;
IF mx ≥ 265 AND mx ≤ 319 THEN
RETURN even(x);
END;
END;
END;
Blotch Drawing Program.
To draw a square blotch, just touch the screen outside the menu.
Input: BLOTCH()
Program:
// EWS 04-20-2014
EXPORT BLOTCH()
BEGIN
// Initialize
LOCAL m, m1, mx, my, j, k, r;
WHILE MOUSE(1) ≥ 0 DO END;
// Clear Canvas
RECT;
LOCAL s := 50, d := 4;
// Menu - to be redrawn
DRAWMENU("Clear", "S+5", "S-5", "D+2", "D-2", "Exit");
// Start main loop
REPEAT
// Get mouse data
REPEAT
m := MOUSE; m1 := m(1);
UNTIL SIZE(m1) > 0;
mx := m1(1); my := m1(2);
DRAWMENU("Clear", "S+5", "S-5", "D+2", "D-2", "Exit");
// Clear Screen
IF (my ≥ 220 AND my ≤ 319) AND (mx ≥ 0 AND mx ≤ 51) THEN
RECT;
END;
// Change Size
IF (my ≥ 220 AND my ≤ 319) AND (mx ≥ 53 AND mx ≤ 104) THEN
IF s < 80 THEN s := s+5; END;
END;
IF (my ≥ 220 AND my ≤ 319) AND (mx ≥ 106 AND mx ≤ 157) THEN
IF s > 5 THEN s := s-5; END;
END;
// Change Depth
IF (my ≥ 220 AND my ≤ 319) AND (mx ≥ 159 AND mx ≤ 210) THEN
IF d < 8 THEN d := d+2; END;
END;
IF (my ≥ 220 AND my ≤ 319) AND (mx ≥ 212 AND mx ≤ 263) THEN
IF d > 2 THEN d := d-2; END;
END;
// Exit Key
IF (my ≥ 220 AND my ≤ 319) AND (mx ≥ 256 AND mx ≤ 319) THEN
BREAK;
END;
// Draw Blotch
FOR j FROM mx-s/2 TO mx+s/2 STEP d DO
FOR k FROM my-s/2 TO my+s/2 STEP d DO
r := RANDINT(1677215);
RECT_P(j, k, j+d-1, k+d-1, r);
END; END;
// Close main loop
UNTIL (my ≥ 220 AND my ≤ 319) AND (mx ≥ 256 AND mx ≤ 319);
RECT_P(0, 220, 319, 239);
TEXTOUT_P("DONE!", 146, 220, 4, #FF0000h);
WAIT(-1);
END;