-Blocos -Escopo de variáveis -Funções

30
-Blocos -Escopo de variáveis -Funções

Transcript of -Blocos -Escopo de variáveis -Funções

-Blocos-Escopo de variáveis -Funções

Universidade Federal Fluminense

Objetivos são:-Rever o conceito de bloco, introduzindo variáveis locais e o conceito de “escopo” de variáveis.- Introduzir o conceito de procedimentos e função, com e sem parâmetros.- Introduzir o conceito de procedimentos e funções recursivos.- Desenvolver algoritmos utilizando procedimentos e funções.

BlocosAté o momento só utilizamos os blocos pelo uso das palavras início e fim. Neste sentido, todo algoritmo é um bloco.

Frequentemente, é necessário declarar novas variáveis, ao longo do desenvolvimento do algoritmo. Uma solução seria retomar o início do algoritmo e fazer novas declarações. Para contornar a dificuldade desta solução, recorre-se ao conceito de bloco.

Um bloco consiste em um conjunto de declarações e comandos delimitados pelas palavras início e fim, conforme ilustra o exemplo:

Universidade Federal Fluminense

início<declarações>C11;

.

.

.C1n;início

<declarações>C2,1;

.

.

.C2,m;início

<declarações>C3,1;

.

.

.C3,k;

fim;fim;

Fim;

Universidade Federal Fluminense

Quando um bloco começa a ser executado, as variáveis declaradasdentro dele são ativadas (passam efetivamente a existir) e permanecem ativas até o término de execução do bloco. Diz-se então que as variáveis são locais ao bloco, o que permite que elas só ocupem memória quando necessário.

Com isto, o programador pode gerenciar a utilização da memória. Por exemplo, um vetor ou matriz cuja dimensão não é conhecida a priori (p. ex., vai ser lida ou depende de algum processamento), pode ser declarado dentro de um bloco e, portanto, alocado dinamicamente na memória.

Universidade Federal Fluminense

Exemplo:iníciointeiro N,I;leia (N);iníciotipo v = vetor [1:N]real;v: VETpara I de 1 até N façaVET [I]<- I;f im para;imprima (VET);fim;fim;

Universidade Federal Fluminense

Escopo de variáveis

Diz-se que um bloco é um externo a outro, quando o segundo faz parte do primeiro.Neste sentido, uma variável declarada em um bloco é global para todos os blocos internos e

local para o próprio bloco.Podemos ter diversos blocos aninhados, como mostra a figura a seguir:

M

PA

B

Q

S

R

Nível0123

BlocoMP,QA,R,SB

P e Q são internos a MA é interno a PB é interno a AR e S são internos a Q

M é externo a P e QP é externo a AA é externo a BQ é externo a R e

Universidade Federal Fluminense

Se uma variável A declarada em um bloco já foi declarada com o mesmo nome num bloco mais externo, a variável ativa no bloco é aquela declarada localmente. A variável A deixa de ser global para aquele bloco.Os exemplos a seguir ilustram variáveis locais, globais e escopo de variáveis.

Exemplo 1:iníciointeiro: I, J;leia (I);J <- I ** 2;inícioreal: XX <- J + 1imprima (X);fim;l ei a (J);I <- I * J;fim;

I, J são variáveisglobais e X é umavariável local aobloco interno.

EscopoI J

X

Universidade Federal Fluminense

Exemplo 2:inícioInteiro: I, J;leia (I);J <- I **2;inícioreal: X, I;X <- J +1imprima (X);fim;leia (J);I<- I * J;fim

EscopoI J

X I’

No exemplo acima, I deixa de ser global por ter sido declarada com o mesmo nome no bloco interno. Na verdade, é como se fosse uma nova variável I’.

Universidade Federal Fluminense

Para ilustrar como é possível economizar memória, utilizando o conceito de bloco, consideramos o problema de trocar os conteúdos de duas variáveis entre si. A seguir é mostrada a troca como tem sido feito e do lado a nova versão usando bloco:

início {sem bloco interno}inteiro: AUX, A, B;leia (A, B);AUX <- A;A <- B;B <- AUX;imprima (A,B);fim;

início {com bloco interno}inteiro: A, B;leia (A, B);iníciointeiro: AUX;AUX <- A;A <- B;B <- AUX;fim;imprima (A,B);fim;

A vantagem da segunda solução é que a variável AUX, só é alocada no instante da troca. Isto se torna mais relevante num contexto onde a troca é eventual, ou seja, pode ser realizada ou não, dependendo de algum teste.

Universidade Federal Fluminense

Procedimentos:Um procedimento é um bloco precedido de um cabeçalho. Com isto é possível fazer referência ao bloco de qualquer ponto do algoritmo. A sintaxe da declaração será:

procedimento <nome do procedimento>;início<declarações>C1;C2;...Cn;fim. {<nome do procedimento>}

Universidade Federal Fluminense

Exemplo:procedimento TROCA;iníciointeiro: AUX;AUX <- X;X <- Y;Y<- AUX;fim [TROCA];

