39
Prof. Adriano Teixeira de Souza

Estrutura de Dados - Procedimentos e Funções

Embed Size (px)

Citation preview

Page 1: Estrutura de Dados - Procedimentos e Funções

Prof. Adriano Teixeira de Souza

Page 2: Estrutura de Dados - Procedimentos e Funções

Procedimentos – são estruturas que agrupam um conjunto de comandos, que são executados quando o procedimento é chamado.

Funções – são procedimentos que retornam um valor ao seu término.

A Linguagem C não faz distinção.

Page 3: Estrutura de Dados - Procedimentos e Funções

Evitam que os blocos do programa fiquem grandes

demais e mais difíceis de ler e entender.

Ajudam a organizar o programa.

Permitem reaproveitamento de códigos construídos

anteriormente.

Evitam repetição de trechos de códigos,

minimizando erros e facilitando alterações.

Page 4: Estrutura de Dados - Procedimentos e Funções

<tipo> nome_da_função (<tipo> arg1, <tipo> arg2, ...,

<tipo> argN)

{

<corpo da função>

return valor_de_retorno;

}

Page 5: Estrutura de Dados - Procedimentos e Funções

int soma(int a, int b)

{

int c;

c = a + b;

return c;

}

Exemplo de uma função:

Page 6: Estrutura de Dados - Procedimentos e Funções

int soma(int a, int b)

{

int c;

c = a + b;

return c;

}

Toda função deve ter um tipo (char, int, float), o qual indicará o tipo de seu valor de retorno (saída).

Os argumentos (ou parâmetros) indicam o tipo e quais valores são

esperados para serem manipulados pela função (entrada).

Corpo da função

Page 7: Estrutura de Dados - Procedimentos e Funções

int random()

{

srand(time(NULL));

return (rand() % 100);

}

Uma função pode não ter argumentos, basta não informá-los. Exemplo:

Page 8: Estrutura de Dados - Procedimentos e Funções

A expressão contida no comando return é chamado de valor de retorno da função.

Esse comando é sempre o último a ser executado por uma função. Nada após ele será executado.

As funções só podem ser declaradas fora de outras funções. Lembre-se que o corpo do programa principal (main()) é uma função!

Page 9: Estrutura de Dados - Procedimentos e Funções

Uma forma clássica de realizarmos a invocação (ou chamada) de uma função é atribuindo o seu valor a uma variável:

Na verdade, o resultado da chamada de uma função é uma expressão, que pode ser usada em qualquer lugar que aceite uma expressão:

resultado = soma(x,y);

printf("Soma: %d\n", soma(a,b) );

Page 10: Estrutura de Dados - Procedimentos e Funções

int x, y, resultado;

int soma(int a, int b){

return (a + b);

}

int main(){

x = 3;

y = 5;

resultado = soma(x, y);

printf("%d\n", resultado);

}

Função que calcula a soma dos valores de x e y:

Page 11: Estrutura de Dados - Procedimentos e Funções

As variáveis x e y no exemplo anterior são chamadas de parâmetros reais.

Conforme exemplo anterior, os argumentos não possuem necessariamente os mesmos nomes que os parâmetros que a função espera.

Seus valores são apenas copiados para a função chamada, sem ser afetados pelas alterações nos parâmetros dentro da função.

Page 12: Estrutura de Dados - Procedimentos e Funções

É utilizado em procedimentos.

É um tipo que representa o “nada”, ou seja: ◦ uma variável desse tipo armazena conteúdo

indeterminado, ◦ uma função desse tipo retorna um conteúdo

indeterminado.

Indica que uma função não retorna nenhum valor, ou seja, é um procedimento.

Page 13: Estrutura de Dados - Procedimentos e Funções

void nome_do_procedimento (<tipo> parâmetro1,

<tipo> parâmetro2, ..., <tipo> parâmetroN)

{

<corpo do procedimento>

}

Page 14: Estrutura de Dados - Procedimentos e Funções

void imprime_dobro(int x)

{

printf("Dobro de x: %d", 2*x);

}

Exemplo de procedimento:

Page 15: Estrutura de Dados - Procedimentos e Funções

Para invocarmos um procedimento, devemos utilizá-lo como qualquer outro comando:

