Linguagem C - Funções (Danilo Giacobo)
-
Upload
gustavo-fausto -
Category
Documents
-
view
26 -
download
0
description
Transcript of Linguagem C - Funções (Danilo Giacobo)
Programação em C Funções
Professor: Danilo Giacobo
Página pessoal: www.danilogiacobo.eti.br
E-mail: [email protected]
16/08/2013 Programação em C - Funções 1
Introdução Essencialmente, uma função é um bloco de código cuja execução visa atingir um
objetivo específico. Na linguagem C, há funções predefinidas, como, por exemplo,
strlen() e sqrt(), bem como funções definidas pelo próprio programador, como,
por exemplo, main().
16/08/2013 Programação em C - Funções 2
Definição Funções, também chamadas de sub-rotinas ou subprogramas, são blocos de
instruções que realizam tarefas específicas. O código de uma função é carregado
uma vez e pode ser executado quantas vezes forem necessárias. Com o problema
pode ser subdividido em pequenas tarefas, os programas tendem a ficar menores
e mais organizados.
Os programas, em geral, são executados linearmente, uma linha após a outra, até
o fim. Entretanto, quando são utilizadas funções, é possível a realização de
desvios na execução dos programas. Esses desvios são efetuados quando uma
função é chamada pelo programa principal.
16/08/2013 Programação em C - Funções 3
Processo de criação de um programa executável em C
16/08/2013 Programação em C - Funções 4
Pré-processador Compilador Linkeditor
*.h *.lib
prog.exe
prog.obj prog.c
código-fonte código-objeto
A diretiva #define Sintaxe:
#define identificador texto
#define macro(parâmetros) texto_parametrizado
A finalidade básica da diretiva #define é aumentar a legibilidade e facilitar a
manutenção do programa, definindo nomes simbólicos para constantes
numéricas.
Por exemplo, em vez de usar diretamente o valor 3.14 em um programa,
podemos definir esse número como PI e usar este nome para referenciá-lo:
#define PI 3.14
16/08/2013 Programação em C - Funções 5
A diretiva #define Uso da diretiva #define, com e sem parâmetros
16/08/2013 Programação em C - Funções 6
A diretiva #define Uso da diretiva #define para representar expressões de uma forma simples
16/08/2013 Programação em C - Funções 7
A diretiva #include Sintaxe:
#include <arquivo_do_compilador>
#include “arquivo_do_programador”
Esse diretiva, quando executada pelo pré-processador, faz com que uma cópia do
arquivo indicado seja incluída no programa.
A primeira forma é usada com arquivos do próprio compilador (por exemplo,
stdio.h).
A segunda forma é usada com arquivos criados pelo próprio programador.
16/08/2013 Programação em C - Funções 8
A diretiva #include - Exemplo
Arquivo de cabeçalho criado pelo programador
Uso da diretiva #include, nas duas formas possíveis
16/08/2013 Programação em C - Funções 9
Funções Um importante recurso apresentado nas linguagens de programação é a
modularização, na qual um programa pode ser particionado em funções bastante
específicas. A linguagem C possibilita a modularização por meio de funções.
Um programa escrito na linguagem C tem, no mínimo, uma função chamada
main, por onde a execução começa. Existem também muitas outras funções
predefinidas na linguagem C, por exemplo: ceil(), strcmp(), strcpy(), etc. Essas
funções são adicionadas aos programas pela diretiva #include, no momento da
‘linkedição’.
Além disso, o usuário também pode criar quantas funções quiser, dependendo do
problema que estiver sendo resolvido pelo programa. As funções às vezes
precisam receber valores externos, chamados parâmetros, e também podem
devolver algum valor produzido para o ambiente externo, denominado retorno.
16/08/2013 Programação em C - Funções 10
Funções O padrão que foi estabelecido pela ISO (International Organization for
Standardization) para criação de funções em C é:
16/08/2013 Programação em C - Funções 11
tipo nome (parâmetros)
{
variáveis locais;
comandos;
}
Neste padrão:
- tipo: refere-se ao tipo do valor devolvido como resposta ao final da execução da função (deve ser void se
não houver um valor a ser devolvido).
- nome: identifica a função e permite que ela seja referenciada no programa.
- parâmetros: é uma lista de variáveis representando dados de entrada, necessários para a execução da
função (deve ser void se não houver dados de entrada).
- variáveis locais: são variáveis criadas quando a função entra em execução e destruídas quando a
execução termina (acessíveis apenas dentro da função).
- comandos: são passos a serem executados pela função.
Funções Para ser executada, uma função precisa ser chamada, direta ou indiretamente,
pela função principal main(). Por exemplo, no programa abaixo, a função main()
chama diretamente a função f() que, por sua vez, chama a função g(), ou seja,
main() chama indiretamente a função g(). Como h() não é chamada por main(),
nem direta nem indiretamente, essa função não será executada. Portanto, a
saída produzida por esse programa será M1 F1 G F2 M2.
16/08/2013 Programação em C - Funções 12
Tipos de funções Ao criarmos uma função, a primeira tarefa é definir o seu tipo. Para isso, é
preciso determinar se, quando chamarmos essa função, o objetivo será dar uma
ordem ou fazer uma pergunta. Se o objetivo for dar uma ordem, a execução da
função deve produzir um efeito; caso contrário, se o objetivo for fazer uma
pergunta, então sua execução deve devolver uma resposta.
Em C, uma função cuja execução produz apenas um efeito deve ser definida com
o tipo void; por outro lado, uma função cuja execução devolve resposta deve ser
definida com o tipo dessa resposta (por exemplo, char, int ou float).
16/08/2013 Programação em C - Funções 13
Tipos de funções Para tornar estes conceitos mais claros, vamos analisar os tipos de algumas
funções predefinidas em C:
system(“PAUSE”): uma chamada para esta função corresponde à ordem “exiba uma
mensagem na tela e espere a pessoa pressionar uma tecla para continuar”, portanto
essa função deve ser definida com o tipo void.
toupper(‘a’): uma chamada a esta função corresponde à pergunta “qual a maiúscula da
letra ‘a’?”; como a resposta esperada para esta pergunta é um caractere, esta função
pode ser criada com o tipo char.
strlen(‘Danilo Giacobo’): uma chamada a esta função corresponde à pergunta “quantos
caracteres possui o texto informado?”; como a resposta para esta pergunta é um número
inteiro, esta função deve ser definida com o tipo int.
sqrt(2): uma chamada a esta função corresponde à pergunta “qual a raiz quadrada de
2?”; como a resposta desta pergunta é um número real, ela deve ser definida com o tipo
float.
16/08/2013 Programação em C - Funções 14
Tipos de funções
16/08/2013 Programação em C - Funções 15
Em uma disciplina são dadas duas provas e dois trabalhos, mas a média é calculada considerando-se
apenas a maior nota de prova e a maior nota de trabalho. Dadas as quatro notas de um aluno, informe a sua
média. Crie e use as funções maior(), que determina o maior entre dois números, e media(), que calcula a
média aritmética de dois números.
Note que o comando return é usado para definir o valor que deve ser devolvido como resposta pela função.
Esse valor que pode ser uma constante, uma variável ou uma expressão, deve ser indicado logo após a
palavra return. Além disso, ao ser executado, o comando return termina imediatamente a execução da
função, fazendo com que a execução do programa continue no comando que aparece logo após o ponto em
que a função foi chamada.
Variáveis locais e globais
16/08/2013 Programação em C - Funções 16
Dentro do corpo de uma função é possível a declaração de variáveis, que são chamadas de variáveis locais. Elas recebem esse nome porque podem ser utilizadas apenas dentro da função. Quando a execução desta chega ao fim, essas variáveis são destruídas e seus conteúdos são perdidos.
Variáveis declaradas fora de qualquer função são chamadas de globais. Elas recebem esse nome porque qualquer ponto do programa, incluindo as funções, pode utilizá-las. São destruídas quando a execução do programa chega ao fim.
As variáveis globais, ou seja, reconhecidas por todas as partes do programa, devem ser declaradas fora de todas as funções, inclusive fora da função main. As variáveis locais devem ser declaradas dentro das funções e são reconhecidas apenas na função onde foram declaradas.
Observação:
Não se aconselha a utilização excessiva de variáveis globais, por tornar difícil a manutenção e a busca por erros nos programa.
Variáveis locais e globais
16/08/2013 Programação em C - Funções 17
Parâmetros da função
16/08/2013 Programação em C - Funções 18
Os parâmetros são representados por uma lista de variáveis colocadas dentro de
parênteses, logo após o nome da função. Caso haja retorno, a última linha da
função deverá incluir o comando return, seguido do valor ou variável que será
devolvido a quem chamou a função. O tipo de valor retornado deverá ser
exatamente igual ao tipo informado antes do nome da função. Caso não haja
retorno, o tipo informado antes do nome da função será void.
Os parâmetros podem ser de dois tipos:
Por valor
Por referência
Passagem de parâmetros por valor e referência
16/08/2013 Programação em C - Funções 19
O(s) parâmetro(s) de uma função podem ser passados por valor ou referência.
A passagem de parâmetro por valor permite que o valor da variável seja utilizado
dentro da função e após o término da mesma esse valor é descartado, isto é, o
valor da variável é usado de forma local apenas e alterações realizadas na
mesma não são permanentes.
A passagem de parâmetro por referência permite que o valor da variável seja
utilizado dentro da função e após o término da mesma esse valor pode continuar
a ser utilizado na função que a chamou, isto é, o valor da variável é usado de
forma global e alterações realizadas na mesma são permanentes.
Passagem de parâmetros por valor
16/08/2013 Programação em C - Funções 20
Passagem de parâmetros por valor significa que a função trabalhará com cópias
dos valores passados no momento de sua chamada.
Passagem de parâmetros por valor
16/08/2013 Programação em C - Funções 21
Representação gráfica da passagem de parâmetros por valor
No momento em que a função soma_sobro chega ao fim, as variáveis a, b e soma são
destruídas e, portanto, as alterações realizadas pelas multiplicações por 2 são perdidas, ou
seja, x continua valendo 5 e y continua valendo 3.
Função main Função soma_dobro
5
3
16
x
y
res
5
16
a
b
soma
3
5*2 = 10
3*2 = 6
res = soma_dobro(5,3)
return soma
Passagem de parâmetros por valor
16/08/2013 Programação em C - Funções 22
Passagem de parâmetros por referência
16/08/2013 Programação em C - Funções 23
Passagem de parâmetros por referência significa que os parâmetros passados para uma
função correspondem a endereços de memória ocupados por variáveis. Dessa maneira, toda
vez que for necessário acessar determinado valor, isso será feito por meio de referência, ou
seja, apontando ao seu endereço.
Passagem de parâmetros por referência
16/08/2013 Programação em C - Funções 24
Representação gráfica da passagem de parâmetros por referência
Quando a função soma_dobro chega ao fim, as variáveis a, b e soma são destruídas. Entretanto, as alterações
decorrentes das multiplicações feitas são mantidas, pois cada alteração faz referência a endereços de memória que
estavam fora da área destinada à função. Assim, após a função soma_sobro, o valor de x será 10 e o de y será 6.
Função main Função soma_dobro
5
3
16
x
y
res
800
16
a
b
soma
300
a = a * 2
b = b * 2
return soma
800
300
res = soma_dobro (800, 300)
10
6
Passagem de parâmetros por referência
16/08/2013 Programação em C - Funções 25
Passagem de parâmetros (vetores e matrizes)
16/08/2013 Programação em C - Funções 26
A linguagem C não permite que vetores e matrizes sejam passados na íntegra
como parâmetro para uma função. Para resolver este problema, deve-se passar
apenas o endereço da posição inicial do vetor ou da matriz. Esse endereço é
obtido utilizando-se o nome do vetor (ou da matriz) sem o índice entre colchetes.
Isso quer dizer que é possível passar um vetor para uma função somente se essa
passagem for por referência.
Passagem de parâmetros (vetores e matrizes)
16/08/2013 Programação em C - Funções 27
A função recebe dois parâmetros: m[][5] e v[]. Assim, toda vez que encontrar um vetor cm colchetes vazios ou uma matriz com os colchetes da primeira dimensão vazios, entenda que eles são variáveis ponteiros que guardam os endereços iniciais das variáveis.
Quando o nome de uma matriz ou vetor for utilizado sem apresentar colchetes contendo um índice, isso significa que estamos usando o endereço de memória ocupado pela posição 0 do vetor ou pela posição 0x0 da matriz.
Funções em arquivos separados (bibliotecas)
Na linguagem C existem algumas bibliotecas já implementadas e dentro destas existem
inúmeras funções. Por exemplo, na biblioteca stdio.h, existem as funções scanf, getchar,
printf, entre outras.
Para criar uma biblioteca é necessário gerar um novo arquivo e dentro dele pôr o código de
todas as funções que farão parte dessa biblioteca. Este arquivo deve ser salvo com extensão
.h e deve ser compilado normalmente.
Quando uma nova biblioteca for utilizada em um programa e seu arquivo estiver salvo no
diretório-padrão das bibliotecas da linguagem C, basta chamá-la por meio da diretiva
#include <biblioteca.h>. Quando a nova biblioteca está em outro diretório, sua chamada deve
obedecer à seguinte sintaxe: #include “caminho\nome_da_biblioteca.h”.
16/08/2013 Programação em C - Funções 28
Funções em arquivos separados (bibliotecas)
16/08/2013 Programação em C - Funções 29
rotinas.h exemplo.c
Funções sem passagem de parâmetros e sem retorno
O tipo mais simples de função é aquele que não recebe nenhuma informação no momento
de sua chamada e que também não repassa nenhum valor para quem a chamou. Um
programa escrito em linguagem C sempre começa pela função main.
16/08/2013 Programação em C - Funções 30
Funções sem passagem de parâmetros e sem retorno
O exemplo anterior mas agora com a utilização de variáveis locais.
16/08/2013 Programação em C - Funções 31
Funções com passagem de parâmetros e sem retorno
O segundo tipo de função é representado por aquelas que recebem valores no momento em
que são chamadas (parâmetros), mas que, no final, não devolvem valor para quem as
chamou (retorno).
16/08/2013 Programação em C - Funções 32
Funções sem passagem de parâmetros e com retorno
O terceiro tipo de função é representado por aquelas que não recebem valores no momento
em que são chamadas (parâmetros), mas que, no final, devolvem um valor para quem as
chamou (retorno).
16/08/2013 Programação em C - Funções 33
Funções com passagem de parâmetros e com retorno
O quarto tipo de função é representado por aquelas que recebem valores no momento em
que são chamadas (parâmetros), e que, no final, devolvem um valor para quem as chamou
(retorno).
16/08/2013 Programação em C - Funções 34
Uso de protótipos De acordo com as regras da linguagem C, uma função só pode chamar outra
função que tenha sido previamente definida ou declarada no programa. Assim,
por exemplo, se invertermos a ordem em que as funções estão definidas nos
programas apresentados nos slides anteriores, esse não poderão ser compilados
corretamente. Porém, se declararmos as funções que serão usadas em um
programa (adicionando seus protótipos), então essas funções podem ser
definidas em qualquer ordem no código-fonte desse programa.
Um protótipo nada mais é que uma declaração da interface de uma função, ou
seja, uma declaração que especifica o tipo, o nome e a lista de parâmetros que a
função precisa para ser corretamente executada.
É uma linha exatamente igual ao cabeçalho da função (terminando com um ponto
e vírgula que sempre deverá ser escrita antes da função main.
16/08/2013 Programação em C - Funções 35
Uso de protótipos Dada uma data, exiba o dia, o mês e o ano da mesma e informe se o ano dela é bissexto.
* Chama-se ano bissexto o ano ao qual é acrescentado um dia extra, ficando ele com 366 dias, um dia a mais do que os anos normais de 365 dias, ocorrendo a cada quatro anos (exceto anos múltiplos de 100 que não são múltiplos de 400). Isto é feito com o objetivo de manter o calendário anual ajustado com a translação da Terra e com os eventos sazonais relacionados às estações do ano. O último ano bissexto foi 2012 e o próximo será 2016.
16/08/2013 Programação em C - Funções 36
Referências Bibliográficas ASCENCIO, A. F. G.; CAMPOS, E. A. V. D. Fundamentos da Programação de
Computadores: Algoritmos, Pascal, C/C++ (Padrão ANSI) e Java. 3. ed. São
Paulo: Pearson Education do Brasil, 2012. 569 p.
PEREIRA, S. D. L. Algoritmos e Lógica de Programação em C: Uma abordagem
didática. 1. ed. São Paulo: Érica, 2010. 190 p.
16/08/2013 Programação em C - Funções 37