·
Matemática Aplicada a Negócios ·
Introdução à Computação 2
Envie sua pergunta para a IA e receba a resposta na hora
Prefere sua atividade resolvida por um tutor especialista?
- Receba resolvida até o seu prazo
- Converse com o tutor pelo chat
- Garantia de 7 dias contra erros
Recomendado para você
54
Slide - Ordenação Por Fusão - Bubblesort e Sharkesort - 2023-2
Introdução à Computação 2
USP
113
Slide - Método da Bolha - Bubblesort e Sharkesort - 2023-2
Introdução à Computação 2
USP
25
Slide - Ordenação por Seleção - 2023-2
Introdução à Computação 2
USP
54
Slide - Ordenação Por Fusão - Bubblesort e Sharkesort - 2023-2
Introdução à Computação 2
USP
48
Slide - Estruturas e Ponteiros em C e C - Introdução à Computação 2 - 2023-2
Introdução à Computação 2
USP
4
Prática 4 - Recursão - Introdução à Computação 2 - 2023-2
Introdução à Computação 2
USP
21
Slide - Complexidade de Algoritmos - Introdução à Computação 2 - 2023-2
Introdução à Computação 2
USP
92
Slide - Algoritmos de Ordenação - 2023-2
Introdução à Computação 2
USP
61
Slide - Sub-algoritmos em C
Introdução à Computação 2
USP
1
Prática 6 - Busca Binária e Ordenação por Inserção - Introdução à Computação 2 - 2023-2
Introdução à Computação 2
USP
Texto de pré-visualização
1.1. Sub-algoritmos (Funções e Procedimentos) em C/C++ ❑ 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 2 Sub-algoritmos em C++ ❑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 sub- algoritmo ▪ As variáveis declaradas dentro do sub-algoritmo, incluindo os parâmetros são denominadas variáveis locais 3 Funções em C++ ❑Função f(x) = x2 - 3x + 2 float f(float x) { return(x * x - 3 * x + 2); } 4 Funções em C++ ❑Função f(x) = x2 - 3x + 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 5 Funções em C++ ❑Função f(x) = x2 - 3x + 2 float f(float x) { return(x * x - 3 * x + 2); } Indica o nome da função. Neste caso, f 6 Funções em C++ ❑Função f(x) = x2 - 3x + 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 7 Funções em C++ ❑Função f(x) = x2 - 3x + 2 float f(float x) { return(x * x - 3 * x + 2); } Indica o nome do primeiro parâmetro da função. Neste caso, x 8 Funções em C++ ❑Função f(x) = x2 - 3x + 2 float f(float x) { return(x * x - 3 * x + 2); } Indica o que deve ser retornado pela função 9 Funções em C++ ❑Função f(x) = x2 - 3x + 2 float f(float x) { float r; r = x * x - 3 * x + 2; return r; } 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 10 Exemplo de Chamada em C++ #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; 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; } 11 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor 12 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 13 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 14 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 3 divisor 4 Memória Endereço Valor a 3 b 4 15 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 3 divisor 4 quociente Memória Endereço Valor a 3 b 4 16 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 3 divisor 4 quociente 0.75 Memória Endereço Valor a 3 b 4 17 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 3 divisor 4 quociente 0.75 Memória Endereço Valor a 3 b 4 18 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 3/4=0.75 19 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 3/4=0.75 20 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 4 divisor 3 Memória Endereço Valor a 3 b 4 3/4=0.75 21 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 4 divisor 3 quociente Memória Endereço Valor a 3 b 4 3/4=0.75 22 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 4 divisor 3 quociente 1.33 Memória Endereço Valor a 3 b 4 3/4=0.75 23 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 4 divisor 3 quociente 1.33 Memória Endereço Valor a 3 b 4 3/4=0.75 24 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 3/4=0.75 4/3=1.33 25 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 3/4=0.75 4/3=1.33 26 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor 3/4=0.75 4/3=1.33 27 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: ▪ 1) passagem de parâmetros por valor ▪ 2) passagem de parâmetros por variável (ou por referência ou por endereço) 28 Passagem de Parâmetros ❑ Passagem por Valor ▪ 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 ❑ Passagem por Variável ▪ Na passagem por variável, ao ser efetuada uma chamada de sub- algoritmo, 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 29 Passagem de Parâmetros C++ ❑ 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 ▪ 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 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 30 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor 31 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 32 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 33 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 34 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor X 0 Memória Endereço Valor A 0 35 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor X 5 Memória Endereço Valor A 0 36 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 37 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 0 38 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 0 39 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor 0 40 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Linha A X 8 9 10 0 11 0 4 0 0 5 0 5 6 0 12 0 13 0 14 41 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } main 0 A soma1 0 X soma1(A) 42 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor 43 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor & colocado na definição de um parâmetro indica que ele será passado por referência, ou seja, seu endereço será passado 44 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor 45 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 46 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 47 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 48 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 X 49 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 5 X 50 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 5 X 51 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 5 5 52 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 5 5 53 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor 5 54 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Linha A X 8 9 10 0 11 0 4 0 0 5 5 5 6 5 12 5 13 5 14 55 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } main 0 A soma2 X soma2(A) 56 Regras de Escopo de Identificadores ❑ 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 ▪ 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 ▪ 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 57 Exemplo 1 #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; } Qtde a ser impressa 7 Qtde = 7 Imprimindo de 1 ate 7 1 2 3 4 5 6 7 Qtde = 8 58 Exemplo 2 #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 = 7 59 Exemplo 3 #include <iostream> using namespace std; //-------------------------------------------------------- // Calcula a media dos elementos 1 ate n do vetor v float media(int n, float v[]) { int i; float soma=0.0; for(i=1; i<=n; i++) soma = soma + v[i]; return soma / n; } //-------------------------------------------------------- int main() { int i; float x[]={0,10,20,30,40,50},y[]={0,1,5,10,15,20,25,30,25,40,45}; cout << "Media x=" << media(5,x) << endl; cout << "Media y=" << media(10,y) << endl; return 0; } Media x=30.00 Media y=21.60 Lembre-se que todo vetor/matriz em C/C++ é sempre passado por referência e que o símbolo “&” não deve ser utilizado nesse caso. Note também que é desnecessário informar o tamanho dos vetores usados como parâmetros 60 Exemplo 4 #include <iostream> using namespace std; 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; for (i=1; i<=n; i++) for (j=1; j<=n; j++) soma = soma + m[i][j]; return soma; } //----------------------------------------------------------- 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; } Para matrizes, é necessário declarar o tamanho de todas as dimensões, exceto a primeira dimensão 61 Copyright© Apresentação 2019 por José Augusto Baranauskas Universidade de São Paulo Professores são convidados a utilizarem esta apresentação da maneira que lhes for conveniente para uso não comercial, desde que esta nota de copyright permaneça intacta. (editado por Renato Tinós em 2022)
Envie sua pergunta para a IA e receba a resposta na hora
Recomendado para você
54
Slide - Ordenação Por Fusão - Bubblesort e Sharkesort - 2023-2
Introdução à Computação 2
USP
113
Slide - Método da Bolha - Bubblesort e Sharkesort - 2023-2
Introdução à Computação 2
USP
25
Slide - Ordenação por Seleção - 2023-2
Introdução à Computação 2
USP
54
Slide - Ordenação Por Fusão - Bubblesort e Sharkesort - 2023-2
Introdução à Computação 2
USP
48
Slide - Estruturas e Ponteiros em C e C - Introdução à Computação 2 - 2023-2
Introdução à Computação 2
USP
4
Prática 4 - Recursão - Introdução à Computação 2 - 2023-2
Introdução à Computação 2
USP
21
Slide - Complexidade de Algoritmos - Introdução à Computação 2 - 2023-2
Introdução à Computação 2
USP
92
Slide - Algoritmos de Ordenação - 2023-2
Introdução à Computação 2
USP
61
Slide - Sub-algoritmos em C
Introdução à Computação 2
USP
1
Prática 6 - Busca Binária e Ordenação por Inserção - Introdução à Computação 2 - 2023-2
Introdução à Computação 2
USP
Texto de pré-visualização
1.1. Sub-algoritmos (Funções e Procedimentos) em C/C++ ❑ 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 2 Sub-algoritmos em C++ ❑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 sub- algoritmo ▪ As variáveis declaradas dentro do sub-algoritmo, incluindo os parâmetros são denominadas variáveis locais 3 Funções em C++ ❑Função f(x) = x2 - 3x + 2 float f(float x) { return(x * x - 3 * x + 2); } 4 Funções em C++ ❑Função f(x) = x2 - 3x + 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 5 Funções em C++ ❑Função f(x) = x2 - 3x + 2 float f(float x) { return(x * x - 3 * x + 2); } Indica o nome da função. Neste caso, f 6 Funções em C++ ❑Função f(x) = x2 - 3x + 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 7 Funções em C++ ❑Função f(x) = x2 - 3x + 2 float f(float x) { return(x * x - 3 * x + 2); } Indica o nome do primeiro parâmetro da função. Neste caso, x 8 Funções em C++ ❑Função f(x) = x2 - 3x + 2 float f(float x) { return(x * x - 3 * x + 2); } Indica o que deve ser retornado pela função 9 Funções em C++ ❑Função f(x) = x2 - 3x + 2 float f(float x) { float r; r = x * x - 3 * x + 2; return r; } 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 10 Exemplo de Chamada em C++ #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; 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; } 11 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor 12 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 13 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 14 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 3 divisor 4 Memória Endereço Valor a 3 b 4 15 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 3 divisor 4 quociente Memória Endereço Valor a 3 b 4 16 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 3 divisor 4 quociente 0.75 Memória Endereço Valor a 3 b 4 17 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 3 divisor 4 quociente 0.75 Memória Endereço Valor a 3 b 4 18 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 3/4=0.75 19 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 3/4=0.75 20 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 4 divisor 3 Memória Endereço Valor a 3 b 4 3/4=0.75 21 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 4 divisor 3 quociente Memória Endereço Valor a 3 b 4 3/4=0.75 22 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 4 divisor 3 quociente 1.33 Memória Endereço Valor a 3 b 4 3/4=0.75 23 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor dividendo 4 divisor 3 quociente 1.33 Memória Endereço Valor a 3 b 4 3/4=0.75 24 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 3/4=0.75 4/3=1.33 25 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor a 3 b 4 3/4=0.75 4/3=1.33 26 Funções em C++ #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; cout << a << ”/” << b << ”=” << divisao(a,b) << endl; cout << b << ”/” << a << ”=” << divisao(b,a) << endl; return 0; } Memória Endereço Valor Memória Endereço Valor 3/4=0.75 4/3=1.33 27 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: ▪ 1) passagem de parâmetros por valor ▪ 2) passagem de parâmetros por variável (ou por referência ou por endereço) 28 Passagem de Parâmetros ❑ Passagem por Valor ▪ 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 ❑ Passagem por Variável ▪ Na passagem por variável, ao ser efetuada uma chamada de sub- algoritmo, 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 29 Passagem de Parâmetros C++ ❑ 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 ▪ 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 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 30 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor 31 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 32 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 33 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 34 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor X 0 Memória Endereço Valor A 0 35 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor X 5 Memória Endereço Valor A 0 36 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 37 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 0 38 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 0 39 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor 0 40 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } Linha A X 8 9 10 0 11 0 4 0 0 5 0 5 6 0 12 0 13 0 14 41 Passagem por Valor 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma1(int X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma1(A); 12 cout << A << endl; 13 return 0; 14 } main 0 A soma1 0 X soma1(A) 42 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor 43 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor & colocado na definição de um parâmetro indica que ele será passado por referência, ou seja, seu endereço será passado 44 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor 45 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 46 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 47 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 48 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 0 X 49 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 5 X 50 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 5 X 51 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 5 5 52 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor A 5 5 53 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Memória Endereço Valor Memória Endereço Valor 5 54 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } Linha A X 8 9 10 0 11 0 4 0 0 5 5 5 6 5 12 5 13 5 14 55 Passagem por Variável 1 #include <iostream> 2 using namespace std; 3 //------------------------ 4 void soma2(int &X) 5 { X = X + 5; 6 } 7 //------------------------ 8 int main() 9 { int A; 10 A = 0; 11 soma2(A); 12 cout << A << endl; 13 return 0; 14 } main 0 A soma2 X soma2(A) 56 Regras de Escopo de Identificadores ❑ 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 ▪ 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 ▪ 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 57 Exemplo 1 #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; } Qtde a ser impressa 7 Qtde = 7 Imprimindo de 1 ate 7 1 2 3 4 5 6 7 Qtde = 8 58 Exemplo 2 #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 = 7 59 Exemplo 3 #include <iostream> using namespace std; //-------------------------------------------------------- // Calcula a media dos elementos 1 ate n do vetor v float media(int n, float v[]) { int i; float soma=0.0; for(i=1; i<=n; i++) soma = soma + v[i]; return soma / n; } //-------------------------------------------------------- int main() { int i; float x[]={0,10,20,30,40,50},y[]={0,1,5,10,15,20,25,30,25,40,45}; cout << "Media x=" << media(5,x) << endl; cout << "Media y=" << media(10,y) << endl; return 0; } Media x=30.00 Media y=21.60 Lembre-se que todo vetor/matriz em C/C++ é sempre passado por referência e que o símbolo “&” não deve ser utilizado nesse caso. Note também que é desnecessário informar o tamanho dos vetores usados como parâmetros 60 Exemplo 4 #include <iostream> using namespace std; 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; for (i=1; i<=n; i++) for (j=1; j<=n; j++) soma = soma + m[i][j]; return soma; } //----------------------------------------------------------- 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; } Para matrizes, é necessário declarar o tamanho de todas as dimensões, exceto a primeira dimensão 61 Copyright© Apresentação 2019 por José Augusto Baranauskas Universidade de São Paulo Professores são convidados a utilizarem esta apresentação da maneira que lhes for conveniente para uso não comercial, desde que esta nota de copyright permaneça intacta. (editado por Renato Tinós em 2022)