• Nenhum resultado encontrado

funções

N/A
N/A
Protected

Academic year: 2021

Share "funções"

Copied!
38
0
0

Texto

(1)

Funções

(2)

Funções

• Motivação:

• Dividir tarefas grandes em tarefas menores:

– Facilita manutenção do código.

– As partes podem ser testadas separadamente.

• Reaproveitar código existente:

– Evitar a reescrita de um mesmo código repetidas vezes.

– Integração com códigos de outros programadores.

• Esconder detalhes:

– Permite uma visão de mais alto nível.

– Viabiliza programas mais complexos.

(3)

Funções

• Exemplo:

– Calcular o número de combinações de

m

elementos

tomados

p

a

p

(

p<=m

), não importando a ordem dos

elementos.

(4)

Funções

• Definição:

– Uma função é uma unidade de código de programa

autônoma desenhada para cumprir uma tarefa

particular (ex:

printf

,

sqrt

,

strcmp

).

• Sintaxe:

tipo

nome_da_função

(

lista de argumentos

){

Declarações de variáveis locais;

Bloco de comandos;

}

(5)

Funções

• Exemplo:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

(6)

Funções

• Exemplo:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } Corpo da função

(7)

Funções

• Exemplo:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } Lista de argumentos (parâmetros)

(8)

Funções

• Exemplo:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; } Chamada da função

(9)

Chamando Funções

comando1; comando2; Chamada da função; comando3; comando4; comandoA; comandoB; comandoC; comandoD; Corpo da Função

(10)

Chamando Funções

• Chamada a uma função:

– Aloca espaço para todas

variáveis locais

declaradas

na função.

– Inicializa os

parâmetros

com os valores passados

para a função.

– Desvia a execução

do código para o corpo da função.

• Após execução:

– Desaloca memória das

variávies locais

.

(11)

Variáveis locais

• Variáveis declaradas dentro de uma função e

argumentos são chamados de

variáveis locais

.

– Existem somente durante a execução da função.

– Podem ser acessadas apenas no corpo da função

onde foram declaradas.

• OBS: Variáveis locais com mesmo nome declaradas em

funções diferentes são variáveis distintas.

(12)

Variáveis locais

• Variáveis declaradas dentro de uma função e

argumentos são chamados de

variáveis locais

.

– Existem somente durante a execução da função.

– Podem ser acessadas apenas no corpo da função

onde foram declaradas.

• OBS: Variáveis locais com mesmo nome declaradas em

funções diferentes são variáveis distintas.

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); }

Possui 3 variáveis

locais:

(13)

Valor de Retorno

• Funções podem retornar um valor

(ex:

sqrt

retorna a

raiz quadrada de um número)

.

• O valor retornado deve ser

compatível

com o tipo da

função.

• O valor é retornado através do comando

return

que

causa a

saída imediata

da função.

• Funções que não retornam nada são chamadas de

procedimentos

e em C são implementadas como sendo

do tipo

void

.

(14)

Exemplo de Execução:

• O programa inicia a execução na

função principal (

main

).

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

(15)

Exemplo de Execução:

• É alocado espaço para as

variáveis locais da função

principal (

main

).

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

?

int

r

(16)

Exemplo de Execução:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

?

int

r

(17)

Exemplo de Execução:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

?

int

r

• É alocado espaço para as

variáveis locais da função.

?

int

a

?

int

b

?

int

q

(18)

Exemplo de Execução:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

?

int

r

• Os parâmetros são inicializados

com os valores passados para a

função.

5

int

a

3

int

b

?

int

q

(19)

Exemplo de Execução:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

?

int

r

• A variável

q

recebe o resultado

da divisão inteira.

5

int

a

3

int

b

1

int

q

(20)

Exemplo de Execução:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

?

int

r

• O resultado

2

da expressão

(a-q*b)

é calculado e retornado

pela função.

5

int

a

3

int

b

1

int

q

(21)

Exemplo de Execução:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

2

int

r

• A variável

r

recebe o valor de

retorno da função e as variáveis

locais da função são destruídas.

5

int a

3

int b

1

int q

(22)

Exemplo de Execução:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

2

int

r

• O conteúdo da variável

r

é

impresso na saída padrão.

(23)

Exemplo de Execução:

#include <stdio.h>

int resto(int a, int b){ int q; q = a/b; return (a-q*b); } int main(){ int r; r = resto(5,3); printf("Resto: %d\n",r); return 0; }

2

int r

• A função principal retorna

0

e a

execução do programa é

encerrada.

• As variáveis locais da função

principal são destruídas.

(24)

Passando variáveis como argumentos

