You are on page 1of 14

Linguagens de Programao

2009/2010
Modularizao
Funes e Procedimentos

LP 2009/20010
ajtavares@ipca.pt

ndice
1.

2.

Conceitos associados modularizao


1.

Funes

2.

Procedimentos

3.

Chamada de Sub-algoritmos

4.

mbito das Variveis

Funes e Procedimentos em C#
1.

Variveis locais

2.

Valor de retorno

3.

Passagem de parmetros

4.

Passagem de Parmetros por REFERNCIA

5.

Parmetros de SAIDA

6.

Numero varivel de parmetros

7.

Variveis Globais

LP 2009/20010
ajtavares@ipca.pt

Conceitos associados Modularizao


Subalgoritmos


Problemas de grande dimenso e de soluo complexa podem ser


divididos em problemas menores com lgica mais simples e de
compreenso mais fcil. Em vez de escrever um algoritmo
grande, escrevem-se vrios algoritmos menores

Quando utilizamos dentro de um algoritmo outros algoritmos, ento


dizemos que estes ltimos so sub-algoritmos.

Um sub-algoritmo pode receber vrios valores de entrada do


algoritmo principal. Estes valores so chamados de parmetros.

O processo de dividir problemas grandes em problemas menores


chamado de modularizao.

LP 2009/20010
ajtavares@ipca.pt

Conceitos associados Modularizao


Vantagens dos sub-algoritmos


diminuem a complexidade de compreenso dos algoritmos;

evitam a repetio de pseudo-cdigo num algoritmo;

permitem reutilizar algoritmos j desenvolvidos

Existem, na maioria das linguagens de programao, dois


tipos de sub-algoritmos:


Funes: implementam uma funo (no sentido matemtico), ou


seja, calculam um nico valor como resultado.

Procedimentos: podem calcular qualquer nmero de valores como


resultado

LP 2009/20010
ajtavares@ipca.pt

Funes
Funo NomeFuncao (Arg1: tipo,..., ArgN: tipo): Tipo
Definio de Variveis
Incio
...
Devolver Expresso
Fim


Tipo o tipo do valor que ser produzido pela funo

O nmero de argumentos (do parmetro) qualquer e cada


argumento de um tipo

Para produzir o valor devolvido pela funo, o sub-algoritmo deve


possuir a instruo Devolver Expresso, a qual indica o trmino da
execuo do sub-algoritmo

LP 2009/20010
ajtavares@ipca.pt

Procedimentos
Procedimento NomeProc (V1:tipo,..,VN:tipo,Var R1:tipo,...,RN:tipo)
Var Definio de Variveis
Incio
...
R1 Expresso
...
RN Expresso
Fim


Os argumentos V1 a VN so valores recebidos pelo sub-algoritmo


parmetros de entrada ou parmetros passados por valor

Os argumentos R1 a RN so valores produzidos pelo sub-algoritmo


parmetros de sada ou parmetros passados por referncia

LP 2009/20010
ajtavares@ipca.pt

Chamada/utilizao/invocao de Sub-algoritmos


As funes e procedimentos precisam ser chamados pelo algoritmo


principal para serem executados

O nmero de parmetros e seu respectivo tipo devem ser respeitados


(correspondncia exacta)

As Funes devem ser chamadas dentro de Expresses.


Varivel Funo(Parmetros)
Varivel Funo(Parmetros) + Z

Os Procedimentos so chamados como instrues isoladas.


Procedimento(Parmetros)

LP 2009/20010
ajtavares@ipca.pt

Chamada/utilizao/invocao de Sub-algoritmos
Algoritmo Motorista
valor_idade: inteiro
nome: string
status: lgico
Incio
ler(nome, valor_idade)
status Verifica_Idade(valor_idade)
se (status = verdadeiro) ento
escrever(Pode tirar a carta)
seno escrever(No pode tirar a carta)
Fim
LP 2009/20010
ajtavares@ipca.pt

Chamada/utilizao/invocao de Sub-algoritmos
Algoritmo Notas
n1, n2, n3, md : real
cdigo : inteiro

Incio
ler (cdigo)
enquanto (cdigo>0)
ler(n1, n2, n3)
Media(n1, n2, n3, md)
escrever(Media: , md)
ler (cdigo)
fim_enquanto

Fim
LP 2009/20010
ajtavares@ipca.pt

mbito das variveis




Sempre que declaramos uma varivel, definimos tambm sua rea de


atuao.

Exemplo:
Funo F(z: inteiro): lgico
varivel x: inteiro
Incio
xz
Devolve verdadeiro
Fim

A varivel x s pode ser utilizada dentro da funo F

Dentro de uma mesma rea de atuao no podem existir duas


variveis com o mesmo nome. Em reas de atuao diferentes podem
ocorrer nomes iguais.

LP 2009/20010
ajtavares@ipca.pt

10

mbito das variveis




Variveis e constantes locais:




so definidas dentro dos sub-algoritmos e s tem validade


dentro das instrues do sub-algoritmo.

Variveis e constantes globais:




