Escolar Documentos
Profissional Documentos
Cultura Documentos
8.1 – Introdução
8.2 – Escopo de validade de declarações
8.3 – Parâmetros e passagem de argumentos
8.4 – Prototipação de subprogramas
8.5 – Classes de alocação
8.6 – Recursividade
8.3 – Parâmetros e Passagem de
Argumentos
8.3.1 – Importância do uso de parâmetros
É comum subprogramas atuarem sobre um determinado
valor ou uma determinada variável para produzir um
resultado ou realizar uma tarefa
Exemplos:
begin
a := 10; b := 20; Comandos do
xxx (a, b); programa ppp
write (“a = ”, a, “; b = ”, b);
end. A palavra var antes da
declaração de y sinaliza
que a passagem é por
referência
Seja a execução deste programa:
program ppp;
var a, b: integer;
begin
a := 10; b := 20;
xxx (a, b);
write (“a = ”, a, “; b = ”, b);
? ?
end. a b
program ppp;
var a, b: integer;
begin
a := 10; b := 20;
xxx (a, b);
write (“a = ”, a, “; b = ”, b);
10
? 20
?
end. a b
Chamada da procedure xxx:
program ppp;
var a, b: integer;
begin
a := 10; b := 20;
xxx (a, b);
write (“a = ”, a, “; b = ”, b);
10 20
end. a b
Alocação dos parâmetros e passagem de argumentos:
program ppp;
var a, b: integer;
begin
a := 10; b := 20;
y
xxx (a, b);
write (“a = ”, a, “; b = ”, b);
10 20
end. a b
O valor de a foi copiado em x
A variável y foi alocada coincidindo com b
program ppp;
var a, b: integer;
begin
a := 10; b := 20;
y
xxx (a, b);
write (“a = ”, a, “; b = ”, b);
10 20
end. a b
program ppp;
var a, b: integer;
begin
a := 10; b := 20;
y
xxx (a, b);
write (“a = ”, a, “; b = ”, b);
10 20
end. a b
program ppp;
var a, b: integer;
begin
a := 10; b := 20;
y
xxx (a, b);
write (“a = ”, a, “; b = ”, b);
10 20
end. a b
program ppp;
var a, b: integer;
begin
a := 10; b := 20;
y
xxx (a, b);
write (“a = ”, a, “; b = ”, b);
10 33
end. a b
Desalocação dos parâmetros:
program ppp;
var a, b: integer;
begin
a := 10; b := 20;
y
xxx (a, b);
write (“a = ”, a, “; b = ”, b);
10 33
end. a b
program ppp;
var a, b: integer;
No vídeo a = 10; b = 33
Quando se deseja que o argumento sofra alterações dentro
do subprograma chamado: usar passagem por referência
int main ( ) {
int a = 5;
printf ("Antes de ff, a = %d\n", a);
ff (a);
printf ("Depois de ff, a = %d\n", a);
printf ("\n\n"); system ("pause"); return 0;
}
8.3.4 – Passagem por referência em C
#include <stdio.h>
#include <stdlib.h>
int main ( ) {
int i = 3, j = 8;
printf ("Antes de trocar, i = %d; j = %d\n", i, j);
trocar(&i, &j);
printf ("Depois de trocar, i = %d; j = %d\n", i, j);
printf ("\n\n"); system ("pause"); return 0;
}
Seja sua execução:
#include <stdio.h>
#include <stdlib.h>
Resultado
void trocar (int *p, int *q){
int aux;
aux = *p; *p = *q; *q = aux;
}
8 3
int main ( ) { i j
int i = 3, j = 8;
printf ("Antes de trocar, i = %d; j = %d\n", i, j);
trocar(&i, &j);
printf ("Depois de trocar, i = %d; j = %d\n", i, j);
printf ("\n\n"); system ("pause"); return 0;
}
Exercícios 8.3:
#include <stdio.h>
int i = 58, j = 49;
void gg (int i, int j, int k, int m) {
1. Dado o programa ao lado printf ("%7d%7d%7d%7d\n\n", i, j, k, m);
}
contendo variáveis void ff (int p, int q, int *r, int *s) {
globais, locais e funções int k, m;
gg (p, q, *r, *s); k = 100; m = 200;
com passagem de p = -1; q = -2; *r = -3; *s = -4;
argumentos por valor e gg (i, j, k, m); gg (p, q, *r, *s);
}
por referência, mostrar o main () {
que será escrito no vídeo int i, j, k, m;
i = 10; j = 20; k = 30; m = 40; gg (i, j, k, m);
pela sua execução {
int j, k;
i = 1; j = 2; k = 3; m = 4;
gg (i, j, k, m); ff (i, j, &k, &m);
}
gg (i, j, k, m);
}
2. A conjectura de Goldbach diz que todo número inteiro,
par, maior que 2, é a soma de dois números primos.
Computadores têm sido muito usados para testar essa
conjectura e nenhum contra-exemplo foi encontrado até
agora.
a) Escrever uma função que receba como argumento por
valor um número inteiro positivo e que retorne 1, se tal
número for primo, ou então zero, em caso contrário.
1098 = 5 + 1093
1100 = 3 + 1097
Capítulo VIII – Subprogramação
8.1 – Introdução
8.2 – Escopo de validade de declarações
8.3 – Parâmetros e passagem de argumentos
8.4 – Prototipação de subprogramas
8.5 – Classes de alocação
8.6 – Recursividade
8.4 – Prototipação de Subprogramas
Nos programas em C, funções devem ser declaradas antes
de serem invocadas
Programa
Pode-se organizar o programa de
forma a colocar primeiramente a Diretivas de pré-
função main processamento
Declarações
Depois vêm aquelas invocadas pela globais
main; depois, aquelas invocadas por Protótipos das
essas últimas funções
Função
E assim por diante main
Funções
Essa ordenação é interessante ao se auxiliares
utilizar a metodologia top-down
para o desenvolvimento de Programa
programas
No capítulo sobre ponteiros serão vistos protótipos de funções
com parâmetros do tipo variáveis indexadas, estruturas e funções
Capítulo VIII – Subprogramação
8.1 – Introdução
8.2 – Escopo de validade de declarações
8.3 – Parâmetros e passagem de argumentos
8.4 – Prototipação de subprogramas
8.5 – Classes de alocação
8.6 – Recursividade
8.5 – Classes de Alocação
8.5.1 - Generalidades
Exemplos:
b c x y z
int main () { d int ff (int x, int *y) {
int b, c, d; int z;
a = 10; b = 20; c = 30; z = x + a + *y;
d = ff (b, &c); a = 1; *y = 2;
printf (“- - -”, a, b, c, d); return z;
} }
Variáveis globais: comunicação nos 2 sentidos
Parâmetros por valor: da invocadora para a invocada
Parâmetros por referência: comunicação nos 2 sentidos
Valores retornados: da invocada para a invocadora
a
int a;
b c x y z
int main () { d int ff (int x, int *y) {
int b, c, d; int z;
a = 10; b = 20; c = 30; z = x + a + *y;
d = ff (b, &c); a = 1; *y = 2;
printf (“- - -”, a, b, c, d); return z;
} } retorno
Variáveis globais dificultam a modularidade e
portabilidade das funções
Gerador de
código Código
intermediário Fica a cargo do programador objeto
escolher o melhor modo de load i
R1: sub nn
Otimizador de comunicação entre os JZ R2
código módulos de seu programa JZ R2
intermediário load i
add j
Gerador de st i
J R1
código objeto
R2: - - - - -
8.5.4 – Variáveis em registradores
void f () {
static int a = 0; int b = 5;
printf ("a = %3d; b = %3d;", a, b);
b = i + 10;
printf (" b = %3d;\n", b);
Resultado
a += 3;
}
int main () {
for (i = 1; i <= 10; i++)
f ();
system ("pause");
return 0;
}
Variáveis estáticas externas oferecem um importante
serviço de privacidade, fundamental para a modularização
de programas
8.1 – Introdução
8.2 – Escopo de validade de declarações
8.3 – Parâmetros e passagem de argumentos
8.4 – Prototipação de subprogramas
8.5 – Classes de alocação
8.6 – Recursividade
8.6 – Recursividade
Para n = 5: 5! = 5 * 4!
= 5 * (4 * 3!)
= 5 * (4 * (3 * 2!))
= 5 * (4 * (3 * (2 * 1!)))
= 5 * (4 * (3 * (2 * 1)))
= 5 * (4 * (3 * 2))
= 5 * (4 * 6)
= 5 * 24
= 120
Exemplo 3: cálculo do mdc de números não-negativos
∞, para m = 0 e n = 0
m, para m > 0 e n = 0
mdc (m, n) =
n, para m = 0 e n > 0
mdc (n, m%n), para m e n > 0
int main() {
char c; int n;
printf ("Calculo do fatorial de n");
printf ("\n\n\tDigite n: "); scanf ("%d", &n);
printf ("\n\tFat(%d) = %d", n, fat(n));
printf ("\n\n"); system ("pause"); return 0;
}
#include <stdio.h> Exemplo 2: cálculo de mdc’s
#include <stdlib.h>
int mdc (int m, int n) { ∞, p/ m = 0 e n = 0
int r; mdc (m, n) = m, p/ m > 0 e n = 0
m = abs(m); n = abs(n); n, p/ m = 0 e n > 0
if (m==0 && n==0) r = -1; mdc (n, m%n),
else if (m == 0) r = n; p/ m e n > 0
else if (n == 0) r = m;
else r = mdc(n, m%n);
return r;
}
int main() {
char c; int m, n;
printf ("Calculo do mdc de m e n");
printf ("\n\n\tDigite m e n: "); scanf ("%d%d", &m, &n);
printf ("\n\tmdc(%d, %d) = %d", m, n, mdc(m, n));
printf ("\n\n"); system ("pause"); return 0;
}
8.6.3 – Execução de subprogramas recursivos
int main() {
char c; int n;
printf ("Calculo do fatorial de n");
printf ("\n\n\tDigite n: "); scanf ("%d", &n);
printf ("\n\tFat(%d) = %d", n, fat(n));
printf ("\n\n"); system ("pause"); return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main() {
char c; int n;
printf ("Calculo do fatorial de n");
printf ("\n\n\tDigite n: "); scanf ("%d", &n); 5
printf ("\n\tFat(%d) = %d", n, fat(n));
n
printf ("\n\n"); system ("pause"); return 0;
}
Valor digitado: 5
#include <stdio.h>
#include <stdlib.h>
fat – v1 fat – v2 fat – v3
Ackermann (m, n) =