Universidade do Estado do Rio de Janeiro
Instituto de Química
Prof André Luís Alberton
Índice

Funções¶

 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:

Fig

$$ A = \frac{ n \cdot a \cdot h }{2} $$

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)

Sobre variáveis e funcionamento nas funções¶

Enxergando variáveis globalmente definidas¶

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 pdefinida 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.

Variáveis de entrada e saída como variáveis locais¶

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.

Modificando variáveis globais dentro da função¶

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 afoi 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.

Informando em ordens distintas nominando as variáveis de entrada¶

É 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.