so definidas dentro do algoritmo principal e podem ser


acedidas por qualquer instruo do algoritmo e sub-algoritmos.

NO se devem utilizar Variveis Globais dentro dos subalgoritmos, s em casos especiais.

LP 2009/20010
ajtavares@ipca.pt

11

Funes e Procedimentos em C#
Relao entre conceitos:


Abordagem a aplicar = simplificar + minimizar conceitos

Mtodos em C# so anlogos a funes e procedimentos em outras


linguagens como C e Pascal (e em Algoritmos)

O conceito de mtodo em C# est relacionado a outros conceitos da


programao orientada a objetos, que sero estudados no segundo
semestre

No entanto, possvel estabelecer uma relao entre o conceito de


mtodo em C# e os conceitos de funo ou procedimento da
programao imperativa

LP 2009/20010
ajtavares@ipca.pt

12

Funes e Procedimentos em C#
Relao entre conceitos:

Algoritmos: Funes e Procedimentos


C#: Mtodos static

Algoritmos: Programa principal


C#: Mtodo static void Main(string[] args)

Algoritmos: Algoritmo ou Programa


C#: class nomeClasse { <codigo> }

LP 2009/20010
ajtavares@ipca.pt

13

Funes e Procedimentos em C#
Exemplo:

static int dif(int a, int b){


while(a != b)
if(a > b) a=a-b; else b=b-a;
return a;
}

int mdc define o nome (mdc) e o tipo do valor retornado (int) pelo
mtodo mdc

(int a, int b) define os parmetros (a e b, inteiros) usados pelo


mtodo

o modificador static indica que o mtodo no est vinculado a


nenhum objecto

os comandos entre { e } correspondem ao 'corpo' do mtodo e sero


executados cada vez que o mesmo for ativado.

o comando return encerra a execuo do mtodo e define o valor


devolvido pelo mesmo

LP 2009/20010
ajtavares@ipca.pt

14

Funes e Procedimentos em C#
Exemplo:

class Exemplo {
static int mdc(int a, int b){
while(a != b) if(a > b) a=a-b; else b=b-a;
return a;
}
public static void Main(string[] args){
int x = 33; int y = 605;
int m = mdc(x,y);
Console.WriteLine("mdc({0},{1})={2}",x,y,m);
}
}

o comando int m = mdc(x,y); atribui como valor inicial da varivel


m o valor retornado pela ativao do mtodo feita em mdc(x,y).

Os parmetros usados nessa ativao so os valores de x e y:


durante execuo do mtodo, o parmetro a substitudo pelo valor
de x e o parmetro b substitudo pelo valor de y.

LP 2009/20010
ajtavares@ipca.pt

15

Funes e Procedimentos em C#
Variveis locais:


Um mtodo pode ter variveis locais. So variveis declaradas


dentro do mtodo e podem ser utilizadas apenas dentro do mtodo
onde foram declaradas

Os parmetros do mtodo tambm so locais a este

Mtodos diferentes podem ter parmetros ou variveis locais com


nomes comuns

Neste caso, cada mtodo tem os seus prprios parmetros e


variveis locais, independentemente de os nomes serem os mesmos.

LP 2009/20010
ajtavares@ipca.pt

16

Funes e Procedimentos em C#
Exemplo:
static float media(float[] v){
float s = 0;
for(int i = 0; i < v.Length; i++) s = s + v[i];
return s/v.Length;
}

v, s e i so variveis locais ao mtodo media.

v parmetro do mtodo, que usado como uma varivel local.

LP 2009/20010
ajtavares@ipca.pt

17

Funes e Procedimentos em C#
Valor de retorno:


Todos exemplos de mtodos apresentados at aqui retornam um


valor ao serem chamados.

Esse valor pode ser usado para atribuir um valor a uma varivel ou
mesmo numa expresso, como por exemplo:
m = mdc(x,y)*10;

Em alguns casos, no se deseja que o mtodo retorne um valor.


Nesse caso, o tipo retornado pelo mtodo definido como void.
static void writeMax(float[] v){
float m = v[0];
for(int i = 1; i < v.Length; i++)
if(v[i] > m) m = v[i];
Console.WriteLine(" maximo: {0}",m);
}

LP 2009/20010
ajtavares@ipca.pt

18

Funes e Procedimentos em C#
Resumindo:
static
{
...
}

void

soma(int x)
Procedimento: tem uma lista de parmetros de
entrada mas no retorna um resultado

static int valor()


{
Funo: tem uma lista de parmetros de
entrada e retorna um resultado do tipo declarado
...
no cabealho (int), atravs da instruo return
return <x>;
}
A instruo return termina o mtodo
independentemente do local

LP 2009/20010
ajtavares@ipca.pt

19

Funes e Procedimentos em C#
Resumindo:


Um mtodo apenas retorna um resultado ou ento no retorna


nenhum resultado

Para retornar um resultado usada a instruo return

Um mtodo pode ter vrios parmetros de diferentes tipos de dados.


Na invocao do mtodo a ordem e os tipos dos parmetros tem de
ser respeitado

