• 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

 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

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.

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..

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