• Quando passamos variáveis a uma função, os seus

conteúdos são copiados

(atribuídos)

para variáveis

locais

(parâmetros)

da função.

• Alterações nos parâmetros dentro da função não

alteram os valores das variáveis que foram passados.

Ex: A saída do programa acima será 1 e não 3.

void teste(int x){

x = 3; } int main(){ int x = 1; teste(x); printf("%d", x); return 0; }

(25)

Exemplo 2:

• Problema:

– Calcular o fatorial de um número.

• Solução:

double fatorial(int x){ double fat = 1.0; while(x>1){ fat = fat*x; x--; } return fat; }

(26)

Problema:

• Calcular o número de combinações de

m

elementos

tomados

p

a

p

(

p<=m

), não importando a ordem dos

elementos.

int binomial(int m, int p){ int b=0;

if(m>=0 && p>=0 && p<=m)

b = (int)(fatorial(m)/(fatorial(p)*fatorial(m-p))); return b;

}

(27)

Exemplo com Estruturas:

#include <stdio.h> struct Complexo{ float real; float imag; };

struct Complexo LeComplexo(){ struct Complexo A;

printf("Digite a parte real: "); scanf("%f",&A.real);

printf("Digite a parte imaginaria: "); scanf("%f",&A.imag);

return A; }

void PrintComplexo(struct Complexo A){

printf("%.2f + (%.2f)*i\n",A.real,A.imag); }

• Faça um programa que lê dois números complexos e

testa se eles são iguais:

(28)

Exemplo com Estruturas:

• Faça um programa que lê dois números complexos e

testa se eles são iguais:

(continuação)

int IgualdadeComplexos(struct Complexo A, struct Complexo B){ return (A.real==B.real && A.imag==B.imag); } int main(){ struct Complexo A; struct Complexo B; A = LeComplexo(); B = LeComplexo(); if(IgualdadeComplexos(A,B)) printf("Números iguais.\n"); else printf("Números distintos.\n"); return 0; }

(29)

Vetores como argumentos de funções

• Quando o nome de uma variável simples

(ex: int,

estrutura)

é passado na chamada da função, é gerada

uma cópia do conteúdo da variável fornecida em uma

variável local da função. Esse processo é conhecido

como

chamada por valor

.

– Ex: Todos exemplos até agora usaram chamadas por valor.

• Vetores podem conter grandes quantidades de dados,

logo copiar todos dados de um vetor em uma chamada

por valor é ineficiente. Em C, vetores são passados

por

referência

de modo que existe uma única cópia do vetor

(a original). É passado apenas o endereço do vetor para

a função.

(30)

Exemplo com Vetores:

• Faça uma função que copia uma string em outra.

#include <stdio.h> #define LIM 300