Os parmetros de um mtodo so passados por valor, no entanto


possvel passar parmetros por referncia usando ref ou out


Passagem por valor = passada uma cpia do valor que est na


varivel

Passagem por referncia = passada a prpria varivel, podendo ser


alterada dentro do mtodo

LP 2009/20010
ajtavares@ipca.pt

20

10

Funes e Procedimentos em C#
Passagem de Parmetros:


Nos mtodos j vistos, os parmetros so passados por valor.

Caso em que os valores das variveis x e y so atribudos aos


parmetros a e b do mtodo
m = mdc(x,y);

Caso da chamada a um mtodo com parmetros passados por valor,


onde o valor passado como parmetro pode ser uma constante ou
mesmo o resultado de uma expresso
m = mdc(115,x+y*8);

Durante a execuo do mtodo mdc, o valor dos parmetros


alterado. As alteraes so feitas nas variveis locais do mtodo,
correspondentes aos parmetros e no afetam as variveis usadas
na chamada ao mtodo

LP 2009/20010
ajtavares@ipca.pt

21

Funes e Procedimentos em C#
Passagem de Parmetros:


C# oferece 4 modos de passagem de parmetros:




valor (mostrado nos exemplos anteriores)

Referncia (ref)

Sada (out)

nmero varivel de parmetros

LP 2009/20010
ajtavares@ipca.pt

22

11

Funes e Procedimentos em C#
Passagem de Parmetros por REFERNCIA:
Durante a sua execuo, o mtodo manipula diretamente as

variveis associadas aos parmetros passados por referncia.


A alterao no valor de um parmetro passado por referncia

corresponde a uma alterao na varivel associada ao mesmo


A passagem de um parmetro por referncia indicada pela palavra

ref antes do parmetro.


Ao passar um array como parmetro por valor, os seus elementos

comportam-se como se fossem passados por referncia.




se alterarmos o valor de um elemento do array dentro do


mtodo, essa alterao vai ocorrer tambm no elemento do array
passado como parmetro.

LP 2009/20010
ajtavares@ipca.pt

23

Funes e Procedimentos em C#
Passagem de Parmetros por REFERNCIA:
class Referencia {
static void troca(ref int a, ref int b){
int t = a;
a = b; b = t;
}
public static void Main(string[] args){
int x = 5; int y = 21;
Console.WriteLine("antes - x:{0}

y:{1}",x,y);

troca(ref x,ref y);


Console.WriteLine("depois - x:{0} y:{1}",x,y);
}
}

LP 2009/20010
ajtavares@ipca.pt

24

12

Funes e Procedimentos em C#
Passagem de Parmetros por REFERNCIA:
Array passado como parmetro

public static void inverte(int[] v){


int k = v.Length-1;
for(int i = 0; i < v.Length/2; i++){
int t = v[i];
v[i] = v[k-i];
v[k-i] = t;
}
}


Aps uma chamada a este mtodo, exemplo: inverte(w);


os elementos do vetor w sero invertidos.

LP 2009/20010
ajtavares@ipca.pt

25

Funes e Procedimentos em C#
Parmetros de SAIDA:


Um parmetro de sada pode ter o seu valor alterado durante a


execuo do mtodo mas esse valor no pode ser usado pelo
mtodo.

O modo de passagem, de sada, indicado pela palavra out antes do


parmetro
...
public static void min_max(int[] v, out int max, out int min )
{
max = v[0]; min = v[1];
for(int i = 1; i < v.Length; i++){
if(v[i] > max) max = v[i];
if(v[i] < min) min = v[i];
}
}
...

LP 2009/20010
ajtavares@ipca.pt

26

13

Funes e Procedimentos em C#
Numero varivel de parmetros:
modo de passagem de parmetros em que o mtodo define um array

como parmetro, precedido da palavra params




Na chamada os valores passados so associados aos elementos do array

No mtodo os parmetros so acedidos como elementos de um array

class MainClass{
public static int soma(params int[] v){
int s = 0;
for(int i = 0; i < v.Length; i++) s = s + v[i];
return s;
}
public static void Main(string[] args){
int t = soma(33,12,22,3,30,44,12,-1);
Console.WriteLine("Soma: {0}",t);
}
}

LP 2009/20010
ajtavares@ipca.pt

27

Funes e Procedimentos em C#
Variveis Globais:


At aqui temos usado variveis locais aos mtodos.

Em C# as variveis definidas fora dos mtodos so variveis globais classe


(static), e podem ser usadas pelos mtodos de classe (static).
class MainClass{
static int[] v = { 33, 21, 44, 2, 3, 4, 1, 9 };
static void min_max(out int min, out int max){
max = v[0]; min = v[0];
for(int i = 1; i < v.Length; i++){
if(v[i] < min) min = v[i];
if(v[i] > max) max = v[i];
}
}
public static void Main(string[] args){
int mi, mx;
min_max(out mi,out mx);
...
}
}

LP 2009/20010
ajtavares@ipca.pt

28

14

You might also like