По всем вопросам - пишите на эл.почтуКруглосуточно 24/7
We speak English

Урок 3.1. Программа EC: команда DRAWMENU

Данные две программы для калькулятора HP Prime иллюстрируют использование команд DRAWMENU и MOUSE.

Программа EC

С помощью команды DRAWMENU можно нарисовать пользовательское меню.

Какие понадобятся функции:

  • head: 1-ый элемент списка
  • tail: все элементы списка кроме 1-ого
  • l2norm: L-2 норма вектора
  • ker: ядро матрицы SPECRAD: спектральный радиус матрицы
  • even: проверяет, является ли число четным

Ввод: EC(argument)

Аргумент должен быть подходящего типа для той операции, которую вы хотите выполнить:

  • Для head и tail аргумент должен быть списком.
  • Для l2norm аргумент должен быть вектором.
  • Для ker и SPECRAD аргумент должен быть матрицей.
  • Для even нужно целое число.

Примеры:

EC({7,8,9}), выбор head выдает {7}, а выбор tail выдает {8,9}.
EC([7,2,6,9]) выбор l2norm выдает √170.
EC() выбор ker выдает .
EC() выбор SPECRAD выдает 13.0384048104 (приблизительно)

В функции even результат в виде 1 означает, что число четное, а результат в виде 0, что число нечетное.

Программа

EXPORT EC(x)
BEGIN
  // Настраиваемое меню CAS
  // EWS 2021-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;