Baixe o app para aproveitar ainda mais
Prévia do material em texto
02/06/2016 Curso Virtual Pascal Aula 26 http://www.ufpa.br/sampaio/curso_de_icc/pascal/Aula_26_Pascal.htm 1/11 Aula 26: Modularização e Subprogramas: Funções e Exercícios Objetivos: Esta aula destinase ao estudo da Modularização e Subprogramas. Funções: declaração e aplicações.Funções recursivas. Material de Referência: Livro "Introdução à Ciência da Computação", Agosto de 1999, Antonio Benedito Coimbra Sampaio; SCHMITZ, Eber Assis. TELES, Antônio Anibal de Souza. PASCAL e Técnicas de Programação Rio de Janeiro RJ .: LTC Editora, 1988. Atividades da Unidade: 1. Registrar presença 2. Seguir Roteiro Abaixo: Anterior.gif (632 Funções Exercícios 1. Funções SUBPROGRAMAS Até agora temos desenvolvido programas que englobam a lógica completa do algoritmo para a solução de um determinado problema. É comum, em programação, decompor a lógica de programas complexos em programas menores e, depois, juntálos para compor o programa final. Essa técnica de programação é denominada programação modular. A programação modular consiste num método para facilitar a construção de grandes programas, através de sua divisão em pequenas etapas, que são os módulos ou subprogramas e para possibilitar o reaproveitamento de código, já que podemos utilizar um módulo quantas vezes for necessário, eliminando assim a necessidade de escrever o mesmo código do programa em situações repetitivas. Outra importância da modularização é que ela permite que diferentes programadores trabalhem simultaneamente na solução de um mesmo problema, através da codificação separada dos diferentes módulos. A modularização, em Pascal, pode ser feita através de procedimentos (procedures) e funções (functions). Isso é feito associandose um nome a uma seqüência de comandos através do que chamamos Declaração do Procedimento ou da Função. Podese, então, usar o nome do procedimento ou da função dentro do corpo do programa, sempre que desejarmos que o seu bloco de comandos seja executado, isso é o que chamamos de Chamada do Procedimento ou da Função. Funções A estrutura de uma função (function) é muito parecida com um procedimento. Podese imaginar que uma função é um procedimento com características especiais quanto ao retorno de valores.A principal diferença é que o identificador de uma função assume o valor de retorno da função. Uma função deve sempre retornar um valor e em Turbo Pascal, este valor é retornado no nome da função. No Turbo Pascal, uma função pode ser tão bem elaborada quanto um programa qualquer. Uma característica que distingue uma função de um procedimento é que a função pode ser impressa, atribuida ou participar de cálculos como se fosse uma variável qualquer. Declaração de funções 02/06/2016 Curso Virtual Pascal Aula 26 http://www.ufpa.br/sampaio/curso_de_icc/pascal/Aula_26_Pascal.htm 2/11 A declaração de uma função é muito parecida com de uma procedure que por sua vez é parecida com a de um programa, vejamos: Function Nome_da_função(parâmetros) : Tipo_da_função; < área de declarações > Begin corpo da função End; A formação do nome da função deve seguir as mesmas regras para formação de identificadores em Turbo Pascal. Dentro dos parênteses devemos declarar os parâmetros e seus respectivos tipos dos quais a função depende. O tipo de valor retornado pela função também deve ser declarado. Na área de declarações, podemos declarar labels, constantes, variáveis e até mesmo Procedures e Functions. Devemos lembrar que tais elementos só poderão ser utilizados dentro do corpo da função, pois são locais a ela. Abaixo, temos o exemplo de uma função. program Prog; var A,B,C: real; function PROD(X,Y : real) : real; begin PROD := X * Y; end; {* PROGRAMA PRINCIPAL *} begin A := 2; B := 110; C := PROD(A,B); write (C); end. OBS.: O resultado impresso será 20. Na declaração da função, além do que está dentro dos parênteses, há mais uma definição, indicando que a função é do tipo real, ou seja, retorna ao local onde foi chamada, assumindo a condição de uma variável real. Neste caso, a função só assume valores coerentes com essa declaração. Como uma função pode ser impressa, atribuida ou participar de cálculos como uma variável qualquer, isto nos permite, em vez de utilizar a variável C, imprimir diretamente a função da seguinte maneira: WRITELN (PROD(A,B)); E teremos o mesmo resultado. Outro exemplo: Vejamos uma função que soma dois números inteiros digitados via teclado: Program Prog; var x,y;integer; function SOMA(A,B : integer) : integer; 02/06/2016 Curso Virtual Pascal Aula 26 http://www.ufpa.br/sampaio/curso_de_icc/pascal/Aula_26_Pascal.htm 3/11 begin SOMA := A + B; end; {* PROGRAMA PRINCIPAL *} begin readIn (X); readIn (Y); writeIn (SOMA (X,Y)); end. OBS.: Na declaração da função podemos acrescentar a cláusula VAR e obter os mesmos recursos adicionais do procedimento feito desta forma. program Prog; var A,B,C: real; function PROD(X : real; var Y : real) : real; begin PROD := X * Y; X := 1; Y := 1 end; {* PROGRAMA PRINCIPAL *} begin A := 2; B := lo; writeln (PROD (A,B)); end. Após a chamada da função, as variáveis X e Y terminam valendo 1. Mas na declaração da função somente a variável Y recebe VAR. Isto implica que o valor final de Y é passado de volta ao local onde foi solicitada a função, fazendo com que B passe a tomarse 1 em vez do valor original l0 Isto tudo não ocorreu com a variável A, que continua valendo 2 tal como antes. No caso de uma função ser do tipo STRING, devese definir primeiro o tipo de dado e depois colocar o nome deste tipo na declaração da função. Type STR1O : string[10]; function EXEMPLO( ) : STR1O; Exemplos: Program Exemplo_1; Uses CRT; 02/06/2016 Curso Virtual Pascal Aula 26 http://www.ufpa.br/sampaio/curso_de_icc/pascal/Aula_26_Pascal.htm 4/11 Var x,y : Real; (* variáveis globais *) Function Soma(a,b:real):real; (* Soma é uma função que depende de dois parâmetros reais e devolve um valor real *) Begin Soma:=a+b; (* reparem que o valor da funçåo é retornado p. seu nome *) End; Begin ClrScr; x:=Soma(4,5); y:=Soma(3,6)Soma(45.5,5.6); Writeln(x:10:2,y:10:2); Writeln; Write('Valor de x > '); Readln(x); Write('Valor de y > '); Readln(y); Writeln; Writeln(Soma(x,y):10:2); End. Program Fat; Uses CRT; {Programa para calcular o fatorial de um número lido do teclado, usando o conceito de Function} Label inicio,fim; Var n : Integer; tecla : char; Function Fatorial(numero:integer) : Real; Var i : Integer; Fat : Real; Begin (* da função Fatorial *) Fat:=1; If numero>1 Then Begin i:=1; Repeat i:=i+1; 02/06/2016 Curso Virtual Pascal Aula 26 http://www.ufpa.br/sampaio/curso_de_icc/pascal/Aula_26_Pascal.htm 5/11 Fat:=Fat*i; Until i=numero; End; Fatorial:=Fat; End; (* da função fatorial *) Begin (* do programa *) ClrScr; inicio: Write('Valor de n (menor que 0 = fim) > '); Readln(n); Writeln; If n<0 Then Begin Write('Não existe fatorial de numeros negativos'); Goto fim; End Else Writeln('Fatorial de n = ',fatorial(n):10:0); Writeln; Goto inicio; Fim: End. (* do programa*) Program Fibonacci; Uses CRT; {Programa para determinar um determinado elemento da seqüência de Fibonacci. A seqüência de Fibonacci é definida como Fib(0) = 0 Fib(1) = 1 Fib(n) = Fib(n1) + Fib(n2)} {Como podemos ver, o elemento atual é determinado pela soma dos dois elementos anteriores} Label inicio; Var numero:integer; tecla : char; Function Fib(n:integer):integer; Var a1,a2,i,pe : Integer; Begin if n=0 02/06/2016 Curso Virtual Pascal Aula 26 http://www.ufpa.br/sampaio/curso_de_icc/pascal/Aula_26_Pascal.htm 6/11 Then Fib:=0 Else If n=1 Then Fib:=1 Else Begin a1:=0; a2:=1; i:=1; Repeat pe:=a1+a2; i:=i+1; a1:=a2; a2:=pe; Until i=n; Fib:=a2; End; End; Begin ClrScr; inicio: Write('Fib('); Read(numero); Writeln(') = ',fib(numero)); Writeln; Write('Deseja continuar ? > '); Readln(tecla); writeln; writeln; If tecla='s' Then goto inicio; End. Recursividade Recursão é um método geral para resolver problemas reduzindoos a problemas mais simples do mesmo tipo. A estrutura geral de uma solução recursiva de um problema é assim : Resolva de forma recursiva um problema Se o problema é trivial, faça o obvio (resolvao) Simplifique o probelma Resolva de forma recursiva (um problema mais simples) Combine (na medida do possível) a solução do(os) problemas mais simples em uma solução do problema original Um subprograma recursivo chama a si próprio constantemente, cada vez em uma situação mais simples, até 02/06/2016 Curso Virtual Pascal Aula 26 http://www.ufpa.br/sampaio/curso_de_icc/pascal/Aula_26_Pascal.htm 7/11 chegar ao caso trivial, quando pára. Exemplos : a. Somatório de inteiros Se n =1; Somatório = 1. Caso contrário Somatório = n + Somatório(n1) b. Fatorial Se n=0 ou n=1 ; Fatorial = 1. Caso contrário Fatorial = n*Fatorial(n1) c. MDC Se b divide a, então o MDC é b. Caso contrário, MDC(a,b) = MDC(b,a mod b) d. Nésimo termo da série de Finonacci . 1° e 2° = 1 e nésimo = (n1)+(n2) A linguagem Pascal e o Turbo Pascal permitem a utilização de funções recursivas. Uma função é dita recursiva quando ela chama a si mesma. Devemos tomar cuidado ao lidar com esse tipo de função, pois podemos criar loops infinitos. Existem pessoas que têm facilidade para pensar recursivamente e outras não. A recursividade permite criar funções elegantes e torna os programas mais fáceis de serem entendidos. Abaixo, temos os mesmos programas anteriores, só que utilizando o conceito de recursividade. Exemplos: Program Fatorial; Uses CRT; Label inicio,fim; Var n : Integer; tecla : char; Function Fat(n:integer):real; Begin if n=0 Then Fat:=1 Else Fat:=n*Fat(n1); (* repare que estamos chamando novamente a funçåo Fat *) End; Begin ClrScr; inicio: Write('Valor de n (menor que 0 = fim) > '); Readln(n); Writeln; If n<0 Then Begin Write('Não existe fatorial de números negativos'); Goto fim; End Else Writeln('Fatorial de n = ',fat(n):10:0); Writeln; Goto inicio; Fim: 02/06/2016 Curso Virtual Pascal Aula 26 http://www.ufpa.br/sampaio/curso_de_icc/pascal/Aula_26_Pascal.htm 8/11 End. Program Fibonacci; Uses CRT; Label inicio; Var numero:integer; tecla : char; Function Fib(n:integer):integer; Begin If n=0 Then Fib:=0 Else If n=1 Then Fib:=1 Else Fib:=Fib(n1)+fib(n2); End; Begin ClrScr; inicio: Write('Fib('); Read(numero); Writeln(') = ',fib(numero)); Writeln; Write('Deseja continuar ? > '); Readln(tecla); writeln; writeln; If tecla='s' Then goto inicio; End. 2. Exercícios Construa "Functions" para : a) Calcular N! b) Calcular AB c) Calcular: 02/06/2016 Curso Virtual Pascal Aula 26 http://www.ufpa.br/sampaio/curso_de_icc/pascal/Aula_26_Pascal.htm 9/11 d) Calcular: f) Retornar TRUE caso um número seja par, FALSE caso contrário g) Retornar TRUE caso um número seja ímpar, FALSE caso contrário 2. Faça uma FUNCTION que codifique uma mensagem, da seguinte forma: A por Z B por Y C por X .. X por C Y por B Z por A Obs.: a Rotina deverá fazer o mesmo para letras minúsculas. 3. Faça uma FUNCTION para transformar as letras de uma STRING de minúsculas para maiúsculas 4. Faça uma FUNCTION para transformar as letras de uma STRING de maiúsculas para minúsculas 5. Dado um vetor com n elementos numéricos, faça uma FUNCTION que verifique se um dado valor existe neste vetor 6. Faça uma FUNCTION para acrescentar N espaços em branco a esquerda de uma STRING qualquer 7. Faça uma FUNCTION para acrescentar N espaços em branco a direita de uma STRING qualquer 8. Dado uma STRING qualquer e um valor N , faça uma FUNCTION para gerar uma nova STRING que tenha este tamanho N . Caso a STRING original possua um tamanho menor que o valor N informado, deverão ser acrescentados espaços em branco a esquerda da STRING, até que o tamanho N seja alcançado. 9. Dado uma STRING qualquer e um valor N , faça uma FUNCTION para gerar uma nova STRING que tenha este tamanho N. Caso a STRING original possua um tamanho menor que o valor N informado, deverão ser acrescentados espaços em branco a direita da STRING, até que o tamanho N seja alcançado. Recursividade Explique qual será o resultado e o funcionamento dos seguintes programas: a) PROGRAM Teste; FUNCTION XXX(A : WORD) : WORD; BEGIN IF a = 0 THEN BEGIN XXX : = 1; 02/06/2016 Curso Virtual Pascal Aula 26 http://www.ufpa.br/sampaio/curso_de_icc/pascal/Aula_26_Pascal.htm 10/11 ELSE XXX : =A * XXX(A 1); END; END; BEGIN WRITE(XXX(5)); END. b) PROGRAM Teste; PROCEDURE Recursão(a : BYTE); BEGIN a : = a 1; IF a > 0 THEN BEGIN Recursão(a); END; WRITE(a); END; BEGIN Recursão(5); END. c) PROGRAM Teste; PROCEDURE Recursão(VAR a: BYTE); BEGIN a : = a 1; IF a > 0 THEN BEGIN Recursão(a); END; WRITE(a); END; BEGIN Recursão(5); END 02/06/2016 Curso Virtual Pascal Aula 26 http://www.ufpa.br/sampaio/curso_de_icc/pascal/Aula_26_Pascal.htm 11/11 Anterior.gif (632
Compartilhar