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 Ler os elementos que preenchem um vetor Zerar um vetor Fazer uma operação matricial Modularização: divisão de um programa em módulos responsáveis por tarefas específicas 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 Motivações Evitar repetição de código Dividir e estruturar melhor a resolução de um problema Aumentar a legibilidade do código 2
Sub-rotinas Vantagens Evitar que os blocos do programa fiquem grandes demais e, por conseq uê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 d a sub-rotina que se deseja) Sub-rotinas O fluxo de um programa é normalmente sequencial, 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 subsequ ente 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 Esse valor pode ser usado posteriormente NO CÓDIGO Procedimentos: não retornam valores para o programa Uma resposta ao usuário nem sempre é uma resposta de uma sub-rotina! 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 Exercícios Escreva uma função C chamada media, que recebe três notas e calcula a média 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 8
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 d o 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 el a existe durante toda a execução do programa Variáveis Globais 9
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 Exemplo [2] int quadrado(){ int num, quad; scanf("%d", &num); quad = num * num; return (quad); int main(){ int result; printf("digite o numero: "); result = quadrado(); printf("quadrado do numero: %d", result); return 0; 10
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; 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 11
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 Vetores são sempre passados por referência Nesse caso, o acesso dentro das funções deve ser feito respeitando a notação de ponteiro 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; 12
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; 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; 13
Exemplo - Parâmetros por Referência Parâmetros: Comparação [3] 14
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 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 array, ele é passado por valor 15
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 i,a[] = {1,2,3; for (i=0; i<3; i++){ incrementa(&a[i],&a[1]); printf("\n %d",a[i]); Exercícios Escreva o que será mostrado na tela pelo seguinte programa 16
Exercícios 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 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 Exercícios 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 Faça um programa com duas variáveis globais inicializadas com 0: número e precentual (21% do valor de número). O programa deve ler número, enviar como parâmetros número e percentual, e através de um procedimento calcular o novo valor de percentual, retornando-o alterado para o programa principal, para depois mostrá-lo na tela 17
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/ 18