linguagem c - funções (danilo giacobo)

37
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

Upload: gustavo-fausto

Post on 12-Jan-2016

23 views

Category:

Documents


0 download

DESCRIPTION

Manual de funções para linguagem C, disponibilizados por Danilo Giacobo.

TRANSCRIPT

Page 1: 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

Page 2: Linguagem C - Funções (Danilo Giacobo)

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

Page 3: Linguagem C - Funções (Danilo Giacobo)

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

Page 4: Linguagem C - Funções (Danilo Giacobo)

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

Page 5: Linguagem C - Funções (Danilo Giacobo)

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

Page 6: Linguagem C - Funções (Danilo Giacobo)

A diretiva #define Uso da diretiva #define, com e sem parâmetros

16/08/2013 Programação em C - Funções 6

Page 7: Linguagem C - Funções (Danilo Giacobo)

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

Page 8: Linguagem C - Funções (Danilo Giacobo)

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

Page 9: Linguagem C - Funções (Danilo Giacobo)

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

Page 10: Linguagem C - Funções (Danilo Giacobo)

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

Page 11: Linguagem C - Funções (Danilo Giacobo)

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.

Page 12: Linguagem C - Funções (Danilo Giacobo)

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

Page 13: Linguagem C - Funções (Danilo Giacobo)

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

Page 14: Linguagem C - Funções (Danilo Giacobo)

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

Page 15: Linguagem C - Funções (Danilo Giacobo)

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.

Page 16: Linguagem C - Funções (Danilo Giacobo)

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.

Page 17: Linguagem C - Funções (Danilo Giacobo)

Variáveis locais e globais

16/08/2013 Programação em C - Funções 17

Page 18: Linguagem C - Funções (Danilo Giacobo)

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

Page 19: Linguagem C - Funções (Danilo Giacobo)

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.

Page 20: Linguagem C - Funções (Danilo Giacobo)

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.

Page 21: Linguagem C - Funções (Danilo Giacobo)

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

Page 22: Linguagem C - Funções (Danilo Giacobo)

Passagem de parâmetros por valor

16/08/2013 Programação em C - Funções 22

Page 23: Linguagem C - Funções (Danilo Giacobo)

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.

Page 24: Linguagem C - Funções (Danilo Giacobo)

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

Page 25: Linguagem C - Funções (Danilo Giacobo)

Passagem de parâmetros por referência

16/08/2013 Programação em C - Funções 25

Page 26: Linguagem C - Funções (Danilo Giacobo)

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.

Page 27: Linguagem C - Funções (Danilo Giacobo)

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.

Page 28: Linguagem C - Funções (Danilo Giacobo)

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

Page 29: Linguagem C - Funções (Danilo Giacobo)

Funções em arquivos separados (bibliotecas)

16/08/2013 Programação em C - Funções 29

rotinas.h exemplo.c

Page 30: Linguagem C - Funções (Danilo Giacobo)

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

Page 31: Linguagem C - Funções (Danilo Giacobo)

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

Page 32: Linguagem C - Funções (Danilo Giacobo)

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

Page 33: Linguagem C - Funções (Danilo Giacobo)

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

Page 34: Linguagem C - Funções (Danilo Giacobo)

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

Page 35: Linguagem C - Funções (Danilo Giacobo)

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

Page 36: Linguagem C - Funções (Danilo Giacobo)

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

Page 37: Linguagem C - Funções (Danilo Giacobo)

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