• Nenhum resultado encontrado

Laboratório de Programação de Computadores para Engenharia - Notas de aula - Teoria - 12/12/2013. Funções

N/A
N/A
Protected

Academic year: 2021

Share "Laboratório de Programação de Computadores para Engenharia - Notas de aula - Teoria - 12/12/2013. Funções"

Copied!
11
0
0

Texto

(1)

Laboratório de Programação de Computadores para

Engenharia - Notas de aula - Teoria - 12/12/2013

Prof. Pietrobon

Funções

1) Introdução

Alguns programas podem possuir milhares de linhas de código. Neste caso, o programa fica difícil de compreender e administrar. Por isso, dividir um grande programa computacional em partes menores para facilitar a compreensão do problema é uma tarefa comum em programação de computadores. Este trecho menor do programa é chamado de função. Funções são também chamadas de sub-rotina, módulo, sub-programa ou sub-algoritmo.

Uma outra motivação para se utilizar funções é para se evitar repetição do mesmo código no programa. Por exemplo, suponha que seu programa tenha a tarefa de calcular um imposto. Em vez de repetir o código toda vez que for realizar esta tarefa, você escreve uma função para calcular o referido imposto e depois chama a função sempre que precisar calcular este imposto.

Neste sentido, as funções apresentam as seguintes vantagens: 1) você escreve o código somente uma vez. 2) você pode reutilizar a função em outros programas. 3) Uma vez que você tem corrigido todos os erros do programas (i.e., depurado o programa), ele funcionara corretamente não importa quantas vezes você use a função.

Em resumo, funções são usadas para:

1. Dividir um grande programa em programas menores;

2. Repetir uma tarefa que é realizada freqüentemente sem ter que repetir o mesmo código em vários lugares.

(2)

2) Idéia básica sobre o funcionamento de funções

Imagine um programa, denominado principal, com as seguintes instruções (onde c1, c2, c3, c4, c5, c6 e c7 são comandos)

Este código poderia ser rearrumado da seguinte forma N comandos C1 C2 M comandos C3 C4 K comandos C5 C6 C7 N comandos a= funcao1(b) M comandos c=funcao2(d) K comandos e=funcao3(f) function y=funcao1(x) C1 C2 endfunction function y=funcao2(x) C3 C4 endfunction function y=funcao1(x) C5 C6 C7 endfunction

principal

(3)

Nesta segunda versão, o código do programa principal foi desmembrado

em quatro partes: as funções funcao1(), funcao2() e funcao3() e mais o

programa principal. Comandos que estavam antes dentro do principal,

foram distribuídos pelas três funções. Quando o programa principal precisa

executar este código, ele chama as funções que os contém. O controle é

transferido para as funções, que após serem executadas, retorna para o

programa principal. Por exemplo, quando o programa principal necessita

executar os comando C3 e C4, o controle é transferido para a função

funcao2 que quando termina, retorna para o programa principal.

3) Programas e Funções no Scilab

No Scilab já existem muitas funções prontas (pré-definidas), algumas delas elementares (cos(x) e sin(x)) e outras específicas para aplicações em engenharia, matemática, física, e na estatística (sqrt, plot, etc). O usuário também pode definir suas funções.

No Scilab, os programas são gravados em arquivos de script. Arquivos de script possuem diversas declarações Scilab armazenadas em um arquivo .sce. Quando um arquivo de script é executado, o resultado é o mesmo de executar todos os comandos diretamente na janela de comandos. Este tipo de arquivo não tem argumentos de entrada (dados que passo quando chamo o arquivo) e não retorna resultados.

Função é um tipo especial de arquivo .sce que pode receber dados de entrada por meio de uma lista de argumentos de entrada e pode retornar resultados por meio de uma lista de argumentos de saída.

Ex s= sin(x) x é o argumento de entrada e s recebe o resultado retornado pela função, no caso, o seno de x

Uma função pode ser chamada diversas vezes dentro de um programa. Quando isto acontece a execução passa a ocorrer no arquivo onde a função foi definida e quando termina a execução retorna para o programa principal (arquivo) que chamou a função.