A declaração de um procedimento deve vir sempre no início do bloco em que estiver sendo declarado (antes de qualquer comando executável). Um procedimento só é executável sob chamada. A chamada no procedimento é feita por um comando que se resume no nome do procedimento. O exemplo a seguir esclarece a utilização do procedimento TROCA declarado anteriormente. O que será impresso no algoritmo abaixo?

Universidade Federal Fluminense

iníciointeiro: X,Y,A,B,C,D;procedimento TROCA;iníciointeiro: AUX; X;AUX <- X;X<- Y;Y <- AUX;fim {TROCA};A<- 5;B<- 3;imprima (A,B);X <- A;Y <- B;TROCA;A <- X;B <- Y;imprima (A,B);C<- 4;D<-9;imprima (C,D);X <- C;Y <- D;TROCA;C <- X;D <- Y;imprima (C,D);fim;

Serão impressos:5 33 5 e4 99 4

Universidade Federal Fluminense

No exemplo anterior o procedimento TROCA foi utilizado duas vezes com o objetivo de trocar o valor das variáveis A e B e depois C e D. O mesmo resultado poderia ser obtido de uma forma mais compacta introduzindo parâmetros no procedimento.

A sintaxe mais geral para procedimentos será:procedimento <nome do procedimento> (<lista de parâmetros>);<especificação dos parâmetros>início<declarações de variáveis locais>C1;C2;...Cm;fim; {nome do procedimento}

Universidade Federal Fluminense

A <especificação dos parâmetros> consiste na declaração dos tipos das variáveis que compõem a lista de parâmetros. No exemplo do procedimento TROCA, X e Y deixariam de ser variáveis globais e passariam a fazer parte da lista de parâmetros:

procedimento TROCA (X,Y);inteiro: X, Y;início

inteiro: AUX;AUX <- X;X <- Y;Y <- AUX;

fim; {TROCA}

Universidade Federal Fluminense

O algoritmo ficaria:

iníciointeiro: A, B, C, D;procedimento TROCA(X,Y);

inteiro: X,Y;início

inteiro: AUX;AUX <- X;

X <- Y;

Y <- AUX;

fim; {TROCA}leia (A,B);imprima (A,B);TROCA (A,B);imprima (A,B);leia (C,D);imprima(C,D);TROCA (C,D);imprima (C,D);

fim.

Universidade Federal Fluminense

A utilização de procedimentos permite que um conjunto de comandos usados repetidas vezes em vários pontos do algoritmo (ou de uso geral) possa ser escrito uma única vez (na declaração) e chamado de vezes necessárias, desde que suficientemente parametrizados.

Exemplo: procedimento ABS (X,Y); {cabeçalho}

real: X,Y; {especificação dos parâmetros formais}início {corpo do procedimento}

{não tem variável local}se X>= 0 então Y <- X;

senão Y <- (- X);fim se;

fim; {ABS}

No exemplo anterior, X é um parâmetro de entrada e Y, um parâmetro de saída. X e Y são denominados parâmetros formais.

Universidade Federal Fluminense

Como podemos ter no algoritmo diversas chamadas do procedimento ABS para encontrar o valor absoluto de diferentes variáveis, os parâmetros que aparecem na chamada do procedimento são denominados parâmetros efetivos. No momento da chamada, quando então o procedimento vai ser executado, os parâmetros formais são substituídos pelos parâmetros efetivos respectivos. Um parâmetro de saída deve ser, necessariamente, um identificador, enquanto que um parâmetro de entrada pode ser um identificador, uma constante ou uma expressão aritmética.

Exemplos ilustrativos:

Universidade Federal Fluminense

Exemplo 1:início

real: A, B, C, D, E;procedimento ABS (X, Y);

real: X, Y;início

se X>= 0então Y <- X;senão Y <- (- X);

fim se;fim;

A <- 5; B<- (-3); E <- (-10);ABS (A, C);imprima (A,C);ABS (- 3, D) ;imprima (“-3”, D);ABS (E**3,D);E <- D* A + B;imprima (E);ABS (A,D);ABS(D,C);E <- C * D;imprima (E);

fim.

Universidade Federal Fluminense

Exemplo 2: início

inteiro: N, FAT;caracter: TÍTULO;procedimento FATORIAL (NF, FATF);

inteiro: NF, FATF;início

inteiro: I FATF <- 1;para I de 1 até NF faça

FATF < FATF * I;fim para;imprima (TÍTULO, NF, “É”, FATF);

fim; [FATORIAL]TÍTULO <- “ O FATORIAL DE”;N <- 5;FATORIAL (N, FAT);imprima (FAT, “É”, TÍTULO, N);

fim.

Universidade Federal Fluminense

Será impresso:O FATORIAL DE 5 É 120120 É O FATORIAL DE 5

Universidade Federal Fluminense

Quando se necessita atribuir o resultado da chamada de um procedimento a uma variável, utilizar este resultado numa expressão aritmética ou imprimir este resultado, é necessário que exista um parâmetro de retorno na chamada do procedimento e este parâmetro é que será utilizado.

Por Exemplo:

ABS (-3, Y);X <- Y * 2;

