Фрагмент для ознакомления
2
Операторы ветвления
Создадим теперь функцию для расчета логарифма числа по произвольному основанию:
function rez=logB(num,base)
rez = log(num)/log(base)
endfunction
Однако, как известно, логарифм числа a по основанию b имеет смысл только при выполнении условий: a,b > 0, a ≠ 1. Наложим дополнительное условие: входные параметры должны быть скалярными величинами, т. е. не векторами или матрицами. Для того чтобы функция не приводила к выводу сообщения об ошибке или краху системы, входные данные следует проверять на корректность. Сделать это можно при помощи условного оператора, общий вид которого показан ниже:
if <Условие> then <Выражения>
elseif <условие2> then <Выражения2>
...
elseif <условиеN> then <ВыраженияN>
else <Выражения>
end
Запишем новый вид функции с проверкой входных данных на корректность:
function [rez]=logB(num, base)
//Проверка размера массивов
if or([length(num)>1, length(base)>1]) then
error('Ошибка: массив не может быть входным параметром');
else
if and([num>0, base>0, base<>1]) then
rez = log(num)/log(base)
else
error('Ошибка: неверные входные данные');
end
end
endfunction
В приведенном фрагменте кода используется функция or([массив условий]), возвращающая результат применения логической операции ИЛИ ко всем, перечисленным в квадратных скобках, условиям. Сходна с ней и функция and([список условий]), возвращающая результат применения логической функции И ко всем элементам списка условий. Однако можно использовать и стандартные операции C++, т. е. & – И, | – ИЛИ.
Переменные, созданные внутри функции, являются локальными и действуют только в пределах этой функции. Переменные, созданные в пространстве до начала функции, являются глобальными и доступны во всех функциях данного файла или текущей рабочей сессии.
def_base=2 //глобальная переменная
function rez=log_b(num, base)
chk_log=%f //локальная переменная
rez=log(num)/log(base)
endfunction
Из приведенного примера видно, что в общем случае описание функции выглядит следующим образом:
function [выходные параметры]=имя_функции(входные параметры)
…
тело функции
…
[выходные параметры]=…
endfunction
Если у функции всего один выходной параметр, то его можно не заключать в квадратные скобки, если же их больше одного, то они заключаются в скобки и перечисляются через запятую.
Иногда возникает необходимость выполнить те или иные действия в зависимости от значения некоторой переменной. Если тип этой переменной является перечислимым, т. е. переменная может принимать конечное количество значений, то можно воспользоваться оператором множественного выбора. Общий вид этого оператора показан ниже:
select <переменная>
case <значение 1> then <действия 1>
case <значение 2> then <действия 2>
case <значение 3> then <действия 3>
…
case <значение N> then <действия N>
else
<действия по умолчанию>
end
Иными словами, в заголовке оператора множественного выбора указывается переменная перечислимого типа, затем указывается один из вариантов (case) значения переменной и выполняется соответствующее данному значению действие. Следует отметить, что служебное слово then должно находиться на одной строке со словом case.
В качестве примера рассмотрим функцию, получающую количество информации в байтах и выдающее название наибольшей единицы измерения. Для экономии пространства ограничимся девятью цифрами:
function rez=edIzm(N)
sN = string(N)
select length(sN)
case 1 then rez='Байт'
case 2 then rez='Байт'
case 3 then rez='Байт'
case 4 then rez='Килобайт'
case 5 then rez='Килобайт'
case 6 then rez='Килобайт'
case 7 then rez='Мегабайт'
case 8 then rez='Мегабайт'
case 9 then rez='Мегабайт'
else
warning('on')
warning('Введенное больше чем 999 Мегабайт')
warning('off')
rez='Много'
end //select
endfunction
Циклы
Для организации повторяющихся вычислений в Scilab присутствует два стандартных типа циклов: счетный (for) и условный (while). Первый используется в тех случаях, когда заранее известно количество повторений тела цикла, второй – в обратном случае.
Общий вид оператора счетного цикла следующий:
for <счетчик>=<Выражение>
<тело цикла>
end
В качестве выражения может выступать все что угодно. Если в качестве выражения указывается вектор (матрица), то переменная-счетчик последовательно принимает все значения этого вектора (матрицы). Если вспомнить, как в Scilab создаются массивы значений, то можно привести эту конструкцию к стандартному виду для цикла for во всех языках программирования:
for <счетчик>=<начальное значение>:<шаг>:<конечное значение>
<тело цикла>
end
Рассмотрим описанную нами функцию edIzm. Если на вход ей будет подано не одно значение, а несколько, то, вне зависимости от количества элементов, будет выведен единственный и абсолютно неверный результат:
-->edIzm([1,2,4])
ans =
Байт
-->edIzm([1,23,4])
WARNING: Введенное больше чем 999 Мегабайт
ans =
Много
Дело в том, что Scilab пытается перевести в строку весь массив сразу. Поэтому длина строки получается очень большой. Следовательно, необходимо рассмотреть каждый из элементов. В этом может помочь счетный оператор цикла:
function [rez]=edIzm(N)
i=0
for iN=N
i=i+1
sN=string(iN)
select length(sN)
case 1 then rez(i)='Байт'
case 2 then rez(i)='Байт'
case 3 then rez(i)='Байт'
case 4 then rez(i)='Килобайт'
case 5 then rez(i)='Килобайт'
case 6 then rez(i)='Килобайт'
case 7 then rez(i)='Мегабайт'
case 8 then rez(i)='Мегабайт'
case 9 then rez(i)='Мегабайт'
else
warning('on')
warning(sN+' больше чем 999 Мегабайт')
warning('off')
rez(i) ='Много'
end //select
end //for
endfunction
Цикл while. Общий вид этого оператора:
while <выражение>
<тело цикла>
end
Пока результат вычисления выражения равен True, цикл выполняется. Чтобы отделить выражение-условие от тела цикла, можно использовать ключевые слова then или do, но они должны находиться на той же строке, что и while. Кроме того, перед end можно вставить блок else, инструкции которого будут выполнены после того, как выражение-условие станет ложью (False).
Фрагмент для ознакомления
3
Список использованной литературы
1. Андриевский Б., Фрадков А. Элементы математического моделирования в программных средах Matlab 5 и Scilab. – СПб.: Наука, 2001. – 286 с.
2. Акчурин, Э. А. Программирование в системе Scilab [Электронный ресурс]. – Режим доступа: http://www.twirpx.com/file/901949.
3. Алексеев, Е. Р. Scilab: Решение инженерных и математических задач / Е. Р. Алексеев, Е. А. Чеснокова, Е. А. Рудченко [Электронный ресурс]. – Режим доступа: http://linux.armd.ru/common/img/uploaded/files.
4. Боден, М. Программирование в Scilab [Электронный ресурс]. – Режим доступа: http://forge.scilab.org/.
5. Кормилицына, Т. В. Цифровое моделирование гармонического сигнала в пакете SCILAB / Т. В. Кормилицына, А. Р. Азисов // Информационное образовательное пространство педагогического вуза: Материалы II Всерос. науч. Интернет-конференции 22 октября 2012 года, г. Саранск / Редкол.: Н. В. Вознесенская; Е. В. Черемухина; МордГПИ. – Саранск, 2012. – С. 77–79.
6. Сайт разработчиков системы Scilab [Электронный ресурс]. – Режим доступа: www.scilab.org.