Compare a diferença de invocação de uma função:

procedimento(parâmetros);

resultado = função(parâmetros);

Page 16: Estrutura de Dados - Procedimentos e Funções

int x, y, resultado;

void soma()

{

resultado = x + y;

}

int main()

{

x = 3;

y = 5;

soma();

printf("%d\n", resultado);

}

Page 17: Estrutura de Dados - Procedimentos e Funções

Parâmetros ou argumentos são os valores recebidos e/ou retornados por uma função.

Podem ser divididos em duas categorias:

◦ Formais: correspondem aos parâmetros utilizados na definição da função.

◦ Reais: correspondem aos parâmetros da função chamadora utilizados para chamar a função.

Page 18: Estrutura de Dados - Procedimentos e Funções

int soma(int a, int b)

{

return (a + b);

}

int main()

{

int x = 3;

int y = 5;

printf("%d\n", soma(x + y));

}

Parâmetros reais

Parâmetros formais

Page 19: Estrutura de Dados - Procedimentos e Funções

É o mecanismo de informar sobre quais valores o processamento definido na função deve ser realizado.

Os parâmetros são passados para uma função de acordo com a sua posição.

Os parâmetros formais de uma função se comportam como variáveis locais (criados na entrada e destruídos na saída)

Existem duas categorias: ◦ Por valor ◦ Por referência

Page 20: Estrutura de Dados - Procedimentos e Funções

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

1011 0011

1111 0101

0101 1010

0001 1001

var

var_interna

1111 0101

0101 1010

0001 1001

0000 0001

Os valores das variáveis externas (função chamadora) são copiados para as variáveis internas da função chamada.

Alteração no valor das variáveis terá efeito local à função chamada.

Page 21: Estrutura de Dados - Procedimentos e Funções

Os valores das variáveis externas não são passados para a função, mas sim os seus endereços.

Ocorre alteração no valor das variáveis externas.

Usamos os caracteres:

& - indica o endereço da variável

* - indica o conteúdo do apontador

Page 22: Estrutura de Dados - Procedimentos e Funções

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

1011 0011

1111 0101

0101 1010

0001 1001

var

Page 23: Estrutura de Dados - Procedimentos e Funções

Uma desvantagem da passagem por valor é que, se um item de dados grande está sendo passado, copiar esses dados pode consumir um tempo de processamento considerável.

Page 24: Estrutura de Dados - Procedimentos e Funções

Vetores têm um comportamento diferente quando usados como parâmetros ou valores de retorno de funções.

O compilador interpreta o nome de um vetor como o endereço do primeiro elemento do vetor.

Dessa forma, os vetores são sempre passados por referência, sem usar uma notação especial.

Page 25: Estrutura de Dados - Procedimentos e Funções

64a

<tipo> funcao(int vet[], ...)

{

...

}

64

Page 26: Estrutura de Dados - Procedimentos e Funções

Ao passar um vetor como parâmetro, se ele for alterado dentro da função, as alterações ocorrerão no próprio vetor e não em uma cópia.

Ao retornar um vetor como valor de retorno, não é feita uma cópia deste vetor.

Assim, o vetor retornado pode desaparecer, se ele foi declarado no corpo da função.

Ao passar um vetor como parâmetro, não é necessário fornecer o seu tamanho na declaração da função.

Porém, é importante lembrar que o vetor tem um tamanho que deve ser considerado pela função durante a manipulação dos dados.

64b

Page 27: Estrutura de Dados - Procedimentos e Funções

void show_matriz(int mat[][10], int n_linhas)

{

...

}

65

Quando o vetor é multidimensional, a possibilidade de não informar o tamanho na declaração da função se restringe apenas à primeira dimensão.

Page 28: Estrutura de Dados - Procedimentos e Funções

1) Faça um programa que: ◦ Leia um vetor “turma” de 5 alunos

◦ Cada registro/struct de aluno deve ter o numero de matrícula do aluno e suas notas de 4 bimestres.

◦ Faca um procedimento que Imprima a lista de matrícula e notas de cada aluno

◦ Faca uma funcao que tenha como parametro um registro de aluno e retorne a média das 4 nota

◦ Percorra o vetor de alunos e imprima a matricula e a média calculada( pela funcao criada) para cada aluno.

