Scilab: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 1474:
Усложним функцию следующим образом
<source lang=Scilab>
-->deff('[x y]=f(z,u)',['x=z^2-u';'y=u^3'])
</source>
Созданная функция переопределится, о чем вам скажет предупреждающее сообщение. Если вы не хотите постоянно это предупреждение, то воспользуйтесь функцией '''funcprot(0)'''. Этой строкой мы создали сложную функцию, которая принимает уже два обязательных аргумента и возвращает вектор результатов. Функция сложная потому, что ее тело состоит уже из двух строк. Обратите внимание, что тело сложной функции должно передаваться '''deff()''' вектором-столбцом, каждая строка которого является инструкцией, записываемой строковым типом данных.
 
Вызовем нашу функцию
<source lang=Scilab>
-->f(2,2)
ans =
2.
</source>
Очевидно, что мы получили не то, что хотели, ведь функция должна была вернуть вектор. К сожалению, в данном случае ''ans'' не переопределилась автоматически системой в вектор и был записан только результат расчета переменной x, потому что при объявлении в '''deff()''' мы его записали первым. Чтобы получить ответ целиком, мы должны слева от вызова явно показать вектор. В этом случае мы должны объявить некоторые переменные, в которые будет записываться результат, либо воспользоваться переменной ''ans'' вот так
<source lang=Scilab>
-->[ans ans]=f(2,2)
ans =
2.
ans =
8.
</source>
В этом случае в ''ans'' сначала запишется результат первой инструкции, а затем результат второй инструкции. Такой способ записи результата приемлем, если мы хотим просто посмотреть результат расчета, но сам результат не планируем никак использовать. Запишем результат расчета в вектор следующим образом
<source lang=Scilab>
-->[a(1),a(2)]=f(2,2);
-->a
a =
2.
8.
</source>
Все аргументы нашей сложной функции являются обязательными и нельзя вызвать функцию, не передав их все. Например, попробуйте сделать такой вызов
<source lang=Scilab>
-->f(3)
!--error 4
Неизвестная переменная: u
at line 2 of function f called by :
f(3)
</source>
В дальнейшем мы научимся обходить это ограничение, перегружая функцию.
|}
Обратите внимание на функцию '''funcprot()''' (от {{lang-en|function protection}}). С помощью данной функции вы можете защитить функции от случайного их переопределения. Функция принимает один целочисленный аргумент:
* 0 — отключение механизма защиты;
* 1 — формирование предупреждения (используется по умолчанию);
* 2 — формирует ошибку при попытке переопределения существующей функции.
 
Вообще говоря, при определении функции через '''deff()''' она может иметь сколь угодно много инструкций, которые необходимо записывать в вектор, как это было показано в упражнении. Однако, запись становится неудобочитаемой и в этом случае целесообразнее использовать уже вторую конструкцию '''function...endfunction''', а также пользоваться редактором ''scinotes'', о котором мы будем говорить дальше. Общий синтаксис выглядит так
<source lang=Scilab>
function <выходные переменные>=имя_функции(аргументы)
...
инструкции
...
endfunction
</source>
Данная конструкция, как правило, для написания пользовательских программируемых функций, однако, в зависимости от предпочтений пользователя, она может использовать и вместо функции '''deff()'''. Использовать эту конструкцию можно в интерпретаторе, который воспринимает ее по особому. Сначала необходимо ввести первую строку с ключевым словом ''function'', именем функции, аргументами и выходными переменными. Далее вы можете нажать <Enter> и интерпретатор будет воспринимать все, что вы вводите, как инструкции для данной функции до тех пор, пока вы не введете ключевое слово ''endfunction''. Если вы не допустили синтаксических ошибок в теле функции, то она будет готова к использованию, в противном случае интерпретатор выведет вам ошибку и объявлять придется заново. Именно поэтому при написании больших функции следует пользоваться исключительно ''scinotes''.
 
В рамках данного раздела покажем как можно объявить функцию f через конструкцию '''function...endfunction'''.
<source lang=Scilab>
-->function x=f(z)
-->x=z^2
-->endfunction
-->f(4)
ans =
16.
</source>
 
== Практикум ==