Seria mais conveniente se pudéssemos escrever:

X <- ABS (-3) * 2;

Universidade Federal Fluminense

Isto é possível utilizando um tipo especial de procedimento, denominado função cuja sintaxe é a seguinte.

função <nome da função> (<lista de parâmetros formais>); <tipo básico>;<especificação dos parâmetros>;início

<declaração de variáveis locais>;C1;C2;...

<nome da função> <- <expressão>;Cn;

fim; {<nome da função>}

Universidade Federal Fluminense

O procedimento ABS (X,Y) visto anteriormente poderia ser transformado na função ABS(X), da seguinte maneira:

função ABS (X): real;real: X;início

se X ≥ 0 então ABS <- X;senão ABS <- - X;

fim se;fim. {ABS}

A chamada da função é ilustrada a seguir:

Universidade Federal Fluminense

inícioreal: A,B,E;função ABS (X): real;

real: Xinício

se X ≥ 0então ABS <- X;senão ABS <- - X;

fim se;fim. {ABS}

A <- 5 ; B <- -3; E <- _10;imprima (ABS (A));imprima (ABS (-3));E <- ABS (E **3) * A + B;imprima (E);E <- ABS (ABS(A)) * ABS(A);imprima (E);

fim.

A chamada da função é, portanto, uma pseudováriavel, isto é, depois de executada a chamada, o valor calculado é retornado no nome da função, que passa a ser uma variável da expressão.

Universidade Federal Fluminense

•Funções recursivas Existem casos em que um procedimento ou função chama a si próprio. Diz-se então que o procedimento ou função é recursivo. Por exemplo, o fatorial de um número n pode ser definido recursivamente, ou seja:

n (n-1)!, se n ≥ 1n! =

1, se n=0

Podemos escrever uma função recursiva em PORTUGOL que traduz esta definição:

função FAT (N) : inteirointeiro : N;início

se N = 0 então FAT <- 1;senão FAT <- N * FAT (N -1);

fim se;fim; {FAT}O fatorial de 3 será calculado a partir da chamada à função pelo (digamos) comando:

X<- FAT(3);que retornará em FAT o valor 6.

Universidade Federal Fluminense

Exemplo 1:Escreva um algoritmo, em PORTUGOL, para um programa que calcule e imprima o valor de S, dado pela expressão a seguir:

S = n!p!(n-p)!

Os valores de n e p são fornecidos em cartões perfurados, um par de valor em cada cartão.Adote como flag um valor negativo para n.

Início {versão inicial}leia (N,P);enquanto N > 0 faça“calcular o fatorial de N”;“calcular o fatorial de P”;“calcular o fatorial de N - P”;“calcular o valor de S”;“imprimir os resultados”;leia (N,P);

fim do enquanto;

Universidade Federal Fluminense

Inícioprocedimento FATORIAL (X, FX);

inteiro: X, {valor fornecido}FX; {fatorial de X devolvido}

iníciointeiro: I ; {variável auxiliar}FX <- 1;para I de 1até X faça

FX <- FX * I;fim para;

fim; {FATORIAL};inteiro: N, P, {valores lidos de cartão}

FN, { fatorial de N}FP, { fatorial de P}FNP, { fatorial de N - P}NP, { variável auxiliar}

real: S; { valor procurado}leia (N,P);enquanto N >∅ faça

FATORIAL (N, FN);FATORIAL (P, FP);NP<- N-P;FATORIAL (NP, FNP);S<- FN/(FP * FNP);imprima (N, P, S);leia (N, P);

fim enquanto;fim.

Universidade Federal Fluminense

Exemplo 3:Indique a saída da impressa do algoritmo abaixo:Início

inteiro: X, Y;procedimento A;

inícioimprima (“passou pelo A”);

fim; {A}procedimento B (X);

inteiro: X;início

imprima (X);fim; {B}

procedimento C(Y);inteiro: Yinício

imprima (“VALOR DE Y:”, Y);Y <- 1;B(Y);

fim; {C}

função D(R,S): inteiro;inteiro: R,S;início

R<-R + S; S<- S + 1;se R > S + 10

então D<- R;senão D<- S;

fim se ;fim; [D]

X<- 15;Y<- 10;A;B(3);X<- D (X,Y); imprima (D, X, Y);C (X); C (Y + 5);

Fim.

Universidade Federal Fluminense

O resultado será:

PASSOU PELO A325, 25, 11VALOR DE Y: 251VALOR DE Y: 161

Universidade Federal Fluminense

Exercícios: 1- Escrever um procedimento para imprimir o cabeçalho:

UFF – PROGRAMAÇÃO DE COMPUTADORES IIIXX/XX/XXXX PÁG:9999

Fornecer a DATA e o número da página como parâmetros.

2- Considere a função: função M (K,L): inteiro;

inteiro: K,L;início

se K > L entãoM <- 1 fim se;se K = L então M <- 0 fim se;se K < L então M <- (-1) fim se;

fim; {M}Calcule: a- M(3,2)b- M(3,2) + M (2,3) + M (2,2)