Prof. Adriano Teixeira de Souza

Page 29: Estrutura de Dados - Procedimentos e Funções

2) Escreva um programa em C que manipule um vetor de registros com dados de 10 trabalhadores de uma empresa, conforme a estrutura a seguir: ◦ int id; ◦ char nome[30]; ◦ char sexo; ◦ float salario;

O programa deve ter as seguintes funções: ◦ a) uma função para ler os dados dos 10 funcionários. ◦ b) uma procedimento para exibir os dados dos 10 funcionários. ◦ c) uma função que receba, como parâmetro, um caractere

correspondente ao sexo para exibir os dados somente dos funcionários do respectivo sexo.

◦ d) uma função que atualize o salário de todos os funcionários de acordo com o percentual informado como parâmetro.

Prof. Adriano Teixeira de Souza

Page 30: Estrutura de Dados - Procedimentos e Funções

Um objeto é dito recursivo se pode ser definido em termos de si próprio.

“Para fazer iogurte, você precisa de leite e de um pouco de iogurte.”

“Para entender recursividade, você primeiro tem de entender

recursividade.”

Page 31: Estrutura de Dados - Procedimentos e Funções

A recursão é uma forma interessante de resolver problemas, pois o divide em problemas menores de mesma natureza.

Um processo recursivo consiste de duas partes: ◦ O caso trivial, cuja solução é conhecida.

◦ Um método geral que reduz o problema a um ou mais problemas menores de mesma natureza.

Page 32: Estrutura de Dados - Procedimentos e Funções

Um programa recursivo é um programa que chama a si mesmo, direta ou indiretamente.

Vantagens ◦ Redução do tamanho do código fonte

◦ Permite descrever algoritmos de forma mais clara e Concisa

Desvantagens ◦ Redução do desempenho de execução devido ao tempo

para gerenciamento de chamadas

◦ Dificuldades na depuração de programas recursivos, especialmente se a recursão for muito profunda

Page 33: Estrutura de Dados - Procedimentos e Funções

Cada vez que uma função é chamada de forma recursiva, é alojado e guardado uma cópia dos seus parâmetros por forma a não perder os valores dos parâmetros das chamadas anteriores.

Em cada instância da função, só são diretamente acessíveis os parâmetros criados para esta instância, não sendo directamente acessíveis os parâmetros de outras instâncias.

Page 34: Estrutura de Dados - Procedimentos e Funções

As funções recursivas contêm duas partes fundamentais:

◦ Ponto de Parada: o ponto de parada da recursividade é

resolvido sem utilização de recursividade, sendo este ponto geralmente um limite superior ou inferior da regra geral.

◦ Regra Geral: o método geral da recursividade reduz a

resolução do problema através da invocação recursiva de casos mais pequenos, sendo estes casos mais pequenos resolvidos através da resolução de casos ainda mais pequenos, e assim sucessivamente, até atingir o ponto de parada que finaliza o método.

Page 35: Estrutura de Dados - Procedimentos e Funções

Cálculo do fatorial:

fat(n) = 1, se n = 1

n * fat(n-1), se n > 1

Page 36: Estrutura de Dados - Procedimentos e Funções

Como fica o Fatorial de 5?

Page 37: Estrutura de Dados - Procedimentos e Funções

int fat(int n)

{

if (n != 1)

return n * fat(n-1);

else

return 1;

}

Função recursiva que calcula o fatorial de um número:

Page 38: Estrutura de Dados - Procedimentos e Funções

3) Exponenciação. Escreva uma função recursiva eficiente que receba inteiros positivos k e n e calcule k n. (Suponha que kn cabe em um int.) Quantas multiplicações sua função executa aproximadamente?

2) Qual o valor de X (4)?

int X (int n) {

if (n == 1 || n == 2) return n;

else return X (n-1) + n * X (n-2);

}

Prof. Adriano Teixeira de Souza

Page 39: Estrutura de Dados - Procedimentos e Funções

4) A sequência de Fibonacci é dada pela seguinte fórmula:

Apresente uma solução por meio de função recursiva que calcule e imprima os números da sequência até o i-ésimo termo.

Prof. Adriano Teixeira de Souza