27. Суперкоманды

Содержание

Ведение
Команды проверки работы программы при отладке
Команды общения с пользователем
Команды научных графиков
Команды вспомогательных расчетов
Команды некоторых математических расчетов
Команды анимации и другой работы с картинками
.

Введение

В этой главе дается информация по использованию некоторых наиболее часто используемых суперкоманд. Cуперкоманды не относятся к основам языка программирования. Это просто небольшие, или даже большие, процедуры, которые удобно использовать таким способом. Их может быть сколько угодно, так как каждый пользователь может добавлять новые. А можно их вообще не использовать, а копировать их код в виде процедуры в текст программы. В исходной версии языка код каждой супекоманды записывается в отдельный файл в папке [proc] интерпретатора vkACL. При этом имя файла совпадает с именем суперкоманды, а вызов состоит в написании двух символов ##.

Такой способ организации кода удобен тем, что один раз написанный код можно использовать в большом числе программ и его не надо переписывать или копировать. Такая возможность сохранена и в новой версии программы ACLP, но она уже не используется. И даже папки [proc] в архиве не существует. Причина в том, что при постоянном считывании кода из файла программа не будет быстро работать, а винчестер будет изнашиваться. Если код нужен только один раз, то это еще терпимо, а в цикле с 1000 повторений это совсем неразумно делать. Вместо этого используется другой способ использования суперкоманд, который описан ниже.

Более того, в новой версии интерпретатора в архив программы записаны не все суперкоманды, которые я уже написал, а только те, которые я сам наиболее активно использую. Остальные находятся в библиотеке и некоторые могут совсем не иметь описания в интернете. Описания суперкоманд я постепенно переписываю, но, как обычно бывает, не все сразу удается сделать. Ниже показан список суперкоманд, разделенных на разделы и имеющих ссылку на основной текст описания. Для возврата к списку команд нажимайте клавишу [Home].