void StringCopy(char dest[], char src[]){ int i=0; while(src[i]!='\0'){ dest[i] = src[i]; i++; } dest[i] = '\0'; } int main(){

char A[LIM]= "String 1"; char B[LIM]= "String 2"; StringCopy(B, A);

printf("A: %s\n",A); printf("B: %s\n",B); return 0;

(31)

Exemplo com Vetores:

• Faça uma função que copia uma string em outra.

#include <stdio.h> #define LIM 300

void StringCopy(char dest[], char src[]){ int i=0; while(src[i]!='\0'){ dest[i] = src[i]; i++; } dest[i] = '\0'; } int main(){

char A[LIM]= "String 1"; char B[LIM]= "String 2"; StringCopy(B, A);

printf("A: %s\n",A); printf("B: %s\n",B); return 0;

}

Os tamanhos dos vetores

(32)

Exemplo com Vetores:

• Faça uma função que copia uma string em outra.

#include <stdio.h> #define LIM 300

void StringCopy(char dest[], char src[]){ int i=0; while(src[i]!='\0'){ dest[i] = src[i]; i++; } dest[i] = '\0'; } int main(){

char A[LIM]= "String 1"; char B[LIM]= "String 2"; StringCopy(B, A);

printf("A: %s\n",A); printf("B: %s\n",B); return 0;

}

O nome de um vetor sem o colchetes representa o

endereço do vetor que é

(33)

Exemplo com Vetores:

• Faça uma função que copia uma string em outra.

#include <stdio.h> #define LIM 300

void StringCopy(char dest[], char src[]){ int i=0; while(src[i]!='\0'){ dest[i] = src[i]; i++; } dest[i] = '\0'; } int main(){

char A[LIM]= "String 1"; char B[LIM]= "String 2"; StringCopy(B, A);

printf("A: %s\n",A); printf("B: %s\n",B); return 0;

}

Alterações nos elementos dos vetores possuem efeito

externo à função, pois atuam sobre o vetor original

(34)

• Matrizes são vetores de vetores e logo também são

passadas por

referência

.

• A função abaixo embaralha os dados de uma matriz:

Exemplo com Matrizes:

#include <stdio.h> #include <stdlib.h> #include <time.h> #define LIM 100

void EmbaralhaMatriz(int M[][LIM], int m, int n){ int i,j,x,y,tmp;

srand(time(NULL)); for(i=0; i<m; i++){ for(j=0; j<n; j++){ x = rand()%n; //valor de 0 a n-1. y = rand()%m; //valor de 0 a m-1. tmp = M[i][j]; M[i][j] = M[y][x]; M[y][x] = tmp; } } }

(35)

• Matrizes são vetores de vetores e logo também são

passadas por

referência

.

• A função abaixo embaralha os dados de uma matriz:

Exemplo com Matrizes:

#include <stdio.h> #include <stdlib.h> #include <time.h> #define LIM 100

void EmbaralhaMatriz(int M[][LIM], int m, int n){ int i,j,x,y,tmp;

srand(time(NULL)); for(i=0; i<m; i++){ for(j=0; j<n; j++){ x = rand()%n; //valor de 0 a n-1. y = rand()%m; //valor de 0 a m-1. tmp = M[i][j]; M[i][j] = M[y][x]; M[y][x] = tmp; } } } Somente a primeira dimensão pode ser omitida.

(36)

• Matrizes são vetores de vetores e logo também são

passadas por

referência

.

• A função abaixo embaralha os dados de uma matriz:

Exemplo com Matrizes:

#include <stdio.h> #include <stdlib.h> #include <time.h> #define LIM 100

void EmbaralhaMatriz(int M[][LIM], int m, int n){ int i,j,x,y,tmp;

srand(time(NULL)); for(i=0; i<m; i++){ for(j=0; j<n; j++){ x = rand()%n; //valor de 0 a n-1. y = rand()%m; //valor de 0 a m-1. tmp = M[i][j]; M[i][j] = M[y][x]; M[y][x] = tmp; } } } Número de linhas e colunas efetivamente em uso.

(37)

• Matrizes são vetores de vetores e logo também são

passadas por

referência

.

• A função abaixo embaralha os dados de uma matriz:

Exemplo com Matrizes:

#include <stdio.h> #include <stdlib.h> #include <time.h> #define LIM 100

void EmbaralhaMatriz(int M[][LIM], int m, int n){ int i,j,x,y,tmp;

srand(time(NULL)); for(i=0; i<m; i++){ for(j=0; j<n; j++){ x = rand()%n; //valor de 0 a n-1. y = rand()%m; //valor de 0 a m-1. tmp = M[i][j]; M[i][j] = M[y][x]; M[y][x] = tmp; } } }

Troca elementos de cada posição i, j por elementos

(38)

• A função principal abaixo pode ser usada para testar a

função que embaralha os dados de uma matriz:

Exemplo com Matrizes:

int main(){ int i,j; int A[LIM][LIM]={{1,2,3}, {4,5,6}, {7,8,9}}; EmbaralhaMatriz(A, 3, 3); for(i=0; i<3; i++){

for(j=0; j<3; j++) printf(" %4d",A[i][j]); printf("\n"); } return 0; }

Referências

Documentos relacionados

São variáveis declaradas dentro de um bloco {} do programa, podendo ser variáveis locais do main(), de um procedimento, de uma função, ou mesmo de um bloco de um dado comando.

Em suas tradições que foram meticulosamente registrada por eruditos muçulmanos, o profeta Muhammad, que Deus o louve, encorajou seus seguidores a buscar conhecimento 4.. Disse

• As variáveis do protótipo da função que recebem dados de entrada ou que retornam resultados (ou dados de saída) são designadas por parâmetros formais. Estes

Considerando o caso ótimo de rastreamento, onde apenas 1 atacante é encontrado, a análise dos filtros mostra que o Filtro de Bloom convencional em seu caso ótimo, onde

l  Os parâmetros da função são variáveis, separadas por vírgulas l  A variável nomeResultado, recebe o valor da função..

 O registro de ativação armazena os parâmetros e variáveis locais da função bem como o “ponto de retorno” no programa ou subprograma que chamou essa função..  Ao final

• O mecanismo de informar os valores a serem processados pela função chama-se passagem de parâmetros... • Mas, como os parâmetros de uma função são variáveis locais,

As questões apontadas nas narrativas suscitam algumas reflexões que compartilhamos, a partir das reflexões acerca da monocultura do saber (SANTOS, 2011) produzida