Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 1 Universidade Federal de Ouro Preto -‐ UFOP Departamento de Computação -‐ DECOM Programação de Computadores I – BCC701 www.decom.ufop.br/moodle } Modularização do código: ◦ Divisão do problema em subproblemas ◦ Encapsulamento de detalhes de implementação } Maior legibilidade do código } Maior facilidade de depuração do código } Reaproveitamento de código } Desenvolvimento de programas top-down DCC001 2013-1 2 2 } Já usamos muitas funções pré-definidas ◦ modulo(x,y) ◦ abs(x) ◦ plot2d(X,Y) ◦ gsort... } E agora sabemos como definir novas funções!!!! 3 DCC001 2013-1 4 3 } Defina uma função combinações que receba como parâmetros 2 inteiros n e k e retorne o número de combinações de n objetos em grupos de k objetos, dado pela fórmula 5 DCC001 2013-1 Para reaproveitar o código devemos adaptá-lo para o cálculo dos fatoriais de n, n-k e k fat = 1; for i = 1:n fat = fat*i; end 6 DCC001 2013-1 4 7 DCC001 2013-1 n=input("n="); k=input("k="); fat_n = 1; // Cálculo do fatorial de n for i = 1:n fat_n = fat_n * i; end fat_n_k = 1; // Cálculo do fatorial de n-k for i = 1:(n-k) fat_n_k = fat_n_k * i; end fat_k = 1; // Cálculo do fatorial de k for i = 1:k fat_k = fat_k * i; end nComb = fat_n/(fat_n_k * fat_k) nComb = fatorial(n)/(fatorial(n-k) * fatorial(k)) function fat = fatorial(n) fat = 1; for i = 1:n fat = fat*i; end endfunction Função combinacoes Função Fatorial Uso do Módulo Detalhes do Módulo 8 DCC001 2013-1 5 DCC001 2013-1 9 function fat = fatorial(n) fat = 1; for i = 1:n fat = fat*i; end endfunction 10 DCC001 2013-1 6 function fat = fatorial(n) fat = 1; for i = 1:n fat = fat*i; end endfunction Parâmetro de Saída É calculado pela função Parâmetro de Entrada É fornecido na chamada da função 11 DCC001 2013-1 function [r1, r2] = eq2g(a,b,c) delta = b^2 - 4*a*c r1 = (-b + sqrt(delta))/(2*a) r2 = (-b - sqrt(delta))/(2*a) endfunction [raiz1,raiz2] = eq2g(x,y,z) Chamada da função eq2g 12 DCC001 2013-1 7 } Valores dos argumentos de entrada (que podem ser expressões) são copiados sobre os parâmetros da função } O controle é transferido para a função, que opera sobre os valores dos parâmetros } Os parâmetros da função somente têm existência como variáveis durante a execução da função 13 DCC001 2013-1 } Alterações feitas pela função sobre os valores dos parâmetros formais não afetam os argumentos passados para a função } Variáveis utilizadas pela função não têm nada a ver com variáveis de mesmo nome existentes no programa que chama a função; } Estas variáveis locais ganham existência somente durante a execução da função 14 DCC001 2013-1 8 } Os valores dos parâmetros de saída da função são retornados para a expressão em que a função foi chamada } O controle de execução do programa é devolvido para o ponto de chamada 15 DCC001 2013-1 DCC001 2013-1 16 //Combinações de n k a k exec("fatorial.sci"); n = input("n = "); k = input("k = "); printf("\nAntes da chamada de fatorial(n)"); pause; fat_n = fatorial(n); printf("\nAntes da chamada de fatorial(k)"); pause; fat_k = fatorial(k); printf("\nAntes da chamada de fatorial(n-k)"); pause fat_n_k = fatorial(n-k); Comb_n_k = fat_n/(fat_k * fat_n_k); printf("Comb(%d,%d) = %d",n,k,Comb_n_k) 9 DCC001 2013-1 17 function fat = fatorial(v) printf("\nIniciando fatorial(%d)",v); pause; fat = 1; for i = 1:v fat = fat*i end printf("\nTerminando fatorial(%d)",v); pause; endfunction DCC001 2013-1 18 10 function nComb = Combinacoes(n,k) nComb = fatorial(n)/... (fatorial(n-k) * fatorial(k)) endfunction exec("Combinacoes.sci") exec("fatorial.sci") n=input("n="); k=input("k="); printf("nComb(%d,%d) = %d",n,k,Combinacoes(n,k)) Nosso programa transformado em função Programa principal 19 DCC001 2013-1 DCC001 2013-1 20 Programa Principal Função nComb Função Fatorial 11 } Parâmetros de entrada e de saída de uma função podem ser qualquer coisa: ◦ números, ◦ strings, ◦ booleanos, ◦ matrizes de qualquer tipo, ◦ e até mesmo outra função! function plotaPontos(f,x) y = f(x); plot2d(x,y); endfunction 21 DCC001 2013-1 DCC001 2013-1 22 function y = minhaFunc(x) y = exp(- x .^ 2); endfunction // Testador PlotaPontos exec(“plotaPontos.sci"); exec(“minhaFunc.sci"); x = 0:0.1:2*%pi; plotaPontos(sin,x); plotaPontos(minhaFunc,x); 12 DCC001 2013-1 23 } Uma função é normalmente escrita em um arquivo separado do arquivo com o programa principal } O arquivo com a função deve ter ◦ o mesmo nome da função ◦ a extensão .sci (um programa tem a extensão .sce) } Para “incorporar” uma função ao Scilab, use exec(<nome do arquivo com a função>) no programa cliente 24 DCC001 2013-1 13 25 DCC001 2013-1 } O Scilab só toma conhecimento da existência de uma função através do comando exec } O arquivo com a função deve estar no mesmo diretório do programa que chama a função exec("fatorial.sci") n=input("n="); k=input("k="); nComb = fatorial(n)/... fatorial(n-k)*fatorial(k) 26 DCC001 2013-1 14 DCC001 2013-1 27 } Técnica: chamada da função antes de seu desenvolvimento } O programador deve especificar o resultado desejado da função, postergando o trabalho de determinar como obter este resultado DCC001 2013-1 28 15 } Sabendo que o conjunto de números primos é infinito, ◦ Construir um programa que lê uma série de números e, para cada número lido, encontra o menor primo que seja maior ou igual a ele ◦ Se, por exemplo, o número lido for 4, o programa deve encontrar o número primo 5; se for 11, o programa deve encontrar o próprio 11. ◦ O programa deve terminar quando o número lido for menor ou igual a 1 29 DCC001 2013-1 } Programa principal ◦ Cuida da interação com o usuário ◦ O problema de encontrar o menor primo ≥ n é “empurrado” para uma função n = input("n = "); while n >= 2 // Encontra o menor primo >= n // e imprime o resultado printf("O menor primo >= %d é %d",... n,menorPrimoMaiorOuIgual(n)) // Lê n n = input("n = (use n < 2 se quiser parar):"); end 30 DCC001 2013-1 16 } Função MenorPrimoMaiorOuIgual ◦ Loop de procura por um primo ◦ Não interage com o usuário ◦ Empurra o problema de saber se um número é primo para outra função function p = menorPrimoMaiorOuIgual(n) p = n; while ~primo(p) p = p+1 end endfunction 31 DCC001 2013-1 } Função Primo ◦ Testa se um número é primo ◦ A saída é booleana: %t se for primo, %f senão ◦ Usa a função MenorFator(q) que calcula o menor divisor de q diferente de 1 function ehPrimo = primo(k) ehPrimo = (k == menorFator(k)); endfunction 32 DCC001 2013-1 17 } Função MenorFator ◦ Encontra o menor fator de um número ◦ Usa a função modulo, que é fornecida pelo Scilab DCC001 2013-1 33 function f = menorFator(q) f = 2; while modulo(q,f) ~= 0 f = f + 1; end endfunction } Funções são uma ferramenta muito útil de modularização } Seu uso permite o reaproveitamento de código e o encapsulamento de detalhes } O uso de funçõespermite o desenvolvimento gradual de programas por refinamentos sucessivos 34 DCC001 2013-1 18 Escreva um programa que faça a leitura de n valores. Para cada valor x lido, o programa deve calcular o valor f(x), onde f é a função definida como f(x) = x – sqrt(x). Os valores f(a) calculados devem ser acumulados em um somatório. Ao final, o programa imprime o valor do somatório calculado. 35 function f = myF(x) f = x - sqrt(x); endfunction n = input("QUANTIDADE DE LEITURAS: "); soma = 0; for i = 1:n x = input("DIGITE UM VALOR: "); soma = soma + myF(x); end printf("\nSOMATÓRIO CALCULADO: %7.3f", soma); 36 Introdução
Compartilhar