ПрагмаСофтСтудия 2.1
Давайте рассмотрим примеры формул. Если в ходе чтения статьи у вас возникнут вопросы, вы можете задать их на нашем форуме http://forum.aviosoft.ru .
Вначале разберём те примеры, которые даны в программе Calculator. Используйте её, чтобы поэкспериментировать и разобраться в неясных моментах. Она укажет вам ошибку, а также тип и значение результата вычисления. Некоторые формулы будут содержать переменные. Тип переменных и их значения вы также можете увидеть в программе Calculator в поле Доступные переменные.
Пример показывает, что числа с плавающей точкой могут быть заданы и без записи начального нуля.
Первое значение - это шестнадцатеричное число. Оно начинается с префикса 0x и имеет тип uint. Десятичное число 10 имеет тип int и, используя операцию приведения типа, преобразуется в тип uint. Также в примере показывается использование комментария /*comment*/. Он разбивает выражение, отделяя число 10 от операции приведения типа, и не создаёт при этой ошибки.
Выражение описывает сложение двух строк. Первая задана непосредственно. Вторая строка образуется приведением числа 123 к типу string. Сложение - это единственная операция, которая разрешена для строк. Все остальные манипуляции должны выполняться, используя встроенные функции работы со строками.
Завершает выражение комментарий // comment. Всё, что написано в этой строке после символов //, не учитывается вычислителем и считается комментарием.
Результатом вычисления будет строка "Version = 123".
Пример показывает, что символам \ и ", расположенным внутри строки, должен предшествовать символ \. В результате мы получим строку " \ " ".
Функция format предназначена для форматирования строки. Т.е. для создания выходной строки на основе той, которая указывается первым аргументом функции и выступает в качестве шаблона, а также на основе дополнительных передаваемых в функцию значений.
В данном случае шаблоном является строка "%d%%, %.3d, 0x%.4X, %.2f, '%s'". Каждому из пяти значений указанных после неё в выражении, в шаблоне соответствует своя управляющая последовательность. Разберём, как происходит формирование строки для каждой из них.
В результате мы получим строку "1%, -012, 0x000a, 3.14, 'Hi'".
format("%c",0x2d) + // middle path
/*right path*/" Calculator"
Выполняется сложение трёх строк. Первая и последняя заданы непосредственно. Вторая образуется в результате форматирования значения 0x2d в строку. Тип c формирует одиночный символ, что даёт на основе значения 0x2d строку "-".
Выражение также показывает разные варианты вставки комментариев и возможность разделения формулы на несколько строк.
Складываются два значения типа int. Первое значение задано числом -5. Второе образуется приведением строки "-3" к типу int, что даёт нам значение -3.
Строка "Value: " складывается с той, которая будет выбрана после выполнения встроенной функции if. Т.к. первый параметр функции имеет значение true, то функция вернёт то значение, которое имеет первый элемент переменной vs2. Иначе, функция вернула бы строку "Two". Переменная vs2 имеет тип string, а её первый элемент содержит значение "One". Выходная строка будет иметь вид "Value: One".
Это более сложный вариант предыдущего примера. Встроенная функция if всегда возвращает значение того типа, который имеют её второй и третий операнды. Переменные vb1 и vb2 имеют тип bool. Это значит, что обе функции if вернут тип bool. К этому же типу будут приведены значения их первых операндов. Число 1.0 преобразуется в true, а число 0 в false. Соответственно, внутренняя функция if вернёт значение vb2[0], и оно же будет возвращено внешней функцией. Первый элемент переменной vb2 имеет значение true. После приведения к типу string мы получим строку "true". Выходная строка при этом будет иметь вид "Value: true".
Это были примеры, которые даны в программе Calculator. Дополнительный блок примеров затронет некоторые не рассмотренные выше особенности построения формул.
Выражение содержит две операции с разным приоритетом. Приоритет операции << выше, чем у операции сравнения ==. Поэтому, вначале число 0x1 сдвигается на 2 бита влево, и мы получим значение 0x4, а затем результат сравнивается с числом 4.
|
Если вы сомневаетесь в том, в какой последовательности будут выполняться операции в вашей формуле, используйте взятие более приоритетных фрагментов выражения в круглые скобки. |
Операция поразрядного ИЛИ добавляет биты левого операнда к битам правого операнда с образованием значения 0x42. Операция && имеет меньший приоритет и выполняется на втором шаге. Её правым операндом выступает встроенная функция strcmp. Т.к. строки не равны, то она возвращает значение отличное от 0, преобразуемое для операции && в константу true. Значение 0x42 также не равно 0 и соответствует true. В результате операция && возвращает true.
Встроенная функция copysign возвращает значение первого операнда со знаком, который имеет второй операнд. Первый операнд задан функцией trunc. Она отбрасывает дробную часть своего входного значения. Т.е. число 100.5 преобразуется в 100.0 . Величина vi2[1] равна -1, и функция copysign в результате вернёт значение -100.0 .
Функция возвращает константу true, если значение первого аргумента находится внутри диапазона, заданного вторым и третьим операндами, или на его границе. Иначе возвращается значение false. Число 20.0 не попадает в диапазон [-10.5,10.5] и заставляет функцию range вернуть false. Унарная операция !, стоящая перед ней, инвертирует результат, превращая его в true.
Встроенная функция limrange также проверяет попадание первого операнда в диапазон, заданный вторым и третьим операндами. Если значение находится в диапазоне, то оно возвращается без изменений. Если выходит за диапазон, то функция возвращает значение границы, за которую произошёл выход. В нашем случае это число -10.5.
Значение -7 превращается в строку с помощью встроенной функции format. Управляющая последовательность %-4d имеет три поля: флаг -, ширину 4 и тип d. Тип d заставляет функцию создать строку в виде целого десятичного значения. Ширина указывает, что строка будет иметь минимум 4 символа. А флаг - задаёт левостороннее выравнивание значения в строке. В результате мы получим строку "-7 ".
Мы немного усложнили предыдущее выражение. Поле ширины заменено символом *. Это заставляет ширину извлекать из списка передаваемых в функцию параметров, причём, она должна предшествовать значению форматирования. Значение переменной vu1 равно 10. После вычитания из неё 6 мы получим прежнюю ширину 4 и тотже выходной результат "-7 ".
Функция strextn возвращает 4 символа из строки "abcdef", начиная со второго. Далее, символы полученной строки преобразуются в символы верхнего регистра, и функция strupr возвращает строку "BCDE".
Встроенная функция strins вставляет строку "is" в строку "Life beautiful", начиная с символа с индексом 5. Далее, полученная строка "Life is beautiful" передаётся в функцию strlen, которая вычисляет количество символом в ней и возвращает значение 17.
Число 45 преобразуется в строку. Функция strdeln удаляет из строки два символа, начиная с четвёртого, т.е. фрагмент 45. Далее, функция strfnd выполняет поиск строки "45" в строке "1236789" и возвращает индекс символа, начиная с которого расположена искомая строка, или -1, если строка не была найдена. В данном случае фрагмент уже был удалён, и выходное значение функции равно -1.
Функция перебирает символы строки "nice" и ищет их совпадение с каким-либо символом в строке "abcdef". Если совпадение существует, то она возвращает индекс в первой строке соответствующий найденному символу. В противном случае результат равен -1. В данном случае, буква c из первой строки присутствует во второй строке и расположена в строке "nice" под индексом 2.