4) Funções Definidas pelo Usuário

Nesta seção, você vai aprender a definir suas próprias funções, isto é, funções que são elaboradas pelos próprios usuários do Scilab.

(4)

function [y1,y2,...,ym] = nomedafuncao(x1,x2,x3,...,xn) <comandos>...

endfunction

Onde,

function Palavra reservada que indica o inicio de uma função. nomedafuncao o nome da função é definido pelo usuário.

x1, x2, x3,..., xn parâmetros de entrada. y1, y2, y3,..., ym parâmetros de saída.

<comandos> Comandos do Scilab a serem executados pela função. A declaração:

function [y1,y2,...,ym] = nomedafuncao(x1,x2,x3,...,xn)

é o cabeçalho da função e serve, entre outras coisas, para dar o nome da função e definir a lista de parâmetros de entrada e saída (também chamados de parâmetros formais)

Exemplo:

function [areaCirculo]=CalcularAreaCirculo(r) areaCirculo= %pi*r^2 endfunction raio=10 resp = CalcularAreaCirculo(raio) disp(resp) raio=20 resp = CalcularAreaCirculo(raio) disp(resp) Resposta no console: 314.15927 1256.6371

Observe neste exemplo que:

1) O cálculo da área do círculo é escrito uma única vez, dentro da função CalcularAreaCirculo.

(5)

2) O cálculo da área do círculo é executado duas vezes, pois CalcularAreaCirculo é chamada duas vezes, recebendo valores de raios diferentes em cada caso

3) raio é o parâmetro que é passado para a função. Dentro da função, r recebe o valor de raio.

4) areaCirculo contém o valor que será retornado para quem chamou a função

5) resp é a variável que vai receber o valor retornado pela função, ou seja, recebe o valor que foi atribuído a areaCirculo.

Nas seções seguintes vamos ver algumas variações da definição e uso de funções. Nestes exemplos apresentamos diversas alternativas do uso de funções e esclarecemos melhor seus conceitos: nome da função, valor retornado e parâmetros.

4.1 – Funções que retornam um só valor

Em um arquivo chamado AreaRet.sce digite:

function

[

r

]=

AreaRet

(

lado1

,

lado2

)

r

=

lado1

*

lado2

;

endfunction

Em outro arquivo (arquivo principal) denominado Teste.sce e salvo na mesma pasta, digite:

//programa principal

l1

=

input('Entre lado 1 = ')

;

l2

=

input('Entre lado 2 = ')

;

a

=

AreaRet

(

l1,l2

)

;

printf('\n A area e = %d'

, a

)

;

Observe neste exemplo que:

1) O cálculo da área do retângulo é escrito uma única vez, dentro da função AreaRet

2) l1 e l2 são os lados do retângulo fornecidos pelo usuário

3) Os lado do retângulo (l1 e l2) são passados como parâmetro para a função. Dentro da função, lado 1 e lado2 recebem os valores l1 e l1 passados.

(6)

4) r é a variável dentro da função que vai receber o valor calculado para a área. O seu valor é que vai ser retornado para o programa principal e atribuído a variável a.

5) Duas variáveis foram passadas por parâmetro, mas apenas um valor foi retornado. Não existe relação entre o número de parâmetros e o numero de valores retornados !!!

4.2 – Funções que retornam mais de um valor e não recebem

parâmetro

Em um arquivo chamado ObterDadosArea.sce, digite:

function

[

l1

,

l2

]=

ObterDadosArea

()

l1

=

input('Entre lado 1 = ')

;

l2

=

input('Entre lado 2 = ')

;

endfunction

Em outro arquivo, que é o programa principal, denominado AreaRetangulo.sce e salvo na mesma pasta da função, digite:

//programa principal

[

lado1, lado2

]

=

ObterDadosArea

()

;

area

=

lado1

*

lado2;

printf('\n A area do retângulo e = %d'

, area

)

;

Observe neste exemplo que:

