Modularidade - Fun ções e Procedimentos José Gustavo de Souza Paiva Problema Em diversas situa ções, é preciso executar uma tarefa específica diversas vezes em um programa, variando apenas os dados de entrada dessa tarefa Exemplo: Combinação simples C n, p n! p!( n p)! 1
Problema Outros exemplos : Mostrar mensagens na tela Zerar um vetor Fazer uma operação matricial Modularização: divisão de um programa em módulos responsáveis por tarefas específicas Modularização Motivações Evitar repetição de código Dividir e estruturar melhor a resolução de um problema Aumentar a legibilidade do c ódigo Benefícios Manutenção mais simples, pois os m ódulos são (idealmente) independentes e menores Elaboração e testes em separado Reutilização do módulo em outros programas 2
Sub-rotinas Blocos de instruções que realizam alguma tarefa espec ífica Seu código é carregado uma vez, e pode ser utilizado diversas vezes no programa Vantagens Evitar que os blocos do programa fiquem grandes demais e, por conseqüência, mais difíceis de entender Facilitar a leitura do programa-fonte Separar o programa em partes (blocos) que possam ser logicamente compreendidos de forma isolada Permitir o reaproveitamento de c ódigo já construído (por você ou por outros programadores) Evitar que um trecho de c ódigo seja repetido v árias vezes dentro de um mesmo programa Permitir a alteração (manutenção) de um trecho de c ódigo de uma forma mais rápida (é preciso alterar apenas dentro da fun ção que se deseja) Sub-rotinas O fluxo de um programa é normalmente seqüencial, e o programa é executado no estilo top-down A utilização de uma sub-rotina pode, entretanto, desviar o fluxo do programa O programa pára o que está fazendo, executa o código correspondente ao código da sub-rotina, e depois volta para a primeira instrução subsequente 3
Sub-rotinas em C Todo programa escrito na linguagem C tem pelo menos uma sub-rotina Ela se chama main, e representa o programa principal Toda vez que um programa escrito em C é executado, a primeira sub-rotina a ser executada é a função main Dentro da sub-rotina main, é possível chamar outras sub-rotinas que realizem tarefas relativas ao programa Sub-rotinas em C A linguagem C possui muitas sub-rotinas pr é- definidas em bibliotecas que acompanham o compilador Exemplos printf scanf pow sqrt Os códigos destas sub-rotinas est ão definidos dentro de bibliotecas, chamadas com o comando #include O programador pode criar novas sub-rotinas, e utilizá-las dentro do código onde foram definidas 4
Sub-rotinas em C As sub-rotinas dividem-se em Funções: retornam um valor, uma resposta ao programa Procedimentos: não retornam valores para o programa Na linguagem C, ambas as sub-rotinas são definidas como fun ções Sub-rotinas em C Construção de sub-rotinas em C O tipo de retorno da sub-rotina define se ela é uma função ou um procedimento Procedimentos possuem sempre tipo void Funções possuem sempre tipos definidos, tais como int, float, char, etc. 5
Sub-rotinas em C Pode-se atribuir qualquer nome para uma função/procedimento em C, desde que n ão seja um nome reservado da linguagem Duas funções não podem ter o mesmo nome no mesmo programa Uma função pode possuir par âmetros Parâmetros são informações necessárias para a realização da tarefa definida na fun ção Os parâmetros são definidos como uma lista na função Para cada parâmetro, especifica-se um tipo e um nome qualquer Exemplo de função em C Definição Chamada 6
Funções em C O resultado de uma fun ção é sempre uma expressão Como tal, uma fun ção pode ser chamada dentro de outra Exemplo de Procedimento em C Definição Chamada 7
Função int main() O programa principal é uma função especial, que possui um tipo fixo (int) e é invocada automaticamente pelo sistema operacional quando este inicia a execu ção do programa Quando utilizado, o comando return informa ao sistema operacional se o programa funcionou corretamente ou n ão O padrão é que um programa retorne zero caso tenha funcionado corretamente ou qualquer outro valor caso contr ário Variáveis Globais e Locais Uma variável é chamada local se ela foi declarada dentro de uma fun ção ou bloco de código Nesse caso, ela existe somente dentro desse escopo, e após o término da execução do mesmo, a variável deixa de existir Uma variável é chamada global se ela for declarada fora de qualquer fun ção ou bloco de código (ou seja, no mesmo lugar onde registros, tipos enumerados e funções são declarados) Essa variável é visível em todas as fun ções, qualquer função pode alterá-la e ele existe durante toda a execução do programa 8
Variáveis Globais Variáveis Globais e Locais É possível declarar vari áveis locais com o mesmo nome de vari áveis globais Neste caso, a vari ável local esconde a variável global 9
int quadrado(){ int num, quad; scanf("%d", &num); quad = num * num; return (quad); Exemplo [2] int main(){ int result; printf("digite o numero: "); result = quadrado(); printf("quadrado do numero: %d", result); return 0; Exemplo [2] int quadrado(){ int num, quad; scanf("%d", &num); quad = num * num; return (quad); Erro! int main(){ printf("digite o numero: "); quad = quadrado(); printf("quadrado do numero: %d", quad); return 0; 10
Parâmetros Chamada por valor: é passado uma c ópia da variável para a subrotina Qualquer alteração feita no parâmetro não reflete em altera ção no argumento Chamada por refer ência: é passado o endereço da variável para a subrotina Ambas as variáveis apontam para o mesmo endereço de memória Todas as alterações realizadas no parâmetro refletem em altera ções no argumento Parâmetros Parâmetros passados por valor s ão declarados como variáveis comuns float f1(int a, float b, int c) Parâmetros a, b, c são passados por valor Parâmetros passados por refer ência devem ser passados como ponteiros, utilizando o símbolo * antes do nome do parâmetro float f2(int *a, float b, double *c) Parâmetros a e c são passados por refer ência, parâmetro b é passado por valor void p2(int *n, float a[]) Parâmetros n, a são passados por referência Nesse caso, o acesso dentro das fun ções deve ser feito respeitando a nota ção de ponteiro 11
Exemplo - Parâmetros por Valor [2] #include <stdio.h> int quadrado(int x){ int q = x * x; return (q); int main(){ int num, result; printf( Digite um numero: ); scanf( %d, &num); result = quadrado(num); printf( \nresultado: %d, result); return 0; Exemplo - Parâmetros por Valor [2] #include <stdio.h> void quadrado(int x){ x = x * x; int main(){ int num; printf( Digite um numero: ); scanf( %d, &num); printf( \nvalor antes: %d, num); quadrado(num); printf( \nvalor depois: %d, num); return 0; 12
Exemplo - Parâmetros por Valor [2] #include <stdio.h> float media(float a, float b){ return ((a+b)/2); int main(){ float x, y, med; printf("digite dois valores:"); scanf("%f %f", &x, &y); med = media(x,y); printf("a media eh %f :,med); return 0; Exemplo - Parâmetros por Referência 13
Parâmetros: Comparação [3] Arrays como parâmetros [2] Para utilizar arrays como par âmetros de funções alguns cuidados simples s ão necessários Arrays são sempre passados por refer ência para uma função A passagem de arrays por refer ência evita a cópia desnecessária de grandes quantidades de dados para outras áreas de memória durante a chamada da fun ção 14
Arrays como parâmetros [2] Geralmente utiliza-se um segundo par âmetro (variável inteira) para passar para a fun ção o tamanho do array separadamente Quando passamos um array por par âmetro, independente do seu tipo, o que é de fato passado é o endereço do primeiro elemento do array Ex: void imprime (int m[5], int n); Observação: Ao passar um elemento de um vetor, ele é passado por valor Exercícios [3] Considere o código abaixo usando passagem por referência. Analise-o e explique o resultado mostrando passo a passo as altera ções ocorridas no vetor a void incrementa(int *x, int *y){ *x = *x + (*y); (*y)++; int main(){ int a[] = {1,2,3; for (int i=0; i<3; i++){ incrementa(&a[i],&a[1]); printf("\n %d",a[i]); 15
Exercícios Escreva uma fun ção C chamada media, que recebe três notas e calcula a m édia Escreva uma fun ção C chamada media2, que recebe quatro par âmetros, sendo os tr ês primeiros as notas e o último um parâmetro de retorno, contendo o resultado. Este último parâmetro deve ser passado como refer ência Defina uma função troca, que permute o valor de uma variável do tipo double por outra, ambas passadas por refer ência Exercícios Crie um programa em C que contenha um procedimento que recebe como entrada uma nota e imprime na tela se o aluno passou ou foi reprovado (nota menor que 7). O programa principal dever á fazer a leitura da nota informada pelo usu ário Escreva uma fun ção chamada find_abs que aceite um número real do tipo double passado para ela, calcule seu valor absoluto, e mostre o valor absoluto. O valor absoluto é o próprio número se for positivo, e o negativo do n úmero se o número for negativo 16
Exercícios Faça uma função em C que receba um conjunto de valores e retorne o maior entre eles Faça uma função que mostre na tela os elementos de um vetor, que é passado como parâmetro Faça uma função que recebe um vetor X(15) de inteiros, por parâmetro, e retorna a quantidade de valores pares em X Faça uma função que recebe, por par âmetro, uma matriz A(6,6) e retorna a soma dos elementos da sua diagonal principal Referências 1. Baranauskas, J. A., Notas de Aula de Sub-algoritmos: Funções e Procedimentos, dispon ível em: http://dcm.ffclrp.usp.br/~augusto/teaching/ici/funcoese-procedimentos.pdf 2. Paiva, E. R., Slides de Modulariza ção da disciplina de Oficina de Programa ção, Faculdade de Computa ção, Universidade Federal de Uberl ândia 3. Vidigal, M. A., Slides de Programa ção Procedimental, Faculdade de Computa ção, Universidade Federal de Uberlândia, disponível em http://www.facom.ufu.br/~madriana/ 17