Buscar

Estrutura de Dados - Aula 04 - Procedimentos e Funções

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 39 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 39 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 39 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Prof. Adriano Teixeira de Souza 
 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. 
 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. 
<tipo> nome_da_função (<tipo> arg1, <tipo> arg2, ..., 
 <tipo> argN) 
{ 
 
<corpo da função> 
 
return valor_de_retorno; 
 
} 
int soma(int a, int b) 
{ 
int c; 
c = a + b; 
return c; 
} 
 Exemplo de uma função: 
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 
int random() 
{ 
srand(time(NULL)); 
return (rand() % 100); 
} 
 Uma função pode não ter argumentos, basta 
não informá-los. Exemplo: 
 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! 
 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) ); 
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: 
 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. 
 É 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. 
void nome_do_procedimento (<tipo> parâmetro1, 
 <tipo> parâmetro2, ..., <tipo> parâmetroN) 
{ 
<corpo do procedimento> 
} 
void imprime_dobro(int x) 
{ 
printf("Dobro de x: %d", 2*x); 
} 
 Exemplo de procedimento: 
 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); 
int x, y, resultado; 
 
void soma() 
{ 
resultado = x + y; 
} 
 
int main() 
{ 
x = 3; 
y = 5; 
soma(); 
printf("%d\n", resultado); 
} 
 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. 
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 
 É 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 
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. 
 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 
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 
 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. 
 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. 
64a 
<tipo> funcao(int vet[], ...) 
{ 
 ... 
} 
64 
 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 
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. 
 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 
 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çãopara 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 
 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.” 
 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. 
 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 
 
 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. 
 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. 
 Cálculo do fatorial: 
fat(n) = 
1, se n = 1 
n * fat(n-1), se n > 1 
 
 Como fica o Fatorial de 5? 
 
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: 
 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 
 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

Outros materiais