1) Neste programa, é utilizada a função para obter os lados e o cálculo da área é feito no programa principal

2) Dois valores são retornados (lado1 e lado2)

3) Nenhum valor é passado por parâmetro. Por isto, não temos () em frente ao nome da função, quando chamamos a função

4) Deve-se notar que as variáveis utilizadas na função (l1 e l2) são variáveis locais, ou seja, só existem enquanto a função é executada e só podem ser utilizadas dentro da função. Os nomes das variáveis usados no programa principal não precisam ser os mesmos que os adotados no script da função.

4.3 – Funções que não retornam nenhum valor e que não

recebem parâmetro

(7)

function

[]=

ExibirMensagemInicial

()

printf

('\nEste programa calcula a área de um círculo\n\n\\')

;

endfunction

Em outro arquivo, que é o programa principal, denominado AreaQuadrado.sce e salvo na mesma pasta da função, digite:

//programa principal

ExibirMensagemInicial

()

r

=

input

(

' Entre com o raio do circulo')

printf('\n A area do círculo de raio %g e = %f'

, r,

%pi

*

r

^2)

;

Observe neste exemplo que:

1) Neste programa, queremos calcular a área de um círculo.

2) Inicialmente chamamos a função ExibirMensagemInicial() para que ela imprima um texto explicando que se trata do cálculo da área de um círculo.

3) Nenhum valor é retornado para o programa principal. A função apenas imprime a mensagem e nada deve ser informado ao programa principal.

4) Nenhum valor é passado para a função, pois ela não precisa de nenhum parâmetro para executar. Ela só tem que imprimir uma mensagem.

4.4 – Funções que não retornam nenhum valor e que recebe um

parâmetro

Em um arquivo chamado ExibirMensagem.sce, digite:

function

[]=

ExibirMensagem

(

numMsg

)

if

numMsg

==1

printf

('\nLado negativo')

;

end

if

numMsg

==2

printf

(' \nLado igual a zero')

;

end

(8)

Em outro arquivo, que é o programa principal, denominado AreaRetangulo.sce e salvo na mesma pasta da função, digite:

//programa principal

lado

=

input

(

' Entre com o lado do quadrado = ')

if

lado

<

0

ExibirMensagem

(1)

elseif

lado

==

0

ExibirMensagem

(2)

else

area

=

lado

^2

;

printf('\n A area do retângulo e = %d'

, area

)

;

end

Observe neste exemplo que:

1) Neste programa, queremos calcular a área de um quadrado, desde que o lado fornecido não seja zero ou negativo.

2) Caso seja zero ou negativo, uma mensagem apropriada é gerada. Esta mensagem é impressa pela função ExibirMensagem, que recebe por parâmetro um código (1 ou 2) que define qual a mensagem a ser exibida

3) Só um valor, o código da mensagem, é passado para a função.

4) Nenhum valor é retornado para o programa principal. A função imprime a mensagem nada deve ser informado ao programa principal.

4.5 – Programas que chamam mais de uma função

Em um arquivo chamado ExibirMensagemInicial.sce, digite:

function

[]=

ExibirMensagemInicial

()

printf

('\nEste programa calcula a área de um círculo\n\n\\')

;

(9)

Em um arquivo chamado ExibirMensagemFinal.sce, localizado no mesmo diretório em que foi criada a função anterior, digite:

function

[]=

ExibirMensagemFinal

()

printf

('\n\n\nFim do cálculo\n\n\\')

;

endfunction

Em outro arquivo, que é o programa principal, denominado AreaCirculo.sce e salvo na mesma pasta das duas funções anteriores, digite:

//programa principal

ExibirMensagemInicial

()

r

=

input

(

' Entre com o raio do circulo')

printf('\n A area do círculo de raio %g e = %f'

, r,

%pi

*

r

^2)

;

ExibirMensagemFinal

()

1) Neste programa, queremos calcular a área de um círculo, apresentando uma mensagem tão logo o programa inicia e outra quando o programa termina.

