funcoes.tex 4.91 KB
Newer Older
1 2 3 4
\documentclass[apostila.tex]{subfiles}


\begin{document}
5

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
6 7 8 9 10 11 12 13 14 15 16 17
\chapter{Funções}

Uma função é uma seção independente de código em C, designada por um nome, 
que realiza uma tarefa específica e, opcionalmente, 
retorna um valor ao programa que a chamou.

\section{Protótipo}

O protótipo da função fornece ao compilador uma descrição de uma função que 
será definida posteriormente no programa. O protótipo inclui o tipo de 
retorno, que indica o tipo de variável que a função retornará. 
Além disso, ele inclui também o nome da função, os tipos de variáveis dos argumentos que
18 19
serão passados para a função e opcionalmente o nome dos argumentos. 
O protótipo sempre termina com `;'.
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
20

21 22 23
\begin{lstlisting}
tipo_de_retorno nome_funcao (tipo1 arg1,..., tipoN argN);
\end{lstlisting}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

\section{Definição}

A definição da função é a função propriamente dita. 
A definição contém as instruções que serão executadas. 
A primeira linha de uma definição de função, chamada de cabeçalho da função, 
deve ser idêntica ao protótipo da função, com exceção do ponto-e-vírgula final.
Os nomes das variáveis usadas como argumentos devem necessariamente 
ser incluídos no cabeçalho. A seguir vem o corpo da função, contendo as
instruções que a função executará contidas num bloco. 
Se o tipo de retorno da função não for void, uma
instrução return deve ser incluída para retornar um valor compatível com o 
tipo de retorno especificado.

\begin{lstlisting}
39
tipo_de_retorno nome_funcao(tipo1 arg1, ..., tipoN argN)
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
40 41 42 43 44
{
	instruções;
}
\end{lstlisting}

45

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
46 47 48 49 50 51 52
\subsection{Tipo de retorno}

Especifica o tipo de dado que a função deverá retornar ao programa 
que a chamou. O tipo pode ser qualquer dos tipos válidos em C ou um 
tipo definido pelo programador. A função pode não retornar nenhum valor.

\begin{lstlisting}
53 54
int func1(...) // retorna um tipo int
void func2(...) // não retorna dados
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
55 56 57 58 59 60 61 62 63 64
\end{lstlisting}

Para retornar um valor a partir de uma função, é usada a palavra-chave return 
seguida por uma expressão válida em C. Quando a execução atinge a instrução 
return, a expressão é avaliada e o valor é transmitido para o programa que 
originou a chamada. O valor de retorno de uma função é o valor da expressão.

\begin{lstlisting}
int func1(...)
{
65 66
	int x; // declaracao da variavel
	... // demais instrucoes
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
67 68
	...
	
69
	return x*2; // retorna x*2
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
70 71 72
}
\end{lstlisting}

73

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
\subsection{Nome da função}

Pode ser qualquer nome, contanto que siga as regras adotadas para atribuir 
nomes de variáveis em C. O nome da função deve ser único e é sempre 
aconselhável usar um nome que reflita a finalidade da função.

\subsection{Corpo da função}

É delimitado por chaves e colocado imediatamente após o cabeçalho da função. 
Quando uma função é chamada, a execução começa no início do corpo e termina 
(retornando ao programa de origem) quando uma instrução return é encontrada 
ou quando a execução chega ao final do bloco.

Podemos declarar variáveis dentro do corpo de uma função. Estas variáveis 
são chamadas de variáveis locais, significando que são privativas desta 
função e distintas de outras variáveis com o mesmo nome que possam ter sido 
declaradas em outras partes do programa. A declaração destas variáveis deve 
ser feita antes de qualquer instrução.

\section{Chamada de funções}

\subsection{Chamadas por valor}

Quando uma variável é passada para uma função pelo valor, a função tem 
acesso ao valor da variável, mas não à própria variável original. 
Portanto, as instruções contidas na função não podem modificar o valor da 
variável original.

\subsection{Chamadas por referência}

Neste caso a função recebe o endereço de memória (uma referência) do 
parâmetro, ao invés do valor do parâmetro. Desta forma, a função pode alterar 
o valor da variável mediante a utilização deste endereço.
Tanto a função quanto o programa devem ser informados de que um parâmetro é 
chamado por referência utilizando os operadores \& (para passar um endereço) 
e * (para receber um endereço).

exemplo:

\lstinputlisting{exemplos/funcao_parametro_por_valor_e_referencia.c}



A saída será: 
\begin{verbatim}
Antes de chamar por valor() : x = 2, y = 4, z = 6
Depois de chamar por valor(): x = 2, y = 4, z = 6
Depois de chamar por ref()  : x = 0, y = 0, z = 0
\end{verbatim}

124

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
125
Obs.:
126 127 128 129 130
\begin{description}
	\item[\&] Passa o endereço de memória da variável passada por parâmetro e, 
		portanto, as modificações sobre esta variável realizadas na função são permanentes.
	\item[*] Acessa o conteúdo de tal endereço de memória.
\end{description}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
131 132 133 134 135 136 137 138


\section{Exemplo de função}

\lstinputlisting{exemplos/exemplo_funcao.c}



139
\section*{Exercícios}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
140 141

1. Transforme o programa que detecta se um número é primo em uma função.
142

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
143
2. Escreva uma função que gera e imprime os primeiros n números primos, 
144
sendo que n é o parâmetro desta função.
145 146

\end{document}