Программирование в системе Scilab
Scilab – это кроссплатформенная система компьютерной алгебры. Изначально это был коммерческий проект под названием Blaise, а затем Basile. С 2003 года продукт получил новое имя Scilab и стал бесплатным. В настоящее время он распространяется по свободной лицензии CeCILL. Что такое Scilab
Для удобства написания скриптов (функций) в Scilab имеется встроенный редактор – Scipad. Редактор SciPad
Встроенный язык Scilab – это язык структурного программирования не имеющий, в отличие от Matlab, средств для работы с объектами. Стандартные конструкции встроенного языка
Переменные не описываются, а создаются путем присвоения им начального значения, например так: a = 1 b='Hello' c= %t
Вследствие Unix-корней системы, важен регистр букв в имени переменных, например: -->d=3;D='три'; -->d*3 ans = 9.0 -->D*3 !--error 144 Операция для заданных операндов не определена. -->D+' – это текст' ans = три – это текст
def_base=2 //глобальная переменная function rez=log_b(num, base) chk_log=%f //локальная переменная rez=log(num)/log(base) endfunction Глобальные и локальные переменные
function [выходные параметры]=имя_функции(входные параметры) … тело функции … [выходные параметры]=… endfunction Описание функции
function [outS]=Hello1(Name) outS='Привет, '+Name+'!' endfunction Вот пример выполнения этой функции: -->Hello1('незнакомец') ans = Привет, Незнакомец! Линейный процесс вычислений
Укажем массив значений: Hello1(['Незнакомец';'Инкогнито']) ans = !Привет, Незнакомец! ! !Привет, Инкогнито! !
Эти операции служат для выполнения матричных действий по правилам матричной алгебры. Например: -->a=[1 2 3],b=[3 2 1] a = 1. 2. 3. b = 3. 2. 1. -->a*b !--error 10 Некорректное умножение.
Согласно правилам матричной алгебры, важен порядок множителей: -->a*b' ans = 10. -->b' * a ans = 3. 6. 9. 2. 4. 6. 1. 2. 3.
Для выполнения поэлементного умножения двух массивов необходимо поставить перед знаком действия точку: -->a .* b ans = 3. 4. 3.
Функция для расчета логарифма числа по произвольному основанию: function rez=logB(num,base) rez = log(num)/log(base) endfunction Операторы ветвления
if then elseif then ... elseif then else end
function [rez]=logB(num, base) //Проверка размера массивов if or([length(num)>1, length(base)>1]) then error('Ошибка: массив не может быть входным параметром'); else if and([num>0, base>0, base1]) then rez = log(num)/log(base) else error('Ошибка: неверные входные данные'); end end endfunction Новый вид функции с проверкой входных данных на корректность:
warning('on') //включение режима вывода предупреждений warning('сообщение') //вывод сообщения warning('off') //выключение режима вывода предупреждений Способ использования прост:
select case then case then case then … case then else end Общий вид оператора множественного выбора
Рассмотрим функцию, получающую количество информации в байтах и выдающее название наибольшей единицы измерения. 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
Счетный (for) и условный (while). Общий вид оператора счетного цикла следующий: for = End Циклы
Рассмотрим описанную нами функцию edIzm. -->edIzm([1,2,4]) ans = Байт -->edIzm([1,23,4]) WARNING: Введенное больше чем 999 Мегабайт ans = Много
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 Счетный оператор цикла:
Возможен и такой вариант начала функции: function [rez]=edIzm(N) NSize=length(N) for i=1:NSize sN=string(N(i)) select length(sN) . . .
Общий вид этого оператора: while end Цикл while.
Вместо строк sN=string(N(i)) select length(sN) можно вставить следующее: iN=0 NTemp=N(i) while NTemp>0 do iN=iN+1 NTemp=int(NTemp/10) end select iN
Спасибо за внимание