В новой версии интерпретатора суперкоманды имеют номер N, который указан в круглых скобках после имени, и их можно использовать по коду ( #e [n=N; b=KY; le=670;] _text ). Сначала для сокрашения текста я использовал процедуру ( #pro scom #e [b=KY; le=670;] _text @ )
и тогда суперкоманды вызывались более коротко (#e [n=N;] _scom ). Такой метод использования суперкоманд более предпочтителен, хотя и менее наглядный. При этом используется всего один файл-склад, содержащий все процедуры, а процедуры считываются из файла только один раз. Затем они запоминаются в массиве t() и дальше используются без файла. То есть работа программы ускоряется, а винчестер меньше изнашивается. В этом случае массив t() можно использовать с индексами меньше значения переменной KY. И нельзя использовать все переменные типа *Y и *Z, где * означает любой символ первой серии, то есть от (a) до (z), от (A) до )Z) и $, %, &. Точнее не все из указанных символов нельзя переписывать, но лучше не использовать все, так как они как бы для внутренней работы. Так символы *Z используются в суперкомандах нового типа, а символы *Y используются в специальной стартовой процедуре, которая записывается в массив t(). Если необходимо записать текст в конец массива, то лучше использовать индекс (KY-N), где N равно необходимому числу символов.

Дело в том, что новая версия при старте определяет процедуру в массиве t(), начиная с индекса KY, которая часто используется и работает с указанными переменными. Кроме того, она определяет переменные ZZ=s(109), &&=12345; Если использовать указанные переменные, то процедура будет работать неадекватно, а переменные могут изменить свои значения. Хотя указанные ограничения выглядят некрасиво, а процедуры выглядят не наглядно, но в целом это не мешает работе, зато все получается более оптимально и быстро. Так записаны многие программы. Но в самое последнее время я сделал аппартный вызов указанный выше процедуры и теперь процедура (scom) больше не нужна, а вместо (#e [n=N;] _scom ) можно писать просто (##N), где вместо N должен стоят реальный числовой номер процедуры. В таком виде запись становится еще более компактной. Переменные при этом писать нельзя потому, что любой символ, отличный от числа трактуется как имя файла в папке [proc]. С другой стороны, для таких файлов нельзя использовать имя с числом в первом символе.

Список суперкоманд

Команды проверки работы программы при отладке
scar (18) -- (show complex array) график комплексной функции в массиве r()
sm (26) -- (show memory) график части массива r()

Команды общения с пользователем
ssel (14) -- программа вертикального фасонного меню
ssel2 (32) -- программа фасонного меню в две колонки
rules (15) -- программа универсальной формы информационной помощи
chva (16) -- программа для выбора одного варианта из 99
mess (17) -- программа легкой подсказки в форме статусной строки
winf (23) -- программа показа картинки с текстом подсказки -- новая
winid (24) -- программа универсальной формы ввода входных данных
info (25) -- программа показа картинки с текстом подсказки -- старая
butt (27) -- программа маленькой кнопочки [OK] для задержки программы
ciph (30) -- программа шифрования текстовых файлов -- новая
mpuv (33) -- (message of printed) показ текста из печати. любое число кнопок в 1 ряд.
idff (35) -- (input data from file) ввод входных данных из файла.
cidp (36) -- (cycle -- input data from file, program) в цикле ввод входных данных из файла и программа.

Команды научных графиков
smau (1) -- универсальный график функций в r() с аргументом, пишет в файл, имеет отказ от графика
smmх (2) -- процедура карты почернения для F(x,y) c разметкой осей и с размерами пиксела, пишет в файл
smma (3) -- процедура аксонометричекой проекции F(x,y) c разметкой осей, пишет в файл
smq3d (4) -- окно показа 2D функции в массиве r() как квази 3D графика
smas (40) -- специальный график функции в r() с аргументом, имеет меньше параметров

Команды вспомогательных расчетов
paax (5) -- команда разметки числовой оси аргумента или функции на графике
paax3 (31) -- команда разметки трех числовых осей для показа карты функции 2-х аргументов
par (6-13) -- команда задания стандартных параметров и выполнения стандартных расчетов
cond (22) -- команда разделения 9 разрядов переменной Q в переменные &1, ..., &9 слева направо

Команды некоторых математических расчетов
varparn (29) -- программа поиска минимума функции двух переменных
time (34) -- программа вычисления даты и времени изменения файла
fffltc (37) -- программа находит файл в папке с последней датой изменения
hmpf (39) -- программа подсчитывает число файлов формата jpg и png в папке
fft2 (41) -- программа вычисляет прямое и обратное 2D преобразование Фурье

Команды анимации и другой работы с картинками
mspic (19) -- анимация по пронумерованным картинкам с масштабированием (новая)
animdep (20) -- анимация по сечениям двумерного массива чисел (новая)
matpic (21) -- картинка как матрица других картинок (новая)
animdep2 (28) -- анимация по сечениям двумерного массива чисел (новая)
cpfwi (38) -- копирует файлы с картинками из одной папки в другую с пронумерованными именами (новая)

.

fft2 (41) -- (программа вычисляет прямое и обратное 2D преобразование Фурье).

Программа работает с комплексными двумерными массивами и использует следующие параметры J, N1, n1, d1, N2, n2, d2, k. Здесь J -- начальный индекс массива r() для исходной матрицы, N1 -- число точек матрицы по первому аргументу (ППА), n1 -- коэффициент умножения области ППА, d1 -- шаг сетки ППА, N2 -- число точек матрицы по второму аргументу (ПВА), n2 -- коэффициент умножения области ПВА, d2 -- шаг сетки ПВА, k = -1 для прямого преобразования, и = 1 для обратного. Числа N1, N2 должны быть равны 2 в целой степени. Числа n1, n2 могуть быть равны 1, 2, 4. Больше не нужно. Это коэффициенты умножения числа точек для расширения области. Лишние точки заполняются нулями. Необходимость в этом возникает по той причине, что некоторые функции (например, функция Гаусса) не заполняют всю расчетную область, а находятся в центре ее. Это происходит как в прямом, так и в обратном пространстве по той причине, что используется метод FFT. Если N2 и n2 равны 1, то делается одномерное преобразование Фурье. Результат записывается вместо исходной матрицы. Пример вызова
#d 8 r(ZZ-200) J ni m d ni m d -1 ##41

.

hmpf (39) -- (подсчитывает число файлов формата jpg и png в папке).

Программа выполняет относительно вспомогательную работу. На входе она получает из печати имя папки. На выходе она выдает в переменную & число файлов с расширениями jpg и png в этой папке. Программа портит начало 3-й сотни в целом массива i() и начало 10 тысяч с конца в текстовом масиве t(). Пример вызова
# s(3)=1; #pr c:/_vk/_ACLp/\E ##39 #m [op=win;] \I5 &;\E

.

cpfwi (38) -- (копирует файлы с картинками из одной папки в другую с пронумерованными именами).

Программа выполняет относительно вспомогательную работу. На входе она получает из печати имя папки источника, имя папки результата и шапку. На выходе она выдает в переменную & число скопированных файлов или 0, если работа не сделана по причине отсутствия папки источника или самих файлов картинок. Сама работа состоит в том, что из папки источника копируются все файлы с расширениями jpg и png в папку результата, причем файлы имеют имена с шапкой и номером, который соответствует номеру, с которым файл копируется, начиная от 1. Если папки результата не существует, то она создается. Программа портит начало 3-й сотни в целом массива i() и начало 10 тысяч с конца в текстовом масиве t(). Пример вызова
# s(3)=1; #pr c:/_vk/_ACLp/ lect s \E #e [n=38;] _scom #m [op=win;] \I5 &;\E

.

fffltc (37) -- (программа находит файл в папке с последней датой изменения).

Программа выполняет относительно вспомогательную работу. На входе она получает имя папки в печати, на выходе выдает имя файла с последней датой изменения среди всех файлов в этой папке. Это бывает необходимо, например, когда какая-то программа показывает картинки из файлов в папке. При этом желательно иметь таблицу иконок этих картинок. Программа ее делает и записывает в эту же папку, чтобы не делать в следующий раз. Но число файлов в папке может измениться. Могут появиться новые файлы. Тогда сделанную ранее таблицу использовать нельзя. Вот и нужно определить файл с последним изменением. Если это таблица, то ее можно использовать. Если нет, то нельзя. Могут быть и другие применения. Программа портит начало 3-й сотни в целом массива i() и начало 10 тысяч с конца в текстовом масиве. Пример вызова
# s(3)=1; #pr c:/_vk/_ACLp/\E #e [n=37;] _scom #m [op=win;] \Tp\E

.

cidp (36) -- (в цикле -- ввод входных данных из файла и программа).

Программа является рамой для разных готовых программ определенного типа. Она выполняет интерактивный ввод входных данных (ВД) из файла и запускает процедуру с названием pr36, в которой должен находиться весь остальной код. ВД в файле программы должны записываться в одной строке, но таких строк может быть много. Сложность такой конструкции в том, что выбор строки для исполнения реализуется по позиции курсора, который должен находиться в начале нужной строки. Программа выполняет первичный анализ входных данных на ошибку, и если ошибка найдена, то все возвращается в самое начало цикла. Если ошибки нет, то запускается процедура pr36 и она способна проводить дополнительный анализ входных данных. При наличии ошибки все опять возвращается в самое начало. Код процедуры с названием pr36 не должен содержать процедуры scom для вызова суперкоманд с номерами. Это устаревшая техника. Сейчас суперкоманды вызываются просто по номеру и проблем нет. Входными параметрами самой программы являются рабочая папка и имя файла ВД. При этом имя файла необходимо напечатать в конце текстового массива, то есть с позиции KY-500-N, где N -- число, большее числа символов в имени файла. Процедура pr36 на входе получает выбранную строку входных данных как \TI1 S1. Если эта строка содержит неверную информацию, то необходимо выйти и задать &0=1; Также программа использует процедуру 4324, которая должна быть определена в вызывающей программе. Эта процедура на входе имеет напечатанный текст, который она должна показать пользователю любым способом. Данная суперкоманда очень часто используется для формирования удобной среды общения с пользователем. И есть проблема, когда процедура pr36 сама вызывает программу, которая вызывает эту суперкоманду и снова с процедурой pr36. А в данном языке рекурсия недопустима. Чтобы избежать ошибки используется переменная &z. Если ее значение 0, то суперкоманда запускает процедуру pr36, а если 1, то она запускает процедуру prex. Переменная исходно имеет значение 0 и если ее не переопределять, то просто работает старый режим. И только в случае такой вот рекурсии надо перед запуском внешней суперкоманды задать новое значение для переменной &z=1, и определить новую процедуру prex, а перед запуском внутренней процедуры изменить переменную &z=0, затем после ее работы вернуть значение &z=1. Наконец, после работы внешей процедуры снова поставить &z=0. Есть также ситуация, когда суперкоманда используется без обработки ВД, а просто сразу запускает процедуру pr36. Для установки такого режима надо задать t(KY-1)=0. Стандартно t(KY-1)=1. Но если переменная изменена, то надо после работы вернуть ее исходное значение. Пример использования суперкоманды для копирования
#f [op=fold; file=pro;] # t(KY-1)=1; &z=0; s(3)=KY-520; #pr m0d.par\E ##36

.

idff (35) -- (программа ввода входных данных из файла).

Программа выполняет интерактивный ввод входных данных из файла в любую ACL программу в упрощенном режиме. А именно, она показывает содержимое файла, имя которого должно быть предварительно напечатано командой pr. В этом файле должно быть A строк (A может быть равно 0) с двумя числами на каждой строке, остальная часть строки произвольная, в ней могут быть комментарии, B строк (B может быть равно 0) с текстовыми параметрами, по одному параметру без пробелов на каждой строке, остальная часть через пробел может быть использована для комментариев. Остальные строки файла могут быть использованы как описание программы. Также необходимо задать число C как начальный индекс текстового массива, куда будут записаны текстовые комментарии. Итак, на входе: напечатанное название файла, A -- число строк с числовыми параметрами (два параметра на строку), B -- число текстовых параметров, C -- начальный индекс для записи текстовых параметров. На выходе: числовые параметры в первых элементах массива r(), сразу на ними длины текстовых параметров, и текстовые параметры в указанном месте массива t(). Пример использования суперкоманды для копирования
# s(3)=1; #pr idfile.ini\E #d 3 A 5 1 1 #e [n=35;] _scom

.

varparn (29) -- программа поиска минимума функции двух переменных

Процедура находит минимум функции двух переменных с графическим оформлением. Ее разумно использовать в том случае, когда каждое значение функции вычисляется относительно долго. При быстром вычислении функции графика немного замедляет процесс, но не очень сильно. Запуск программы реализуется следующим образом
#d 5 r(ZZ-70) a1 a2 s1 s2 n ##varparn
где переменная ZZ=s(109) определено в самом начале, a1, a2 -- начальные значения двух аргументов функции, s1, s2 -- шаги изменения этих аргументов, n -- полное число расчетов функции при поиске минимума. Вместо переменных при вызове можно задавать их числовые значения. Дополнительно должна быть определена процедура =pro pcmf ... @, которая вычисляет функцию двух переменных. Для нее аргументы должны задаваться в переменные B1, B2, а результат, то есть значение самой функции должен быть определен в переменной С. Кроме того, процедура не должна использовать переменные b1-- b9, c, c0, c1, c2, d1, d2, e, e0, e1 -- e8, k1 -- k4, m0, m1 -- m4, n0, n3, w, w1, u0, u1 -- u9, v, v1 -- v4, B1, B2, C, K1, K2, N1, W, Y1, Y2, &8, и массив r(), начиная с элемента 997001. Результат, то есть значения аргументов, которые соответствуют минимуму функции выдается в переменные AZ и BZ. В этой точке надо заново пересчитать процедуру pcmf, так как текущее значение функции программа не сохраняет. Сама программа указанные выше переменные не портит, так как они запоминаются в начале и восстанавливаются в конце. Алгоритм работы программы описан в другом месте.


.

time (34) -- программа вычисления даты и времени изменения файла

Программа на входе использует полный путь к файлу на компьютере при заказе главной папки (null) из команды печати, а на выходе выдает дату и время последнего изменения файла в переменные DZ и TZ. Она не портит переменные, но портит первые 30 элементов массива r(). Вместо печати выбор пути к файлу можно делать также через менеджер файлов по команде #f [op=choo;]. Переменные представляют собой 6-разрядные целые числа, в которых разряды парами представляют три числа. У переменной DZ -- это год 21 века, месяц и число. У переменной TZ -- это часы, минуты и секунды. Пример применения суперкоманды можно посмотреть в файле 38 описания ACL.

.

animdep2 (28) -- анимация по сечениям трехмерного массива чисел (новая)

Программа показывает трехмерный массив чисел, записанный в файл в формате float (4 байта на число) как анимацию, в которой сечения (картинки зависимости от первых двух аргументов) меняются со временем на одних и тех-же осях, либо увеличивая третью координату, либо уменьшая ее. Перед запуском программы нужно задать значения параметров, которые она использует в работе. Такими значениями являются 19 чисел, которые должны быть записаны в массив r() начиная с первого элемента, то есть в r(1) ... r(18), и текстовая строка, которая должна быть напечатана командой #pri. Числовые значения имеют следующий смысл

1 -- Nx, число точек по горизонтали (в сечениях) трехмерного массива
2 -- Ny, число точек по вертикали (в сечениях) трехмерного массива
3 -- Nz, число сечений, то есть кадров анимации
4 -- xb, начальное значение на оси первого аргумента
5 -- xe, конечное значение на оси первого аргумента
6 -- xl, значение первой длинной риски на графике (горизонтальная ось)
7 -- dxl, шаг до следующей длинной риски
8 -- nxl, число коротких рисок между длинными
9 -- yb, начальное значение на оси второго аргумента (вертикальной)
10 -- ye, конечное значение на оси второго аргумента (вертикальной)
11 -- yl, значение первой длинной риски на графике (вертикальная ось)
12 -- dyl, шаг до следующей длинной риски
13 -- nyl, число коротких рисок между длинными
14 -- k, номер картинки, которая будет показана первой, начинается от нуля.
15 -- i, индекс массива r(), где записаны кривые
16 -- tp, время паузы в единицах 0.1 секунды
17 -- pa, номер палитры (0 -- черно-белая, 3 -- цветная, 1,2 -- цветные устаревшие)
18 -- pn, параметр нормировки (-1 -- нет нормировки, 1 -- нормировка каждой картинки индивидуально)
19 -- cs, коэффициент масштабирования ( 0 < C <= 1). Если 1, то одна точка = один пиксель экрана, но можно делать меньше.

Текстовый аргумент должен содержать два текста, разделенные символом вертикальной черты. Первый текст -- это имя файла с числами относительно папки той программы, которая использует суперкоманду. Второй текст содержит начальную часть заголовка. К ней динамически прибавляется номер картинки и ее минимальное и максимальное значения. Числа прочитываются из файла при условии, что параметр i (его номер 15) равен 0. Если он больше 0, то числа прочитываются из массива r(), начиная с индекса, на который указывает параметр.

Параметр нормировки обычно равен 1 и тогда нет проблем. Если же он равен -1, то вертикальная ось все равно будет от 0 до 1, а весь трехмерный массив надо нормировать на этот интервал предварительно, иначе программа будет работать неправильно. Сама программа в этом случае нормировку не делает.

Программа работает следующим образом: Сначала показывается картинка с номером, заданным входным параметром номер 15. После нажатия клавиши [Enter] номер кривой начинает увеличиваться с интервалом, задаваемым параметром номер 16 + время на создание самого графика. Если точек много, оно может быть заметным. Если нажать клавишу пробела (или любую другую из тех, которые ниже не указаны) то анимация останавливается. Повторное нажатие клавиши [Enter] снова ее запускает. При выходе за максимальное значение номера (Nz) он становится равным первому значению (1). То же самое происходит при нажатии клавиши [Backspace], только в это случае номер не увеличивается, а уменьшается, а при выходе за минимум (1) он становится максимальным (Nz).

Дополнительные операции. Если в процессе анимации нажать клавишу стрелки вправо, то анимация остановится. При повторном запуске анимации интервал времени между разными кривыми будет в два раза короче, то есть кривые будут сменятся быстрее. Если нажать клавишу стрелки влево, то все будет точно так же, только интервал будет в два раза длиннее. Эти процедуры можно повторять многократно постепенно увеличивая или уменьшая время паузы. Если нажать клавишу стрелки вверх, то показ остановится и программа попросит ввести номер кривой в окно ввода с двумя кнопками [OK] и [Cancel].

При выборе (клике) кнопки [OK] программа покажет кривую, номер которой ввел пользователь, и на экране снова появится предложение ввести номер следующей кривой. Все окна появляются в центре экрана и окно ввода, вообще говоря, может мешать видеть картинки. Но любое окно можно передвинуть в любую часть экрана. Так окно анимации можно передвинуть в самом начале показа, если поставить курсор мыши на титульную строку и перетащить окно. Окно ввода можно перетаскивать в тот момент, когда оно появляется.

Процедура показа картинок по номеру повторяется каждый раз пока нажимается кнопка [OK]. Чтобы остановить этот процесс надо выбрать кнопку [Cancel]. Затем можно снова запускать анимацию. Анимация начнется с той кривой, которая показывалась последней. Она хороша для общего обзора и в презентациях. А просмотр картинок по номеру удобен при исследовании наиболее интересных участков.

Есть и возможность пошагового просмотра кривых. Для этого в самом начале надо нажать клавишу стрелки вниз. Программа покажет кривую с номером на 1 больше того, который показывался. Для сдвига номера дальше надо сначала нажать клавишу 0, а затем снова клавишу стрелки вниз. Такую процедуру можно повторять много раз. Комбинация с использованием всех клавиш дает много возможностей просмотра сечений. Программа удобна тем, что не требует создавать очень большое число рисунков с одной картинкой в каждом сечении. Вполне достаточно иметь двумерный массив в одном файле.

Вот пример запуска суперкоманды
#d 19 r(1) 820 820 21 -0.6 0.6 -0.5 0.25 4 -0.6 0.6 -0.5 0.25 4 1 0 5 0 1 1 #pr 01-map.dat|Интенсивность\E ##animdep2

.

butt (27) -- программа кнопки [OK] для задержки программы

Программа рисует на экране кнопку с названием OK и ждет пока пользователь кликнет эту кнопку. Это бывает необходимо, когда надо задержать выполнение программы, до тех пор пока пользователь не разрешит ее продолжить. Эту суперкоманду (СК) можно использовать в паре с СК inff, которая выставляет окно с информацией без задержки программы. Наверняка у нее найдутся и другие применения. Перед вызовом программы необходимо определить координаты левого нижнего угла кнопки и ее масштаб. Это нужно делать следующим образом (переменная ZZ=s(109); определена в самом начале)
#d 3 r(ZZ-10) 100 100 2 ##butt

.

sm (26) -- (show memory) график части массива r()

Программа показывает на графике значения части элементов числового массива r(). При этом надо задать номер первого элемента ( J ), число элементов ( n ) и номер варианта вызова (не более 10, от 0 до 9) стандартным образом. Полезно в том случае, когда программа работает неправильно и надо понять содержание памяти. Иногда полезно для диагностики расчетов при показе промежуточных кривых. Первые два параметра могут иметь знак минус. При этом знаки работают как указатели, а сами параметры берутся по модулю. Если оба параметра положительны, то график показывается на экране и все. Если второй параметр отрицателен, то график показывается на экране и спасается в файл с названием smN.jpg во внутреннюю папку рабочей папки программы. Тут N означает значение 3-го параметра. Если оба параметра отрицательны, то график не показывается на экране, а только спасается в файл. Это бывает необходимо при автоматическом расчете многих программ, которые рисуют много графиков. В этом случае удобно смотреть их все сразу, а не по очереди. Имя внутренней папки надо указать перед вызовом процедуры. Это обязательно. Я обычно использую папку с названием [pic]. Тогда пример вызова процедуры может быть таким
#d 3 r(ZZ-10) J n 1 #pr pic\E #e [n=26;] _scom

.

info (25) - программа показа картинки с текстом подсказки

Программа используется для показа на экране разного рода информационных текстовых сообщений стандартного вида. Стандартными являются цвет текста (синий) и фона (светлокоричневый), размер (22) и тип (простой) текста. Фон высвечивается в области с размерами W и H и с координатами левого верхнего угла X и Y. Переменная N2 задает номер картинки для внутренней передачи из графики в окно. Ее значение может быть от 1 до 100. Имеются две модификации, которые задаются переменной M. Если M = 0, то текст берется из последней печати командой #pri, при этом признаки конца строки учитываются естественным образом. Если M = 1, то из последней печати берется имя файла и текст берется из этого файла начиная с N1-й строки и всего N строк. Этот режим могу использовать только я. Список всех используемых переменных: f1,f2,H,J,M,N,N1,N2,W,X,y,Y. Программа открывает окно на неограниченное время. Окно надо закрывать командой #fr [op=c; mo=1;] когда это необходимо. Закрыть окно вручную невозможно, поэтому будьте аккуратны. Переменные не сохраняются, так что об этом должен заботиться пользователь.

.

winid (24) -- шаблон программы с универсальной формой ввода входных данных

Это программа старой универсальной формы ввода входных данных через окна ввода. Она выставляет рамку, которая имеет некоторое количество строк с окнами ввода (справа) и с заголовском каждого окна (слева), а также 5 кнопок [OK], [Cancel], [Help], [Notes], [Save Var], [Choose Var]. Предполагается, что эта рамка позволяет пользователю вводить входные данные в какую-либо более сложную программу (БСП). Обычно эта БСП как раз начинается с показа данной рамки. Для работы данной программы пользователь должен приготовить 4 файла в какой-либо папке внутри папки интерпретатора ACL. В первом файле (назовем его tin) должны быть записаны все подписи (заголовки) всех окон ввода для БСП, каждый заголовок заканчивается символом вертикальной черты, включая последний. Во втором файле (назовем его par) в первой строке должен быть записан заголовок рамки, во второй строке -- значения параметров для каждого окна, каждое значение заканчивается символом вертикальной черты. Это могут быть как тексты, так и численные значения. Следующие 99 строк должны содержать копии второй строки или ее варианты, то есть значения входных данных для других вариантов. Третий файл (назовем его inf) должен содержать описание БСП в любой форме. Четвертый файл (назовем его txt) может быть пустым, но лучше набить приглашение писать текст. Перед вызовом суперкоманды необходимо определить параметр L (он означает ширину рамки в пикселах) и напечатать 5 названий, каждое из которых заканчивается символом вертикальной черты. Эти названия означают имя папки, где находятся описаннные выше файлы, а также их имена в указанной выше последовательности. Нужно также отметить, что перед вызовом данной программы сама БСП должна быть написана как процедура с названием genp. Данная программа сама запускает БСП. Хотя такая форма уже устарела и я ее не использую, она иногда может быть полезной. Необходимо перед вызовом определить переменную ZZ=s(109); Вот пример вызова
#pro genp команды БСП @
# ZZ=s(109); s(3)=1; L=140; #pr pro/3|a01.tin|a01.par|a01.inf|a01.txt| \E ##winid !

.

winf (23) -- программа показа картинки с текстом подсказки

Это современная версия 25-й суперкоманды. Она отличается тем, что по другому вызывается и сохраняет переменные. Программа используется для показа на экране разного рода информационных текстовых сообщений стандартного вида. Стандартными являются цвет текста (синий) и фона (светлокоричневый), размер (22) и тип (простой) текста. Программа высвечивает фон в области с размерами W и H и с координатами левого верхнего угла X и Y. Переменная N2 задает номер картинки для внутренней передачи из графики в окно. Ее значение может быть от 1 до 100. Имеются две модификации, которые задаются переменной M. Если M = 0, то текст берется из последней печати командой #pr, при этом признаки конца строки учитываются естественным образом. Заканчивать текст признаком конца строки не нужно. Если M = 1, то из последней печати берется имя файла и текст берется из этого файла начиная с N1-й строки и всего N строк. Имя файла надо писать с учетом рабочей папки. Указанные переменные имеют условный характер. На самом деле входные данные вводятся в конец числового массива в определенном порядке, который эти переменные указывают. Но вместо них можно вводить просто числа. Программа открывает окно на неограниченное время. Окно надо закрывать командой #fr [op=c; mo=1;] когда это необходимо. Закрыть окно вручную невозможно, поэтому будьте аккуратны. Вот как выглядит вызов команды, если переменная ZZ=s(109); определена как размер числового массива.
#pr text\E #d 8 r(ZZ-20) W H X Y M N N1 N2 ##winf

.

ciph (30) -- программа шифрования текстовых файлов -- новая

Эта программа работает с текстовыми файлами, содержащими символы первой половины ASCII кодов (от 0 до 127), а также русские символы в Виндовс кодировке. Она читает входные данные из печати, причем печать должна содержать три аргумента, разделенные пробелами. Первый аргумент определяет полное имя текстового файла на компьютере, который будет редактироваться. Второй аргумент определяет ключ шифрования, представляющий собой число от 1 до 255. Третий аргумент задает вариант шифрования, который имеет значения от 1 до 3 и означает следующее: 1 -- только ширфование, 2 -- дешифровка и шифрование, 3 -- только дешифровка. Эти варианты могут использоваться в различных ситуациях. Пусть вы имеете простой текстовый файл. Вариант 1 позволяет с ним работать, то есть редактировать текст, а затем программа его шифрует перед записью на диск. Вариант 2 позволяет работать с уже зашифрованным файлом. Программа его сначала дешифрует, показывает в редакторе в нормальном виде, его можно редактировать, а перед записью в файл она его снова шифрует. В этом случае файл находится на диске только в зашифрованном виде. Вариант 3 позволяет привести зашифрованный файл в нормальное состояние и записать его на диск. Естественно, что все операции надо делать с одним и тем же значением ключа. Если вы не знаете значение ключа, то ничего не получится. Вот как выглядит вызов команды
#pr C:/папка/.../папка/файл 123 2 \E ##ciph

.

cond (22) -- команда разделения 9 разрядов переменной Q в переменные &1, ..., &9 слева направо

Это очень простая команда без параметров, которая просто разделяет разряды переменной Q. При этом в одной переменной можно задать 9 переключателей режимов работы программы. Это экономит время работы над программой и сокращает ее код. Разряды читаются слева направо. Так что при задании &1=1; надо писать Q=100000000;

.

matpic (21) -- картинка как матрица других картинок (новая)

Программа создает и показывает новую картинку в виде матрицы других картинок. Она имеет один аргумент в виде имени файла в текущей папке программы, которая ее вызывает. Это имя должно быть напечатано командой #pr. В этом файле в первой строке должны быть напечатаны несколько имен файлов без расширения. Первое имя указывает на внутреннюю папку относительно текущей папки. Такая папка тоже должна быть, ошибка не исправляется. Предполагается, что данная программа используется в другой программе, которая создает много картинок. И их удобно спасать в специальную папку. Вот эту папку и надо указывать. Далее идут имена файлов картинок, из которых будет создана матрица. Последнее имя -- это имя файла, который будет создан для новой картинки -- матрицы всех указанных картинок. Все файлы источники должны иметь расширение png или jpg, а расширение у нового файла будет png. Во второй строке файла должны быть набраны два числа, указывающие сколько картинок будет на одной строке и сколько строк. Программу лучше всего использовать вместе с программой редактирования файла. Вот пример как это может выглядеть

#pr _param.txt\E # &=1; ##par #f [file=\Tp\E] \Tp\E #case 1 ##matpic #end |

Если использовать файл-склад суперкоманд и если определена процедура scom, то код может быть таким

#pr _param.txt\E #e [n=6;] _scom #f [file=\Tp\E] \Tp\E #e [c=1; n=21;] _scom

Второй способ более прогрессивный, хотя и менее наглядный.

.

animdep (20) -- анимация по сечениям двумерного массива чисел (новая)

Программа показывает двумерный массив чисел, записанный в файл в формате float (4 байта на число) как анимацию, в которой сечения (кривые зависимости от первого аргумента) меняются со временем на одних и тех-же осях, либо увеличивая вторую координату, либо уменьшая ее. Перед запуском программы нужно задать значения параметров, которые она использует в работе. Такими значениями являются 17 чисел, которые должны быть записаны в массив r() начиная с первого элемента, то есть в r(1) ... r(17), и текстовая строка, которая должна быть напечатана командой #pr. Числовые значения имеют следующий смысл

1 -- Nx, число точек по горизонтали (в сечениях) двумерного массива
2 -- Ny, число точек по вертикали, то есть число сечений
3 -- x1, начальное значение первого аргумента
4 -- x2, конечное значение первого аргумента
5 -- xb, начальное значение на оси первого аргумента
6 -- xt, конечное значение на оси первого аргумента
7 -- xl, значение первой длинной риски на графике (горизонтальная ось)
8 -- dxl, шаг до следующей длинной риски
9 -- nxl, число коротких рисок между длинными
10 -- yb, начальное значение на оси функции (вертикальной)
11 -- ye, конечное значение на оси функции (вертикальной)
12 -- yl, значение первой длинной риски на графике (вертикальная ось)
13 -- dyl, шаг до следующей длинной риски
14 -- nyl, число коротких рисок между длинными
15 -- k, номер кривой, которая будет показана первой, начинается от 1.
16 -- i, индекс массива r(), где записаны кривые, если = 0, то чтение из файла.
17 -- tp, время паузы в единицах 0.1 секунды

Текстовый аргумент должен содержать два текста, разделенные символом вертикальной черты. Первый текст -- это имя файла с числами относительно папки той программы, которая использует суперкоманду. Файл используется если r(16)=0. Второй текст содержит начальную часть заголовка. К ней динамически прибавляется номер кривой и ее максимальное значение. Числа прочитываются из файла при условии, что параметр i (его номер 16) равен 0. Если он больше 0, то числа прочитываются из массива r(), начиная с индекса, на который указывает параметр.

Программа работает следующим образом: Сначала показывается кривая с номером, заданным входным параметром номер 15. После нажатия клавиши [Enter] номер кривой начинает увеличиваться с интервалом tp (параметр 17) + время на создание самого графика. Если точек много, оно может быть заметным. Если нажать клавишу пробела (или любую другую из тех, которые ниже не указаны) то анимация останавливается. Повторное нажатие клавиши [Enter] снова ее запускает. При выходе за максимальное значение номера (Ny) он становится равным первому значению (1). То же самое происходит при нажатии клавиши [Backspace], только в это случае номер не увеличивается, а уменьшается, а при выходе за минимум (1) он становится максимальным (Ny).

Дополнительные операции. Если в процессе анимации нажать клавишу стрелки вправо, то анимация остановится. При повторном запуске анимации интервал времени между разными кривыми будет в два раза короче, то есть кривые будут сменятся быстрее. Если нажать клавишу стрелки влево, то все будет точно так же, только интервал будет в два раза длиннее. Эти процедуры можно повторять многократно постепенно увеличивая или уменьшая время паузы. Если нажать клавишу стрелки вверх, то показ остановится и программа попросит ввести номер кривой в окно ввода с двумя кнопками [OK] и [Cancel].

При выборе (клике) кнопки [OK] программа покажет кривую, номер которой ввел пользователь, и на экране снова появится предложение ввести номер следующей кривой. Все окна появляются в центре экрана и окно ввода, вообще говоря, может мешать видеть кривую. Но любое окно можно передвинуть в любую часть экрана. Так окно анимации можно передвинуть в самом начале показа, если поставить курсор мыши на титульную строку и перетащить окно. Окно ввода можно перетаскивать в тот момент, когда оно появляется.

Процедура показа кривых по номеру повторяется каждый раз пока нажимается кнопка [OK]. Чтобы остановить этот процесс надо выбрать кнопку [Cancel]. Затем можно снова запускать анимацию. Анимация начнется с той кривой, которая показывалась последней. Она хороша для общего обзора и в презентациях. А просмотр кривых по номеру удобен при исследовании наиболее интересных участков.

Есть и возможность пошагового просмотра кривых. Для этого в самом начале надо нажать клавишу стрелки вниз. Программа покажет кривую с номером на 1 больше того, который показывался. Для сдвига номера дальше надо сначала нажать клавишу 0, а затем снова клавишу стрелки вниз. Такую процедуру можно повторять много раз. Комбинация с использованием всех клавиш дает много возможностей просмотра сечений. Программа удобна тем, что не требует создавать очень большое число рисунков с одной кривой в каждом сечении. Вполне достаточно иметь двумерный массив в одном файле.

Вот пример запуска суперкоманды
#d 17 r(1) 820 801 -0.6 0.6 -0.65 0.65 -0.5 0.25 4 -0.2 14.5 0 5 4 350 0 8 #pri 01-map.dat|Интенсивность\E ##animdep

.

mspic (19) -- анимация по пронумерованным картинкам с масштабированием (новая)

Программа показывает анимацию по серии картинок, записаных в файлы в одной и той же папке и имеющих одно и то же расширение (jpg или png). Имена файлов должны иметь трехзначный номер перед точкой, в котором нули слева обязательны, а левые от номера символы должны быть одинаковыми для всех файлов, но произвольными по содержанию. Номера не обязательно начинаются от единицы, начальный и конечный номера являются входными параметрами задачи. Программа масштабирует картинки на лету на заданный размер. Переход между кадрами только один (мгновенный), а время паузы есть входной параметр. Итак, перед вызовом программы необходимо напечатать командой =pri три слова и 5 чисел. Пример вызова программы
#pri folder filename filemusic N1 N2 W H T \E ##mspic
Здесь folder -- имя папки с файлами картинок относительно папки интерпретатора, filename -- может быть именем первого файла с картинкой, но номер не важен, можно писать даже 000, filemusic -- имя файла с музыкой в формате midi, если музыка не нужна, надо писать nomusic, N1 -- начальный номер картинки для показа, N2 -- конечный номер картинки для показа, W -- ширина картинки в пикселях на экране, H -- высота картинки в пикселах на экране, T -- время паузы в миллисекундах. Замечу, что начальные размеры картинок не имеют значения, но их надо знать, чтобы правильно выставить аспектное отношение, если это необходимо, так как автоматически это не делается.
Обычно начальный номер меньше конечного, но это не обязательно, может быть наоборот. В любом случае процесс ижет от начального номера к конечному. Данная программа исходно запускается в режиме просмотра, то есть она показывает первый кадр и стоит. Поменять кадр можно нажимая клавишу пробела. При каждом нажатии кадр меняется на единицу. Чтобы запустить автоматическую анимацию надо нажать клавишу [Enter]. Тогда картинки меняются автоматически через указанную паузу. Переход к пошаговому просмотру снова по клавише пробела. По клавише [Esc] можно остановить анимацию и закрыть окно. То же самое делается при клике на крестик в правом верхнем углу окна, но это не так интересно. На клик мыши данная версия не реагирует. Программа портит переменную (%0).

.

scar (18) -- (show complex array) график комплексной функции в массиве r()

При работе с комплексными функциями результатом обычно является квадрат модуля этой функции. Однако, если программа работает неправильно бывает полезно посмотреть саму функцию. В ней каждая точка записывается парой чисел. Программа выделяет реальную и мнимую части в отдельные массивы, показывает две кривые на разных графиках, а потом все возвращает на место. Она берет входные данные в виде 4-х чисел из любых переменных, пусть для примера это будет J, N, X и M. В первой переменной записывается начальный индекс массива r(), где записан массив комплексных чисел, во второй -- число комплексных точек. То есть число точек в каждой функции. В третьей переменной записана половина области изменения аргумента. Аргумент на графике выставляется в диапазоне (-X, X), он роли не играет, но так более привычно для пользователя. В четвертой переменной указывается номер использования процедуры. Данная процедура сначала записывает графики в файлы с названиями scarReM.png и scarImM.png для реальной и мнимой частей соответственно, а затем показывает картинки из файлов. В названиях вместо M будет стоять значение этой переменной. Оно должно быть целым из одного разряда, то есть от 1 до 9. Кроме того, перед вызовом процедуры нужно напечатать имя внутренней папки относительно рабочей папки, када будут записаны файлы с графиками. Не очень удобно записывать все картинки в рабочую папку программы. Я обычно использую для этого папку с названием [pic]. Еще одна возможность. Параметр M может быть отрицательным. При этом используется модуль, а знак указывает на режим работы, когда файл с графиком записывается, но сам график не показывается. Вызов процедуры может выглядеть так
#d 4 r(ZZ-21) J N X M #pr pic\E #e [n=18;] _scom

.

mess (17) -- программа легкой подсказки в форме статусной строки

Программа выставляет стандартное окно в нижней строке экрана как раз над статусной строкой Виндовс с текстом в одну строку. Текст должен быть напечатан перед ее вызовом командой #pr text\E. Ее основное назначение - сообщить пользователю о необходимых действиях во время ожидания от него каких-либо действий. Это очень простая и легкая форма, которая сделана так, чтобы не занимать экран. После того как действие сделано необходимо закрыть окно командой #fr [op=c; mo=1;]. В новой версии программы она реагирует на значение переменной ZY. Стандартный режим получается при ZY=0. Если программа портит значение этой переменной, то ее надо принудительно обнулять перед вызовом. Но иногда полезно задавать ненулевое значение для перемещения текста сообщения по экрану. Разумные значения находятся в диапазоне от 0 до 1.

.

chva (16) -- программа для выбора одного варианта из 99

Программа показывает таблицу из 99 кнопок для того, чтобы пользователь выбрал номер варианта из 99 возможных. После клика мыши, таблица закрывается, а параметр & равен номеру выбранной клавиши. Иногда вариантов может быть меньше, но такая стандартная форма удобна в любом случае. Те варианты, которых нет, можно просто не кликать, или при их клике запускается дежурный вариант. Стандартный вариант не имеет параметров и форма таблицы полностью определена. Иногда разные программы используют эту процедуру последовательно. Чтобы различить их введен нестандарный вариант, который реагирует на ситуацию # &Z=99; В этом случае надо определить первые 6 элементов массива r(), которые определяют цвет цифр и цвет фона для кнопок. Например, вызов может быть таким
#d 6 r(1) 0*3 255*3 1 &Z 99 ##chva
В стадартном варианте переменная &Z не должна быть равна 99, но случайное совпадение маловероятно, поэтому можно просто ничего не задавать, но при задании переменной ее потом надо изменить.

.

rules (15) -- программа универсальной формы информационной помощи

Данная процедура является одним из вариантов реализации предложения об информационной помощи. Она полностью выполняет работу, которая обычно делается по первой кнопке меню любой программы. Предполагается, что информация о программе записана в файле на компьютере или в интернете. Программа показывает текст сообщения о том, что нужно прочитать этот файл и предлагает две кнопки [OK] и [CANCEL]. Используется нарисованный текст и нарисованные кнопки. После клика кнопки [OK] программа организует bat файл и запускает его. Файл показывается в программе показа файлов данного типа. При клике второй кнопки ничего не происходит. У программы есть два параметра, а именно, в переменной $ надо указать где конкретно находится файл. Если файл находится на компьютере, то надо указать $=0 и напечатать путь к файлу относительно главной папки программы (интерпретатора ACL). Если файл находится в интернете, то надо указать $=1 и напечатать интернет адрес сайта. Например, вызов может быть таким
# $=1; #pr http://xray-optics.ucoz.ru/XR/rules.htm\E #e [n=15;] _scom

.

ssel (14) -- программа вертикального фасонного меню

Программа выставляет окно без рамки, на котором написан заголовок и нарисованы кнопки меню. Перед вызовом программы необходимо задать ее параметры, а именно в переменных X и Y - координаты левого верхнего угла окна, W и H - ширина и высота одной кнопки меню, K - тип текста, может принимать 4 значения: 0 - простой, 1 - жирный, 2 - наклонный и 3 - жирный-наклонный. Необходимо задать первые 5 элементов таблицы цветов. 1-й цвет для фона, 2-й цвет для заголовка, 3-й цвет для имен кнопок меню, 4 и 5 цвета - для градиента цвета, которым рисуются кнопки меню. Если число кнопок n то необходимо напечатать n+2 текстов, разделенных вертикальной чертой по образцу #pri title|first|second|...|Font|\E . Здесь первый текст - заголовок, следующие - названия кнопок меню, последний текст - имя фонта, который будет использоваться для написания кнопок. Необходимо сделать проверку на наличие фонта и если он отсутсвует на компьютере, то предложить альтернативные варианты. Тексты на кнопках выставляются, начиная слева от поля кнопки, а справа указывается название клавиши, которую надо нажать, чтобы выбрать данную кнопку. Порядок клавиш фиксирован: сначала от 1 до 9, затем 0, затем буквы от A до Z. Другие клавиши не используются. После того, как окно выставлено, программа ждет от пользователя выбора кнопки. Выбирать можно кликом мышки на соответствующей кнопке меню или нажимая клавиши, указанные справа. Если нажата правильная клавиша, то она имеет приоритет. После этого окно закрывается автоматически, а выбранный номер возвращается в переменную &. Вот возможный шаблон кода, использующий программу
# &=1;
#case 1 #p [fk=3; fs=16; em=0;] # X=10; Y=30; W=350; H=30; K=0; s(3)=1;
#d 15 i(1) 200 180 160 0 0 0 0 0 200 200 255 200 60 120 100 #col [fir=i(1); b=1; le=5;]
#pri Select what to do|Game rules (read first)|Two|Three|Four|Five|Six|Seven|Eight|Nine|Exit|Comic Sans MS|\E
##ssel # &9=&; &0=10;
#e [c=1;] 0001 #e [c=2;] 0002 #e [c=3;] 0003 #e [c=4;] 0004 #e [c=5;] 0005 #e [c=6;] 0006 #e [c=7;] 0007 #e [c=8;] 0008 #e [c=9;] 0009
# &=(&0-&9)<1;
#end

.

ssel2 (32) -- программа вертикального фасонного меню

Эта программа полностью аналогична суперкоманде ssel. Отличие только в том, что она показывает меню в две колонки и потому число разделов меню должно быть четным. Если оно нечетное, то надо добавить один пустой раздел меню. Входные данные точно такие же, как и у суперкоманды ssel.

.

par (6--13) -- команда задания стандартных параметров и выполнения стандартных расчетов

Это набор разных комбинаций команд ACL для сокращения записи основной программы. Перед вызовом суперкоманды надо задать входные данные. Номер комбинации определяется значением переменной &. В зависимости от номера могут быть другие входные параметры. При вызове суперкоманды по номеру используются разные номера для разных значений переменной &. Так при &=1 используется номер 6, при &=2 -- номер 7 и так далее. Eсть такие комбинации

(##6) без допол. параметров, задаются стандартные параметры для команды редактора текстов. Выглядит это так
. . . . . . . . ##6 #f [file=name.txt;]

(##7) без допол. параметров задаются стандартные параметры для суперкоманды ssel. Выглядит это так
. . . . . . . . ##7 #pr печать меню ##ssel

(##8) вычисление квадрата модуля комплексной функции, 2 допол. параметра ( AZ -- начало записи КФ в массиве r(), BZ -- число комплексных чисел). Результат остается в r(), начиная с AZ, BZ реальных чисел. Выглядит это как показано ниже. Если после этой суперкоманды сразу поставить суперкоманду ##sm , то можно посмотреть модуль на графике.
. . . . . . . . #d 2 AZ J n ##8

(##9) интерполяция одномерной функции, задаются 7 параметров в первых элементах массива r() параметры определяют (1) начало исходного массива (первый индекс в r()) (2)-(4) аргумент исходного массива (первое, последнее значения и число точек), (5)-(7) аргумент функции в результате интерполяции. Новая функция начинается там же, где была исходная, но имеет другое число точек. Выглядит это так
. . . . . . . . #d 7 r(1) J x1 x2 n X1 X2 m ##9

(##10) интерполяция двумерной функции, определенной на квадратной области. Задаются 8 параметров в первых элементах массива r() параметры определяют (1) начало исходного массива (первый индекс в r()) (2)-(4) аргументы исходного массива (первое, последнее значения и число точек по одной оси, одинаково по обоим осям), (5) начало массива результата (первый индекс в r()) (6)-(8) аргументы функции в результате интерполяции, тоже одинаково по обоим осям. Новая функция начинается там же, где была исходная, но имеет другое число точек. Выглядит это так
. . . . . . . . #d 8 r(1) J x1 x2 n K X1 X2 m ##10

(##11) без допол. параметров, задаются стандартные параметры для команды встроенного редактора текстов. Выглядит это так
. . . . . . . . ##11 #f [file=name.txt;]

(##12) сложение комплексного массива с реальной константой поэлементно, 3 дополнительных параметра ( AZ -- начало записи КФ в массиве r(), BZ -- число комплексных чисел, CZ -- реальная константа). Результат остается на том же месте. Выглядит это так

. . . . . . . . #d 3 AZ J n С ##12

(##13) вычисление комплексно сопряженного массива с стандартной форме (r,i,r,i,...), 2 дополнительных параметра ( AZ -- начало записи КФ в массиве r(), BZ -- число комплексных чисел). Результат остается на том же месте. Выглядит это так
. . . . . . . . #d 2 AZ J n ##13

.

paax (05) -- команда разметки числовой оси аргумента или функции на графике

Некоторые программы научной графики сами размечают числовые оси аргумента или функции автоматически. Но есть другие программы, которые просят задать разметку осей. При этом обычно всегда известно или можно вычислить начало и конец оси. Данная команда по этим значениям, которые надо записать в начало массива r(), то есть в r(1) и r(2) сама вычисляет значение первой длинной риски, шаг до следующей длинной риски и число коротких рисок между ними в переменные r(3), r(4) и r(5). Потом эти значения можно переслать куда надо. Такой расчет не является простым и использование команды имеет смысл.

.

paax3 (31) -- команда разметки трех числовых осей для показа карты функции 2-х аргументов

Эта процедура делает разметку сразу трех осей, в отличие от процедуры paax. И она сделана по современному, то есть не портит переменные. Для нее надо задать три комплекта начала и конца осей и она определяет 15 элементов массива r(), начиная с индекса, задаваемого переменной F. То есть она является вспомогательной для процедуры smmx. Вызов процедуры выглядит так (вместо переменных могут быть числа или переменные с любым именем)
. . . . . . . . # F=J5; #d 6 r(ZZ-30) x1 x2 y1 y2 z1 z2 ##paax3

.

smq3d (04) -- окно показа 2D функции в массиве r() как квази 3D графика

Программа показывает квази-трехмерный график 2D функции, значения которой записаны в массиве r(). Все параметры заданы, кроме 13 параметров, которые следует записать в переменные, а именно, A = начальный индекс массива, B = число точек по оси X, C = число точек по оси Y, D=X1, E=X2 -- минимальное и максимальное значения аргумента по оси X, F=Y1, G=Y2 -- минимальное и максимальное значения аргумента по оси Y, H = дополнительный сдвиг вправо в пикселах (0 или больше), I = добавление к числу шагов по оси Х для сдвижки вправо следующего сечения (стандартно, то есть при 0, сдвиг делается на 1 шаг, но часто этого мало), J = вертикальный сдвиг следующего сечения в единицах 0.001 от максимального значения (от 10 до 50), K = размер текста для числовых значений на осях, L = дополнительное увеличение ширины графика, если необходимо, если 0, то ширина 900, M = дополнительное увеличение высоты графика, если необходимо, если 0, то высота 600. Также необходимо предварительно напечатать имя файла для записи картинки. Программа позволяет очень просто получить вполне качественный график двумерного массива. Вот пример вызова процедуры
#d 13 A J nx ny -1 1 0 1 0 10 40 18 0 0 #pr 1/fig3D\E #e [n=4;] _scom

.

smma (03) -- процедура аксонометричекой проекции F(x,y) c разметкой осей, пишет в файл

Программа показывает аксонометрическую проекцию трехмерной поверхности z(x,y) по значениям функции двух аргументов. Перед вызовом суперкоманды нужно определить 14 параметров в переменные A,D,...,N, а также 15 параметров разметки осей, которые нужно записать в массив r(). Начало этого массива указывается в переменной F. Разметка осей делается так же, как в суперкомандах smau и smmx. Переменные определяют следующее: . . . A -- начало массива r(), где задана функция z(x,y); . . . B -- число точек по оси X; . . . C -- число точек по оси Y; . . . D -- составное целое число из 4 разрядов. 4-й разряд задает показ графика, если 0, то не показывать, а если 1, то показывать с остановкой работы программы. Три младшие разряда задают коэффициент масштабирования графика в процентах, то есть 100 означает без масштабирования. Стандартное значение D=1100; . . . E -- составное целое число из 2 разрядов. Старший разряд может принимать значения: 1 для x-z сечений, 2 для y-z сечений, 3 для сечений по обоим направлениям. Младший разряд может принимать значения: 0 для рисования двух вертикальных осей, 1 для рисования только правой вертикальной оси около оси X, 2 для рисования только левой вертикальной оси около оси Y; . . . F -- указывает начало массива с разметкой осей; . . . G,H,I -- задают координаты направления точки зрения, важны только отношения; . . . J -- задает десятичный логарифм расстояния до точки зрения, . . . K,L -- определяют масштабные коэффициенты для аргументов на осях X и Y при рисования поверхности в том случае, когда аргументы измеряются в других единицах; . . . M,N -- координаты для установки заголовка, отсчитываются от левого верхнего угла. Разметка оcи X задает начало и конец оси, координату первой длинной риски, шаг до следующей длинной риски и число коротких рисок между длинными, всего 5 чисел. Для осей Y и Z аналогично. Кроме того нужно напечатать два текста, разделенные символом вертикальной черты. Первый текст -- это имя файла для записи графика без расширения (расширение png добавляется автоматически), второй текст -- это текст заголовка. Вот работающий пример номального использования процедуры
# J=101; j=J; nx=91; ny=91; y=-9; d=0.2; #rep ny # x=-9; #rep nx # r(j)=exp(-0.06*(x*x+y*y)); j=j+1; x=x+d; #end # y=y+d; #end
#d 15 r(1) -9 9 -8 4 3 -9 9 -8 4 3 0 1 0 0.2 0 #d 14 A J nx ny 1100 30 1 1 1 0.06 3 1 1 9 9 #pr test|title\E ##smma

.

smmx (02) -- универсальная процедура карты матрицы c разметкой осей и с размерами пикселя (линейная шкала)

Программа показывает стандартную картинку матрицы чисел, записанной в массиве r(), представляющую функцию двух аргументов на сетке с постоянным шагом. Все параметры заданы стандартным образом, кроме 6 общих параметров и 15 параметров разметки осей x,y,z. Общие параметры следует записать в переменные, а именно, A = начальный индекс массива r(), где записана матрица, B = число точек первого аргумента (по горизонтали), C = число точек второго аргумента (по вертикали), D = составное целое число из 5 разрядов. 5-й разряд показывает знак контраста. Если 0, то минимум черный, максимум белый, а если 1, то наоборот. 4-й разряд задает показ графика, если 0, то не показывать, а если 1, то показывать с остановкой работы программы. Три младшие разряда задают коэффициент масштабирования графика в процентах, то есть 100 означает без масштабирования. Стандартное значение D=1100; E = составное число из двух разрядов. Левый разряд указывает сколько пикселей экрана находится в одном пикселе картинки по оси x, а второй -- по оси y; F = начальный индекс массива r(), где записаны 15 чисел разметки осей по стандартной системе, 5 чисел на каждую ось: левое значение, правое значение, значение первой длинной метки, шаг до второй длинной метки, число коротких меток между длинными. Кроме этого, перед вызовом программы необходимо напечатать два текста, разделенные символом вертикальной черты '|'. Первый текст определяет имя файла для записи картинки без расширения (расширение всегда png). Второй текст показывается над графиком как заголовок. Результат также зависит от знаков переменных D и E. Если E > 0, то программа показывает числа, нормированные на интервал (0,1), а значения минимума и максимума реальной матрицы показываются в заголовке. В этом случае заданная разметка третьей оси не используется, вместо нее принудительно вводится разметка как 0 1 0 0.2 1 . Это сделано для универсальности, потому что иногда значения функции могут быть либо очень большими, либо очень маленькими и выставлять их на вертикальную ось некрасиво. Если E < 0, то используется модуль E, но вертикальная ось используется та, которая задана, а программа показывает реальные числа, но значения максимума и минимума все равно показываются. Если D > 0, то график полный. Если D < 0, то используется модуль D, но картинка показывается без масштабирования и без осей, то есть только картинка голой матрицы. Однако четвертый разряд по-прежнему задает показ графика, и используется имя файла для записи картинки. Иногда это бывает необходимо. Важное замечание касается размера символов текста. Программа автоматически определяет размер, масштабируя его по формуле 18*N1/700, где N1 -- число точек по горизонтали. Это необходимо для очень большого числа точек, так как при уменьшении размера графика тексты становятся аномально мелкими. Если число N1 мало и график увеличивается размером пиксела, то учитывается произведение N1 на размер пиксела. Программа не портит переменные и массивы, кроме 100 последних элементов массива r() и 5 последних элементов массива i(). Кроме того, параметр [pa=0;] задает черно-белую палитру на картинке, [pa=1;] задает фиксированную цветную (сине-красно-белую) палитру, [pa=2;] задает фиксированную цветную с большим числом цветов, наконец [pa=3;] задает цветную палитру из файла colmap.txt. Кроме того, нужно регулировать положение окна, которое задается параметрами [em=; xp=; yp=;]. Вот пример нормального использования процедуры
# F=J+N1*N2; #d 15 r(F) -X1 X1 -X1 X2 4 t0 t2 t0 t3 4 0 m 0 m0 4 #d 5 A J N1 N2 1100 13 #p [pa=1; em=0;] #pri filename|title\E ##smmx

.

smau (01) -- окно законченного графика функций в массиве r() с аргументом

Программа показывает стандартный график функций, значения которых вычислены в массиве r() на постоянной сетке аргумента. Все параметры заданы, кроме 7 параметров, которые следует записать в переменные, а именно, A = начальный индекс массива r(), где записаны функции, B = число точек аргумента, C = число функций, D = минимальное значение аргумента, E = максимальное значение аргумента, F = номер цвета, которым будет нарисована первая кривая, остальные будут иметь номера сдвинутые каждый раз на единицу, G = составное целое число из 4 разрядов. Четвертый разряд указывает на показ графика, 0 - не показывать, 1 -показывать с остановкой работы программы. Три младшие разряда задают коэффициент масштабирования графика в процентах, то есть 100 означает без масштабирования. Стандартное значение G=1100; Кроме этого, перед вызовом программы необходимо напечатать два текста, разделенные символом вертикальной черты '|'. Первый текст определяет имя файла для записи картинки без расширения (расширение всегда png). Второй текст показывается над графиком как заголовок. Размер картинки без масштабирования 980*500 (если G = 100 или 1100). Изменяя параметр G можно получить картинку любого размера. Есть специальный случай. Если параметр F отрицателен, то ширина картинки равна не 980, а 550. При этом ширина горизонтальной оси в 2 раза меньше. А номер цвета определяется как abs(F). Пример вызова:
#d 7 A 1 101 1 -1 1 247 1100 #pri s\I-2 k;|Figure\E ##smau

.

mpuv (33) -- (message of printed universal variabt) показ на экране текста из печати. любое число кнопок в 1 ряд.

Эта программа является частным случаем единственной операции m [op=gen;], так как операция эта слишком сложная и есть необходимость в ее упрощении. Она показывает на экране окно сообщения, которое перед этим было напечатано в текстовый массив t(), и сколько угодно кнопок в 1 ряд. Результат выбора сообщает в переменную &. В данном случае текст как бы является инструкцией к выбору одного варианта из многих. А перед текстом надо напечатать названия кнопок, разделителем служит символ вертикальной черты. После команды можно делать разные операции при &=1, &=2, ... и &=-1. Значения выдаются при нажатии кнопок или крестика, закрывающего окно. Можно кнопки вообще не писать, тогда автоматически добавляется кнопка [OK]. Пример применения программы выглядит так
#pr 1D|2D|Choose between\n1D and 2D figures !\E ##33

.

mp2 -- (message of printed) показ на экране текста из массива t(). 2 кнопки.

Эта программа состоит из одной команды, но печатать эту команду каждый раз отнимает много времени. Она показывает на экране окно сообщения, которое перед этим было напечатано в текстовый массив t(), и две кнопки на выбор. Результат выбора сообщает. В данном случае текст как бы является инструкцией к выбору одного варианта из двух. А перед текстом надо напечатать названия двух кнопок, разделителем служит символ вертикальной черты. Команда делает операции &=1, &=2 и &=-1 при нажатии кнопок и крестика, закрывающего окно. Команда устарела и является частным случаем mpuv. Пример применения программы выглядит так
#pr 1D|2D|Choose between\n1D and 2D figures !\E ##mp2

.

smas (40) -- специальный график функции в r() с аргументом, имеет меньше параметров

Эта программа является специальным случаем программы smau (1) научного графика. В некоторых случаях она более удобна, чем указанная программа, так как имеет меньше параметров и может работать с матрицей, а также зависит от режимов работы. Среди параметров есть переменная U (условное название). Это целое число из двух разрядов. Назовем старший разряд v, а младший u. То есть U=vu. Если u=0, то не делается ничего, программа игнорируется. Если u>0, то предполагается, что в массиве r() записана двумерная числовая матрица (n1,n2) и расчет идет в цикле по строкам этой матрицы. На графике показывается одна строка, но результат зависит от размера n2 этой матрицы. Если n2>1, то вычисляется только интеграл от строки этой матрицы и больше ничего не делается. Интеграл записывается в переменную S и это есть ответ. Если n2=1, то при u=1 график записывается в файл (с расширением .png) и показывается на экране, а при u=2 он только записывается в файл. Далее, если v=1, то выбранная строка матрицы записывается в числовой файл (с расширением .dat), а если нет, то не записывается. Ниже показан пример вызова этой суперкоманды
#d 6 r(1) j n1 n2 d U e #pr Name\E ##40
Здесь j -- индекс начала выбранной строки матрицы, он выбирается заранее в цикле, n1,n2 -- размеры матрицы, d -- шаг сетки точек по аргументу, U -- переменная, указанная выше, e -- малое число, нужное для показа интеграла. Интеграл S вычисляется как сумма по всем точкам, умноженная на d. Если S < e, то принудительно ставится S=0, чтобы на графике было красиво. Значение S показывается над графиком. В частности при e=0 значение S будет показываться точно. Наконец, Name -- это им файла без расширения. Расширения подставляются автоматически. Вместо переменных можно указывать просто числа.