Consulte também o vídeo explicativo sobre funções em Scilab. Um segundo vídeo explicativo também pode ser acessado clicando aqui.
Funções são procedimentos que retornam saídas a partir de entradas. A estrutura básica de uma função é na forma:
funcao [variaveis_de_saida] = nome_da_funcao(variaveis_de_entrada)
procedimentos com atribuição das variaveis_de_saida
endfunction
Vejamos alguns exemplos:
Exemplo
A seguinte função por exemplo, retorna o quadrado de um número.
# definindo a função
function f= quadrado(x)
f = x^2
endfunction
# agora podemos usar a função
a = 2
b = quadrado(a)
disp(b)
Que retorna o resultado 4.
Vejamos outros exemplos e usos de funções.
Exemplo
Por exemplo, para calcular as frações molares dadas as frações mássicas e massas molares, a relação é escrita da seguinte forma.
$$ x^{mol}_i = \frac{\frac{x^{max}_i}{MM_i}}{\sum_i{\frac{x^{max}_i}{MM_i}}} $$A função que efeuta o cálculo está apresentada abaixo, exemplificada para uma mistura água,etanol, metanol.
function xmol = mas_p_mol(xmas,MM)
n = length(xmas) // captura a dimensão do vetor de frações mássicas
xmol = xmas ./MM // efetua a operação de divisão elemento a elemento
xmol = xmol / sum(xmol) // nomaliza o valor de xmol
endfunction
// vamos usar a função
nomes = ['agua','etanol','metanol'] // nomes dos compostos
xmas = [.3, .5, .2] // frações mássicas
MM = [ 18, 46, 32] // massas molares
xmol = mas_p_mol(xmas,MM)
O resultado gerado é:
[0.4932975871313673, 0.32171581769436997, 0.18498659517426275]
Exemplo
Um polígono regular de $ n $ lados inscrito em uma circunferência de raio $ R=1 $ unitário é dada por:
em que $ a, h $ correspondem à apótema e a altura dos triângulos, dados por:
$$ a = 2 \cdot sen \left( \theta \right) $$$$ h = cos \left( \theta \right) $$em que o ângulo $ \theta $ é calculado como:
$$ \theta = \frac{ 360º}{2 \cdot n} $$O perímetro de tal polígono, por sua vez fica:
$$ P = n \cdot a $$O código a seguir calcula a área e o perímetro de um polígonos regulares inscritos em um círculo de raio unitário em função do número de lados informado.
clear
clc
function [area,perimetro] = poligonoregular(n)
angulo = %pi/n/2
apotema = 2*sin(angulo)
h = cos(angulo)
area = n*apotema*h/2
perimetro = apotema * n
endfunction
n = 5
[area,perimetro] = poligonoregular(n)
disp('area =', area)
disp('perimetro =', perimetro)
No Scilab, as funções 'enxergam' as variáveis globalmente definidas. Contudo, se houver uma variável local já definida com mesmo nome que que as variáveis globais, dá preferência à local. Por exemplo:
function [c,d]=func(a,b)
p = 10
c = a + b + p
d = a - b + q
endfunction
p = 100
q = 200
a = 5
b = 3
[c,d] = func(a,b)
disp([c,d])
------ resultado
c = 18
d = 202
O resultado das variáveis c,d
serão respectivamente 18
(calculado como 5 + 3 + 10
) e 202
(calculado como 5 - 3 + 200
). Observe que internamente à função, uma variável p
definida como 10; logo, o software irá usar este valor no cálculo da variável c
, ao invés da variável na p
na memória global com o valor de 100
. Já para o cálculo da variável d
, o cálculo retorna 202
pois faz uso de uma variável q
não definida intermente na função, mas definida globalmente.
Vale ressaltar que as variáveis de entrada e saída das funções são locais, e rodam em outro espaço de memória (não sobrepõem as variáveis com eventuais mesmos nomes na memória global).
Por exemplo, o exemplo anterior teria os mesmos resultados se rodado com o seguinte código:
function [w,z]=func(x,y)
p = 10
w = x + y + p
z = x - y + q
endfunction
p = 100
q = 200
a = 5
b = 3
[c,d] = func(a,b)
------ resultado
c = 18
d = 202
Note que as variáveis globais não tem o mesmo nome que as locais; porém, a correspondência é feita pela ordem. Na chamada da função, no comando [c,d] = func(a,b)
, os valores de a,b
são respectivamente 5
e 3
; e nesta ordem, estes serão os valores atríbuídos respectivamente à x
e y
ao rodar a função. A função calcula os valores de [w,z]
e os atibui à [c,d]
, respectivamente. Os argumentos são passados para a função na mesma ordem em que são informados.
Embora a função "enxergue" variáveis globais, elas não podem ser modificadas internamente na função, a menos que sejam declaradas como globais. Vejamos um exemplo.
function teste()
global a
a = a + 8
b = b + 8
endfunction
global a
a = 10
b = 10
teste()
disp('a', a)
disp('b', b)
------ resultado
a = 18
b = 10
Observe que a
foi declarada como global (dentro e fora da função), enquanto b
não o foi. O resultado é que a variável global a
foi modificada dentro da função e isto foi transferido para seu valor na memória global; enquanto a variável b
modificada dentro da função não teve seu valor transferido para a memória global.
É possível informar as variáveis à função em ordem distita, indicando qual variável receberá qual valor. Neste caso, na chamada da função, deve-se atribuir um valor ao nome da variável de entrada da função (conforme ela aparece onde a função é definida). Considere um exemplo.
function [w,z]=func(x,y)
p = 10
w = x + y + p
z = x - y + q
endfunction
p = 100
q = 200
a = 5
b = 3
[c,d] = func(x = a,y = b)
[f,g] = func(y = b,x = a)
------ resultado
c = 18
d = 202
f = 18
g = 202
No exemplo acima, foi informado que a variável x = 5
(igual à a
); e y=2
(igual a b
). Tanto na chaamda [c,d] = func(x = a,y = b)
quanto na chamada [f,g] = func(y = b,x = a)
, os resultados de saída foram os mesmos, embora a ordem de informação das variáveis de entrada estivesse trocada.