Beruflich Dokumente
Kultur Dokumente
IEC012
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, int, float), o qual indicará o
tipo de seu valor de retorno
(saída).
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
Os argumentos (ou parâmetros)
indicam o tipo e quais valores são
esperados para serem manipulados
pela função (entrada).
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
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
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()
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
void
void simplifica(int
simplifica(int f[]) f[]) {{
A 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)
{{
B int
int resto;
resto;
resto
resto == num
num %% den;
den;
num
num == den;
den;
den
den == resto;
resto;
}}
C f[0]
f[0] == f[0]/num;
f[0]/num;
f[1]
f[1] == f[1]/num;
f[1]/num;
}}
D
Variáveis automáticas × estáticas
:: Situação da pilha de execução
resto
num num
den den
num
den
Variáveis automáticas × estáticas
/*
/* Proc.
Proc. impressao
impressao de
de var.
var. local
local estatica
estatica */
*/
void
void proc_est()
proc_est()
{{
static
static int
int var
var == 100;
100;
printf("Variavel
printf("Variavel estatica:
estatica: %d\n",
%d\n", --var);
--var);
}}
/*
/* Proc.
Proc. impressao
impressao de
de var.
var. local
local automatica
automatica */
*/
void
void proc_auto()
proc_auto()
{{
int
int var
var == 100;
100;
printf("Variavel
printf("Variavel automatica:
automatica: %d\n",
%d\n", --var);
--var);
}}
Variáveis automáticas × estáticas
/*
/* Funcao
Funcao principal
principal */
*/
int
int main(void)
main(void)
{{
/*
/* variavel
variavel local
local automatica
automatica */
*/
proc_auto();
proc_auto();
proc_auto();
proc_auto();
printf("\n");
printf("\n");
/*
/* variavel
variavel local
local estatica
estatica */
*/
proc_est();
proc_est();
proc_est();
proc_est();
return
return 0;
0;
}}
Parâmetros
Parâmetros formais
int
int soma(int
soma(int a,a, int
int b)
b)
{{
return
return (a
(a ++ b);
b);
}}
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
#include <stdio.h>
/* Calcula o quadrado de x */
int square (int x)
{
printf ("O quadrado e %d",(x*x));
return(0);
}
int main ()
{
int num;
printf ("Entre com um numero: ");
scanf ("%d",&num);
printf ("\n\n");
square(num);
return(0);
Passagem de Parâmetros
:: Passagem por valor
Na definição de square() dizemos
que a função receberá um
argumento inteiro x.
Quando fazemos a chamada à
função, o inteiro num é passado
como argumento.
Temos que satisfazer aos requisitos
da função quanto ao tipo e à
quantidade de argumentos
quando a chamamos.
Passagem de Parâmetros
:: Passagem por valor
Em seguida vamos dar um exemplo de
função de mais de uma variável.
Neste caso, os argumentos são separados por
vírgula e que deve-se explicitar o tipo de
cada um dos argumentos, um a um.
Note, também, que os argumentos passados
para a função não necessitam ser todos
variáveis porque mesmo sendo constantes
serão copiados para a variável de entrada da
função.
Passagem de Parâmetros
:: Passagem por valor
#include <stdio.h>
/* Multiplica 3 numeros */
int mult (float a, float b,float c)
{
printf ("%f",a*b*c);
return(0);
}
int main ()
{
float x,y;
x=23.5;
y=12.9;
mult (x,y,3.87);
return(0);
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
:: Passagem por referência
void main (void)
{
int num1,num2;
num1=100;
num2=200;
printf ("Antes: num1=%d num2=%d\n",num1,num2);
Swap (&num1,&num2);
printf ("Depois: num1=%d num2=%d\n",num1,num2);
}
Passagem de Parâmetros
:: Passagem por referência
#include <stdio.h>
int prod (int x, int y)
{
return (x*y);
}
int main ()
{
int saida;
saida = prod (12,7);
printf ("A saida e: %d\n",saida);
return(0);
}
Passagem de Parâmetros
:: Retornando Valores
<tipo>
<tipo> funcao(int
funcao(int vet[],
vet[], ...)
...)
{{
...
...
}}
Passagem de Vetores
:: Exemplo
void ler_vetor(int vet[], int n_elem)
void ler_vetor(int vet[], int n_elem)
{{
int i;
int i;
for (i = 0; i < n_elem; i++) {
for (i = 0; i < n_elem; i++) {
printf("vet[%d]: ", i);
printf("vet[%d]: ", i);
scanf("%d", &vet[i]);
scanf("%d", &vet[i]);
}}
}}
void imprime_vetor(int vet[], int n_elem)
void imprime_vetor(int vet[], int n_elem)
{{
int i;
int i;
for (i = 0; i < n_elem; i++)
for (i = 0; i < n_elem; i++)
printf("vet[%d]: %d\n", i, vet[i]);
printf("vet[%d]: %d\n", i, vet[i]);
}}
Passagem de Vetores
void
void show_matriz(int
show_matriz(int mat[][10],
mat[][10], int
int n_linhas)
n_linhas)
{{
...
...
}}
Passagem de Vetores
void
void show_matriz(int
show_matriz(int mat[][10],
mat[][10], int
int n_linhas)
n_linhas)
{{
...
...
}}
Passagem de Vetores
void mostra_matriz(int mat[][10], int lin)
void mostra_matriz(int mat[][10], int lin)
{{
int i, j;
int i, j;
for (i = 0; i < lin; i++) {
for (i = 0; i < lin; i++) {
for (j = 0; j < 10; j++)
for (j = 0; j < 10; j++)
printf("%2d ", mat[i][j]);
printf("%2d ", mat[i][j]);
printf("\n");
printf("\n");
}}
}}
Passagem de Vetores
int
int main(void)
main(void)
{{
int
int mat[][10]
mat[][10] == {{
{00,
{00, 01,
01, 02,
02, 03,
03, 04,
04, 05,
05, 06,
06, 07,
07, 08,
08, 09},
09},
{10,
{10, 11,
11, 12,
12, 13,
13, 14,
14, 15,
15, 16,
16, 17,
17, 18,
18, 19},
19},
{20,
{20, 21,
21, 22,
22, 23,
23, 24,
24, 25,
25, 26,
26, 27,
27, 28,
28, 29},
29},
{30,
{30, 31,
31, 32,
32, 33,
33, 34,
34, 35,
35, 36,
36, 37,
37, 38,
38, 39},
39},
{40,
{40, 41,
41, 42,
42, 43,
43, 44,
44, 45,
45, 46,
46, 47,
47, 48,
48, 49},
49},
{50,
{50, 51,
51, 52,
52, 53,
53, 54,
54, 55,
55, 56,
56, 57,
57, 58,
58, 59},
59},
{60,
{60, 61,
61, 62,
62, 63,
63, 64,
64, 65,
65, 66,
66, 67,
67, 68,
68, 69},
69},
{70,
{70, 71,
71, 72,
72, 73,
73, 74,
74, 75,
75, 76,
76, 77,
77, 78,
78, 79}};
79}};
mostra_matriz(mat,
mostra_matriz(mat, 8);
8);
return
return 0;
0;
}}
Const
void copiar(const char *origem, char *destino)
void copiar(const char *origem, char *destino)
{{
while (*origem)
while (*origem)
*destino++ = *origem++;
*destino++ = *origem++;
}}
int main(void)
int main(void)
{{
char origem[8] = "Manaus";
char origem[8] = "Manaus";
char destino[8];
char destino[8];
printf("Antes\t Origem:%s\n", origem);
printf("Antes\t Origem:%s\n", origem);
copiar(origem, destino);
copiar(origem, destino);
printf("Depois\t Origem:%s ", origem);
printf("Depois\t Origem:%s ", origem);
printf("Destino: %s\n", destino);
printf("Destino: %s\n", destino);
return 0;
return 0;
}}
Parâmetros da função principal
:: argv, argc
❖ Parâmetros
◗ Argc (Número de argumentos recebidos)
É um número inteiro
Possui valor maior ou igual a 1(um)
int
int main(int
main(int argc,
argc, char
char **argv)
**argv)
Parâmetros da função principal
:: argv, argc
❖ Exemplo. Ao executar:
./p66a
./p66a arg1
arg1 arg2
arg2 arg3
arg3 arg4
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 fazer
fazer iogurte,
iogurte, você
você precisa
precisa de
de
leite
leite ee de
de um
um pouco
pouco de
de iogurte.”
iogurte.”
“Para
“Para entender
entender recursividade,
recursividade, você
você
primeiro
primeiro tem
tem de
de entender
entender
recursividade.”
recursividade.”
Funções
:: Recursividade
❖ Cálculo do fatorial:
1, se n = 1
fat(n) =
n * fat(n-1), se n > 1
Funções
:: Recursividade – Fatorial
int
int fat(int
fat(int n)
n)
{{
if
if (n
(n !=
!= 1)
1)
return
return nn ** fat(n-1);
fat(n-1);
else
else
return
return 1;
1;
}}
Funções
:: Recursividade – Série de Fibonacci
}}
Funções
:: Recursividade – Série de Fibonacci
int
int fibo_it(int
fibo_it(int n) n)
{{
int
int i,
i, a,
a, b,b, c;
c;
if
if ((n==1)
((n==1) || || (n==2))
(n==2)) return
return 1;1;
else
else
{{
aa == 1;
1; bb == 1;
1;
for
for (i(i == 3;
3; ii <=
<= n;
n; i++)
i++)
{{
cc == aa ++ b;
b; aa == b;
b; bb == c;
c;
}}
return
return c; c;
}}
}}
Funções
:: Recursividade – Torre de Hanói
void hanoi(int n, char orig, char dest, char ajuda)
void hanoi(int n, char orig, char dest, char ajuda)
{{
if (n == 1)
if (n == 1)
printf("Mova disco %d de %c para %c \n", n, orig, dest);
printf("Mova disco %d de %c para %c \n", n, orig, dest);
else
else
{
{
hanoi(n1, orig, ajuda, dest);
hanoi(n1, orig, ajuda, dest);
printf("Mova disco %d de %c para %c \n", n, orig, dest);
printf("Mova disco %d de %c para %c \n", n, orig, dest);
hanoi(n1, ajuda, dest, orig);
hanoi(n1, ajuda, dest, orig);
}
}
}}
Macros
int
int main()
main() {{
int
int maxi;
maxi;
printf(TITULO);
printf(TITULO);
printf(MOSTRA(MAX));
printf(MOSTRA(MAX));
scanf("%d",
scanf("%d", &maxi);
&maxi);
printf("Valor
printf("Valor lido
lido de
de MAX
MAX == %d\n",
%d\n", maxi);
maxi);
}}
int
int main()
main() {{
int
int maxi;
maxi;
printf("maxi");
printf("maxi");
printf("Valor
printf("Valor (MAXIMO
(MAXIMO == %d):
%d): ",
", 100);
100);
scanf("%d",
scanf("%d", &maxi);
&maxi);
printf("Valor
printf("Valor lido
lido de
de MAX
MAX == %d\n",
%d\n", maxi);
maxi);
}}
Macros
❖ No exemplo anterior:
//
// Constante
Constante numérica
numérica
#define
#define MAX
MAX 100
100
//
// Constante
Constante de
de caracteres
caracteres
#define
#define TITULO
TITULO "maxi"
"maxi"
//
// Macro
Macro
#define
#define MOSTRA(x)
MOSTRA(x) "Valor
"Valor (MAXIMO
(MAXIMO == %d):
%d): ",
", xx
Macros
//
// Determina
Determina oo maior
maior entre
entre dois
dois números
números
#define
#define MAX(x)
MAX(x) (( ((x)
((x) >> (y))
(y)) ?? (x)
(x) :: (y)
(y) ))
//
// Determina
Determina oo menor
menor entre
entre dois
dois números
números
#define
#define MIN(x)
MIN(x) (( ((x)
((x) << (y))
(y)) ?? (x)
(x) :: (y)
(y) ))
Macros
#define
#define SOMA
SOMA (x,y)
(x,y) ((x)
((x) ++ (y));
(y));
printf(“Resultado:
printf(“Resultado: %d”,
%d”, SOMA(3,5));
SOMA(3,5));
❖ Após o pré-processamento:
printf(“Resultado:
printf(“Resultado: %d”,
%d”, ((3)
((3) ++ (5)););
(5)););
Macros
#define
#define SOMA
SOMA (x,y)
(x,y) ((x)
((x) ++ (y))
(y))
(x,y)
(x,y) ((x)
((x) ++ (y))
(y))
Questões