Funções em C
Linguagem de Programação Estruturada Prof. Leandro Carlos Fernandes
2º semestre 2015
Funções
• Agrupa um conjunto de comandos e associa a ele um nome (identificador).
• O emprego deste nome como um comando corresponde a uma chamada a função para sua execução
• Após sua execução, o programa retoma sua execução no ponto imediatamente após ao momento da chamada à sub-rotina
–O momento de retorno ao ponto em que a função foi invocada é chamado de retorno.
2
Parâmetros de uma Função
• Durante a chamada de uma função pode informar valores (argumentos) para o processamento da função
• Argumentos = lista de expressões
–Lista pode ser vazia
–Lista aparece entre parênteses após o nome da função
• Ex: int soma (int x, int y) { }
O Retorno da Função
• No seu retorno, uma função pode entregar resultados ao programa que a chamou
– Exemplo: return (resultados);
– O valor da variável local resultados é passado de volta como o valor da função
• Valores de qualquer tipo podem ser retornados – Funções predicado: funções que retornam valores – Procedimentos: funções que não retornam valores – Exemplo: voidfunction (intx)
Elementos que compõem uma função
• Funções são definidas de acordo com a seguinte sintaxe:
tipo_de_resultadonome (lista de parâmetros) { /* corpo de função */
• Onde:}
–Tipo de resultado:
• Quando a função é um procedimento, usa-se a palavra chave void
• Procedimentos não retornam valor –Lista de parâmetros
• Funcionam como variáveis locais com valores iniciais
• Quando função não recebe parâmetros, a lista de parâmetros é substituída pela palavra void
5
Realizando uma chamada
• Quando invocamos uma função:
–Cada expressão na lista de argumentos é avaliada –O valor da expressão é convertido, se necessário,
para o tipo do parâmetro formal
–Este tipo é atribuído ao parâmetro formal correspondente no início do corpo da função –O corpo da função é executado
–Ao término, o fluxo de execução retorna imediatamente após o ponto de chamada
6
Exemplo de Função
Um programa em C que apresenta uma função capaz de calcular o máximo divisor comum entre dois números
#include <stdio.h>
intMDC (inta, intb); /* Protótipo */
voidmain() { intresultado;
resultado = MDC(12,8); /* chamada */
printf("O máximo divisor comum entre %d e
%d é &d\n", 12, 8, resultado );
}
/* definição da função */
intMDC (inta, intb) { intaux;
if(a < b) { aux = a;
a = b;
b = aux;
}while(b != 0) { aux = b;
b = a % b;
a = aux;
}returna;
}
Protótipos
• Antes de usar uma função em C, é aconselhável declará-la para que o compilador tome conhecimento de sua existência e verifique se estão corretas as chamadas
– A declaração apenas indica a assinaturada função.
• Esse tarefa é realizada especificando seu protótipo – Tem a mesma forma que a função, só que substitui o corpo
por um (;)
– Nomes das variáveis de um parâmetro são opcionais
• Fornecê-los ajuda a leitura do programa
O comando RETURN
• Durante a execução do corpo de uma função:
–Se um comando returnfor executado, o controle é passado de volta para o trecho que chamou a função imediatamente
–Se um comando returnincluir uma expressão, o valor resultante da expressão é convertido, se necessário, para o tipo do valor que a função retorna; e então é retornado para o trecho que chamou a função
–Se um comando returnnão apresentar algum valor ou expressão, então nenhum valor será retornado ao trecho que chamou a função
–Se não existir um comando returndentro do corpo da função, o controle é passado de volta para o trecho que chamou a função após o corpo da função ser executado.
9
Passagem de Informações
• Exemplo:
doublemesada(doublenotas, intidade) { doubletotal;
if(idade > 10)
return(idade * 20.0);
else{
total = notas*idade*20;
returntotal;
} }
10
Passagem de Informações
• Argumentos passados por valor
–Quando chamada, a função recebe o valor da variável informada
–Quando argumento é do tipo atômico, a passagem por valor significa que a função não pode mudar seu valor
–Os argumentos deixam de existir após a execução do método
Exemplo – Passagem “Por valor”
#include <stdio.h>
intsoma(intx, inty); /* Protótipo */
voidmain() { inta, b;
printf("Informe dois valores inteiros");
printf("Primeiro valor: "); scanf("%d", &a);
printf("Segundo valor: "); scanf("%d", &b);
printf("%d+ %d= %d\n", a, b, soma(a,b) ); /* Chamada a função */
}
intsoma(intx, inty) { /* Definição da função soma */
returnx+ y;
}
Passagem de Informações
• Argumentos passados por referência
–Quando chamada, a função passa a referenciar (apontar) a variável informada
–Portanto o processo consiste em informar o endereço da variável para o que o parâmetro formal possa referenciá-lo.
–Os argumentos deixam de existir após a execução do método, porém as variáveis informadas e que foram referenciadas permanecem (pois não são dadas por este bloco de comandos).
13
Exemplo – Passagem “Por Referência”
#include <stdio.h>
#include <math.h>
inteq2Grau(floata, floatb, floatc, float *x1, float *x2);
voidmain() { floatc1, c2, c3, r1, r2;
intexisteRaizReal;
printf("Informe os coeficientes da equação ax^2 + bx + c\n");
printf("a: "); scanf("%d", &c1);
printf("b: "); scanf("%d", &c2);
printf(“c: "); scanf("%d", &c3);
existeRaizReal= eq2Grau(c1, c2, c3, &r1, &r2);
if(existeRaizReal)
printf("x’ = %fe x’’ = %f\n", r1, r2);
elseprintf("Não existem raízes reais\n");
}
/* Definição da função */
inteq2Grau(floata, floatb, floatc, float *x1, float *x2) {
floatdelta;
delta= b*b - 4*a*c;
if(delta< 0) return0;
else{
*x1= (-b + sqrt(delta) ) / 2*a;
*x2= (-b - sqrt(delta) ) / 2*a;
return1;
}}
14
Realizando uma chamada
Agora com mais detalhes, temos:
1. O valor dos argumentos é calculado pelo programa que está invocando a função 2. O sistema cria um novo espaço para todas as
variáveis locais da função (estrutura de pilha) 3. O valor de cada argumento é então copiado ou
referenciado pela variável dada como parâmetro de acordo com a ordem em que aparecem
– Realiza conversões de tipo necessárias
Realizando uma chamada
4. Os comandos do corpo da função são executados até que:
a) Se encontre um comando return
b) Não existirem mais comandos para serem executados
5. O valor da expressão return, se ele existir, é avaliado e retornado como valor da função 6. A pilha criada é liberada
7. O programa que chamou continua sua execução
Prática: função troca
• Fazer uma função troca(px, py) que recebe como parâmetros 2 ponteiros para inteiros e troca o conteúdo deles
• Ex:
intx= 10, y= 20;
troca(&x, &y);
printf("x=%dy=%d", x, y) /* ==> x=20 y=10 */
17
Vetores como Argumentos de Funções
• Quando desejamos informar um vetor como
argumento para uma função, podemos fazê-lo de três maneiras equivalentes.
• Suponha o vetor:
intmatrx [50];
e que queiramos informá-lo como argumento para uma função func().
• Podemos declarar func() de três maneiras:
voidfunc (intmatrx[50]);
voidfunc (intmatrx[]);
voidfunc (int*matrx);
18
Ex: Concatena Strings
#include <stdio.h>
char *concatena(charcabeca[ ], charcauda[ ]) { inti, j;
/* procura o fim da primeira palavra */
for(i= 0; cabeca[i] != '\0'; i++) ;
/* ... e copia cada letra da segunda palavra para a primeira */
for( j= 0; (cabeca[i] = cauda[ j]) != '\0'; i++, j++) ; cabeca[i] = '\0';
returncabeca;
}
Exemplo (cont.)
intmain( ) {
charsobrenome[ ] = " Dumont";
charnome[80] = "Santos"; /* a variável tem que ter tamanho suficiente para comportar a msg */
/* Escreve na tela a frase, substituindo a máscara %s pela string "Santos Dumont“, que é retornada pela chamada da função concatena. */
printf("O nome é %s.\n", concatena(nome, sobrenome) );
return0;
}