Commit 755914e6 authored by Jomaro Rodrigues's avatar Jomaro Rodrigues

Closes #1

parent 4a867fcd
/* Calcula a divisao de dois numeros */
#include <stdio.h>
#include <stdlib.h>
float divisao(float a, float b); /* Prototipo da função */
void main()
{
float x = 13.75, y = 1.38;
printf("O valor da divisao de %f por %f e: %f.\n", x, y, divisao(x,y));
}
float divisao(float a, float b) /* Definicao da funcao */
{
float div;
if (b != 0) /* Se b for nao nulo */
{
div = a / b; /* faz a divisao */
return(div);
}
else /* Se b for nulo */
{
/* Imprime mensagem de erro e aborta execucao */
printf("Divisao por zero!\n");
exit(1);
}
}
// Passando argumentos por valor e por referência
void por_valor(int a, int b, int c);
void por_ref(int *a, int *b, int *c);
void main ()
{
int x = 2, y = 4, z = 6;
printf("Antes de chamar por valor() : x=%d, y=%d, z= %d\n", x, y, z);
por_valor(x, y, z);
printf("Depois de chamar por valor(): x=%d, y=%d, z=%d\n", x, y, z);
por_ref(&x, &y, &z);
printf("Depois de chamar por ref() : x=%d, y=%d, z=%d\n", x, y, z);
}
void por_valor(int a, int b, int c)
{
a = b = c = 0;
}
void por_ref(int *a, int *b, int *c)
{
*a = *b = *c = 0;
}
......@@ -2,5 +2,136 @@
\begin{document}
\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
serão passados para a função e opcionalmente o nome dos argumentos. O protótipo sempre termina com
`;'.
tipo de retorno nome funcao (tipo arg1,..., tipo argN);
\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}
tipo de retorno nome funcao (tipo arg1,..., tipo argN)
{
instruções;
}
\end{lstlisting}
\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}
int func1(...) /* retorna um tipo int */
void func2(...) /* não retorna dados */
\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(...)
{
int x; /* declaracao da variavel */
... /* demais instrucoes */
...
return x*2; /* retorna x*2 */
}
\end{lstlisting}
\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}
Obs.:
\& - 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.
* - Acessa o conteúdo de tal endereço de memória.
\section{Exemplo de função}
\lstinputlisting{exemplos/exemplo_funcao.c}
\section{Exercícios}
1. Transforme o programa que detecta se um número é primo em uma função.
2. Escreva uma função que gera e imprime os primeiros n números primos,
sendo que n é o parâmetro desta função.
\end{document}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment