Funções e Procedimentos - Departamento de Computação e

Propaganda
SubSub-algoritmos:
Funções e Procedimentos
SubSub-algoritmos
‰ Em geral, um programa é executado linearmente, uma linha
após a outra, até o fim
‰ Entretanto, quando são utilizados sub-algoritmos, é possível
a realização de desvios na execução natural dos programas
‰ Assim, um programa é executado linearmente até a
chamada de um sub-algoritmo
‰ O programa que chama um sub-algoritmo (“chamador”) é
temporariamente suspenso e o controle é passado para o
sub-algoritmo, que é executado
‰ Ao terminar o sub-algoritmo, o controle retorna para o
programa que realizou a chamada (“chamador”)
‰ Tipos de Sub-algoritmos:
‰ Nesta aula veremos o conceito de
sub-algoritmo (ou sub-rotina):
funções e procedimentos
‰ Sub-algoritmos são blocos de
instruções que realizam tarefas
específicas
‰ O código de um sub-algoritmo é
carregado uma vez e pode ser
executado quantas vezes for
necessário
‰ Assim, os programas tendem a
ficar menores e mais organizados,
uma vez que o problema pode ser
dividido em tarefas menores
José Augusto Baranauskas
Departamento de Física e Matemática – FFCLRP-USP
Sala 226 – Bloco P2 – Fone (16) 3602-4361
E-mail: [email protected]
URL: http://fmrp.usp.br/augusto
ƒ Funções (functions)
ƒ Procedimentos (procedures)
2
Funções
Funções
‰É comum encontrar-se nas linguagens de
programação, várias funções embutidas, por
exemplo, sin (seno), cos (co-seno), abs
(valor absoluto), sqrt (raiz quadrada)
‰Funções embutidas podem ser utilizadas
diretamente em expressões
‰Por exemplo, o comando:
‰Essas funções são utilizadas em expressões como
se fossem simplesmente variáveis comuns
‰Como variáveis comuns, as funções têm (ou
retornam) um único valor
‰É responsabilidade do programador fornecer os
argumentos (ou parâmetros) necessários para a
função efetuar seus cálculos
‰Por exemplo
ƒ A função abs tem como parâmetro um número,
retornando um valor numérico
ƒ Em C/C++, a função pow tem como parâmetros dois
números, retornando um valor numérico
ƒ Em C/C++, a função strlen tem como parâmetro uma
string, retornando um valor numérico inteiro
ƒ hipotenusa Å sqrt(cateto1^2 + cateto2^2)
ƒ calcula a hipotenusa de um triângulo retângulo
como a raiz quadrada da soma dos quadrados
dos dois catetos
3
Funções
4
Função: Fluxo de Controle
‰A utilização de funções afeta o fluxo de
controle em um programa
‰Quando uma função é chamada, o programa
que chama a função fica em estado de
espera e o controle passa para as instruções
que definem a função
‰Após a execução da função com os
parâmetros fornecidos, o controle retorna ao
ponto de chamada da função, com o valor
calculado pela função
Algoritmo Exemplo
Início
declare x,y,valor : real
Função
abs
Instruções
definindo
a função abs
x Å -10
y Å 16
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
Memória
Endereço
Valor
Função
sqrt
5
Instruções
definindo
a função sqrt
6
1
Função: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y,valor : real
Função
abs
Função: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y,valor : real
Instruções
definindo
a função abs
x Å -10
Instruções
definindo
a função abs
x Å -10
y Å 16
y Å 16
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
Memória
Endereço
Função
abs
Memória
Valor
Função
sqrt
x
y
Instruções
definindo
a função sqrt
Endereço
Valor
x
-10
Função
sqrt
y
valor
Instruções
definindo
a função sqrt
valor
7
Função: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y,valor : real
Função
abs
Função: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y,valor : real
Instruções
definindo
a função abs
x Å -10
Função
abs
Instruções
definindo
a função abs
x Å -10
y Å 16
y Å 16
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
Memória
Endereço
8
Memória
Valor
x
-10
y
16
Função
sqrt
Instruções
definindo
a função sqrt
valor
Endereço
Valor
x
-10
y
16
Função
sqrt
Instruções
definindo
a função sqrt
valor
9
Função: Fluxo de Controle
10
Função: Fluxo de Controle
O controle é transferido para a função abs
Algoritmo Exemplo
Início
declare x,y,valor : real
O controle é transferido para a função abs
Função
abs
Algoritmo Exemplo
Início
declare x,y,valor : real
Instruções
definindo
a função abs
x Å -10
Instruções
definindo
a função abs
x Å -10
y Å 16
y Å 16
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
O código que define a
função é executado,
respeitando as
estruturas de controle
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
Memória
Endereço
Função
abs
Memória
Valor
x
-10
y
16
Função
sqrt
Instruções
definindo
a função sqrt
valor
Endereço
Valor
x
-10
y
16
Função
sqrt
Instruções
definindo
a função sqrt
valor
11
12
2
Função: Fluxo de Controle
Função: Fluxo de Controle
O controle é transferido para a função abs
Algoritmo Exemplo
Início
declare x,y,valor : real
Função
abs
Algoritmo Exemplo
Início
declare x,y,valor : real
Instruções
definindo
a função abs
Função
abs
Instruções
definindo
a função abs
Retorno do controle
x Å -10
x Å -10
Retorno do valor calculado pela função (10)
y Å 16
y Å 16
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
Memória
Endereço
Memória
Valor
x
-10
y
16
Função
sqrt
Instruções
definindo
a função sqrt
valor
Endereço
Valor
x
-10
y
16
Função
sqrt
Instruções
definindo
a função sqrt
valor
13
Função: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y,valor : real
Função
abs
Função: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y,valor : real
Instruções
definindo
a função abs
x Å -10
Função
abs
Instruções
definindo
a função abs
x Å -10
y Å 16
y Å 16
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
O controle é transferido para a função sqrt
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
O controle é transferido para a função sqrt
Memória
Endereço
14
Memória
Valor
x
-10
y
16
Função
sqrt
Instruções
definindo
a função sqrt
valor
Endereço
Valor
x
-10
y
16
valor
O código que define a
função é executado,
respeitando as
estruturas de controle
Função
sqrt
Instruções
definindo
a função sqrt
15
Função: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y,valor : real
Função
abs
Função: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y,valor : real
Instruções
definindo
a função abs
x Å -10
Instruções
definindo
a função abs
y Å 16
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
Memória
Memória
Valor
x
-10
y
16
valor
Função
abs
x Å -10
y Å 16
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
O controle é transferido para a função sqrt
Endereço
16
Função
sqrt
Retorno do controle
Instruções
definindo
a função sqrt
Retorno do valor calculado pela função (4)
17
Endereço
Valor
x
-10
y
16
valor
14
Função
sqrt
Instruções
definindo
a função sqrt
18
3
Função: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y,valor : real
Função
abs
Função: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y,valor : real
Instruções
definindo
a função abs
x Å -10
Instruções
definindo
a função abs
x Å -10
y Å 16
y Å 16
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
valor Å abs(x) + sqrt(y)
Escreva(valor)
Fim
Memória
Memória
Endereço
Função
abs
Valor
x
-10
y
16
valor
14
Função
sqrt
Endereço
Instruções
definindo
a função sqrt
Valor
Função
sqrt
Instruções
definindo
a função sqrt
19
20
Funções
Funções
‰ Em algumas situações, o programador gostaria de utilizar
(definir) novas funções
‰ Por analogia, na Matemática, escreve-se (ou define-se) uma
função por meio de parâmetros, por exemplo:
‰Como na Matemática, os parâmetros podem ser
nomeados livremente
ƒ Por exemplo, são equivalentes as funções
™f(x) = x2 – 3x + 2
™f(y) = y2 – 3y + 2
x2 -
ƒ f(x) =
3x + 2
Definição da função f
ƒ Esta função f foi definida em termos do parâmetro x
‰O nome da função é definido pelo programador e
segue a mesma norma de formação de
identificadores
‰Por exemplo, são equivalentes as funções
‰ Para saber o valor da função para um valor particular do
argumento x, por exemplo, x = 3, basta substituir este valor
onde aparece o parâmetro x:
ƒ f(3) = 32 - 3(3) + 2 = 2
“Ativação” da função
ƒ f(1) = 12 - 3(1) + 2 = 0
2
ƒ f(-1) = (-1) - 3(-1) + 2 = 6
ƒ
ƒ
ƒ
ƒ
‰ Uma vez definida a nova função, ela pode ser utilizada
sempre que necessária, mesmo em outras (novas) funções
f(x) = x2 – 3x + 2
g(x) = x2 – 3x + 2
f(y) = y2 – 3y + 2
g(y) = y2 – 3y + 2
21
22
Funções
Exemplo
‰ Funções podem ter mais de um parâmetro (argumento):
//--------------------------------------------------------// Encontra o máximo entre dois inteiros
Função Maximo(x,y : inteiro) : inteiro
declare max : inteiro
ƒ g(x,y) = x2 + y3
™ g possui 2 parâmetros
ƒ h(x,y,z) = x2 + 2y + z2
Se (x > y) Então
max Å x
Senão
max Å y
Fim Se
Retorne(max)
Fim Função
//--------------------------------------------------------Algoritmo TesteMaximo
Início
declare a,b : inteiro
™ h possui 3 parâmetros
‰ Pode-se avaliar cada uma dessas funções de forma
análoga:
ƒ g(3,2) = 32 + 23 = 9 + 8 = 17
ƒ h(1,3,2) = 12 + 2(3) + 22 = 1 + 6 + 4 = 11
‰ Notar a correspondência estabelecida entre os parâmetros
da definição da função e os parâmetros de ativação (ou
execução) da função
‰ No caso da função g, 3 é substituído para cada ocorrência
de x e 2 é substituído para cada ocorrência de y. Essa
ordem é fundamental, pois g(3,2) não é o mesmo que g(2,3)
a Å 5
b Å 10
Escreva(”Máximo de ”,a,” e ”,b,”=”,Maximo(a,b))
Escreva(”Máximo de ”,a+10,” e ”,b-5,”=”,Maximo(a+10,b-5))
Fim
23
24
4
Outro Exemplo
SubSub-algoritmos em C++
//--------------------------------------------------------// Encontra o máximo entre dois inteiros
Função Maximo(x,y : inteiro) : inteiro
declare max : inteiro
‰A declaração (definição) de um sub-algoritmo
(função ou procedimento) em C++ é similar à
do programa principal (main)
‰Sub-algoritmos preferencialmente devem ser
declarados antes do programa que os chama
‰É permitido declarar variáveis dentro do subalgoritmo
Se (x > y) Então
max Å x
Senão
max Å y
Fim Se
Retorne(max)
Fim Função
//--------------------------------------------------------// Encontra o máximo entre tres inteiros
Função Maximo3(a,b,c : inteiro) : inteiro
Retorne(Maximo(a,Maximo(b,c)))
Fim Função
//--------------------------------------------------------Algoritmo TesteMaximo
Início
declare a,b,c : inteiro
ƒ As variáveis declaradas dentro do sub-algoritmo,
incluindo os parâmetros são denominadas
variáveis locais
a Å 5
b Å 10
c Å 15
Escreva(Maximo3(a,b,c))
Fim
25
26
Funções em C++
Funções em C++
‰Função f(x) = x2 - 3x + 2
‰Função f(x) = x2 - 3x + 2
float f(float x)
{
return(x * x - 3 * x + 2);
}
float f(float x)
{
return(x * x - 3 * x + 2);
}
Indica o tipo de
dado que a função deve retornar.
Neste caso, a função retorna um
número real
27
28
Funções em C++
Funções em C++
‰Função f(x) = x2 - 3x + 2
‰Função f(x) = x2 - 3x + 2
float f(float x)
{
return(x * x - 3 * x + 2);
}
float f(float x)
{
return(x * x - 3 * x + 2);
}
Indica o tipo de dado do primeiro
parâmetro da função. Neste caso
é um número real
Indica o nome da função. Neste
caso, f
29
30
5
Funções em C++
Funções em C++
‰Função f(x) = x2 - 3x + 2
‰Função f(x) = x2 - 3x + 2
float f(float x)
{
return(x * x - 3 * x + 2);
}
float f(float x)
{
return(x * x - 3 * x + 2);
}
Indica o nome do primeiro
parâmetro da função. Neste
caso, x
Indica o que deve ser retornado
pela função
31
32
Funções em C++
Exemplo de Chamada em C++
‰Função f(x) = x2 - 3x + 2
#include <iostream>
using namespace std;
//-----------------------------------------------------------float f(float x)
/* definicao da funcao f */
{
return x * x - 3 * x + 2;
}
//-----------------------------------------------------------int main()
/* programa principal */
{ float a,r;
float f(float x)
{ float r;
r = x * x - 3 * x + 2;
return r;
}
a = 3;
/* utilizar a funcao numa expressao simples */
r = f(a);
/* ativacao de f */
cout << ”Valor de f(“ << a << “)=” << r << endl;
/* utilizar a funcao numa expressao mais elaborada */
r = f(2*a) + 3 * f(1) + 2 * f(-1); /* ativacao de f */
cout << r << endl;
return 0;
Se houver necessidade,
variáveis (locais) adicionais
podem ser declaradas dentro da
função, de forma análoga à
declaração de variáveis no
programa principal
}
33
34
Funções em C++
Funções em C++
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
Memória
Endereço
Valor
quociente = 1.0 * dividendo / divisor;
return quociente;
Valor
quociente = 1.0 * dividendo / divisor;
return quociente;
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Memória
Memória
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
Memória
Endereço
Endereço
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
Valor
}
Endereço
Valor
a
3
b
4
}
35
36
6
Funções em C++
Funções em C++
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
Memória
Endereço
Valor
quociente = 1.0 * dividendo / divisor;
return quociente;
quociente = 1.0 * dividendo / divisor;
return quociente;
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Valor
dividendo
3
divisor
4
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Memória
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
Memória
Endereço
Memória
Endereço
Valor
a
3
b
4
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
}
Endereço
Valor
a
3
b
4
}
37
38
Funções em C++
Funções em C++
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
quociente = 1.0 * dividendo / divisor;
return quociente;
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Memória
Endereço
Valor
dividendo
3
divisor
dividendo
quociente = 1.0 * dividendo / divisor;
return quociente;
4
quociente
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Memória
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
Memória
Endereço
Valor
3
divisor
4
quociente
0.75
Memória
Endereço
Valor
a
3
b
4
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
}
Endereço
Valor
a
3
b
4
}
39
40
Funções em C++
Funções em C++
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
quociente = 1.0 * dividendo / divisor;
return quociente;
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Memória
Endereço
Valor
dividendo
3
divisor
4
quociente
0.75
Valor
quociente = 1.0 * dividendo / divisor;
return quociente;
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Memória
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
Memória
Endereço
Memória
Endereço
Valor
a
3
b
4
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
}
3/4=0.75
Endereço
Valor
a
3
b
4
}
41
42
7
Funções em C++
Funções em C++
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
Memória
Endereço
Valor
quociente = 1.0 * dividendo / divisor;
return quociente;
quociente = 1.0 * dividendo / divisor;
return quociente;
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
3/4=0.75
Valor
dividendo
4
divisor
3
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Memória
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
Memória
Endereço
Memória
Endereço
Valor
a
3
b
4
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
}
3/4=0.75
Endereço
Valor
a
3
b
4
}
43
44
Funções em C++
Funções em C++
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
quociente = 1.0 * dividendo / divisor;
return quociente;
Memória
Endereço
Valor
dividendo
4
divisor
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
dividendo
quociente = 1.0 * dividendo / divisor;
return quociente;
3
quociente
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Memória
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
3/4=0.75
Valor
4
divisor
3
quociente
1.33
Memória
Endereço
Valor
a
3
b
Memória
Endereço
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
4
}
3/4=0.75
Endereço
Valor
a
3
b
4
}
45
46
Funções em C++
Funções em C++
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
quociente = 1.0 * dividendo / divisor;
return quociente;
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Memória
Endereço
Valor
dividendo
4
divisor
3
quociente
1.33
3/4=0.75
Valor
quociente = 1.0 * dividendo / divisor;
return quociente;
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Memória
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
Memória
Endereço
Memória
Endereço
Valor
a
3
b
4
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
}
3/4=0.75
4/3=1.33
Endereço
Valor
a
3
b
4
}
47
48
8
Funções em C++
Funções em C++
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
#include <iostream>
using namespace std;
//-----------------------------------------------------float divisao(int dividendo, int divisor)
{ float quociente;
Memória
Endereço
Valor
quociente = 1.0 * dividendo / divisor;
return quociente;
Valor
quociente = 1.0 * dividendo / divisor;
return quociente;
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
}
//-----------------------------------------------------int main()
{ int a=3, b=4;
Memória
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
Memória
Endereço
3/4=0.75
4/3=1.33
Memória
Endereço
Valor
a
3
b
4
cout << a << ”/” << b << ”=”
<< divisao(a,b) << endl;
cout << b << ”/” << a << ”=”
<< divisao(b,a) << endl;
return 0;
}
Endereço
Valor
3/4=0.75
4/3=1.33
}
49
50
∞
Exemplo
‰
Exemplo
A constante especial π desempenha um importante papel
na matemática. Não é surpresa que haja muitos métodos
de obter aproximações numéricas de π. Muitas destas
aproximações envolvem operações com séries infinitas.
Dentre essa séries temos:
i
∞
//------------------------------------------------------// Calcula o valor de Pi usando serie com N termos
Função Pi(N : inteiro) : real
declare soma
: real
// variáveis locais
i,sinal
: inteiro
soma Å 0.0
sinal Å 1
Para i Å 0 até N-1 Faça
soma Å soma + sinal/(2.0*i+1.0)
sinal Å -sinal
Fim Para
retorne 4*soma
Fim Função
//------------------------------------------------------Algoritmo ImprimePi. Testa função Pi.
Início
declare A : inteiro
( −1)
π = 4∑
i = 0 2i + 1
‰
‰
(−1)i
i = 0 2i + 1
π = 4∑
Para cálculos práticos, as séries infinitas devem terminar
após um número finito de termos, penalizando a precisão
do resultado
Preparar uma função para calcular π de acordo com a
série acima. A função deve aceitar, como parâmetro, o
valor N, indicando o número de termos a serem utilizados
nos cálculos
Escreva(”Numero de termos = ”)
Leia(A)
Escreva(”Valor de Pi = ”,Pi(A),” com ”,A,” termos”)
Fim
51
52
∞
Exemplo em C++
(−1)i
i = 0 2i + 1
π = 4∑
Procedimentos
‰ Em algumas situações desejamos especificar uma operação
que não é convenientemente determinada como parte de
uma expressão
‰ Nesses casos, utilizamos outra forma de sub-algoritmo: o
procedimento
‰ Embora a função e o procedimento sejam similares, existem
duas diferenças importantes:
#include <iostream>
using namespace std;
//------------------------------------------------------// Calcula o valor de Pi usando serie com N termos
float Pi(int N)
{ float soma=0.0;
int i,sinal=1;
for(i=0; i<=N-1; i++)
{ soma = soma + sinal/(2.0*i+1.0);
sinal = -sinal;
}
return 4*soma;
ƒ Numa chamada de procedimento, a execução do programa que o
chamou é interrompida, passando o controle ao procedimento
chamado. Após a execução do procedimento, o controle retorna ao
programa que efetuou a chamada no comando imediatamente
subseqüente. A execução do programa continua a partir desse
ponto
ƒ Não existe retorno de um único valor como no caso da função.
Qualquer valor a ser retornado por um procedimento retorna ao
programa que efetuou a chamada por meio de seus parâmetros
}
//------------------------------------------------------// Testa função Pi.
int main()
{ int A;
cout << ”Numero de termos = ”;
cin >> A;
cout << ”Valor de Pi = ” << Pi(A)
<< ” com ” << A << ” termos” << endl;
return 0;
}
53
54
9
Procedimento: Fluxo de Controle
Procedimento: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y : real
Algoritmo Exemplo
Início
declare x,y : real
x Å 3
x Å 3
y Å 2
divide(x,y)
Escreva(x,y)
Fim
Procedimento
divide
y Å 2
Instruções
definindo o
procedimento divide
divide(x,y)
Escreva(x,y)
Fim
Memória
Endereço
Procedimento
divide
Instruções
definindo o
procedimento divide
Memória
Valor
Endereço
Valor
x
y
55
Procedimento: Fluxo de Controle
56
Procedimento: Fluxo de Controle
Algoritmo Exemplo
Início
declare x,y : real
Algoritmo Exemplo
Início
declare x,y : real
x Å 3
x Å 3
y Å 2
divide(x,y)
Escreva(x,y)
Fim
Procedimento
divide
y Å 2
Instruções
definindo o
procedimento divide
divide(x,y)
Escreva(x,y)
Fim
Memória
Procedimento
divide
Instruções
definindo o
procedimento divide
Memória
Endereço
Valor
Endereço
Valor
x
3
x
3
y
2
y
57
Procedimento: Fluxo de Controle
58
Procedimento: Fluxo de Controle
O controle é transferido para o procedimento divide
Algoritmo Exemplo
Início
declare x,y : real
Algoritmo Exemplo
Início
declare x,y : real
x Å 3
x Å 3
y Å 2
divide(x,y)
Escreva(x,y)
Fim
Procedimento
divide
y Å 2
Instruções
definindo o
procedimento divide
divide(x,y)
Escreva(x,y)
Fim
Memória
Procedimento
divide
Instruções
definindo o
procedimento divide
Memória
Endereço
Valor
Endereço
Valor
x
3
x
3
y
2
y
2
59
60
10
Procedimento: Fluxo de Controle
Procedimento: Fluxo de Controle
O controle é transferido para o procedimento divide
O controle é transferido para o procedimento divide
Algoritmo Exemplo
Início
declare x,y : real
Algoritmo Exemplo
Início
declare x,y : real
x Å 3
x Å 3
y Å 2
Procedimento
divide
divide(x,y)
Escreva(x,y)
Fim
y Å 2
Instruções
definindo o
procedimento divide
divide(x,y)
Escreva(x,y)
Fim
Memória
Memória
Endereço
Valor
Endereço
Valor
x
3
x
3
y
2
y
2
O código que define o
procedimento é
executado, respeitando
as estruturas de
controle
Procedimento
divide
Instruções
definindo o
procedimento divide
Retorno do controle no
comando subseqüente
61
Procedimento: Fluxo de Controle
Exemplo
//--------------------------------------------------------// Calcula e imprime quociente e resto entre dois inteiros
Procedimento divide(dividendo, divisor : inteiro)
declare quociente,resto : inteiro
Algoritmo Exemplo
Início
declare x,y : real
quociente Å dividendo / divisor
resto Å dividendo - quociente * divisor
Escreva(”quociente = ”,quociente,” resto = ”,resto)
Fim Procedimento
//--------------------------------------------------------Algoritmo TestaDivide
Início
declare a,b : inteiro
x Å 3
y Å 2
divide(x,y)
Escreva(x,y)
Fim
Procedimento
divide
Instruções
definindo o
procedimento divide
Memória
Endereço
62
a Å 5
b Å 3
divide(a,b)
divide(a*b-1,b+1)
Fim
Valor
63
64
Procedimentos em C++
Procedimentos em C++
void divide(int dividendo, int divisor)
{ int quociente,resto;
void divide(int dividendo, int divisor)
{ int quociente,resto;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
}
Indica um procedimento. Em
C/C++ todo procedimento pode
ser visto como uma função que
não retorna valor algum
65
66
11
Procedimentos em C++
Procedimentos em C++
void divide(int dividendo, int divisor)
{ int quociente,resto;
void divide(int dividendo, int divisor)
{ int quociente,resto;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
}
Indica o tipo do primeiro
parâmetro. Neste caso, é um
inteiro.
Indica o nome do procedimento.
Neste caso, divide
67
68
Procedimentos em C++
Procedimentos em C++
void divide(int dividendo, int divisor)
{ int quociente,resto;
void divide(int dividendo, int divisor)
{ int quociente,resto;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
}
Indica o nome do primeiro
parâmetro. Neste caso,
dividendo
Indica o tipo do segundo
parâmetro. Neste caso, é um
inteiro.
69
70
Procedimentos em C++
Procedimentos em C++
void divide(int dividendo, int divisor)
{ int quociente,resto;
void divide(int dividendo, int divisor)
{ int quociente,resto;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
}
Indica o nome do segundo
parâmetro. Neste caso, divisor
Declara duas variáveis locais do
tipo inteiro.
71
72
12
Procedimentos em C++
Procedimentos em C++
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
}
//-----------------------------------------int main()
{ int a=5,b=3;
divide(a,b);
divide(a*b-1,b+1);
return 0;
Memória
Endereço
Valor
Memória
Endereço
Valor
divide(a,b);
divide(a*b-1,b+1);
return 0;
}
}
73
74
Procedimentos em C++
Procedimentos em C++
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
Memória
Endereço
Valor
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
divide(a,b);
divide(a*b-1,b+1);
return 0;
Memória
Endereço
Valor
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
Memória
Endereço
Valor
a
5
b
3
divide(a,b);
divide(a*b-1,b+1);
return 0;
}
Memória
Endereço
Valor
a
5
b
3
}
75
76
Procedimentos em C++
Procedimentos em C++
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
divide(a,b);
divide(a*b-1,b+1);
return 0;
Memória
Endereço
Valor
dividendo
5
divisor
3
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
Memória
Endereço
Valor
a
5
b
3
divide(a,b);
divide(a*b-1,b+1);
return 0;
}
Memória
Endereço
Valor
dividendo
5
divisor
3
quociente
resto
Memória
Endereço
Valor
a
5
b
3
}
77
78
13
Procedimentos em C++
Procedimentos em C++
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
divide(a,b);
divide(a*b-1,b+1);
return 0;
Memória
Endereço
Valor
dividendo
5
divisor
3
quociente
1
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
resto
}
//-----------------------------------------int main()
{ int a=5,b=3;
Memória
Endereço
Valor
a
5
b
3
divide(a,b);
divide(a*b-1,b+1);
return 0;
}
Memória
Endereço
Valor
dividendo
5
divisor
3
quociente
1
resto
2
Memória
Endereço
Valor
a
5
b
3
}
79
80
Procedimentos em C++
Procedimentos em C++
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
quociente = 1 resto = 2
divide(a,b);
divide(a*b-1,b+1);
return 0;
Memória
Endereço
Valor
dividendo
5
divisor
3
quociente
1
resto
2
Valor
a
5
b
3
Valor
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
Memória
Endereço
Memória
Endereço
quociente = 1 resto = 2
divide(a,b);
divide(a*b-1,b+1);
return 0;
}
Memória
Endereço
Valor
a
5
b
3
}
81
82
Procedimentos em C++
Procedimentos em C++
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
Memória
Endereço
Valor
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
}
//-----------------------------------------int main()
{ int a=5,b=3;
quociente = 1 resto = 2
divide(a,b);
divide(a*b-1,b+1);
return 0;
Memória
Endereço
Valor
a
5
b
3
quociente = 1 resto = 2
divide(a,b);
divide(a*b-1,b+1);
return 0;
}
Memória
Endereço
Valor
dividendo
14
divisor
4
Memória
Endereço
Valor
a
5
b
3
}
83
84
14
Procedimentos em C++
Procedimentos em C++
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
quociente = 1 resto = 2
divide(a,b);
divide(a*b-1,b+1);
return 0;
Memória
Endereço
Valor
dividendo
14
divisor
4
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
quociente
resto
}
//-----------------------------------------int main()
{ int a=5,b=3;
Memória
Endereço
Valor
a
5
b
3
quociente = 1 resto = 2
divide(a,b);
divide(a*b-1,b+1);
return 0;
}
Memória
Endereço
Valor
dividendo
14
divisor
4
quociente
3
resto
Memória
Endereço
Valor
a
5
b
3
}
85
86
Procedimentos em C++
Procedimentos em C++
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
quociente = 1 resto = 2
divide(a,b);
divide(a*b-1,b+1);
return 0;
Memória
Endereço
Valor
dividendo
14
divisor
4
quociente
3
resto
2
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
Memória
Endereço
Valor
a
5
b
3
divide(a,b);
divide(a*b-1,b+1);
return 0;
}
quociente = 1 resto = 2
quociente = 3 resto = 2
Memória
Endereço
Valor
dividendo
14
divisor
4
quociente
3
resto
2
Memória
Endereço
Valor
a
5
b
3
}
87
88
Procedimentos em C++
Procedimentos em C++
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
Memória
Endereço
Valor
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
}
//-----------------------------------------int main()
{ int a=5,b=3;
divide(a,b);
divide(a*b-1,b+1);
return 0;
quociente = 1 resto = 2
quociente = 3 resto = 2
Memória
Endereço
Valor
a
5
b
3
divide(a,b);
divide(a*b-1,b+1);
return 0;
}
quociente = 1 resto = 2
quociente = 3 resto = 2
Memória
Endereço
Valor
Memória
Endereço
Valor
a
5
b
3
}
89
90
15
Procedimentos em C++
#include <iostream>
using namespace std;
//-----------------------------------------void divide(int dividendo, int divisor)
{ int quociente,resto;
Passagem de Parâmetros
‰Em cada chamada de um procedimento ou
função, uma correspondência é estabelecida
entre os argumentos (ou parâmetros) da
chamada particular e os parâmetros (ou
argumentos) de definição do sub-algoritmo
‰Existem duas formas de executar essa
correspondência:
Memória
Endereço
Valor
quociente = dividendo / divisor;
resto = dividendo - quociente * divisor;
cout << ”quociente = “ << quociente
<< “ resto = ” << resto << endl;
}
//-----------------------------------------int main()
{ int a=5,b=3;
divide(a,b);
divide(a*b-1,b+1);
return 0;
quociente = 1 resto = 2
quociente = 3 resto = 2
Memória
Endereço
Valor
ƒ 1) passagem de parâmetros por valor
ƒ 2) passagem de parâmetros por variável (ou por
referência ou por endereço)
}
91
92
Passagem de Parâmetros
Passagem de Parâmetros
‰ Passagem por Valor
‰ Em pseudo-código a escolha de passagem por valor ou por
variável é efetuada na definição de cada parâmetro
‰ Parâmetros passados por valor são declarados como
variáveis comuns
ƒ Ao ser efetuada uma chamada de sub-algoritmo, os parâmetros
passados por valor são calculados e seus valores são atribuídos aos
parâmetros de definição; ou seja, os valores são copiados para os
parâmetros de definição
ƒ Quaisquer alterações (nos valores das variáveis passadas por valor)
efetuadas dentro do sub-algoritmo não causam alterações nos
parâmetros de chamada
ƒ Função f1(a:inteiro, b:real, c:inteiro) : real
™ parâmetros a, b, c são passados por valor
ƒ Procedimento p1(n:inteiro, a[1..100]:real)
™ parâmetros n, a são passados por valor
‰ Passagem por Variável
‰ Parâmetros passados por variável devem ser precedidos
pelo símbolo var antes do nome do parâmetro
ƒ Na passagem por variável, ao ser efetuada uma chamada de subalgoritmo, os endereços dos parâmetros de chamada são passados
aos parâmetros de definição, ou seja, a própria variável de chamada
é passada
ƒ Quaisquer alterações (das variáveis passadas por referência)
efetuadas dentro do sub-algoritmo causam a alterações nos
parâmetros de chamada
ƒ Função f2(var a:inteiro, b:real, var c:real) : real
™ parâmetros a e c são passados por variável, parâmetro b é passado por
valor
ƒ Procedimento p2(var n:inteiro, var a[1..100]:real)
™ parâmetros n, a são passados por variável
93
94
Passagem de Parâmetros C/C++
Passagem por Valor
‰ Em C/C++ a escolha de passagem por valor ou por variável é efetuada
na definição de cada parâmetro
‰ Parâmetros passados por valor são declarados como variáveis comuns
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ƒ float f1(int a, float b, int c)
™ parâmetros a, b, c são passados por valor
‰ Parâmetros passados por referência devem ser precedidos pelo símbolo
& antes do nome do parâmetro
ƒ float f2(int &a, float b, double &c)
™ parâmetros a e c são passados por referência, parâmetro b é passado por valor
ƒ void p2(int &n, float a[])
™ parâmetros n, a são passados por variável
‰ Importante: vetores e matrizes sempre são sempre passados por
variável e o símbolo & é omitido
ƒ É desnecessário informar o tamanho dos vetores usados como parâmetros
ƒ Para matrizes é necessário declarar o tamanho de todas as dimensões
exceto a primeira
95
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
96
16
Passagem por Valor
Passagem por Valor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
0
97
98
Passagem por Valor
Passagem por Valor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
0
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
X
0
Memória
Endereço
Valor
A
0
99
100
Passagem por Valor
Passagem por Valor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
X
5
Memória
Endereço
Valor
A
0
101
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
0
102
17
Passagem por Valor
Passagem por Valor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
0
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
0
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
0
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
0
103
104
Passagem por Valor
Passagem por Valor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
0
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
return 0;
}
Linha
A
X
8
9
10
0
11
0
4
0
0
5
0
5
6
0
12
0
13
0
14
105
106
Passagem por Valor
Passagem por Variável
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma1(int X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma1(A);
cout << A << endl;
return 0;
}
soma1
X
0
soma1(A)
main
A
0
107
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
108
18
Passagem por Variável
Passagem por Variável
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------& colocado na definição
de um parâmetro indica
int main()
que ele será passado
{ int A;
por referência, ou seja,
seu endereço será
A = 0;
passado
soma2(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
109
110
Passagem por Variável
Passagem por Variável
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
0
111
112
Passagem por Variável
Passagem por Variável
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
0
113
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
X
0
Memória
Endereço
Valor
A
0
114
19
Passagem por Variável
Passagem por Variável
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
X
5
Memória
Endereço
Valor
A
5
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
5
115
116
Passagem por Variável
Passagem por Variável
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
5
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
5
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
5
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
A
5
117
118
Passagem por Variável
Passagem por Variável
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
5
return 0;
}
Memória
Endereço
Valor
Memória
Endereço
Valor
119
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
return 0;
}
Linha
A
X
8
9
10
0
11
0
4
0
0
5
5
5
6
5
12
5
13
5
14
120
20
Passagem por Variável
Regras de Escopo de Identificadores
1
2
3
4
5
6
7
8
9
10
11
12
13
14
‰ Um identificador consiste em um nome de variável, tipo de dado, sub-algoritmo ou
constante simbólica
‰ O escopo de um identificador é a região do programa na qual ele pode ser referenciado
#include <iostream>
using namespace std;
//-----------------------void soma2(int &X)
{ X = X + 5;
}
//-----------------------int main()
{ int A;
A = 0;
soma2(A);
cout << A << endl;
return 0;
}
ƒ
soma2
X
ƒ
ƒ
ƒ
Uma variável local é criada (alocada na memória) no momento em que o sub-algoritmo que a
define é chamado
Uma variável local é liberada da memória no momento em que o sub-algoritmo que a define
termina
O escopo de uma variável local é dentro do sub-algoritmo que a define
‰ Caso um mesmo identificador (nome de variável) seja declarado em sub-algoritmos
distintos, esses identificadores são considerados distintos entre si (variáveis distintas)
‰ O uso de variáveis locais minimiza a ocorrência de “efeitos colaterais” em programação: o
programador pode definir e utilizar as variáveis que desejar em um sub-algoritmo sem
interferir com outros sub-algoritmos
‰ As variáveis definidas na “camada” mais externa de um programa são denominadas
globais e têm sua existência durante toda a execução do programa
‰ O uso de variáveis globais deve ser evitado, pois elas podem ser alteradas por quaisquer
sub-algoritmos
soma2(A)
main
A
Parâmetros e variáveis locais de um sub-algoritmo só podem ser referenciados diretamente dentro
do próprio sub-algoritmo; nenhum outro sub-algoritmo pode fazer referência a eles
‰ Os parâmetros e as variáveis definidas em um sub-algoritmo são variáveis locais
0
121
122
Exemplo 1
Exemplo 2
#include <iostream>
#include <iomanip>
using namespace std;
//----------------------------------------------int i;
// variavel global
//----------------------------------------------void escreve(int n)
{ cout << "Imprimindo de 1 ate " << n << endl;
for(i=1; i<=n; i++)
cout << setw(4) << i;
cout << endl;
}
//----------------------------------------------int main()
{ cout << "Qtde a ser impressa ";
cin >> i;
cout << "Qtde = " << i << endl;
escreve(i);
cout << "Qtde = " << i << endl;
return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
//----------------------------------------------void escreve(int n)
{ int i;
// variavel local
cout << "Imprimindo de 1 ate " << n << endl;
for(i=1; i<=n; i++)
cout << setw(4) << i;
cout << endl;
}
//----------------------------------------------int main()
{ int i;
// variavel local
cout << "Qtde a ser impressa ";
cin >> i;
cout << "Qtde = " << i << endl;
escreve(i);
cout << "Qtde = " << i << endl;
return 0;
Qtde a ser impressa 7
Qtde = 7
Imprimindo de 1 ate 7
1 2 3 4 5 6 7
Qtde = 8
}
Qtde a ser impressa 7
Qtde = 7
Imprimindo de 1 ate 7
1 2 3 4 5 6 7
Qtde = 7
123
124
Exemplo 3
Exemplo 4
#include <iostream>
using namespace std;
//-------------------------------------------------------// Calcula a media dos elementos 1 ate n do vetor v
float media(int n, float v[])
{ int i;
Lembre-se que todo vetor/matriz em
float soma=0.0;
C/C++ é sempre passado por referência
e que o símbolo “&” não deve ser
for(i=1; i<=n; i++)
utilizado nesse caso. Note também que é
soma = soma + v[i];
desnecessário informar o tamanho dos
return soma / n;
vetores usados como parâmetros
}
//-------------------------------------------------------int main()
{ int i;
float x[]={0,10,20,30,40,50},y[]={0,1,5,10,15,20,25,30,25,40,45};
#include <iostream>
using namespace std;
cout << "Media x=" << media(5,x) << endl;
cout << "Media y=" << media(10,y) << endl;
return 0;
}
const int Max=5;
//----------------------------------------------------------// Calcula soma dos elementos de uma matriz quadrada ordem n
float soma_matriz(int n, float m[][Max+1])
{ int i, j;
float soma=0.0;
Para matrizes, é necessário
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
soma = soma + m[i][j];
return soma;
declarar o tamanho de todas as
dimensões, exceto a primeira
dimensão
}
//----------------------------------------------------------int main()
{ int x, y, n=Max;
float matriz[Max+1][Max+1];
for (x=1; x<=n; x++)
for (y=1; y<=n; y++)
{ cout << "Elemento [" << x << "," << y << "] ? ";
cin >> matriz[x][y];
}
cout << "\nA soma dos elementos da matriz = "
<< soma_matriz(n,matriz) << endl;
return 0;
Media x=30.00
Media y=21.60
125
}
126
21
Exemplo 5
#include <iostream>
#include <iomanip>
using namespace std;
//----------------------------------// Ordena vetor a[1..N]
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Exemplo 5
cout << "Vetor x" << endl;
Escrever(5,x);
Ordenar(5,x);
Escrever(5,x);
cout << "Vetor y" << endl;
Escrever(10,y);
Ordenar(10,y);
Escrever(10,y);
return 0;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
}
//----------------------------------// Escreve elementos do vetor v[1..n]
void Escrever(int n, float v[])
{ int i;
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
//----------------------------------int main()
{ float x[] = {0,10,30,50,0,2},
y[] = {0,11,45,7,3,0,-1,5,25,36,8};
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
}
for(i=1; i<=n; i++)
cout << setw(4) << v[i];
cout << endl;
}
Vetor
10
0
Vetor
11
-1
x
30
2
y
45
0
50
10
0
30
2
50
7
3
3
5
0
7
Memória
0
a
Endereço
Valor
N
5
1
2
3
4
5
10
30
50
0
2
}
-1
8
5
11
25
25
36
36
8
45
127
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
128
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
i
j
indice_menor
0
a
1
2
3
4
5
10
30
50
0
2
}
Memória
Endereço
Valor
N
5
i
j
indice_menor
x
0
a
1
2
3
4
5
10
30
50
0
2
}
129
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
130
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
1
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
j
indice_menor
x
i
0
a
1
2
3
4
5
10
30
50
0
2
}
Memória
Endereço
Valor
N
5
i
1
j
indice_menor
1
x
i
0
a
1
2
3
4
5
10
30
50
0
2
}
131
132
22
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
1
j
2
indice_menor
1
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
x
0
a
i
j
1
2
3
4
5
10
30
50
0
2
}
Memória
Endereço
Valor
N
5
i
1
j
2
indice_menor
1
x
0
a
i
j
1
2
3
4
5
10
30
50
0
2
}
a[indice_menor]
a[j]
133
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
134
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
1
j
3
indice_menor
1
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
x
i
0
a
j
1
2
3
4
5
10
30
50
0
2
}
Memória
Endereço
Valor
N
5
i
1
j
3
indice_menor
1
x
i
0
a
j
1
2
3
4
5
10
30
50
0
2
}
a[indice_menor]
a[j]
135
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
136
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
1
j
4
indice_menor
1
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
x
i
0
a
j
1
2
3
4
5
10
30
50
0
2
}
Memória
Endereço
Valor
N
5
i
1
j
4
indice_menor
1
x
i
0
a
j
1
2
3
4
5
10
30
50
0
2
}
a[indice_menor]
137
a[j]
138
23
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
1
j
4
indice_menor
4
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
x
i
0
a
j
1
2
3
4
5
10
30
50
0
2
}
Memória
Endereço
Valor
N
5
i
1
j
5
indice_menor
4
x
i
0
a
j
1
2
3
4
5
10
30
50
0
2
}
139
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
140
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
1
j
5
indice_menor
4
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
x
i
0
a
j
1
2
3
4
5
10
30
50
0
2
}
Memória
Endereço
Valor
N
5
i
1
j
6
indice_menor
4
x
i
0
a
j
1
2
3
4
5
10
30
50
0
2
}
a[indice_menor]
a[j]
141
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
142
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
1
j
6
indice_menor
4
x
10
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
i
0
a
1
2
3
4
5
10
30
50
0
2
}
Memória
Endereço
Valor
N
5
i
1
j
6
indice_menor
4
x
10
i
0
a
1
2
3
4
5
0
30
50
0
2
}
143
144
24
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
1
j
6
indice_menor
4
x
10
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
i
0
a
1
2
3
4
5
0
30
50
10
2
}
Memória
Endereço
Valor
N
5
i
2
j
6
indice_menor
4
x
10
i
0
a
1
2
3
4
5
0
30
50
10
2
}
Ordenado
145
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
146
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
2
j
6
indice_menor
2
x
10
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
i
0
a
1
2
3
4
5
0
30
50
10
2
}
Memória
0
a
Endereço
Valor
N
5
i
2
j
3
indice_menor
2
x
10
i
j
1
2
3
4
5
0
30
50
10
2
}
147
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
148
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
0
a
Endereço
Valor
N
5
i
2
j
3
indice_menor
2
x
10
i
j
1
2
3
4
5
0
30
50
10
2
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
}
Memória
Endereço
Valor
N
5
i
2
j
4
indice_menor
2
x
10
j
i
0
a
1
2
3
4
5
0
30
50
10
2
}
a[indice_menor]
a[j]
149
150
25
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
2
j
4
indice_menor
2
x
10
j
i
0
a
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
1
2
3
4
5
0
30
50
10
2
}
Memória
Endereço
Valor
N
5
i
2
j
4
indice_menor
4
x
10
j
i
0
a
1
2
3
4
5
0
30
50
10
2
}
a[indice_menor]
a[j]
151
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
152
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
2
j
5
indice_menor
4
x
10
j
i
0
a
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
1
2
3
4
5
0
30
50
10
2
}
Memória
Endereço
Valor
N
5
i
2
j
5
indice_menor
4
x
10
j
i
0
a
1
2
3
4
5
0
30
50
10
2
}
a[indice_menor]
a[j]
153
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
154
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
2
j
5
indice_menor
5
x
10
j
i
0
a
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
1
2
3
4
5
0
30
50
10
2
}
Memória
Endereço
Valor
N
5
i
2
j
6
indice_menor
5
x
10
j
i
0
a
1
2
3
4
5
0
30
50
10
2
}
155
156
26
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
2
j
6
indice_menor
5
x
30
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
i
0
a
1
2
3
4
5
0
30
50
10
2
}
Memória
Endereço
Valor
N
5
i
2
j
6
indice_menor
5
x
30
i
0
a
1
2
3
4
5
0
2
50
10
2
}
157
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
158
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
2
j
6
indice_menor
5
x
30
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
i
0
a
1
2
3
4
5
0
2
50
10
30
}
Memória
Endereço
Valor
N
5
i
3
j
6
indice_menor
5
x
30
i
0
a
1
2
3
4
5
0
2
50
10
30
}
Ordenado
159
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
160
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
3
j
6
indice_menor
3
x
30
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
i
0
a
1
2
3
4
5
0
2
50
10
30
}
Memória
0
a
Endereço
Valor
N
5
i
3
j
4
indice_menor
3
x
30
i
j
1
2
3
4
5
0
2
50
10
30
}
161
162
27
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
0
a
Endereço
Valor
N
5
i
3
j
4
indice_menor
3
x
30
i
j
1
2
3
4
5
0
2
50
10
30
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
}
Memória
Endereço
Valor
N
5
i
3
j
0
a
4
indice_menor
4
x
30
i
j
1
2
3
4
5
0
2
50
10
30
}
a[indice_menor]
a[j]
163
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
164
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
3
j
5
indice_menor
4
x
30
j
i
0
a
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
1
2
3
4
5
0
2
50
10
30
}
Memória
Endereço
Valor
N
5
i
3
j
5
indice_menor
4
x
30
j
i
0
a
1
2
3
4
5
0
2
50
10
30
}
a[indice_menor]
a[j]
165
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
166
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
3
j
6
indice_menor
4
x
30
j
i
0
a
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
1
2
3
4
5
0
2
50
10
30
}
Memória
Endereço
Valor
N
5
i
3
j
6
indice_menor
4
x
50
i
0
a
1
2
3
4
5
0
2
50
10
30
}
a[indice_menor]
a[j]
167
168
28
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
3
j
6
indice_menor
4
x
50
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
i
0
a
1
2
3
4
5
0
2
10
10
30
}
Memória
Endereço
Valor
N
5
i
3
j
6
indice_menor
4
x
50
i
0
a
1
2
3
4
5
0
2
10
50
30
}
Ordenado
169
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
170
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
4
j
6
indice_menor
4
x
50
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
i
0
a
1
2
3
4
5
0
2
10
50
30
}
Memória
Endereço
Valor
N
5
i
4
j
6
indice_menor
4
x
50
i
0
a
1
2
3
4
5
0
2
10
50
30
}
171
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
172
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
0
a
Endereço
Valor
N
5
i
4
j
5
indice_menor
4
x
50
i
j
1
2
3
4
5
0
2
10
50
30
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
}
Memória
0
a
Endereço
Valor
N
5
i
4
j
5
indice_menor
4
x
50
i
j
1
2
3
4
5
0
2
10
50
30
}
a[indice_menor]
173
a[j]
174
29
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
0
a
Endereço
Valor
N
5
i
4
j
5
indice_menor
5
x
50
i
j
1
2
3
4
5
0
2
10
50
30
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
}
Memória
Endereço
Valor
N
5
i
4
j
6
indice_menor
5
x
50
j
i
0
a
1
2
3
4
5
0
2
10
50
30
}
175
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
176
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
4
j
6
indice_menor
5
x
50
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
i
0
a
1
2
3
4
5
0
2
10
50
30
}
Memória
Endereço
Valor
N
5
i
4
j
6
indice_menor
5
x
50
i
0
a
1
2
3
4
5
0
2
10
30
30
}
177
Exemplo 5
Exemplo 5
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
178
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
Memória
Endereço
Valor
N
5
i
4
j
6
indice_menor
5
x
50
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
i
0
a
1
2
3
4
5
0
2
10
30
50
}
Memória
0
a
Endereço
Valor
N
5
i
5
j
6
indice_menor
5
x
50
1
2
3
4
5
0
2
10
30
50
}
Ordenado
179
180
30
Exemplo 5
Exemplo 6
void Ordenar(int N, float a[])
{ int i,j,indice_menor;
float x;
for(i = 1; i <= N-1; i++)
{ indice_menor = i;
for(j = i+1; j <= N; j++)
if(a[indice_menor] > a[j])
indice_menor = j;
x = a[i];
a[i] = a[indice_menor];
a[indice_menor] = x;
}
#include <iostream>
using namespace std;
int a=3,x=5;
//---------------------------------------------------------------void teste1(int x)
{ int a=7;
cout << "teste1 antes incremento: a=" << a ",x=" << x << endl;
a++; x++;
cout << "teste1 depois incremento: a=" << a ",x=" << x << endl;
}
//---------------------------------------------------------------void teste2(int a)
{ cout << "teste2 antes incremento: a=" << a ",x=" << x << endl;
a++; x++;
cout << "teste2 depois incremento: a=" << a ",x=" << x << endl;
}
//---------------------------------------------------------------void teste3(int x)
{ cout << "teste3 antes incremento: a=" << a ",x=" << x << endl;
a++; x++;
cout << "teste3 depois incremento: a=" << a ",x=" << x << endl;
}
//---------------------------------------------------------------int main()
{ int a=10;
cout << "principal: a=" << a << ",x=" << x << endl;
teste1(a);
cout << "principal: a=" << a << ",x=" << x << endl;
teste2(a);
cout << "principal: a=" << a << ",x=" << x << endl;
teste3(a);
cout << "principal: a=" << a << ",x=" << x << endl;
return 0;
}
Memória
Endereço
0
a
Valor
1
2
3
4
5
0
2
10
30
50
}
181
Variáveis Globais
a
x
teste1
a
x
teste2
a
teste3
x
main
a
principal: a=10,x=5
teste1 antes incremento: a=7,x=10
teste1 depois incremento: a=8,x=11
principal: a=10,x=5
teste2 antes incremento: a=10,x=5
teste2 depois incremento: a=11,x=6
principal: a=10,x=6
teste3 antes incremento: a=3,x=10
teste3 depois incremento: a=4,x=11
principal: a=10,x=6
182
Resumo
‰Nesta aula vimos os dois tipos de sub-algoritmos
existentes: funções e procedimentos
‰A função sempre retorna um valor no ponto onde foi
chamada; já o procedimento pode retornar vários
valores e seu retorno ao programa que chama é
efetuado no comando subseqüente
‰Variáveis declaradas dentro de um sub-algoritmo
(variáveis locais) têm sua existência somente
quando o sub-algoritmo é executado e deixam de
existir ao término da execução do sub-algoritmo
‰Existem duas formas de correspondência entre
parâmetros de definição e de chamada: por valor e
por variável
183
31
Download