2) Duas funções são chamadas dentro do programa principal, uma para exibir a primeira mensagem (ExibirMensagemInicial() ) e outra para exibir a segunda mensagem ( ExibirMensagemFinal() )

4.6 – Função que chama função

Não apenas o programa principal pode chamar uma função.

Uma função pode chamar outra função

Em um arquivo chamado

CalcularAreaCirculo

.sce, digite:

function

[

areaCirculo

]=

CalcularAreaCirculo

(

r

)

areaCirculo

=

%pi*

r

^2

endfunction

Em um arquivo chamado

CalcularVolumeCilindro

.sce, localizado no mesmo diretório em que foi criada a função anterior, digite:

(10)

function

[

volume

]=

CalcularVolumeCilindro

(

r

,

h

)

areaCirc

=

CalcularAreaCirculo

(

r

)

volume

=

h

*

areaCirc

endfunction

Em outro arquivo, que é o programa principal, denominado VolumeCilindro.sce e salvo na mesma pasta das duas funções anteriores, digite:

//programa principal

r

=

input('Entre com o raio da base = ')

;

h

=

input('Entre a altura do cilindro = ')

;

v

=

CalcularVolumeCilindro

(

r, h

)

printf('O volume do cilindro e = %f'

,v1

)

1)

Neste programa, queremos calcular o volume de um cilindro.

2)

Para obter o volume desejado, o programa principal chama a função

CalcularVolumeCilindro.

3)

Para calcular o volume do cilindro, é necessário calcular a área da

base,

assim,

CalcularVolumeCilindro

chama

a

função

CalcularAreaCirculo que retorna esta área.

4.7 – Funções e programa principal no mesmo arquivo

Nos exemplos anteriores, as funções estavam definidas em arquivos diferentes dos arquivos que as utilizavam (chamavam)

Isto é importante quando queremos que as funções sejam utilizadas por programas diferentes

Uma forma alternativa de definir funções, é defini-las no mesmo arquivo que contém o programa principal. Neste caso, só este programa poderá chamá-las. Copie o programa abaixo e salve em TesteFunPrincJuntos.sce.

function

[

r

]=

AreaRet

(

lado1

,

lado2

)

(11)

endfunction

l1

=

input('Entre lado 1 = ')

;

l2

=

input('Entre lado 2 = ')

;

a

=

AreaRet

(

l1,l2

)

;

printf('\n A area e = %d'

, a

)

;

Este programa calcula a área do retângulo como visto anteriormente na seção 4.1. Só que, desta vez, ele não chama uma função remota, definida em outro arquivo. Ele chama a função definida dentro dele.

Observação importante: a função tem que ser definida antes dela ser chamada !!!

Referências

Documentos relacionados

Assim, a presente pesquisa objetiva apresentar uma proposta voltada à re- ferida zona de esperança, que pressuponha o uso correto dos direitos do homem, a partir de uma

Desta forma, existem benefícios para os clientes que possuem melhores controles internos, como, agilidade na elaboração dos demonstrativos contábeis e até mesmo

Segundo [HEXSEL (2002)], há indicações de que o número de técnicos qualificados é pequeno frente à demanda e, portanto, estes técnicos tornam-se mão-de-obra relativamente

radia¸c˜ ao do campo espalhado para uma perturba¸c˜ ao de 10% na velocidade compressional para modelos: homogˆ eneos (em verde) e final (frequˆ encia de corte de 30 Hz) (em azul) -

In the present study, IPost protected the heart against IR injury in the C-IPost group through the recovery of LVEDP, LVDP and ± dp/dt, whereas no significant effects on the hearts

Gráfico 1 Porcentagem de enraizamento e de brotação A, número médio de raízes e brotos B de estacas caulinares e radiculares de amoreira vermelha Rubusrosifolius tratadas com

Além de serem gravados no cartão, os dados são transmitidos através de um módulo de rádio frequência transmissor para um receptor do modelo, onde há um outro PIC capaz de

São muitos os problemas ambientais causados pelo crescimento urbano, o poder público não acompanha esse crescimento com investimentos em obras de infraestrutura, são ocupados