Subprogramas : Procedimentos (procedures) em Pascal Prof. Luis Otavio Alvares Funções/procedimentos • Funções • devolvem 1 valor • o valor calculado é usado diretamente pelo programa • Procedimentos • podem devolver zero, um ou mais valores • valores são passados como parâmetros Procedures sem parâmetros Exemplo Program teste; Procedure asteriscos; Var I:integer; Begin writeln; for I:=1 to 80 do write(’*’); Writeln; End; {programa principal} ... Asteriscos; {chamada da procedure} ... Asteriscos; {chamada da procedure} ... Procedures com parâmetros • Há duas formas de passagem de parâmetros nas procedures em Pascal: • Por valor e por referência • Na passagem por valor, como o próprio nome indica, somente o valor é passado (é usado para os parâmetros de entrada da procedure). Análogo aos parâmetros de funções. • Na passagem por referência, o valor do parâmetro pode ser alterado e vai ser percebido pelo programa que chamou a procedure (é usado para os parâmetros de saída da procedure) Exemplo Program ExcomFatorial; Procedure Fat(A:integer ; Var X:real); Var I: integer; begin X:= 1; for I:=1 to A do X:= X * I; end; {programa principal} var Valor : integer; f : real; begin write('digite um numero inteiro: '); readln(Valor); If ( Valor >= 1 ) then begin Fat(Valor, f); writeln('Fatorial de ',Valor,' = ',f:5:0); end; readln; end. Procedures - Pascal 6 Declaração Procedure <identificador> [( <lista de parâmetros formais> ) ] ; [ <declaração de variáveis locais>; ] begin < comandos separados por ‘;’ > end; Lista de parâmetros formais opcionais [ var ] < lista de identificadores > : <tipo>; ... Indica passagem de parâmetro por referência- opcional Ex: Procedure Teste ( A, B: integer; var C: real ); begin C := A / B; end; Exemplo com dois parâmetros de saída • Fazer uma procedure que receba como parâmetro o nome de um vetor e forneça como saída o maior elemento do vetor e a sua posição. program exemploProcedure; type tipoVetor = array[1..10] of integer; procedure maiorElemento(V:tipoVetor; var maior,posicao:integer); var I:integer; begin maior:=V[1]; posicao:= 1; for I:= 1 to 10 do if V[I] > maior then begin maior:=V[I]; posicao:=I; end; end; var vet:tipoVetor; I,M,P:integer; begin writeln('informe os 10 valores do vetor: '); for I:=1 to 10 do readln(vet[I]); maiorElemento(vet,M,P); writeln('o maior elemento do vetor eh: ',M,' na posicao ',P); readln; end. 9 Relembrando... Procedure Muda; var X : integer; begin X := 1 end; { Muda } 10 var X : integer; {programa principal } begin X := 0; Variável local Muda; Não muda valor da write ( X ); variável do progr. end. principal Procedure Muda (var X: integer); begin X := 1 end; { Muda } ar X : integer; {programa principal } begin X := 0; Parâmetro por referência Muda (X); write ( X ); Muda valor da variável do progr. principal end. Procedure Muda (X : integer); begin X := 1 end; { Muda } var X : integer; {programa principal } begin X := 0; Parâmetro por valor Muda (X); Não muda valor da variável write ( X ); do progr. principal end. var X : integer; Procedure Muda; begin X := 1 end; { Muda } begin {programa principal } X := 0; Muda; write ( X ); Variável global end. Muda valor da variável Exercício • Faça uma procedure que receba como parâmetro de entrada uma matriz 5x5 e forneça como saída o maior e o menor elemento da matriz. program procedureMatriz; type tipoMatriz = array[1..5,1..5] of integer; procedure maiorMenor(M:tipoMatriz; var maior,menor:integer); var I,K:integer; begin maior:=M[1,1]; menor:=M[1,1]; for I:= 1 to 5 do for K:=1 to 5 do begin if M[I,K] > maior then maior:=M[I,K]; if M[I,K] < menor then menor:=M[I,K]; end; end; var Mat:tipoMatriz; L,C,M,Menor:integer; begin for L:= 1 to 5 do begin writeln('informe os valores da linha ',L); for C:=1 to 5 do readln(Mat[L,C]); end; maiorMenor(Mat,M,Menor); writeln('o maior elemento da matriz eh: ',M); writeln('o menor elemento da matriz eh: ',Menor); readln; end. Units • Units em Pascal são bibliotecas de funções e procedures. Algumas já vem com o compilador, como a unit CRT, que tem funções para a saída em vídeo. • As funções e procedures definidas pelo usuário podem ser salvas em uma unit e desta forma utilizadas em qualquer programa. Exemplo de definição de unit unit minhaUnit; interface Function Fat(X:integer): real; function Pot(base:real;exp:integer):real; implementation Function Fat(X:integer): real; var I:integer; begin fat:=1; for I:= 1 to X do Fat:=Fat*I; End; function Pot(base:real;exp:integer):real; var I:integer; begin Pot:=1; for I:=1 to exp do Pot:=Pot*base; end; end. Exemplo de uso de unit {calcula o cosseno de um angulo do 1. quadrante dado em radianos} uses minhaUnit; {é uma declaração} function cos1quad(A:real):real; var I,sinal:integer; cos:real; begin cos:=1; sinal:=-1; I:=2; while I<= 60 {30 termos da serie} do begin cos:=cos+sinal*(Pot(A,I)/fat(I)); sinal:=sinal*-1; I:=I+2; end; cos1quad:=cos; end; {--- programa principal ---} var angulo: real; begin write(‘informe o angulo do 1. quadrante em radianos’); readln(angulo); writeln('o cosseno de ',angulo,' eh aproximadamente ', cos1quad(angulo):1:6); readln; end.