O documento discute funções e procedimentos em C. Explica que funções retornam valores ao contrário de procedimentos e que ambos podem receber parâmetros. Também aborda passagem de parâmetros por valor e por referência e o comportamento de vetores como parâmetros.
2. 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.
3. 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.
5. Exemplo de uma função:
int soma(int a, int b)
{
int c;
c = a + b;
return c;
}
6. Toda função deve ter um tipo Os argumentos (ou parâmetros)
(char, int, float), o qual indicará o indicam o tipo e quais valores são
tipo de seu valor de retorno esperados para serem manipulados
(saída). pela função (entrada).
int soma(int a, int b)
{
int c;
Corpo da função
c = a + b;
return c;
}
7. Uma função pode não ter argumentos, basta
não informá-los. Exemplo:
int random()
{
srand(time(NULL));
return (rand() % 100);
}
8. 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!
9. Uma forma clássica de realizarmos a invocação (ou
chamada) de uma função é atribuindo o seu valor a
uma variável:
resultado = soma(x,y);
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:
printf("Soma: %dn", soma(a,b) );
10. Função que calcula a soma dos valores de x e
y:
int x, y, resultado;
int soma(int a, int b){
return (a + b);
}
int main(){
x = 3;
y = 5;
resultado = soma(x, y);
printf("%dn", resultado);
}
11. 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.
12. É 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.
14. Exemplo de procedimento:
void imprime_dobro(int x)
{
printf("Dobro de x: %d", 2*x);
}
15. Para invocarmos um procedimento, devemos
utilizá-lo como qualquer outro comando:
procedimento(parâmetros);
Compare a diferença de invocação de uma função:
resultado = função(parâmetros);
16. int x, y, resultado;
void soma()
{
resultado = x + y;
}
int main()
{
x = 3;
y = 5;
soma();
printf("%dn", resultado);
}
17. 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.
18. Parâmetros formais
int soma(int a, int b)
{
return (a + b);
}
int main()
{
int x = 3;
int y = 5;
printf("%dn", soma(x + y));
}
Parâmetros
reais
19. É 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
20. 0001 1001
Os valores das
0101 1010
1111 0101
variáveis externas 1011 0011
0000 0001
(função chamadora) var 0001 1001
são copiados para as
0101
0000 1010
0001
1111
0001 0101
1001
variáveis internas da 1011
0101
0000
1111
0011
1010
0001
0101
função chamada. 0001 1001
0101 1010
1111 0101
Alteração no valor das 1011 0011
0000 0001
variáveis terá efeito var_interna 0001 1001
local à função
0101 1010
1111 0101
chamada. 1011 0011
0000 0001
0001 1001
0101 1010
1111 0101
1011 0011
21. 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
23. 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.
24. 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.
26. 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
27. Quando o vetor é multidimensional, a
possibilidade de não informar o tamanho na
declaração da função se restringe apenas à
primeira dimensão.
void show_matriz(int mat[][10], int n_linhas)
{
...
}
65
28. 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
29. 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
30. 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.”
31. 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.
32. 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
33. 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.
34. 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.
35. Cálculo do fatorial:
1, se n = 1
fat(n) =
n * fat(n-1), se n > 1
37. Função recursiva que calcula o fatorial de um
número:
int fat(int n)
{
if (n != 1)
return n * fat(n-1);
else
return 1;
}
38. 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
39. 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