Um procedimento é uma junção de instruções que, associadas, produzem
uma tarefa, e que, estando agrupadas sob uma denominação, estão
sujeitas a serem usadas por outras sob essa denominação. Um exemplo:
» meumin := proc(x : Type::Real, y : Type::Real)
begin
if x < y then
return(x);
end_if;
y;
end_proc:
Em certos casos, é necessário a utilização de outras variáveis apenas a ser utililizadas no procedimento. Neste caso, é usado o comando local antes de begin. A instrução return devolve o valor obtido no procedimento.
Eis a sintaxe:
»proc(
x1 <= default1> <: type1>,
x2 <= default2> <: type2>, ...
) <: returntype>
<name pname;>
<option option1, option2, ...;>
<local local1, local2, ...;>
<save global1, global2, ...;>
begin
body
end_proc
Tendo criado um conjunto relevante de procedimentos, torna-se imperioso a existência de uma ferramenta que permita ler os procedimentos em sessões futuras. Ou seja, é provavelmente uma boa ideia criar ficheiros com procedimentos que executem certas tarefas para depois, numa sessão de trabalho, esse procedimento ser invocado de uma forma expedita sem que tenha que ser de novo introduzido pelo utilizador. No caso do procedimento meumax apresentado atrás, o autor destas linhas procedeu da forma seguinte:
Apresentamos, de seguida, dois conjuntos de procedimentos que implementam os códigos ISBN e EAN-13.
COMO INSTALAR
Copie, para uma directoria, os ficheiros
verISBN.txt
menu.txt
testaisbn.txt
constroiisbn.txt
No MUPAD, indique o caminho para essa directoria, usando
READPATH:="directoria"
Por exemplo, estando os ficheiros em
d:\users\pedro\My Documents usou-se \begin{verbatim}READPATH:="d:\\users\\pedro\\My Documents"
Ainda no MuPAD, faça
read("verISBN.txt")
Optimizado para Mupad, em linux, num terminal. Testado no XMUPAD pro em linux e no MuPADlight, em Windows.
verISBN.txt
/* ************************************* */ /* verISBN v0.01 beta1 */ /*****************************************/ /* copyleft, pedro patricio, 2006 */ /*****************************************/ read("menu.txt"):
menu.txt
/* ************************************* */ /* M E N U das opcoes */ /*****************************************/ prima:=0: read("testaisbn.txt"): read("constroiisbn.txt"): repeat input("Prima 1 para testar o ISBN-10; 2 para calcular o digito de controlo; 3 sair " , prima): if prima=1 then input("Indique o ISBN da forma [a,b,c,...] ",isbn): testaisbn(isbn) end_if: if prima=2 then input("Indique o ISBN da forma [a,b,c,...] ",isbn): constroiisbn(isbn) end_if /*menu das opcoes */ until prima=3 end_repeat:
Seguem-se os procedimentos propriamente ditos.
constroiisbn.txt
/* ************************************* */ /* Procedim que constroi o dig controlo*/ /*****************************************/ constroiisbn:=proc(isbn) local i, teste, checksum; begin isbnArray:=array(1..9,isbn); teste:=0; for i from 9 downto 1 do teste:=teste+(11-i)*isbnArray[i] end_for: checksum:=-teste mod 11: /* checksum e' o digito de controlo */ if checksum=10 then /* caso em que o caracter e' X=10 */ print("O digito de controlo e' X") else print(" O digito de controlo e' ",checksum): end_if: end_proc:
testaisbn.txt
/* ************************************* */ /* Procedimento que testa o ISBN-10 */ /*****************************************/ testaisbn:=proc(isbn) local i, isbnArray, teste; begin isbnArray:=array(1..10,isbn); /* criar o array com o isbn */ if (isbnArray[10]=X or isbnArray[10]=x) then isbnArray[10]:=10 end_if: /* o caso em que o controlo e' X=10 */ teste:=0; for i from 10 downto 1 do teste:=teste+(11-i)*isbnArray[i] end_for: if (teste mod 11 = 0) then print("O ISBN esta' correcto") else print(" O ISBN esta' incorrecto"): end_if: end_proc:
Aqui esta' um exemplo de um conjunto de procedimentos que testam e controem o digito de controlo de um codigo EAN-13
verEAN v0.01 beta1
COMO INSTALAR
Copie, para uma directoria, os ficheiros
verEAN.txt
menu.txt
testaean.txt
constroiean.txt
No MUPAD, indique o caminho para essa directoria, usando
READPATH:="directoria"
::LINUX::
Por exemplo, estando os ficheiros em
/home/pedro/Desktopusou-se READPATH:="/home/pedro/Desktopbegintex2html_deferred
::WINDOWS:: Por exemplo, estando os ficheiros em
d:\users\pedro\My Documentsusou-se
READPATH:="d:\\users\\pedro\\My Documents"
Ainda no MuPAD, faça
read("verEAN.txt")
Optimizado para Mupad, em linux, num terminal. Testado no XMUPAD pro em linux, e no MUPAD-light em windows.
verEAN.txt
/* ************************************* */ /* verEAN v0.01 beta1 */ /*****************************************/ /* copyleft, pedro patricio, 2006 */ /*****************************************/ read("menu.txt"):
menu.txt
/* ************************************* */ /* M E N U das opcoes */ /*****************************************/ prima:=0: read("testaean.txt"): read("constroiean.txt"): /* leitura dos sub-procedimentos */ repeat input("Prima 1 para testar o EAN-13; 2 para calcular o digito de controlo; 3 sair :" , prima): if prima=1 then input("Indique o EAN da forma [a,b,c,...] ",ean): /*entrada do ean pelo utilizador */ testaean(ean) end_if: if prima=2 then input("Indique o EAN da forma [a,b,c,...] ",ean): /*entrada do ean pelo utilizador */ constroiean(ean) end_if /*menu das opcoes */ until prima=3 end_repeat:
constroiean.txt
/* ************************************* */ /* Procedim que constroi o dig controlo*/ /*****************************************/ constroiean:=proc(ean) local i, isbn, testePAR, testeIM, checksum, eanArray; begin eanArray:=array(1..12,ean); testeIM:=0; for i from 1 to 6 do testeIM:=testeIM+eanArray[2*i-1] end_for: testePAR:=0; for i from 1 to 6 do testePAR:=testePAR+3*eanArray[2*i] end_for: checksum:=-(testeIM+testePAR) mod 10: print(" O digito de controlo e' ",checksum): end_proc:
testaean.txt
/* ************************************* */ /* Procedimento que testa o EAN-13 */ /*****************************************/ testaean:=proc(ean) local i, testeIM, testePAR, teste, eanArray; begin eanArray:=array(1..13,ean); /* criar o array com o ean */ testeIM:=0; for i from 1 to 7 do testeIM:=testeIM+eanArray[2*i-1] end_for: testePAR:=0; for i from 1 to 6 do testePAR:=testePAR+3*eanArray[2*i] end_for: teste:=testeIM+testePAR: if (teste mod 10 = 0) then print("O EAN esta' correcto") else print(" O EAN esta' incorrecto"): end_if: end_proc:
Como exercício, construa um procedimento
Para tal, use a instrução mod que a um par de naturais faz corresponder o resto da divisão inteira do primeiro pelo segundo.
Caso ache conveniente, pode dividir o problema em dois, em que um consiste em transformar a escrita decimal de um natural na sua representação binária, e o outro constrói a matriz.