Universidade Federal de São Carlos Departamento de Computação “Introdução a Computação” Capítulo III Modularização Procedimentos e Funções Aluna: Mestrado em Ciência da Computação Sistemas Distribuídos e Redes Luanna Lopes Lobato [email protected] Professor: Sérgio Donizetti Zorzo São Carlos – Maio 2006 Introdução • Evolução do Software – Problemas mais complexos; – Aumento do código; – Replicação de código; – Difícil acompanhar os trechos dos programas. • Utiliza-se Funções ou Procedimentos • Trechos devem ser coerentes – Cada um deve ter uma função ou tarefa definida. Procedimentos: • Procedimentos são rotinas chamadas pelo programa principal para executar alguma operação específica; • Forma Geral: procedure nomeProc (lista_de_parametros) Declaração Variáveis {Área de Declarações} begin Comandos {Corpo do Procedimento} end; Exemplo de atribuição procedure nomeProc (lista_de_parametros) Declaração Variáveis {Área de Declarações} begin Comandos {Corpo do Procedimento} end; • É possível definir constantes, tipos, declarar variáveis, funções e outros procedimentos, da mesma forma como declarados no programa principal. • São válidos apenas no escopo do procedimento. Procedimentos • Para chamar o procedimento, basta utilizar seu nome no programa principal; A execução é desviada do programa principal até o procedimento, para que este seja executado e depois retorna na linha do programa principal abaixo do linha da chamada do procedimento; Procedimentos Program exemplo; var i: integer; ... {Declaração de variáveis} procedure exemplo(i:integer); begin ... {corpo do procedimento} end; begin ... {corpo do programa} exemplo(i) {chama procedimento} ... {corpo do programa} end. Procedimentos - Exemplo 1 • Informar dados do aluno (nome, idade); • Calcula a média das notas; • Imprime os dados do aluno e média. • Implementar a parte de imprimir como procedimento. Procedimentos - Exemplo 1 Program dados_aluno; type tipoaluno = record nome: string; idade: integer; notas: array[1..5] of real; end; var aluno : tipoaluno; media,soma : real; i : integer; procedure imprime_dados(aluno:tipoaluno; media: real); begin writeln(aluno.nome); writeln (aluno.idade); writeln (media:4:3); end; {... continuação} begin readln(aluno.nome); readln(aluno.idade); for i:=1 to 5 do begin readln (aluno.notas[i]); end; soma:=0; for i:=1 to 5 do begin soma:=soma+aluno.notas[i]; end; media:=soma/5; imprime_dados(aluno,media); end. Exercício 1: • Utilizar o programa anterior e criar uma rotina de Calcular a média. Resolução - Exercício 1 Program dados_aluno; type tipoaluno = record nome: string; idade: integer; notas: array[1..5] of real; end; var aluno : tipoaluno; i : integer; media : real; {... continuação} procedure imprimirdados(aluno:tipoaluno; media:real); begin writeln(aluno.nome); writeln (aluno.idade); writeln (media:4:3); end; {... continuação} procedure calcularmedia(aluno: tipoaluno); var media, soma: real; i: integer; begin soma:=0; for i:=1 to 5 do begin soma:=soma + aluno.notas[i]; end; media:=soma/5; imprimirdados(aluno,media); end; {... continuação} {corpo do programa principal} begin writeln (‘Digite o nome do aluno’); readln(aluno.nome); writeln (‘Digite a idade do aluno’); readln(aluno.idade); writeln (‘Digite as 5 notas do aluno’); for i:=1 to 5 do begin readln (aluno.notas[i]); end; calcularmedia(aluno); end. Observações • Se você for chamar um modulo (procedimento ou funcao), lembre-se que este modulo deve ter sido declarado previamente. Procedure a () begin ... end; Procedure b () begin a(); //a dever ter sido declarado primeiro end; Programa Principal .... b(); ... Funções: • Uma Função é parecida com os Procedimentos, tem praticamente a mesma estrutura; • Retorna um valor; • Forma Geral: function nomeFunc (lista_de_parametros): tipo de dado a ser retornado Declaração Variáveis {Área de Declarações} begin Comandos {Corpo da Função} end; Exemplo de atribuição function nomeFunc (lista_de_parametros): tipo Declaração Variáveis {Área de Declarações} begin Comandos {Corpo da Função} nomeFunc:= x; end; O nome da variável que vai retornar tem que ser igual ao nome da função. Funções Program exemplo; var i: integer; ... {Declaração de variáveis} function exemplo(i:integer): integer; begin ... {corpo da função} end; begin ... {corpo do programa} exemplo(i) {chama função} ... {corpo do programa} end. Funções - Exemplo 2 • • • • Informar dois números; Definir maior número; Retornar o valor do maior número; Imprimir o resultado no Programa Principal. • Implementar a parte de verificar maior número através de Função. Procedimentos - Exemplo 1 Program calc_max; var max, a, b: integer; function maximo(a,b:integer): integer; begin if(a>b) then maximo := a else maximo := b; end; ... continuação begin writeln(‘Digite dois números’); readln(a, b); max := maximo(a,b); writeln(‘O valor maximo é ', max) end. As 2 últimas linhas dentro do bloco poderia ser: writeln(‘O valor maximo é ', maximo(a,b)); Exercício 2: • Utilizar o programa anterior e criar uma rotina de Calcular a Fatorial. • Ler um nro inteiro; • Chamar uma função e passar esse nro. Resolução - Exercício 2 Program Fatorial; function fat(n:integer): integer; {Início da Função} var F,i:integer; begin F:=1; for i:=2 to n do F:=F*i; fat:=F; end; {Fim da função} {Programa Principal} var n:integer begin writeln(‘Entre com o número: ‘); readln(n); writeln(‘O fatorial de ‘,n,’ é: ‘,fat(n)); end. Passagem por Valor e por Referência • Passagem por Valor: apenas o valor da variável é passado; • Passagem por Referência: A variável é passada. – Utiliza-se o Var antes do parâmetro. Exemplo ... continuação Função Passagem por Valor Program dadosaluno; var nome: string; procedure mostranome(parametro:string); begin writeln('*********************************'); writeln(' Valor original', parametro); parametro:= 'Luanna'; writeln(' Valor modificado' ,parametro); end; {corpo do Programa Principal} begin nome := 'Zorzo'; mostranome(nome); writeln('Valor no programa' , nome); readln; end. Passagem por Referência Program dadosaluno; var nome: string; procedure mostranome(var parametro:string); begin writeln('*********************************'); writeln(' Valor original', parametro); parametro:= 'Luanna'; writeln(' Valor modificado' ,parametro); end; {corpo do Programa Principal} begin nome := 'Zorzo'; mostranome(nome); writeln('Valor no programa' , nome); readln; end.