Escolar Documentos
Profissional Documentos
Cultura Documentos
Linguagem C
Procedimentos
e
Funções
Eliane Pozzebon
Procedimentos e Funções
<tipo>
<tipo> nome_da_função
nome_da_função (<tipo>
(<tipo> arg1,
arg1, <tipo>
<tipo> arg2,
arg2, ...,
...,
<tipo>
<tipo> argN)
argN)
{{
<corpo
<corpo da
da função>
função>
return
return valor_de_retorno;
valor_de_retorno;
}}
Funções
:: Como declarar
int
int soma(int
soma(int a,a, int
int b)
b)
{{
int
int c;c;
cc == aa ++ b;
b;
return
return c; c;
}}
Funções
:: Como declarar
Toda função deve ter um tipo (char, Os argumentos (ou parâmetros) indicam o
int, float), o qual indicará o tipo de tipo e quais valores são esperados para
seu valor de retorno (saída). serem manipulados pela função (entrada).
int
int soma(int
soma(int a,a, int
int b)
b)
{{
int
int c;c;
Corpo da função
cc == aa ++ b;
b;
return
return c; c;
}}
Funções
:: Como declarar
int
int random()
random()
{{
srand(time(NULL));
srand(time(NULL));
return
return (rand()
(rand() %% 100);
100);
}}
Funções
:: Como declarar
resultado
resultado == soma(x,y);
soma(x,y);
printf("Soma:
printf("Soma: %d\n",
%d\n", soma(a,b)
soma(a,b) );
);
Funções:: Invocando
Função que calcula a soma dos valores
de x e y:
int
int x,
x, y,
y, resultado;
resultado;
int
int soma(int
soma(int a,
a, int
int b){
b){
return
return (a
(a ++ b);
b);
}}
int
int main(){
main(){
xx == 3;
3;
yy == 5;
5;
resultado
resultado == soma(x,
soma(x, y);
y);
printf("%d\n",
printf("%d\n", resultado);
resultado);
}}
Funções
:: Invocando
É 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.
Procedimentos
:: Como declarar
void
void nome_do_procedimento
nome_do_procedimento (<tipo>
(<tipo> parâmetro1,
parâmetro1,
<tipo>
<tipo> parâmetro2,
parâmetro2, ...,
..., <tipo>
<tipo> parâmetroN)
parâmetroN)
{{
<corpo
<corpo do
do procedimento>
procedimento>
}}
Procedimentos
:: Como declarar
Exemplo de procedimento:
void
void imprime_dobro(int
imprime_dobro(int x)
x)
{{
printf("Dobro
printf("Dobro de
de x:
x: %d",
%d", 2*x);
2*x);
}}
Procedimentos
:: Invocando
procedimento(parâmetros);
procedimento(parâmetros);
resultado
resultado == função(parâmetros);
função(parâmetros);
Procedimentos
:: Invocando
int
int x,
x, y,
y, resultado;
resultado;
void
void soma()
soma()
{{
resultado
resultado == xx ++ y;
y;
}}
int
int main()
main()
{{
xx == 3;
3;
yy == 5;
5;
soma();
soma();
printf("%d\n",
printf("%d\n", resultado);
resultado);
}}
A função main()
<tipo>
<tipo> nome
nome (<tipo>
(<tipo> parâmetro1,
parâmetro1, <tipo>
<tipo>
parâmetro2,
parâmetro2, ...,
..., <tipo>
<tipo> parâmetroN);
parâmetroN);
Variáveis locais e globais
int
int nota;
nota;
void
void funcao()
funcao()
{{
int
int nota;
nota;
//
// Neste
Neste ponto,
ponto, nota
nota eh
eh variavel
variavel local.
local.
}}
Variáveis automáticas × estáticas
Exemplo:
– Considere um procedimento que simplifica uma
fração
– A fração é guardada em um vetor de dois
elementos:
posição 0: guarda o numerador
posição 1: guarda o denominador
– A fração é simplificada dividindo-se cada
elemento pelo máximo divisor comum
Variáveis automáticas × estáticas
void
void simplifica(int
simplifica(int f[])f[]) {{
int
int num,
num, den;
den;
num
num == f[0];
f[0];
den
den == f[1];
f[1];
while
while (den)
(den) //
// Equivale
Equivale aa (den
(den !=
!= 0)
0)
{{
int
int resto;
resto;
resto
resto == num
num %% den;
den;
num
num == den;
den;
den
den == resto;
resto;
}}
f[0]
f[0] == f[0]/num;
f[0]/num;
f[1]
f[1] == f[1]/num;
f[1]/num;
}}
Variáveis automáticas × estáticas
:: Situação da pilha de execução
resto
num
num
den
den
Após o laço while:
Depois do procedimento:
num
den
Variáveis automáticas × estáticas
int
int main()
main()
{{
int
int xx == 3;
3;
int
int yy == 5;
5;
printf("%d\n",
printf("%d\n", soma(x
soma(x ++ y));
y));
}}
Parâmetros
reais
Passagem de Parâmetros
Usamos os caracteres:
& - indica o endereço da variável
* - indica o conteúdo do apontador
Passagem de Parâmetros
:: Passagem por referência
0001 1001
0101 1010
1111 0101
1011 0011
0000 0001
0001 1001
var 0101 1010
1111 0101
1011 0011
0000 0001
0001 1001
0101 1010
1111 0101
1011 0011
0000 0001
0001 1001
0101 1010
1111 0101
1011 0011
0000 0001
0001 1001
0101 1010
1111 0101
1011 0011
Passagem de Parâmetros
<tipo>
<tipo> funcao(int
funcao(int vet[],
vet[], ...)
...)
{{
...
...
}}
Passagem de Vetores
void
void show_matriz(int
show_matriz(int mat[][10],
mat[][10], int
int n_linhas)
n_linhas)
{{
...
...
}}
Const
Parâmetros
– Argc (Número de argumentos recebidos)
É um número inteiro
Possui valor maior ou igual a 1(um)
– Argv (Guarda os argumentos recebidos)
É um vetor de ponteiros para strings
O primeiro argumento, argv[0], é sempre o nome do
programa
int
int main(int
main(int argc,
argc, char
char **argv)
**argv)
Parâmetros da função principal
:: argv, argc
./p66a
./p66a arg1
Exemplo. arg2
arg2 arg3
arg3 arg4
Ao executar:
arg1 arg4
argc = 5 p 6 6 a
0 a r g 1
argv 1
a r g 2
2
3 a r g 3
4
a r g 4
Funções
:: Recursividade
“Para
“Para entender
entender recursividade,
recursividade, você
você
primeiro
primeiro tem
tem de
de entender
entender recursividade.”
recursividade.”
Funções
:: Recursividade