Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Programação de Computadores Introdução a C++
Alan de
Freitas
Por que programar?• Utilizar computadores é claramente uma
vantagem em nossas vidas...
• Nos ajuda a comunicar
• Nos ajuda a fazer planos
• Nos permite trabalhar menos
• Nos provê diversão
• Mas por que fazer nossos próprios programas?
• É tudo questão de automatizar coisas
Sempre escolherei pessoas preguiçosas
para realizar trabalhos difíceis, pois os mesmos buscam os caminhos mais fáceis
para fazê-lo.
Quantas tarefas repetitivas
temos em nossas vidas?
Na profissão? Na família?
Programadores costumam ter ferramentas próprias
para o dia a dia. Calendários, lembretes,
processadores de dados...
Programação é muito necessária em tarefas avançadas de todas as áreas do
conhecimento humano.
Agricultura
MúsicaEngenharia
Medicina
Biologia
Matemática
Física
Estatística
Economia
Contabilidade
Cinema
Entretenimento
Arquitetura
Nutrição
Direito
Política
Jornalismo
LinguísticaPolítica
Manufaturas
Comunicação
Para fazer cálculos
• Saber por que um computador falha
Programadores usualmente reconhecem o motivo de erros em programas.
Isso, porque já passaram pelos mesmos erros em seus próprios programas.
• Te ajuda a pensar e quebrar problemas em partes muito pequenas.
• O único limite no seu programa é sua imaginação.
• Uma idéia simples pode mudar a vida de milhões de pessoas.
C++• Desenvolvido por
Bjarne Stroustrup [ˈbjɑːnә ˈsdʁʌʊ̯ˀsdʁɔb] do Bell Labs, durante a década de 1980.
• Como o Unix era escrito em C, dever-se-ia manter a compatibilidade.
• Em 1983 o nome da linguagem foi alterado de “C with Classes” para C++
• A linguagem contém uma biblioteca padrão de recursos que também sofreu melhorias ao longo do tempo.
Características• Considerada de médio nível
• Uma das linguagens comerciais mais populares
• Alto desempenho
• Adicional à linguagem C
• Novas características foram adicionadas com o tempo
Compilação
Como conversar?
Como faremos para conversar com
computadores se falamos línguas tão
diferentes?
Compilador
O compilador é a ferramenta que nos serve como uma ponte para fazer esta comunicação.
CompiladorCódigo em
linguagem de programação
Primeiramente escreveremos nossa mensagem para o
computador em uma linguagem de
programação de nossa preferência.
Compilador
Compilador recebe o código
Compilador
Código transformado em linguagem de
máquina
CompiladorComputador recebe os comandos em
linguagem de máquina
Tipos de dados e seus tamanhos
0100110101
Tipos de dados e seus tamanhos
0100110101
a? 4? F? 3.5? ?????
Tipos de dados e seus tamanhos
Tipo lógico bool V ou F
Números inteirosshort < int <
long... -3, -2, -1, 0, 1, 2,
3...
Números reais float < double 3.32, 4.78, 7.24, -3.14, 0.01
Caracteres char a, b, c, d, e, f … #, $, [, ., \ …
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
Este comando inclui a biblioteca com recursos para fluxo de entrada e saída (in/out stream).
As entradas serão feitas pelo teclado. As saídas feitas pelo monitor.
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
Aqui começa a função principal (main) de nosso programa. As chaves { e } indicam onde
começa e termina a função.
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
Dizemos que cout é um objeto que faz saída de dados para o monitor. Os dados são enviados para ele em cadeia com os comandos << que
estão a sua direita.
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
Para evitar conflito entre nomes, recursos são divididos em espaços de nomes. O cout é
precedido de std e :: para indicar que ele pertence ao espaço de nomes padrão
(standard) da linguagem.
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
O comando << é então utilizado para enviar a frase “Olá, Mundo!” para cout. Cada letra
desta frase é um dado do tipo char.
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
As aspas ao redor da expressão “Olá, Mundo!” indicam que é um conjunto de chars e não uma palavra reservada da linguagem.
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
Além da frase, uma quebra de linha após a frase é enviada para cout. A quebra de linha é
representada com o comando endl, que também pertence a std.
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
Todos os comandos em C++ devem ser acompanhados de um ponto e vírgula
indicando que ali termina aquele comando.
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
O comando return indica que a função retorna dali encerrando o programa. Ela não só
retorna, mas retorna um valor do tipo int.
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
O int antes da definição main() indica que a função main() vai retornar um int.
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
A função main é obrigatória em todos os programas!
Primeiro Programa em C++
#include <iostream> int main() { std::cout << "Olá, Mundo!" << std::endl; return 0; }.
Olá, Mundo!
Este é o resultado do programa:
Segundo Programa em C++
#include <iostream>using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; }.
Segundo Programa em C++#include <iostream>using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; }.
Indicamos agora que o espaço de nomes (namespace) std deve ser utilizado por se nenhum espaço for mencionado. Eliminamos
assim os vários std:: em nosso código.
Segundo Programa em C++#include <iostream>using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; }.
As variáveis em C++ são organizadas em espaços de nomes para evitar conflito entre
duas variáveis que tenham o mesmo identificador.
Segundo Programa em C++#include <iostream>using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; }.
Olá, Mundo!
Comentários
???
Algumas vezes, um código pode se tornar
tão complexo nem mesmo um outro
programador consiga entender.
Neste caso, seria bom deixar comentários para outros programadores.
Comentários• Comentários são partes do código que são
ignoradas pelo compilador
• Servem para deixar lembretes ou informações sobre o código para outros programadores
• O comando // marca o início de um comentário de uma linha
• Os comandos /* e */ são utilizados para iniciar e encerrar um bloco de comentários
#include <iostream>using namespace std; int main() { cout << "Olá, Mundo!" << endl; // Tudo isto é ignorado // cout << "Olá, Mundo!" << endl; cout << "Olá! Mais uma vez!" << endl; /* Aqui se inicia um bloco de comentários. Tudo dentro do bloco é ignorado. */ return 0; }.
#include <iostream>using namespace std; int main() { cout << "Olá, Mundo!" << endl; // Tudo isto é ignorado // cout << "Olá, Mundo!" << endl; cout << "Olá! Mais uma vez!" << endl; /* Aqui se inicia um bloco de comentários. Tudo dentro do bloco é ignorado. */ return 0; }.
Olá, Mundo!
#include <iostream>using namespace std; int main() { cout << "Olá, Mundo!" << endl; // Tudo isto é ignorado // cout << "Olá, Mundo!" << endl; cout << "Olá! Mais uma vez!" << endl; /* Aqui se inicia um bloco de comentários. Tudo dentro do bloco é ignorado. */ return 0; }.
Olá, Mundo! Olá! Mais uma vez!
Esta linha inteira é ignorada
#include <iostream>using namespace std; int main() { cout << "Olá, Mundo!" << endl; // Tudo isto é ignorado // cout << "Olá, Mundo!" << endl; cout << "Olá! Mais uma vez!" << endl; /* Aqui se inicia um bloco de comentários. Tudo dentro do bloco é ignorado. */ return 0; }.
Olá, Mundo! Olá! Mais uma vez!
Criando variáveis• Os dados de nosso
programa serão guardados em variáveis
• É necessário informar qual o tipo de dado de cada variável
• Damos para cada variável um nome identificador que a referencia
variável
4 5.7
cfalse
7.2 a
true20
#include <iostream>using namespace std; int main() { int numero; // criando uma variável do tipo int com nome x char letra; // criando uma variável do tipo char com nome letra double num_real; // criando uma variável do tipo double com nome num_real bool teste; // criando uma variável do tipo bool com nome teste cout << "Este programa criou 4 variáveis!" << endl; return 0; }.
#include <iostream>using namespace std; int main() { int numero; // criando uma variável do tipo int com nome x char letra; // criando uma variável do tipo char com nome letra double num_real; // criando uma variável do tipo double com nome num_real bool teste; // criando uma variável do tipo bool com nome teste cout << "Este programa criou 4 variáveis!" << endl; return 0; }.
numero
#include <iostream>using namespace std; int main() { int numero; // criando uma variável do tipo int com nome x char letra; // criando uma variável do tipo char com nome letra double num_real; // criando uma variável do tipo double com nome num_real bool teste; // criando uma variável do tipo bool com nome teste cout << "Este programa criou 4 variáveis!" << endl; return 0; }.
numero
Repare que a variável numero é escrita sem acentos
#include <iostream>using namespace std; int main() { int numero; // criando uma variável do tipo int com nome x char letra; // criando uma variável do tipo char com nome letra double num_real; // criando uma variável do tipo double com nome num_real bool teste; // criando uma variável do tipo bool com nome teste cout << "Este programa criou 4 variáveis!" << endl; return 0; }.
numero letra
#include <iostream>using namespace std; int main() { int numero; // criando uma variável do tipo int com nome x char letra; // criando uma variável do tipo char com nome letra double num_real; // criando uma variável do tipo double com nome num_real bool teste; // criando uma variável do tipo bool com nome teste cout << "Este programa criou 4 variáveis!" << endl; return 0; }.
numero letra num_real
#include <iostream>using namespace std; int main() { int numero; // criando uma variável do tipo int com nome x char letra; // criando uma variável do tipo char com nome letra double num_real; // criando uma variável do tipo double com nome num_real bool teste; // criando uma variável do tipo bool com nome teste cout << "Este programa criou 4 variáveis!" << endl; return 0; }.
numero letra num_real teste
#include <iostream>using namespace std; int main() { int numero; // criando uma variável do tipo int com nome x char letra; // criando uma variável do tipo char com nome letra double num_real; // criando uma variável do tipo double com nome num_real bool teste; // criando uma variável do tipo bool com nome teste cout << "Este programa criou 4 variáveis!" << endl; return 0; }.
numero
Este programa criou 4 variáveis!
letra num_real teste Identificadores
• Nome que damos a uma variável ou função (estudaremos mais adiante).
• O primeiro caractere deve ser letra ou um sinal de sublinha _ 1peso ou @email estão errados.
• É sensível a maiúsculas: x é diferente de X
Operadores• Operadores são muito importantes em
programação pois eles alteram o valor de variáveis ou usam variáveis existentes para criar novas variáveis
variável1 variável1 variável2
variável1 variável3
Operador de atribuição• Operador =
• Não confundir com o sinal de igualdade
• O operador = não diz que dois valores são iguais
• O operador = atribui o valor à direita à variável à esquerda
• Dá um valor a uma variável
• O valor da variável pode ser utilizado posteriormente
• O valor antigo da variável é perdido
#include <iostream>using namespace std; int main() { int numero; numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }.
#include <iostream>using namespace std; int main() { int numero; numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }.
numero
Variável é criada
#include <iostream>using namespace std; int main() { int numero; numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }.
numero 4
#include <iostream>using namespace std; int main() { int numero; numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }.
numero 4
O operador = diz que a variável numero receberá o valor 4. Ela não diz que
numero é igual a 4.
#include <iostream>using namespace std; int main() { int numero; numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }.
numero 4
Ao imprimir a mensagem, a palavra numero é substituida pelo valor da variável numero
A variável numero do tipo int tem valor 4
#include <iostream>using namespace std; int main() { int numero; numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }.
numero 4
A variável numero do tipo int tem valor 4
Fluxo de entrada
• O objeto cin é utilizado para que o usuário possa fazer entradas no programa.
variável
Fluxo de entrada
• Isto é importante para interagir com a pessoa que utiliza o programa
• Assim, ela é complementar à opção de atribuição = para dar valor a variáveis
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
numero1
Comandos que criam variáveis
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
numero1
numero2
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
numero1
numero2
soma
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Digite o primeiro número:
numero1
numero2
soma
Imprime mensagem pedindo ao usuário para executar uma ação
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Digite o primeiro número:
numero1
numero2
soma
Repare que não há comando endl para passar para a
próxima linha
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Digite o primeiro número:
numero1
numero2
soma
cin é usado para obter um valor do teclado
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Digite o primeiro número:
numero1
numero2
soma
O programa fica parado até que o usuário digite um valor e
aperte a tecla Enter
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Digite o primeiro número: 3.14
numero1
numero2
soma
Suponha que o valor 3.14 tenha sido digitado
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Digite o primeiro número: 3.14 Digite o segundo número:
numero1 3.14
numero2
soma
3.14 é guardado na variável e vamos para o próximo passo
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Digite o primeiro número: 3.14 Digite o segundo número: 2.7
numero1 3.14
numero2
soma
Programa espera entrada de dados novamente
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Digite o primeiro número: 3.14 Digite o segundo número: 2.7
numero1 3.14
numero2 2.7
soma
Atribuiremos a soma o valor numero1 + numero2
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Digite o primeiro número: 3.14 Digite o segundo número: 2.7
numero1 3.14
numero2 2.7
soma 5.84
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Digite o primeiro número: 3.14 Digite o segundo número: 2.7 A soma dos números é 5.84
numero1 3.14
numero2 2.7
soma 5.84
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Digite o primeiro número: 3.14 Digite o segundo número: 2.7 A soma dos números é 5.84
numero1 3.14
numero2 2.7
soma 5.84
Fim do programa
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }.
Fim do programaAlterações possíveis#include <iostream>using namespace std; int main() { double numero1, numero2, soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }
Lista separada por vírgulas para declação de várias variáveis do
mesmo tipo.
#include <iostream>using namespace std; int main() { double numero1; double numero2; double soma; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; soma = numero1 + numero2; cout << "A soma dos números é " << soma << endl; return 0; }
Fim do programaAlterações possíveis#include <iostream>using namespace std; int main() { double numero1, numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; cout << "A soma dos números é " << numero1 + numero2 << endl; return 0; }
Fazer a adição diretamente nos parâmetros do comando cout.
Operadores aritméticos• Além dos operador
de atribuição = existem os operadores aritméticos
• Os operadores aritméticos são utilizados principalmente para tipos de dados que representam números
variável1 4 variável2 7
variável3 11
+
Operadores aritméticos
• Já utilizamos o operador aritmético + no exemplo anterior
• Podem ser utilizados para outros tipos de dados, tendo nestes casos outros significados
Operador Comando
Adição +
Subtração -
Multiplicação *
Divisão /
Resto da divisão inteira %
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
numero1
numero2
r
São criadas as variáveis
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2
numero1 7
numero2 2
r
O usuário atribui valores às variáveis numero1 e numero2
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2
numero1 7
numero2 2
r 9
Operador de adição
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9
numero1 7
numero2 2
r 9
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9
numero1 7
numero2 2
r 5
Operador de subtração
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Subtração dos números = 5
numero1 7
numero2 2
r 5
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Subtração dos números = 5
numero1 7
numero2 2
r 14
Operador de multiplicação
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Subtração dos números = 5 Multiplicação dos números = 14
numero1 7
numero2 2
r 14
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Subtração dos números = 5 Multiplicação dos números = 14
numero1 7
numero2 2
r 3
Operador de divisão
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Subtração dos números = 5 Multiplicação dos números = 14
numero1 7
numero2 2
r 3
Repare que o resultado é 3 e não 3.5 pois r é uma variável do tipo int
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Subtração dos números = 5 Multiplicação dos números = 14 Divisão dos números = 3
numero1 7
numero2 2
r 3
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Subtração dos números = 5 Multiplicação dos números = 14 Divisão dos números = 3
numero1 7
numero2 2
r 1
Operador de resto da divisão inteira
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Subtração dos números = 5 Multiplicação dos números = 14 Divisão dos números = 3 Resto da divisão = 1
numero1 7
numero2 2
r 1
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Subtração dos números = 5 Multiplicação dos números = 14 Divisão dos números = 3 Resto da divisão = 1
numero1 7
numero2 2
r 1
Fim do programa
Operadores de atribuição aritméticos
• Existem outros operadores de atribuição além dos operador =
• Os outros operadores de atribuição são utilizados para abreviar expressões aritméticas e devem ser utilizados sempre que possível
• Qualquer instrução na forma
• c = c + 2; • variável = variável operador expressão
• Pode ser convertido e abreviado na forma
• c += 2; • variável operador = expressão
variável1 4
variável1 6
+2
Operador Exemplo Significado
+= x += 6 x = x + 6
-= x -= 3 x = x - 3
*= x *= 2 x = x * 2
/= x /= 4 x = x / 4
%= x %= 7 x = x % 7
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1
numero2
São criadas as variáveis
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 8
numero2 3
São atribuídos valores às variáveis
Digite o primeiro número: 8 Digite o segundo número: 3
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 11
numero2 3
Mesmo que numero1 = numero1 + numero2;
Digite o primeiro número: 8 Digite o segundo número: 3
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 11
numero2 3
Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 8
numero2 3
Mesmo que numero1 = numero1 - numero2;
Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 8
numero2 3
Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 24
numero2 3
Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8
Mesmo que numero1 = numero1 * numero2;#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 24
numero2 3
Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8 Multiplicando por 3 -> 24
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 8
numero2 3
Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8 Multiplicando por 3 -> 24
Mesmo que numero1 = numero1 / numero2;#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 8
numero2 3
Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8 Multiplicando por 3 -> 24 Dividindo por 3 -> 8
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 2
numero2 3
Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8 Multiplicando por 3 -> 24 Dividindo por 3 -> 8
Mesmo que numero1 = numero1 % numero2;#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 2
numero2 3
Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8 Multiplicando por 3 -> 24 Dividindo por 3 -> 8 Resto da divisão por 3 -> 2
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
numero1 2
numero2 3
Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8 Multiplicando por 3 -> 24 Dividindo por 3 -> 8 Resto da divisão por 3 -> 2
Operadores de incremento e decremento
• Operadores ++ e --
• Usados para adicionar 1 ou subtrair 1 do valor de uma variável
• ++ pode ser utilizado para incrementar 1 no valor de uma variável x no lugar de x = x + 1 ou x += 1
variável1 4
variável1 5
+
Operadores prefixados ou de pós-incremento
• O operador pode ser:
• prefixado (++x ou --x)
• de pós-incremento/decremento (x++ ou x--)
• O operador prefixado incrementa o valor da variável e depois a variável é utilizada na expressão em que aparece
• O operador prefixado incrementa o valor da variável depois que a variável é utilizada na expressão em que aparece
Operadores de incremento e decremento
Utiliza e depois incrementa i++
Incrementa e depois utiliza ++i
Utiliza e depois decrementa i--
Decrementa e depois utiliza --i
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x
É criada a variável x
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 0
x é inicializado com 0#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 0
Operador de pós-incremento
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 0
1) x é utilizado
x = 0
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 1
2) x é incrementado
x = 0
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 1
x = 0 x = 1
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 1
x = 0 x = 1
Operador de incremento prefixado
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 2
x = 0 x = 1
1) Variável x é incrementada#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 2
x = 0 x = 1 x = 2
2) Variável x é utilizada
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 2
x = 0 x = 1 x = 2 x = 2
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 2
x = 0 x = 1 x = 2 x = 2
Operador de pós-decremento
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 2
x = 0 x = 1 x = 2 x = 2 x = 2
1) Utiliza#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 1
x = 0 x = 1 x = 2 x = 2 x = 2
1) Decrementa
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 1
x = 0 x = 1 x = 2 x = 2 x = 2 x = 1
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 1
x = 0 x = 1 x = 2 x = 2 x = 2 x = 1
Operador de decremento prefixado
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 0
x = 0 x = 1 x = 2 x = 2 x = 2 x = 1
1) Decrementa #include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 0
x = 0 x = 1 x = 2 x = 2 x = 2 x = 1 x = 0
2) Utiliza
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 0
x = 0 x = 1 x = 2 x = 2 x = 2 x = 1 x = 0 x = 0
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
x 0
x = 0 x = 1 x = 2 x = 2 x = 2 x = 1 x = 0 x = 0
Exercício
Digite o lado do quadrado: 4.2 A área do quadrado é 17.64
Revisão
#include <iostream>using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; }.
Revisão
#include <iostream>using namespace std; int main() { cout << "Olá, Mundo!" << endl; return 0; }.
Biblioteca de entrada e saída
Espaço de nomes padrãoFunção principal
Impressão na telaRetorno
#include <iostream>using namespace std; int main() { int numero1; int numero2; int r; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; r = numero1 + numero2; cout << "Adição dos números = " << r << endl; r = numero1 - numero2; cout << "Subtração dos números = " << r << endl; r = numero1 * numero2; cout << "Multiplicação dos números = " << r << endl; r = numero1 / numero2; cout << "Divisão dos números = " << r << endl; r = numero1 % numero2; cout << "Resto da divisão = " << r << endl; return 0; }.
Criando variáveis
Fluxo de entrada
Operadores aritméticos e de atribuição
#include <iostream>using namespace std; int main() { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }.
Operadores de
atribuição aritméticos
#include <iostream>using namespace std; int main() { int x; x = 0; cout << "x = " << x++ << endl; cout << "x = " << x << endl; cout << "x = " << ++x << endl; cout << "x = " << x << endl; cout << "x = " << x-- << endl; cout << "x = " << x << endl; cout << "x = " << --x << endl; cout << "x = " << x << endl; return 0; }.
Operadores de incremento e decremento
Dados lógicos• Em muito comum
em nossas vidas dilemas onde temos apenas duas opções:
• Verdadeiro ou Falso
• Sim ou Não
• 0 ou 1
• Esquerda ou direita
Dados lógicos
• Variáveis lógicas são criadas com o comando para tipo de dado bool
• Estas variáveis podem assumir apenas dois valores:
• Verdadeiro (representado por True)
• Falso (representado por False)
#include <iostream>using namespace std; int main() { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }.
#include <iostream>using namespace std; int main() { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }.
var1
É criada a variável var1
#include <iostream>using namespace std; int main() { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }.
var1 true
var1 recebe true (verdadeiro)#include <iostream>using namespace std; int main() { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }.
var1 true
É criada a variável var2
var2
#include <iostream>using namespace std; int main() { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }.
var1 true
var2 recebe false (falso)
var2 false
#include <iostream>using namespace std; int main() { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }.
var1 true
cout imprime true como 1 e false como 0
var2 false
var1 = 1 var2 = 0
#include <iostream>using namespace std; int main() { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }.
var1 true
var2 false
var1 = 1 var2 = 0
Operadores relacionais• São utilizados para
comparar variáveis de qualquer tipo
• O resultado da comparação é um dado do tipo bool
• Usualmente são mais utilizados para gerar dados do tipo bool que os valores true e false diretamente
variável1 3 variável2 7
variável bool
false
>
Operadores relacionais
Significado Em C++ Em álgebra
Maior que > >
Maior ou igual >= ≥
Menor que < <
Menor ou igual <= ≤
Igual == =
Diferente != ≠
Operadores relacionais
Significado Em C++ Em álgebra
Maior que > >
Maior ou igual >= ≥
Menor que < <
Menor ou igual <= ≤
Igual == =
Diferente != ≠
Não confundir o operador relacional == (que representa igualdade) com o operador de
atribuição =
#include <iostream>using namespace std; int main() { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4 != 4) << endl; return 0; }.
x
É criada a variável x#include <iostream>using namespace std; int main() { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4 != 4) << endl; return 0; }.
#include <iostream>using namespace std; int main() { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4 != 4) << endl; return 0; }.
x true
x recebe bool que diz se 2 é menor que 9 #include <iostream>
using namespace std; int main() { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4 != 4) << endl; return 0; }.
x true
Imprime x, onde true é representado por 1
1
#include <iostream>using namespace std; int main() { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4 != 4) << endl; return 0; }.
x true
se não precisamos armazenar o resultado de uma expressão,
podemos imprimir diretamente seu resultado
1 1
#include <iostream>using namespace std; int main() { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4 != 4) << endl; return 0; }.
x true
1 1 0
#include <iostream>using namespace std; int main() { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4 != 4) << endl; return 0; }.
x true
1 1 0 1
#include <iostream>using namespace std; int main() { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4 != 4) << endl; return 0; }.
x true
1 1 0 1 1
#include <iostream>using namespace std; int main() { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4 != 4) << endl; return 0; }.
x true
1 1 0 1 1 1
#include <iostream>using namespace std; int main() { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4 != 4) << endl; return 0; }.
x true
1 1 0 1 1 1 0
#include <iostream>using namespace std; int main() { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4 != 4) << endl; return 0; }.
x true
1 1 0 1 1 1 0
Operadores lógicos• Operadores de relação
são úteis para expressar condições simples como x < 10, y ≥ 1000, x ≠ y
• Operadores lógicos são utilizados para testar múltiplas condições, que são representadas por bools
condição1 true condição2 false
variável bool
false
&&
Nome Em C++ Retorna
E lógico && se dois bools são true
OU lógico || se um de dois bools é true
Não lógicoou
Negação! o inverso de um
bool
Expressão Resultado
((2 > 7) && (6 > 3)) false
((2 < 7) && (6 > 3)) true
((2 < 7) || (6 < 3)) true
((7 < 2) || (6 < 3)) false
!(2 < 3) false
Exemplos
Resumo do operador &&
Expressão 1 Expressão 2 Expressão 1 && Expressão 2
false false false
false true false
true false false
true true true
Atenção
• Embora (3 < x < 7) seja uma condição matematicamente correta, deve-se utilizar ((3 < x) && (x < 7)) em C++ pois são duas operações distintas de comparação.
Resumo do operador ||
Expressão 1 Expressão 2 Expressão 1 && Expressão 2
false false false
false true true
true false true
true true true
Resumo do operador !
Expressão ! Expressão
true false
false true
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x false
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x false
0
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x true
0
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x true
0 1
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x true
0 1 1
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x true
0 1 1 1
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x true
0 1 1 1 0
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x false
0 1 1 1 0
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x false
0 1 1 1 0 0
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x false
0 1 1 1 0 0 0
#include <iostream>using namespace std; int main() { bool x; x = ((2 > 7) && (6 > 3)); cout << x << endl; x = ((true) || (false)); cout << x << endl; cout << ((2 < 7) && (6 > 3)) << endl; cout << ((2 < 7) || (6 < 3)) << endl; cout << ((7 < 2) || (6 < 3)) << endl; x = !x; cout << x << endl; cout << !(2 < 3) << endl; return 0; }.
x false
0 1 1 1 0 0 0
Estrutura condicional• Todos os momentos,
as pessoas tomam decisões.
• Se o carro estiver sujo, lavar o carro
• Se não choveu ontem, regar as plantas
• Se estiver escuro, acender as luzes
Estrutura condicional• No códigos que criamos até o
momento, apenas estruturas sequenciais foram utilizadas
• De cima para baixo, todos os comandos são executados
• Com estruturas condicionais, podemos dizer que alguns trechos de código nem sempre serão executados
Estrutura condicionalComandos
Comandos
Comandos
Comandos
Comandos
Condição
Comandos
Comandos
Se
• A instrução if (se) é uma instrução de uma única seleção
• Seleciona ou ignora um grupo de ações
Comandos
Condição
Comandos
Comandos
Comandos
Comandos
Condição
Comandos
Comandos
Comandos
Esta condição...
...pode fazer ignorarmos
ou não este bloco
de comandos
Se
• Toda instrução de controle espera um dado do tipo bool indicando se a condição é true (verdadeira) ou false (falsa)
Se - Sintaxe
if (condição){ comandos; comandos;}.
Se - Sintaxe
if (condição){ comandos; comandos;}.
A condição entre parênteses deve ser um dado do tipo bool
Se - Sintaxe
if (condição){ comandos; comandos;}.
Este bool pode ser simplesmente true ou false mas normalmente é uma expressão
que retorne um bool como (x < 3)
O motivo disto é que caso contrário a condição seria sempre verdadeira ou
sempre falsa
Se - Sintaxe
if (condição){ comandos; comandos;}.
As chaves { e } indicam onde se inicia e termina o bloco de comandos que serão
executados apenas se a condição for verdadeira
Se - Sintaxe
if (condição){ comandos; comandos;}.
Entre as chaves, podem ser inseridos quantos comandos forem necessários
Se - Sintaxe
if (condição){ comandos; comandos;}.
Perceba que os comandos pertencentes ao if estão alinhados mais à direita do restante
do código
Isto é fundamental para legibilidade do código. Esta organização se chama
indentação.
#include <iostream>using namespace std; int main() { double largura; cout << "Digite a largura do quadrado: "; cin >> largura; if (largura >= 0){ cout << "A área do quadrado é " << largura * largura << endl; } return 0; }.
#include <iostream>using namespace std; int main() { double largura; cout << "Digite a largura do quadrado: "; cin >> largura; if (largura >= 0){ cout << "A área do quadrado é " << largura * largura << endl; } return 0; }.
largura 5
Digite a largura do quadrado: 5
#include <iostream>using namespace std; int main() { double largura; cout << "Digite a largura do quadrado: "; cin >> largura; if (largura >= 0){ cout << "A área do quadrado é " << largura * largura << endl; } return 0; }.
largura 5
Digite a largura do quadrado: 5
Testada a condição 5 ≥ 0
#include <iostream>using namespace std; int main() { double largura; cout << "Digite a largura do quadrado: "; cin >> largura; if (largura >= 0){ cout << "A área do quadrado é " << largura * largura << endl; } return 0; }.
largura 5
Digite a largura do quadrado: 5 A área do quadrado é 25
O comando dentro do bloco é executado pois a condição retornou true
#include <iostream>using namespace std; int main() { double largura; cout << "Digite a largura do quadrado: "; cin >> largura; if (largura >= 0){ cout << "A área do quadrado é " << largura * largura << endl; } return 0; }.
largura -3
Digite a largura do quadrado: -3
Suponha agora que o usuário digitou -3
#include <iostream>using namespace std; int main() { double largura; cout << "Digite a largura do quadrado: "; cin >> largura; if (largura >= 0){ cout << "A área do quadrado é " << largura * largura << endl; } return 0; }.
largura -3
Digite a largura do quadrado: -3
-3 >= 0 é false
#include <iostream>using namespace std; int main() { double largura; cout << "Digite a largura do quadrado: "; cin >> largura; if (largura >= 0){ cout << "A área do quadrado é " << largura * largura << endl; } return 0; }.
largura -3
Digite a largura do quadrado: -3
Bloco do false é ignorado e programa é encerrado sem a mensagem
Se-Senão• Além de fazer
tarefas condicionais, fazemos muitas decisões entre duas coisas.
• A festa é a noite? Se sim, usar um terno. Senão, usar uma bermuda.
?
Se-Senão
• A instrução if-else (se-senão) é uma instrução de seleção dupla
• Seleciona entre dois blocos diferentes de ações em vez de apenas ignorar um bloco
Comandos
Condição
Comandos
Comandos
Comandos
Comandos
Comandos
Comandos
Condição
Comandos
Comandos
Comandos
Comandos
Comandos
Esta condição...
...decide qual bloco de
comandos utilizaremos
Se-Senão - Sintaxe
if (condição){ comandos; comandos;} else { comandos; comandos;}.
Se-Senão - Sintaxe
if (condição){ comandos; comandos;} else { comandos; comandos;}.
A condição entre parênteses deve ser um dado do tipo bool
Se-Senão - Sintaxe
if (condição){ comandos; comandos;} else { comandos; comandos;}.
As chaves { e } indicam agora onde se iniciam e terminam dois blocos de
comandos
Se-Senão - Sintaxe
if (condição){ comandos; comandos;} else { comandos; comandos;}.
Este bloco é executado se a condição for true
Este bloco é executado se a condição for false
Se-Senão - Sintaxe
if (condição){ comandos; comandos;} else { comandos; comandos;}.
Perceba a indentação
#include <iostream>using namespace std; int main() { int numero; cout << "Digite um número: "; cin >> numero; if (numero % 2 == 0){ cout << "O número é par" << endl; } else { cout << "O número é ímpar" << endl; } return 0; }.
numero 7
Digite um número: 7
#include <iostream>using namespace std; int main() { int numero; cout << "Digite um número: "; cin >> numero; if (numero % 2 == 0){ cout << "O número é par" << endl; } else { cout << "O número é ímpar" << endl; } return 0; }.
numero 7
Digite um número: 7
#include <iostream>using namespace std; int main() { int numero; cout << "Digite um número: "; cin >> numero; if (numero % 2 == 0){ cout << "O número é par" << endl; } else { cout << "O número é ímpar" << endl; } return 0; }.
Testa se a divisão do número por 2 tem resto 0
numero 7
Digite um número: 7 O número é ímpar
#include <iostream>using namespace std; int main() { int numero; cout << "Digite um número: "; cin >> numero; if (numero % 2 == 0){ cout << "O número é par" << endl; } else { cout << "O número é ímpar" << endl; } return 0; }.
Como resultado é false, o bloco de comandos do else é executado
numero 7
Digite um número: 7 O número é ímpar
#include <iostream>using namespace std; int main() { int numero; cout << "Digite um número: "; cin >> numero; if (numero % 2 == 0){ cout << "O número é par" << endl; } else { cout << "O número é ímpar" << endl; } return 0; }.
Se-Senão aninhados• Existem ocasiões onde há várias condições
possíveis que levam a diferentes escolhas.
• Imagine um caixa eletrônico.
• Se a opção for a extrato, a tela 1 é exibida. Se a opção for saldo, a tela 2 é exibida. Se a opção for depósito, a tela 3 é exibida. Se a opção for saque, a tela 4 é exibida.
Se-Senão aninhados
Extrato
Saque
Saldo
Depósito
Tela 1
Tela 3
Tela 2
Tela 4
Se-Senão aninhados
• A instrução if-else (se-senão) aninhada é utilizada como instrução de seleção múltipla para testar vários casos
• Seleciona entre vários grupos diferentes de comandos
Comandos
Condições
Comandos
Comandos
Comandos
Comandos
Comandos
Comandos
Comandos
Comandos
Condições
Comandos
Comandos
Comandos
Comandos
Comandos
Comandos
Comandos
Há agora um grupo de condições...
... que escolhem entre grupos de blocos de comandos.
Se-Senão - Sintaxeif (condição){ comandos; comandos;} else if (condição){ comandos; comandos; } else if (condição){ comandos; comandos;} else { comandos; comandos;}.
Se-Senão aninhados - Sintaxeif (condição){ comandos; comandos;} else if (condição){ comandos; comandos; } else if (condição){ comandos; comandos;} else { comandos; comandos;}.
Há agora várias condições
Podem ser criados quantos blocos forem necessários
Se-Senão aninhados - Sintaxeif (condição){ comandos; comandos;} else if (condição){ comandos; comandos; } else if (condição){ comandos; comandos;} else { comandos; comandos;}.
Para cada condição a mais, temos um bloco a
mais
Se-Senão aninhados - Sintaxeif (condição){ comandos; comandos;} else if (condição){ comandos; comandos; } else if (condição){ comandos; comandos;} else { comandos; comandos;}.
A primeira condição que
for true determina qual bloco
será executado
Se nenhuma for true, o bloco do else é
executado
Se-Senão - Sintaxe
A indentação se mantém
if (condição){ comandos; comandos;} else if (condição){ comandos; comandos; } else if (condição){ comandos; comandos;} else { comandos; comandos;}.
#include <iostream>using namespace std; int main() { int nota; cout << "Digite a nota do aluno: "; cin >> nota; if (nota >= 90){ cout << "O conceito do aluno é A" << endl; } else if (nota >= 80) { cout << "O conceito do aluno é B" << endl; } else if (nota >= 70) { cout << "O conceito do aluno é C" << endl; } else if (nota >= 60) { cout << "O conceito do aluno é D" << endl; } else { cout << "O conceito do aluno é E" << endl; } return 0; }.
nota 74
Digite a nota do aluno: 74
#include <iostream>using namespace std; int main() { int nota; cout << "Digite a nota do aluno: "; cin >> nota; if (nota >= 90){ cout << "O conceito do aluno é A" << endl; } else if (nota >= 80) { cout << "O conceito do aluno é B" << endl; } else if (nota >= 70) { cout << "O conceito do aluno é C" << endl; } else if (nota >= 60) { cout << "O conceito do aluno é D" << endl; } else { cout << "O conceito do aluno é E" << endl; } return 0; }.
nota 74
Digite a nota do aluno: 74
#include <iostream>using namespace std; int main() { int nota; cout << "Digite a nota do aluno: "; cin >> nota; if (nota >= 90){ cout << "O conceito do aluno é A" << endl; } else if (nota >= 80) { cout << "O conceito do aluno é B" << endl; } else if (nota >= 70) { cout << "O conceito do aluno é C" << endl; } else if (nota >= 60) { cout << "O conceito do aluno é D" << endl; } else { cout << "O conceito do aluno é E" << endl; } return 0; }.
A nota não é maior que 90
nota 74
Digite a nota do aluno: 74
#include <iostream>using namespace std; int main() { int nota; cout << "Digite a nota do aluno: "; cin >> nota; if (nota >= 90){ cout << "O conceito do aluno é A" << endl; } else if (nota >= 80) { cout << "O conceito do aluno é B" << endl; } else if (nota >= 70) { cout << "O conceito do aluno é C" << endl; } else if (nota >= 60) { cout << "O conceito do aluno é D" << endl; } else { cout << "O conceito do aluno é E" << endl; } return 0; }.
A nota não é maior que 80
nota 74
Digite a nota do aluno: 74
#include <iostream>using namespace std; int main() { int nota; cout << "Digite a nota do aluno: "; cin >> nota; if (nota >= 90){ cout << "O conceito do aluno é A" << endl; } else if (nota >= 80) { cout << "O conceito do aluno é B" << endl; } else if (nota >= 70) { cout << "O conceito do aluno é C" << endl; } else if (nota >= 60) { cout << "O conceito do aluno é D" << endl; } else { cout << "O conceito do aluno é E" << endl; } return 0; }.
Mas a nota é maior que 70
nota 74
Digite a nota do aluno: 74 O conceito do aluno é C
#include <iostream>using namespace std; int main() { int nota; cout << "Digite a nota do aluno: "; cin >> nota; if (nota >= 90){ cout << "O conceito do aluno é A" << endl; } else if (nota >= 80) { cout << "O conceito do aluno é B" << endl; } else if (nota >= 70) { cout << "O conceito do aluno é C" << endl; } else if (nota >= 60) { cout << "O conceito do aluno é D" << endl; } else { cout << "O conceito do aluno é E" << endl; } return 0; }.
Executa-se então o bloco de comandos correpondente
nota 74
Digite a nota do aluno: 74 O conceito do aluno é C
#include <iostream>using namespace std; int main() { int nota; cout << "Digite a nota do aluno: "; cin >> nota; if (nota >= 90){ cout << "O conceito do aluno é A" << endl; } else if (nota >= 80) { cout << "O conceito do aluno é B" << endl; } else if (nota >= 70) { cout << "O conceito do aluno é C" << endl; } else if (nota >= 60) { cout << "O conceito do aluno é D" << endl; } else { cout << "O conceito do aluno é E" << endl; } return 0; }.
Saímos do bloco aninhado
nota 74
Digite a nota do aluno: 74 O conceito do aluno é C
#include <iostream>using namespace std; int main() { int nota; cout << "Digite a nota do aluno: "; cin >> nota; if (nota >= 90){ cout << "O conceito do aluno é A" << endl; } else if (nota >= 80) { cout << "O conceito do aluno é B" << endl; } else if (nota >= 70) { cout << "O conceito do aluno é C" << endl; } else if (nota >= 60) { cout << "O conceito do aluno é D" << endl; } else { cout << "O conceito do aluno é E" << endl; } return 0; }. Repare que a nota também era maior que 60 mas
apenas o primeiro bloco true é considerado
Outros operadores condicionais
• Apesar das instruções apresentadas serem suficientes para representar qualquer estrutura condicional, existem outros operadores disponíveis
Operador Ternário
condicao?expressao1:expressao2;if (condicao){ expressao1;} else { expressao2;}.
Sintaxe
Operador Ternário
condicao?expressao1:expressao2;if (condicao){ expressao1;} else { expressao2;}.
max=(x>y)?1:0;if (x>y){ max = 1;} else { max = 0;}
Exemplo
Sintaxe
Operador Ternário
• Faz o mesmo que um if-else (se-senão)
• Uso deve ser evitado pois dificulta a leitura do código
Switch
Sintaxe
switch(variável){ case constante1: comandos; break; case constante2: comandos; break; default: comandos;}.
if (variável == contante1){ comandos;} else if (variável == constante2){ comandos;} else { comandos;}.
Switch
Sintaxe
switch(variável){ case constante1: comandos; break; case constante2: comandos; break; default: comandos;}.
if (variável == contante1){ comandos;} else if (variável == constante2){ comandos;} else { comandos;}.
switch(opcao){ case 1: cout << “Opção 1 escolhida” << endl; break; case 2: cout << “Opção 2 escolhida” << endl; break; default: cout << “Opção inválida escolhida” << endl;}
if (opcao == 1){ cout << “Opção 1 escolhida” << endl;} else if (opcao == 2){ cout << “Opção 2 escolhida” << endl;} else { cout << “Opção inválida escolhida” << endl;}
Exemplo
Switch
• Pode ser substituído por um if-else aninhado
• É um recurso muito utilizado para apresentar um menu de opções para o usuário (assim como if-else aninhado)
Exercício
Digite o primeiro número: 7Digite o segundo número: 15Você digitou 0 números pares e 2 números ímpares
#include <iostream>using namespace std; int main() { double largura; cout << "Digite a largura do quadrado: "; cin >> largura; if (largura >= 0){ cout << "A área do quadrado é " << largura * largura << endl; } return 0; }.
#include <iostream>using namespace std; int main() { int numero; cout << "Digite um número: "; cin >> numero; if (numero % 2 == 0){ cout << "O número é par" << endl; } else { cout << "O número é ímpar" << endl; } return 0; }.
#include <iostream>using namespace std; int main() { int nota; cout << "Digite a nota do aluno: "; cin >> nota; if (nota >= 90){ cout << "O conceito do aluno é A" << endl; } else if (nota >= 80) { cout << "O conceito do aluno é B" << endl; } else if (nota >= 70) { cout << "O conceito do aluno é C" << endl; } else if (nota >= 60) { cout << "O conceito do aluno é D" << endl; } else { cout << "O conceito do aluno é E" << endl; } return 0; }.
Operador de endereço• Cada variável declarada possui seu
endereço na memória
• O nome da variável retorna diretamente seu valor
• Operador & retorna o endereço desta variável que, por sua vez, contém um valor
• Endereço de variáveis é conceito fundamental em C++
Ao criar uma variável, ela é guardada na memória
largura 5
double largura; largura = 5;
Cada valor precisa ficar em uma posição da memória
largura 5
Valores na memória
Cada uma destas posições tem um endereço
24
25
26
27
28
largura 5 29
30
31
32
33
34
35
Nome das variáveis
Valores das variáveis
Endereços das variáveis
O nome da uma variável já nos retorna seu valor
24
25
26
27
28
largura 5 29
30
31
32
33
34
35
O operador de endereço é usado para nos retornar o endereço de uma variável
#include <iostream>using namespace std; int main() { int num; cout << "Digite um número: "; cin >> num; cout << "O número é " << num << endl; cout << "O endereço do número é " << &num << endl; return 0; }.
num
Criamos uma variável num#include <iostream>using namespace std; int main() { int num; cout << "Digite um número: "; cin >> num; cout << "O número é " << num << endl; cout << "O endereço do número é " << &num << endl; return 0; }.
num
A princípio, sabemos que a variável existe mas não sabemos seu endereço na memória
#include <iostream>using namespace std; int main() { int num; cout << "Digite um número: "; cin >> num; cout << "O número é " << num << endl; cout << "O endereço do número é " << &num << endl; return 0; }.
num 65
Digite um número: 65
Suponha que neste trecho de código, o usuário dê um valor qualquer a num
#include <iostream>using namespace std; int main() { int num; cout << "Digite um número: "; cin >> num; cout << "O número é " << num << endl; cout << "O endereço do número é " << &num << endl; return 0; }.
num 65
Digite um número: 65 O número é 65
Como estamos acostumados, cout imprime o valor do número num
#include <iostream>using namespace std; int main() { int num; cout << "Digite um número: "; cin >> num; cout << "O número é " << num << endl; cout << "O endereço do número é " << &num << endl; return 0; }.
num 65
Digite um número: 65 O número é 65 O endereço do número é 0xbf8d456c
Agora utilizamos &num em vez de num e o endereço de num na memória é exibido
#include <iostream>using namespace std; int main() { int num; cout << "Digite um número: "; cin >> num; cout << "O número é " << num << endl; cout << "O endereço do número é " << &num << endl; return 0; }.
#include <iostream>using namespace std; int main() { int num; cout << "Digite um número: "; cin >> num; cout << "O número é " << num << endl; cout << "O endereço do número é " << &num << endl; return 0; }.
num 65
Digite um número: 65 O número é 65 O endereço do número é 0xbf8d456c
Fim do programa. Repare que o endereço da variável não é um número tão simples como os números de nosso
exemplo. Isso se deve à grande capacidade (e número de endereços) das memórias atuais.
Arranjos• Pelo o que vimos até agora, cada variável
identifica um dado da memória.
• Porém, sabemos que programas complexos trabalham com muitos dados: milhares de estudantes, milhões de produtos ou centenas de números.
• Precisamos então de estruturas que representem vários dados de uma só vez.
Arranjos• Um arranjo é um endereço onde há um
grupo consecutivo de posições alocadas na memória
• Todas as posições neste grupo guardam variáveis do mesmo tipo
• Arranjos são estruturas de dados muito úteis para se trabalhar com vários itens do mesmo tipo
x 5 9 3 7 2 5 8 2
Arranjos
Este é um arranjo de números inteiros chamado x.
x 5 9 3 7 2 5 8 2
x nada mais é que o endereço do primeiro elemento deste arranjo de números inteiros.
x 5 9 3 7 2 5 8 2
Para acessar elementos específicos precisamos da utilizar x[i] onde i é a
posição no arranjo. Formalmente i é chamado de índice do
arranjo.
x 5 9 3 7 2 5 8 2
x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7]
x 5 9 3 7 2 5 8 2
Repare que o primeiro índice i é 0
x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7]
x 5 9 3 7 2 5 8 2
Repare que o último índice i é 7, ou seja, um a menos que o número de elementos
x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7]
x 5 9 3 7 2 5 8 2
Os índices são simplesmente números inteiros ou uma expressão do tipo inteiro
x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7]
x 5 9 3 7 2 5 8 2
Suponha variáveis a e b do tipo inteiro
x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7]
a 3 b 2
x 5 9 3 7 2 5 8 2
Podemos acessar x[a+b] para retornar o elemento x[5]
x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7]
a 3 b 2
x 5 9 3 7 2 5 8 2
Os endereços dos elementos do arranjo estão em sequência na memória.
x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7]
Endereço 50 51 52 53 54 55 56 57
x
Para criar um arranjo inicial em branco use:
int x[10];
x 5 9 3 7 2 5 8 2
Para já criar um arranjo com elementos use:
int x[] = {5, 9, 3, 7, 2, 5, 8, 2};
É fundamental lembrar que um arranjo ocupa posição contíguas na memória
24
x[0] 5 25
x[1] 9 26
x[2] 3 27
x[3] 7 28
x[4] 2 29
x[5] 5 30
x[6] 8 31
x[7] 2 32
33
34
35
Variáveis
Valores
Endereçosx 5 9 3 7 2 5 8 2
0 1 2 3 4 5 6 7
}x
Os índices indicam quantas posições somamos ao endereço da variável para encontrar um elemento
24
x[0] 5 25
x[1] 9 26
x[2] 3 27
x[3] 7 28
x[4] 2 29
x[5] 5 30
x[6] 8 31
x[7] 2 32
33
34
35
Posições
Valores
Endereçosx 5 9 3 7 2 5 8 2
0 1 2 3 4 5 6 7
&x[3] == &x[0] + 3
Tentar acessar uma posição inexistente do arranjo é um erro grave! Não sabemos o que há na posição!
24
x[0] 5 25
x[1] 9 26
x[2] 3 27
x[3] 7 28
x[4] 2 29
x[5] 5 30
x[6] 8 31
x[7] 2 32
33
???? 34
35
Posições
Valores
Endereçosx 5 9 3 7 2 5 8 2
0 1 2 3 4 5 6 7
x[9]
#include <iostream>using namespace std; int main() { int a[] = {5,7,2,1,3,5}; int soma; soma = a[0] + a[2] + a[4]; cout << "a[0] + a[2] + a[4] -> " << soma << endl; cout << "Endereço do arranjo -> " << a << endl; return 0; }.
a 5 7 2 1 3 5
É criado um arranjo a com 6 elementos#include <iostream>using namespace std; int main() { int a[] = {5,7,2,1,3,5}; int soma; soma = a[0] + a[2] + a[4]; cout << "a[0] + a[2] + a[4] -> " << soma << endl; cout << "Endereço do arranjo -> " << a << endl; return 0; }.
a[0] a[1] a[2] a[3] a[4] a[5]
a 5 7 2 1 3 5
Criada uma variável soma#include <iostream>using namespace std; int main() { int a[] = {5,7,2,1,3,5}; int soma; soma = a[0] + a[2] + a[4]; cout << "a[0] + a[2] + a[4] -> " << soma << endl; cout << "Endereço do arranjo -> " << a << endl; return 0; }.
a[0] a[1] a[2] a[3] a[4] a[5]
soma
a 5 7 2 1 3 5
soma recebe 5 + 2 + 3#include <iostream>using namespace std; int main() { int a[] = {5,7,2,1,3,5}; int soma; soma = a[0] + a[2] + a[4]; cout << "a[0] + a[2] + a[4] -> " << soma << endl; cout << "Endereço do arranjo -> " << a << endl; return 0; }.
a[0] a[1] a[2] a[3] a[4] a[5]
soma 10
a 5 7 2 1 3 5
#include <iostream>using namespace std; int main() { int a[] = {5,7,2,1,3,5}; int soma; soma = a[0] + a[2] + a[4]; cout << "a[0] + a[2] + a[4] -> " << soma << endl; cout << "Endereço do arranjo -> " << a << endl; return 0; }.
a[0] a[1] a[2] a[3] a[4] a[5]
soma 10
a[0] + a[2] + a[4] -> 10
a 5 7 2 1 3 5
#include <iostream>using namespace std; int main() { int a[] = {5,7,2,1,3,5}; int soma; soma = a[0] + a[2] + a[4]; cout << "a[0] + a[2] + a[4] -> " << soma << endl; cout << "Endereço do arranjo -> " << a << endl; return 0; }.
a[0] a[1] a[2] a[3] a[4] a[5]
soma 10
a[0] + a[2] + a[4] -> 10 Endereço do arranjo -> 0x7fff5f6bdb70
a 5 7 2 1 3 5
#include <iostream>using namespace std; int main() { int a[] = {5,7,2,1,3,5}; int soma; soma = a[0] + a[2] + a[4]; cout << "a[0] + a[2] + a[4] -> " << soma << endl; cout << "Endereço do arranjo -> " << a << endl; return 0; }.
a[0] a[1] a[2] a[3] a[4] a[5]
soma 10
a[0] + a[2] + a[4] -> 10 Endereço do arranjo -> 0x7fff5f6bdb70
Cadeias de caracteres• Como vimos, o tipo fundamental de
dados char é utilizado para representar letras e caracteres
• Sua relação com arranjos é fundamental para formar cadeias de caracteres.
• Estas cadeias representam então palavras e frases, que não são um tipo fundamental de dado
Cadeias de caracteres
• As cadeias de caracteres são arranjos de char que terminam o caractere especial \0, que representa o fim da cadeia
b a b a c a t e \0
Este é um arranjo de char chamado b e que carrega a palavra abacate.
b a b a c a t e \0
O caractere \0 mostra que ali termina a palavra
São necessários assim 8 elementos para uma palavra de 7 letras
b a b a c a t e \0
Este arranjo poderia ter sido criado diretamente com o comando:
char b[] = {'a', 'b', 'a', 'c', 'a', 't', 'e', '\0'};
b a b a c a t e \0
Porém existe um atalho equivalente:
char b[] = "abacate";
b a b a c a t e \0
Porém, o comandocin >> b;
é muito perigoso pois a pessoa pode digitar mais que 7 letras e haverá uma tentativa de inserir elementos
além do arranjo b l a r a n j a d a \0
Em um comando:cin >> b;
Se a pessoa digita “laranjada”:
Ocorre um erro por falta de espaço, por isto é preciso garantir que isto não ocorra como arranjos com espaço suficiente para as palavras possíveis
Porém, o comando:cout << b;
Imprime a palavra abacate corretamente.
b a b a c a t e \0
Assim como cin, cout não se preocupa com o tamanho do arranjo. São impressos todos os
caracteres até que se encontre um \0.
Como em qualquer arranjo, os índices i em
b[i]
são utilizados para acessar o caractere na posição i
b a b a c a t e \0
b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7]
#include <iostream>using namespace std; int main() { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
nome
É criado um arranjo de char com 10 elementos#include <iostream>using namespace std; int main() { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
nome M a r i a \0
Um nome é inserido no arranjo#include <iostream>using namespace std; int main() { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
Digite seu nome: Maria
nome M a r i a \0
nome[2]#include <iostream>using namespace std; int main() { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
Digite seu nome: Maria Terceira letra de seu nome é r
nome M a r i a \0
#include <iostream>using namespace std; int main() { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
Digite seu nome: Maria A quinta letra de seu nome é a
nome M a r i a \0
Repare que este código é propenso a erros.#include <iostream>using namespace std; int main() { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
Digite seu nome: Maria A quinta letra de seu nome é a
nome M a r i a \0
O nome digitado poderia ter mais de 9 letras#include <iostream>using namespace std; int main() { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
Digite seu nome: Maria A quinta letra de seu nome é a
nome M a r i a \0
#include <iostream>using namespace std; int main() { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
Digite seu nome: Maria A quinta letra de seu nome é a
O nome poderia ter menos de 3 letras
Classe string• Pode ser muito trabalhoso lidar com todos os
erros possíveis na representação de cadeias de caracteres com arranjos
• O C++ oferece a classe string para aliviar este problema
• Esta é uma classe que define um tipo de dado não fundamental, composto com os dados fundamentais da linguagem que já conhecemos
• A classe string organiza as cadeias dentro dos arranjos automaticamente para o programador
b a b a c a t e \0
Suponha que b agora é uma string e não um arranjo simples de char
b a b a c a t e \0
Suponha que b agora é uma string e não um arranjo simples de char
Esta string pode ser criada com o comando: string b(“abacate”);
b a b a c a t e \0
Suponha que b agora é uma string e não um arranjo simples de char
Se tentarmos executar o comando: b = “laranjada”;
Mais espaço é alocado para atender à demanda.
b l a r a n j a d a \0
b a b a c a t e \0
Suponha que b agora é uma string e não um arranjo simples de char
Se tentarmos executar o comando: b = “laranjada”;
Mais espaço é alocado para atender à demanda.
b l a r a n j a d a \0
Por não ser um tipo de dado fundamental, é necessário incluir em nosso código o cabeçalho
#include <string>
#include <iostream> #include <string>using namespace std; int main() { string nome; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
O cabeçalho #include <string> nos dá o recurso de utilizar strings.
Ele é necessário pois string não é um tipo fundamental de dados.
#include <iostream> #include <string>using namespace std; int main() { string nome; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
nome
É criada uma string que terá a capacidade que for demandada
#include <iostream> #include <string>using namespace std; int main() { string nome; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
nome M a r i a \0
É alocado um arranjo com o espaço para o nome digitado
#include <iostream> #include <string>using namespace std; int main() { string nome; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
Digite seu nome: Maria
nome M a r i a \0
#include <iostream> #include <string>using namespace std; int main() { string nome; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
Digite seu nome: Maria Terceira letra de seu nome é r
nome[2]
nome M a r i a \0
#include <iostream> #include <string>using namespace std; int main() { string nome; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
Digite seu nome: Maria Terceira letra de seu nome é r
Arranjos Multidimensionais• Arranjos multidimensionais de duas
dimensões costumam representar tabelas de valores organizados em linhas e colunas
• Precisamos de dois índices para encontrar um item
• Por convenção o primeiro índice indica a linha e o segundo a coluna
• Estes são arranjos bidimensionais ou 2-D
x Coluna 0 Coluna 1 Coluna 2 Coluna 3
Linha 0 3 4 7 5
Linha 1 4 7 4 2
Linha 2 7 8 3 6
Exemplo de arranjo bidimensional
x Coluna 0 Coluna 1 Coluna 2 Coluna 3
Linha 0 x[0][0] x[0][1] x[0][2] x[0][3]
Linha 1 x[1][0] x[1][1] x[1][2] x[1][3]
Linha 2 x[2][0] x[2][1] x[2][2] x[2][3]
Se acessam os elementos com dois índices
x Coluna 0 Coluna 1 Coluna 2 Coluna 3
Linha 0 x[0][0] x[0][1] x[0][2] x[0][3]
Linha 1 x[1][0] x[1][1] x[1][2] x[1][3]
Linha 2 x[2][0] x[2][1] x[2][2] x[2][3]
Assim como em outros arranjos, os índices começam em 0
x
3 4 7 5
4 7 4 2
7 8 3 6
Este arranjo pode ser criado com: int x[3][4] = {{3,4,7,5},{4,7,4,2},{7,8,3,6}};
x
3 4 7 5
4 7 4 2
7 8 3 6
Este arranjo pode ser criado com: int x[3][4] = {{3,4,7,5},{4,7,4,2},{7,8,3,6}};
Isto ocorre porque um arranjo multidimensional é um arranjo de arranjos
Um arranjo multidimensional também ocupa posições contíguas na memória
x[0][0] 3 24
x[0][1] 4 25
x[0][2] 7 26
x[0][3] 5 27
x[1][0] 4 28
x[1][1] 7 29
x[1][2] 4 30
x[1][3] 2 31
x[2][0] 7 32
x[2][1] 8 33
x[2][2] 3 34
x[2][3] 6 35
Variáveis
Valores
Endereços
x3 4 7 54 7 4 27 8 3 6
{Isso porque nada mais são do que arranjos de
arranjos
x[0][0] 3 24
x[0][1] 4 25
x[0][2] 7 26
x[0][3] 5 27
x[1][0] 4 28
x[1][1] 7 29
x[1][2] 4 30
x[1][3] 2 31
x[2][0] 7 32
x[2][1] 8 33
x[2][2] 3 34
x[2][3] 6 35
Posições
Valores
Endereços
x3 4 7 54 7 4 27 8 3 6
}}}
x[0]
x[1]
x[2]
Arranjos Multidimensionais• A mesma estrutura sintática de arranjos de
arranjos pode ser utilizada para criar arranjos com qualquer número de dimensões:
• int x[3][2][5]; (3-D)
• double y[4][8][15][26]; (4-D)
• O primeiro elemento sempre tem índice 0
• Elementos são sempre contíguos na memória
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
É criado um arranjo de duas dimensões com 3 linhas e 2 colunas. Assim os índices vão de
x[0][0] até x[2][1].
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
x 0 1012
Cada linha da matriz representará um aluno e cada coluna uma prova feita por ele.
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
x 0 1012
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
resultado
x 0 1012
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
resultado
x 0 10 7.312
A posição x[0][0] se refere à primeira linha e primeira coluna.
Digite a nota do aluno 0 na prova 0: 7.3
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
resultado
x 0 10 7.312
Nos referimos ao aluno 0 na prova 0 para o usuário. Seria possível omitir esta informação
do usuário e mostrar aluno 1 prova 1.
Digite a nota do aluno 0 na prova 0: 7.3
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
resultado
x 0 10 7.3 5.612
Digite a nota do aluno 0 na prova 0: 7.3 Digite a nota do aluno 0 na prova 1: 5.6
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
resultado
x 0 10 7.3 5.61 6.52
Digite a nota do aluno 0 na prova 0: 7.3 Digite a nota do aluno 0 na prova 1: 5.6 Digite a nota do aluno 1 na prova 0: 6.5
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
resultado
x 0 10 7.3 5.61 6.5 9.32 2.6 3.4
Digite a nota do aluno 0 na prova 0: 7.3 Digite a nota do aluno 0 na prova 1: 5.6 Digite a nota do aluno 1 na prova 0: 6.5 Digite a nota do aluno 1 na prova 1: 9.3 Digite a nota do aluno 2 na prova 0: 2.6 Digite a nota do aluno 2 na prova 1: 3.4
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
resultado 5.46667
x 0 10 7.3 5.61 6.5 9.32 2.6 3.4
Digite a nota do aluno 0 na prova 0: 7.3 Digite a nota do aluno 0 na prova 1: 5.6 Digite a nota do aluno 1 na prova 0: 6.5 Digite a nota do aluno 1 na prova 1: 9.3 Digite a nota do aluno 2 na prova 0: 2.6 Digite a nota do aluno 2 na prova 1: 3.4 Nota média na prova 0 = 5.46667
Somamos todos os elementos da coluna 0 e dividimos por 3 para saber qual foi a nota
média nesta prova.
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
resultado 7.9
x 0 10 7.3 5.61 6.5 9.32 2.6 3.4
Digite a nota do aluno 0 na prova 0: 7.3 Digite a nota do aluno 0 na prova 1: 5.6 Digite a nota do aluno 1 na prova 0: 6.5 Digite a nota do aluno 1 na prova 1: 9.3 Digite a nota do aluno 2 na prova 0: 2.6 Digite a nota do aluno 2 na prova 1: 3.4 Nota média na prova 0 = 5.46667 Nota final do aluno 1 = 7.9
Somamos todos os elementos da linha 1 e dividimos por 2 para saber qual foi a nota final
deste aluno.
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
resultado 7.9
x 0 10 7.3 5.61 6.5 9.32 2.6 3.4
Digite a nota do aluno 0 na prova 0: 7.3 Digite a nota do aluno 0 na prova 1: 5.6 Digite a nota do aluno 1 na prova 0: 6.5 Digite a nota do aluno 1 na prova 1: 9.3 Digite a nota do aluno 2 na prova 0: 2.6 Digite a nota do aluno 2 na prova 1: 3.4 Nota média na prova 0 = 5.46667 Nota final do aluno 1 = 7.9
Digite o número x[0]: 5 Digite o número x[1]: 4 Digite o número x[2]: 4 5 + 4 é ímpar 4 + 4 é par
#include <iostream>using namespace std; int main() { int num; cout << "Digite um número: "; cin >> num; cout << "O número é " << num << endl; cout << "O endereço do número é " << &num << endl; return 0; }.
#include <iostream>using namespace std; int main() { int a[] = {5,7,2,1,3,5}; int soma; soma = a[0] + a[2] + a[4]; cout << "a[0] + a[2] + a[4] -> " << soma << endl; cout << "Endereço do arranjo -> " << a << endl; return 0; }.
#include <iostream>using namespace std; int main() { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
#include <iostream> #include <string>using namespace std; int main() { string nome; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.
#include <iostream>using namespace std; int main() { double x[3][2]; double resultado; cout << "Digite a nota do aluno 0 na prova 0: "; cin >> x[0][0]; cout << "Digite a nota do aluno 0 na prova 1: "; cin >> x[0][1]; cout << "Digite a nota do aluno 1 na prova 0: "; cin >> x[1][0]; cout << "Digite a nota do aluno 1 na prova 1: "; cin >> x[1][1]; cout << "Digite a nota do aluno 2 na prova 0: "; cin >> x[2][0]; cout << "Digite a nota do aluno 2 na prova 1: "; cin >> x[2][1]; resultado = (x[0][0] + x[1][0] + x[2][0])/3; cout << "Nota média na prova 0 = " << resultado << endl; resultado = (x[1][0] + x[1][1])/2; cout << "Nota final do aluno 1 = " << resultado << endl; return 0; }.
Estruturas de repetição
• Computadores nos auxiliam muito pois são capazes de repetir de tarefas por milhões ou bilhões de vezes.
• Este tipo de repetição poderia demorar séculos para humanos porém são simples para computadores.
Estruturas de repetição• Imagine quanto
tempo demoraria para enviar uma carta para um milhão de pessoas.
• Imagine agora quanto tempo demora enviar um e-mail para um milhão de pessoas.
Estruturas de repetição• Permitem realizar instruções
repetidamente se uma condição for verdadeira
• Estruturas de repetição também são chamadas de instruções de loop ou laços
• Usualmente, os laços são repetidos um certo número de vezes ou até que algo aconteça
Estrutura de repetiçãoComandos
Comandos
Comandos
Comandos
Comandos
Condição
Comandos
Comandos
Laços com contadores• O caso mais
simples de repetição é aquele no qual queremos repetir exatamente a mesma tarefa um certo número de vezes. 1 2 3 …
Variável contadora• Quando queremos que um um bloco de
comandos se repita um certo número de vezes, uma variável contadora guardará quantas vezes o bloco já foi executado
• Esta variável deve ser do tipo int
• A variável contadora pode ter qualquer nome mas ela tem usualmente, por convenção, o nome de i para facilitar seu uso repetido
• Cada repetição do laço é chamada de iteração
Repetição controlada por contador
• O contador precisa de um nome
• O contador precisa de um valor inicial
• O contador precisa de um valor final
• O contador precisa de um incremento a cada passo
Controle de Fluxo - for
for (inicialização; condição; incremento){ comandos;}.
Sintaxe
O comando for é utilizado para repetições controladas por variável contadora
Controle de Fluxo - for
for (inicialização; condição; incremento){ comandos;}.
A condição de inicialização é utilizada para inicializar a variável contadora.
Controle de Fluxo - for
for (inicialização; condição; incremento){ comandos;}.
Condição para que a repetição pare de acontecer. A condição é usualmente que a variável contadora tenha
atingido um valor final.
Controle de Fluxo - for
for (inicialização; condição; incremento){ comandos;}.
Aqui dizemos como será incrementada a variável contadora após cada repetição. Usualmente, somamos
1 à variável contadora.
Controle de Fluxo - for
for (inicialização; condição; incremento){ comandos;}.
Podemos colocar quantos comandos quisermos dentro do bloco, inclusive outras estruturas condicionais ou
mesmo outras estruturas de repetição.
Controle de Fluxo - for
for (inicialização; condição; incremento){ comandos;}.
for (i = 0; i < 10; i++){ comandos;}.
Estrutura básica para repetir um bloco de comandos 10 vezes.
Controle de Fluxo - forfor (inicialização; condição; incremento){ comandos;}.
for (i = 0; i < 10; i++){ comandos;}.
Contador i começa em zero e repetimos os comandos enquanto ele for menor do que 10. A
cada repetição ele é incrementado em 1.
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
Criada a variável contadora
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i
Contador é inicializado com zero
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 0
A condição é testada e o bloco de comandos será executado pois i < 10 é true.
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 0
Todo o bloco é executado.
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 0
Olá mundo!
Ao fim da execução do bloco, o comando de incremento é executado.
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 1
Olá mundo!
A condição de parada é testada e o comando será executado pois 1 < 10 é true
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 1
Olá mundo!
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 1
Olá mundo! Olá mundo!
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 2
Olá mundo! Olá mundo!
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 2
Olá mundo! Olá mundo!
2 < 10 == true
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 2
Olá mundo! Olá mundo! Olá mundo!
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 3
Olá mundo! Olá mundo! Olá mundo!
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 3
Olá mundo! Olá mundo! Olá mundo!
3 < 10 == true#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 3
Olá mundo! Olá mundo! Olá mundo! Olá mundo!
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 9
Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo!
Após as 10 iterações deste laço, teremos o seguinte estado...
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 10
Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo!
i chega a 10
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 10
Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo!
i < 10 == false e o bloco não é mais executado.
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
i 10
Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo!
Fim do programa
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
#include <iostream>using namespace std; int main() { cout << "Olá mundo!" << endl; cout << "Olá mundo!" << endl; cout << "Olá mundo!" << endl; cout << "Olá mundo!" << endl; cout << "Olá mundo!" << endl; cout << "Olá mundo!" << endl; cout << "Olá mundo!" << endl; cout << "Olá mundo!" << endl; cout << "Olá mundo!" << endl; cout << "Olá mundo!" << endl; return 0; }
Do ponto de vista de resultados, os dois programas são equivalentes.
Repetições determinadas pelo usuário
• No último exemplo, o comando for nos permitiu não precisar reescrever o comando várias vezes
• Um programa sequencial que simula o mesmo comportamento pode ser muito extenso (imagine milhões de repetições)
• Na maior parte dos problemas, nem é mesmo possível fazer uma versão sequencial equivalente
• Um exemplo é quando não sabemos quantas vezes o comando será repetido
1 2 3 4 5 6
6#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
Criada a variável contadora
i
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
Criada a variável para o número de repetições
i
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n
i
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n
Quantas vezes você quer a mensagem?
i
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6
i 0
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6
i 0
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo!
i 1
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo!
i 1
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo!
true
i 1
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo!
i 2
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo!
i 2
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo!
true
i 2
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo!
i 3
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo!
i 3
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo!
true
i 3
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo! Olá mundo!
i 4
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo! Olá mundo!
i 4
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo! Olá mundo!
true
i 4
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo!
i 5
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo!
i 5
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo!
true
i 5
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo!
i 6
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo!
i 6
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo!
false
i 6
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
n 6
Quantas vezes você quer a mensagem? 6 Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo! Olá mundo!
Repetição de processos similaresOlá José, Feliz Natal!Olá Maria, Feliz Natal!Olá Oswaldo, Feliz Natal!Olá João, Feliz Natal!Olá Clara, Feliz Natal!
Repetição de processos similares
• Nos últimos exemplos repetimos os mesmos comandos várias vezes
• É comum também repetir tarefas que sejam similares de acordo com a repetição do laço
• Usualmente uma mudança nas próprias condições das variáveis pode alterar como a repetição se comporta
• Um exemplo disto é quando usamos o contador dentro do próprio bloco de repetição
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
Neste exemplo, a variável contadora será utilizada dentro do próprio bloco do for para
imprimir os números de 0 até n
Criada a variável contadora
i
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
Variável com o número final da sequência impressa
i
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n
Usuário escolhe um número
i
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 5
Digite o número final: 5
i é inicializado com 0
i 0
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 5
Digite o número final: 5
i é impresso e seguido de um espaço
i 0
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 5
Digite o número final: 5 0
i é incrementado
i 1
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 5
Digite o número final: 5 0
Agora a condição de parada é que i seja menor ou igual a n, pois queremos imprimir o
número n também
i 1
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 5
Digite o número final: 5 0
i é impresso
i 1
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 5
Digite o número final: 5 0 1
i é incrementado
i 2
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 5
Digite o número final: 5 0 1
i ainda é menor ou igual a n
i 2
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 5
Digite o número final: 5 0 1
i é impresso
i 2
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 5
Digite o número final: 5 0 1 2
Ao continuar executando o laço, todos os números ≤ 5 serão impressos até que i seja 6
i 6
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 5
Digite o número final: 5 0 1 2 3 4 5
i 6
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 5
Digite o número final: 5 0 1 2 3 4 5
i 57
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
n 56
Digite o número final: 56 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
O programa pode aceitar qualquer número n
Alterando variáveis externas• Algumas vezes, usamos estruturas de
repetição para alterar o valor de variáveis externas ao bloco de repetição
• Um exemplo disto é fazer o somatório de vários valores
• A estrutura de repetição faz incrementar o somatório, que será impresso após o processo Neste exemplo, a variável soma terá o
somatório de todos os números entre 1 e n. Soma = 1 + 2 + 3 + ... + n-1 + n
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
Criada a variável contadora
i
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
Variável para o número final da série
i
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n
Variável para guardar o somatório dos números
i
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n
soma
i
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma
Digite o número final: 4
Somatório começa em 0 e será incrementado durante o laço
i
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 0
Digite o número final: 4
Contador i inicia em 1 pois não precisamos somar 0
i 1
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 0
Digite o número final: 4
i 1
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 0
Digite o número final: 4
true
i 1
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 1
Digite o número final: 4
i 2
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 1
Digite o número final: 4
i 2
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 1
Digite o número final: 4
true
i 2
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 3
Digite o número final: 4
i 3
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 3
Digite o número final: 4
i 3
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 3
Digite o número final: 4
true
i 3
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 6
Digite o número final: 4
i 4
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 6
Digite o número final: 4
i 4
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 6
Digite o número final: 4
true
i 4
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 10
Digite o número final: 4
i 5
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 10
Digite o número final: 4
i 5
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 10
Digite o número final: 4
false
i 5
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 10
Digite o número final: 4 Somatório = 10
soma = 1 + 2 + 3 + 4
i 5
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 4
soma 10
Digite o número final: 4 Somatório = 10
i 101
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 5050
Digite o número final: 100 Somatório = 5050
Outro exemplo... Perceba como estruturas de repetição nos
permite realizar tarefas muito mais complexas
Aninhando estruturas de controle
• É possível combinar estruturas de repetição com estruturas de controle
• Isso pode ser feito para garantir que a repetição apenas aconteça sob determinadas condições
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
Neste exemplo, só adicionaremos o número ao somatório se este for múltiplo de 3.
soma será 3 + 6 + 9 + 12 + ...
Criadas e inicializadas as variáveis
i
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 0
Digite o número final: 100
i 1
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 0
Digite o número final: 100
i inicia em 1 pois não precisamos somar 0
i 1
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 0
Digite o número final: 100
Se o resto da divisão de i por 3 for 0, o comando é executado. Neste caso, nada
acontece.
false
i 2
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 0
Digite o número final: 100
i 2
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 0
Digite o número final: 100
true
i 2
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 0
Digite o número final: 100
falsei 3
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 0
Digite o número final: 100
i 3
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 0
Digite o número final: 100
true i 3
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 0
Digite o número final: 100
true
Como a condição é verdadeira, este valor será adicionado à soma
i 3
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 3
Digite o número final: 100
i 101
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 1683
Digite o número final: 100
O processo se repete até que i seja 101 e a condição de repetição seja falsa
i 101
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 1683
Digite o número final: 100 Somatório = 1683
i 101
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
n 100
soma 1683
Digite o número final: 100 Somatório = 1683
Condições de inicialização
• A condição de inicialização de um for pode ser qualquer uma
• Suponha o problema de calcular 5/3 + 7/4 + 9/5 + 11/6 … 99/50
• Podemos calcular a série com um i de 3 a 50, sendo que a cada repetição somamos (2*i-1)/i
#include <iostream>using namespace std; int main() { int i; int n; double soma; double numerador; double denominador; cout << "Digite o contador final: "; cin >> n; soma = 0; for (i = 3; i <= n; i++){ numerador = 2*i-1; denominador = i; soma += numerador/denominador; } cout << "Somatório = " << soma << endl; return 0; }.
Criadas e inicializadas as variáveis
i
n 50
soma 0
Digite o contador final: 50
#include <iostream>using namespace std; int main() { int i; int n; double soma; double numerador; double denominador; cout << "Digite o contador final: "; cin >> n; soma = 0; for (i = 3; i <= n; i++){ numerador = 2*i-1; denominador = i; soma += numerador/denominador; } cout << "Somatório = " << soma << endl; return 0; }.
numerador
denominador
i é inicializado em 3
i 3
n 50
soma 0
Digite o contador final: 50
#include <iostream>using namespace std; int main() { int i; int n; double soma; double numerador; double denominador; cout << "Digite o contador final: "; cin >> n; soma = 0; for (i = 3; i <= n; i++){ numerador = 2*i-1; denominador = i; soma += numerador/denominador; } cout << "Somatório = " << soma << endl; return 0; }.
numerador
denominador
i 3
n 50
soma 0
Digite o contador final: 50
#include <iostream>using namespace std; int main() { int i; int n; double soma; double numerador; double denominador; cout << "Digite o contador final: "; cin >> n; soma = 0; for (i = 3; i <= n; i++){ numerador = 2*i-1; denominador = i; soma += numerador/denominador; } cout << "Somatório = " << soma << endl; return 0; }.
numerador
denominador
True
soma recebe 5/3
i 3
n 50
soma 1.66666
Digite o contador final: 50
#include <iostream>using namespace std; int main() { int i; int n; double soma; double numerador; double denominador; cout << "Digite o contador final: "; cin >> n; soma = 0; for (i = 3; i <= n; i++){ numerador = 2*i-1; denominador = i; soma += numerador/denominador; } cout << "Somatório = " << soma << endl; return 0; }.
numerador 5
denominador 3
i 4
n 50
soma 1.66666
Digite o contador final: 50
#include <iostream>using namespace std; int main() { int i; int n; double soma; double numerador; double denominador; cout << "Digite o contador final: "; cin >> n; soma = 0; for (i = 3; i <= n; i++){ numerador = 2*i-1; denominador = i; soma += numerador/denominador; } cout << "Somatório = " << soma << endl; return 0; }.
numerador 5
denominador 3
i 4
n 50
soma 1.66666
Digite o contador final: 50
#include <iostream>using namespace std; int main() { int i; int n; double soma; double numerador; double denominador; cout << "Digite o contador final: "; cin >> n; soma = 0; for (i = 3; i <= n; i++){ numerador = 2*i-1; denominador = i; soma += numerador/denominador; } cout << "Somatório = " << soma << endl; return 0; }.
numerador 5
denominador 3True
i 4
n 50
soma 3.416666
Digite o contador final: 50
#include <iostream>using namespace std; int main() { int i; int n; double soma; double numerador; double denominador; cout << "Digite o contador final: "; cin >> n; soma = 0; for (i = 3; i <= n; i++){ numerador = 2*i-1; denominador = i; soma += numerador/denominador; } cout << "Somatório = " << soma << endl; return 0; }.
numerador 7
denominador 4
soma é incrementado de 7/4
i 51
n 50
soma 93.0008
Digite o contador final: 50
#include <iostream>using namespace std; int main() { int i; int n; double soma; double numerador; double denominador; cout << "Digite o contador final: "; cin >> n; soma = 0; for (i = 3; i <= n; i++){ numerador = 2*i-1; denominador = i; soma += numerador/denominador; } cout << "Somatório = " << soma << endl; return 0; }.
numerador 99
denominador 50
Processo se repete até que i seja n + 1, ou 51
i 51
n 50
soma 93.0008
Digite o contador final: 50 Somatório = 93.0008
#include <iostream>using namespace std; int main() { int i; int n; double soma; double numerador; double denominador; cout << "Digite o contador final: "; cin >> n; soma = 0; for (i = 3; i <= n; i++){ numerador = 2*i-1; denominador = i; soma += numerador/denominador; } cout << "Somatório = " << soma << endl; return 0; }.
numerador 99
denominador 50
5/3 + 7/4 + 9/5 + 11/6 … 99/50
i 51
n 50
soma 93.0008
Digite o contador final: 50 Somatório = 93.0008
#include <iostream>using namespace std; int main() { int i; int n; double soma; double numerador; double denominador; cout << "Digite o contador final: "; cin >> n; soma = 0; for (i = 3; i <= n; i++){ numerador = 2*i-1; denominador = i; soma += numerador/denominador; } cout << "Somatório = " << soma << endl; return 0; }.
numerador 99
denominador 50
Condições de incremento• As condições de incremento também podem ser
alteradas de qualquer maneira que se queira.
• Os principais motivos para isto são:
• Dar saltos mais largos
• Ex: i aumenta em 7 a cada iteração (i += 7)
• Utilizar outra operação
• Ex: i dobra a cada iteração (i *= 2)
• Até mesmo decrementar a variável a cada passo
• Ex: i diminui em 1 a cada iteração (i--)
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
Calcularemos a soma de todos os múltiplos de 7 menores que 1000.
7 + 14 + 21 + 28 ...
Criadas e inicializadas as variáveis
i
n 1000
soma 0
Digite o número final: 1000
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
i já é inicializado no primeiro número da série
Digite o número final: 1000
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
i 7
n 1000
soma 0
Como ele é menor que o número final, executamos os comandos
Digite o número final: 1000
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
truei 7
n 1000
soma 0
Como ele é menor que o número final, executamos os comandos
Digite o número final: 1000
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
i 7
n 1000
soma 7
Já incrementamos i em 7 para a próxima iteração
Digite o número final: 1000
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
i 14
n 1000
soma 7
Digite o número final: 1000
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
i 14
n 1000
soma 7
true
Digite o número final: 1000
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
i 14
n 1000
soma 21
Digite o número final: 1000
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
i 21
n 1000
soma 21
Digite o número final: 1000
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
i 21
n 1000
soma 21
true
Digite o número final: 1000
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
i 1001
n 1000
soma 71071
Processo se repete enquanto i seja menor ou igual a 1000
Digite o número final: 1000 Somatório = 71071
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
i 1001
n 1000
soma 71071
Digite o número final: 1000 Somatório = 71071
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
i 1001
n 1000
soma 71071
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
Imprimiremos todas potências de 2 entre 2 e n
2 4 8 16 32 64 128 ...
Criadas e inicializadas as variáveis
i
n 10000
Digite o número final: 10000
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
i é inicializado no primeiro item da série
i 2
n 10000
Digite o número final: 10000
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
i 2
n 10000
Digite o número final: 10000 2
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
i 4
n 10000
Digite o número final: 10000 2
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
A operação de incremento multiplica i por 2
i 4
n 10000
Digite o número final: 10000 2
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
true
i 4
n 10000
Digite o número final: 10000 2 4
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
i 8
n 10000
Digite o número final: 10000 2 4
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
i 8
n 10000
Digite o número final: 10000 2 4
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
truei 8
n 10000
Digite o número final: 10000 2 4 8
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
i 16384
n 10000
Digite o número final: 10000 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
Processo se repete enquanto i seja menor que 10000
i 16384
n 10000
Digite o número final: 10000 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }.
Imprimiremos a sequência n n-1 n-2 n-3 ... 4 3 2 1
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
Criadas e inicializadas as variáveis
i
n 50
Digite o número inicial: 50
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
i inicia no primeiro item da série, que é n
i 50
n 50
Digite o número inicial: 50
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
i 50
n 50
Digite o número inicial: 50
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
true
Bloco de comandos se repetirá enquanto i for maior que 0.
i 50
n 50
Digite o número inicial: 50 50
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
i 49
n 50
Digite o número inicial: 50 50
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
i é decrementado
i 49
n 50
Digite o número inicial: 50 50
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
truei 49
n 50
Digite o número inicial: 50 50 49
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
i 48
n 50
Digite o número inicial: 50 50 49
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
i 48
n 50
Digite o número inicial: 50 50 49
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
true
i 0
n 50
Digite o número inicial: 50 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
Processo se repete enquanto i for maior que 0.
i 0
n 50
Digite o número inicial: 50 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }.
ExercícioQuantos valores deseja ler? 7 Digite um número: 6 Digite um número: 3 Digite um número: 5 Digite um número: 4 Digite um número: 2 Digite um número: 8 Digite um número: 5 Você digitou 4 números pares e 3 números ímpares
ExercícioQuantos valores deseja ler? 7 Digite um número: 6 Digite um número: 3 Digite um número: 5 Digite um número: 4 Digite um número: 2 Digite um número: 8 Digite um número: 5 Você digitou 4 números pares e 3 números ímpares
#include <iostream>using namespace std; int main() { int i; // contador for (i = 0; i < 10; i++){ cout << "Olá mundo!" << endl; } return 0; }.
#include <iostream>using namespace std; int main() { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "Olá mundo!" << endl; } return 0; }.
#include <iostream>using namespace std; int main() { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }.
Neste exemplo, a variável soma terá o somatório de todos os números entre 1 e n.
Soma = 1 + 2 + 3 + ... + n-1 + n
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
#include <iostream>using namespace std; int main() { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; } } cout << "Somatório = " << soma << endl; return 0; }.
#include <iostream>using namespace std; int main() { int i; int n; double soma; cout << "Digite o número final: "; cin >> n; soma = 0; for (i = 7; i <= n; i += 7){ soma += i; } cout << "Somatório = " << soma << endl; return 0; }.
Calcularemos a soma de todos os múltiplos de 7 menores que 1000.
7 + 14 + 21 + 28 ...
Percorrer arranjos• Arranjos estão muito relacionados à
instrução for
• Como arranjos têm um número grande de elementos, inicializá-los um a um pode ser uma tarefa muito repetitiva
• A própria variável contadora pode ser utilizada dentro do bloco de repetição como um índice para elementos do arranjo
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
A instrução const na frente de int indica que esta é uma constante. Constantes não podem
ser alteradas.
n 5
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
Criamos um arranjo chamado notas. Apenas constantes podem definir o tamanho de
arranjos.
n 5
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas
soma receberá a soma de todas as notas
n 5
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas
soma
Variável contadora
n 5
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas
soma
i
Variável contadora inicializa em 0 para trabalhar com a posição notas[0]
n 5
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas
soma
i 0
notas[i]
Pedimos para o usuário a nota do aluno que está na posição i, que vale 0
n 5
Digite a nota do aluno 0:
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas
soma
i 0
notas[i]
Guardamos o resultado em notas[i], indicada pela seta
n 5
Digite a nota do aluno 0: 6.7
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7
soma
i 0
notas[i]
Passamos para o próximo aluno i. Note que notas[i] passa a representar outra posição do
arranjo.
n 5
Digite a nota do aluno 0: 6.7
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7
soma
i 1
notas[i]
n 5
Digite a nota do aluno 0: 6.7
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7
soma
i 1
notas[i]
true n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8
soma
i 1
notas[i]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8
soma
i 2
notas[i]
Ao fazer i++, alteramos também o significado de notas[i].
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8
soma
i 2
notas[i]
true
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2
soma
i 2
notas[i]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2
soma
i 3
notas[i]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2
soma
i 3
notas[i]
true n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4
soma
i 3
notas[i]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4
soma
i 4
notas[i]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4
soma
i 4
notas[i]
true
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma
i 4
notas[i]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma
i 5
notas[i]
Ao fazer i++, notas[i] passa a representar uma posição fora do arranjo. O programa daria um
erro se tentássemos acessar notas[i].
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma
i 5
notas[i]
false
Condição de repetição não é atendida e prosseguimos com o código.
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma 0
i 5
notas[i]
Soma é inicializada em 0 para fazermos um somatório das notas no arranjo. Diferentemente dos exemplos anteriores somaremos notas[i] em
vez de i.
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma 0
i 0
notas[i]
i volta a ser 0 nesta nova estrutura de repetição e notas[i] volta a indicar notas[0]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma 6.7
i 0
notas[i]
soma é incrementado de notas[0]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma 6.7
i 1
notas[i]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma 6.7
i 1
notas[i]
true
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma 14.5
i 1
notas[i]
soma é incrementado de notas[1]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma 14.5
i 2
notas[i]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma 36.4
i 5
notas[i]
Ao fim do processo, soma terá o somatório das notas
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3 Média das notas: 7.28
#include <iostream>using namespace std; int main(){ const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma 36.4
i 5
notas[i]
n 5
Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 2: 4.2 Digite a nota do aluno 3: 9.4 Digite a nota do aluno 3: 8.3 Média das notas: 7.28
#include <iostream>using namespace std; int main() { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }.
notas 6.7 7.8 4.2 9.4 8.3
soma 36.4
i 5
notas[i]
Laços aninhados• Vimos em um exemplo anterior a
junção de estruturas de repetição com estruturas de seleção
• Estruturas de repetição podem ser combinadas com outras estruturas de repetição para uma diversidade de tarefas
• Inclusive, o contador de uma estrutura de repetição pode servir de referência para o contador da outra estrutura mais interna
#include <iostream>using namespace std; int main() { int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
#include <iostream>using namespace std; int main(){ int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Temos agora duas variáveis i e j que serão usadas como contadores ao mesmo tempo.
#include <iostream>using namespace std; int main() { int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Para cada valor de i, o for interno vai imprimir i vezes o próprio valor i. Depois do for interno, será dada
uma quebra de linha com endl.
Inicializamos as variáveis
n 5
#include <iostream>using namespace std; int main(){ int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número:
i
j
i começa em 1 e ele irá até n
n 5
#include <iostream>using namespace std; int main() { int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5
i 1
j
j começa em 0 e ele irá até i-1. Este laço interno ocorre então i vezes para cada
repetição do laço externo.
n 5
#include <iostream>using namespace std; int main(){ int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5
i 1
j 0
n 5
#include <iostream>using namespace std; int main() { int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5 1
i 1
j 0
n 5
#include <iostream>using namespace std; int main(){ int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5 1
i 1
j 1
false
n 5
#include <iostream>using namespace std; int main() { int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5 1
i 1
j 1
endl passa para o próxima linha e encerra-se assim o laço externo
n 5
#include <iostream>using namespace std; int main(){ int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5 1
i 2
j 1
i é incrementado e vamos para a próxima iteração
true
n 5
#include <iostream>using namespace std; int main() { int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5 1 22
i 2
j 2
Laço interno imprime i vezes o valor de i.
n 5
#include <iostream>using namespace std; int main(){ int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5 1 22
i 2
j 2
endl passa para a próxima linha.
n 5
#include <iostream>using namespace std; int main() { int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5 1 22
i 3
j 2
i é incrementado e vamos para a próxima iteração
n 5
#include <iostream>using namespace std; int main(){ int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5 1 22 333
i 3
j 3
O laço interno imprime i vezes o valor de i e endl passa para o próxima linha
n 5
#include <iostream>using namespace std; int main() { int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5 1 22 333 4444 55555
i 6
j 5
O processo se repete até que i seja 6
n 5
#include <iostream>using namespace std; int main(){ int i; int j; int n; cout << "Digite um número: "; cin >> n; for(i=1; i<=n; i++) { for (j=0; j<i; j++){ cout << i ; } cout << endl; } return 0; }.
Digite um número: 5 1 22 333 4444 55555
i 6
j 5
Percorrer arranjos de arranjos
• Uma das aplicações mais comuns para laços aninhados é percorrer arranjos de arranjos, muito utilizados para representar matrizes ou tabelas
• Enquanto o laço externo percorre linhas com contador i, o laço mais interno percorre colunas com o contador j
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
O laço interno varia todas as colunas j de uma linha i. Cada coluna do exemplo representa
uma prova.
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
O laço externo varia todas as linhas do arranjo
bidimensional. Cada linha representa um aluno.
Inicializamos as variáveis
n1 10
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
notas
n2 3
i j
soma
Para cada linha i (que representa um aluno)
n1 10
notas
n2 3
i 0 j
soma
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
Imprime mensagem pedindo as notas do aluno
n1 10
notas
n2 3
i 0 j
soma
Digite as notas do aluno 0
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
Para cada coluna j deste aluno i...
n1 10
notas
n2 3
i 0 j 0
soma
Digite as notas do aluno 0
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
Pedimos a nota do aluno i na prova j
n1 10
notas
n2 3
i 0 j 0
soma
Digite as notas do aluno 0 Prova 0:
E salvamos em notas[i][j]
n1 10
notas 6.8
n2 3
i 0 j 0
soma
Digite as notas do aluno 0 Prova 0: 6.8
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
O laço interno finaliza as colunas do aluno
n1 10
notas 6.8 7.9 7.6
n2 3
i 0 j 3
soma
Digite as notas do aluno 0 Prova 0: 6.8 Prova 1: 7.9 Prova 2: 7.6
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
O fim do bloco do laço interno é também o fim do bloco do laço externo e atualizamos i.
n1 10
notas 6.8 7.9 7.6
n2 3
i 1 j 3
soma
Digite as notas do aluno 0 Prova 0: 6.8 Prova 1: 7.9 Prova 2: 7.6
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
Como não se acabaram os alunos, vamos para a próxima iteração.
n1 10
notas 6.8 7.9 7.6
n2 3
i 1 j 3
soma
Digite as notas do aluno 0 Prova 0: 6.8 Prova 1: 7.9 Prova 2: 7.6
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
A iteração seguinte faz o mesmo para a próxima linha.
n1 10
notas 6.8 7.9 7.6
5.4 6.8 9.8
n2 3
i 1 j 3
soma
Digite as notas do aluno 0 Prova 0: 6.8 Prova 1: 7.9 Prova 2: 7.6 Digite as notas do aluno 1 Prova 0: 5.4 Prova 1: 6.8 Prova 2: 9.8
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
E o conjunto de todas as iterações completa a tabela.
n1 10
notas 6.8 7.9 7.6
5.4 6.8 9.8
8.6 9.5 8.2
7.6 8.7 6.8
5.8 7.2 9.5
9.5 7.3 8.8
6.7 8.8 10
6.2 6.8 9.3
8.3 6.9 7.3
7.2 9.5 7.8
n2 3
i 10 j 3
soma
Prova 1: 6.8 Prova 2: 9.3 Digite as notas do aluno 8 Prova 0: 8.3 Prova 1: 6.9 Prova 2: 7.3 Digite as notas do aluno 9 Prova 0: 7.2 Prova 1: 9.5 Prova 2: 7.8
...
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
O próximo laço externo percorrerá as colunas j. Para cada coluna calculamos sua média.
n1 10
notas 6.8 7.9 7.6
5.4 6.8 9.8
8.6 9.5 8.2
7.6 8.7 6.8
5.8 7.2 9.5
9.5 7.3 8.8
6.7 8.8 10
6.2 6.8 9.3
8.3 6.9 7.3
7.2 9.5 7.8
n2 3
i 10 j 0
soma
Prova 1: 6.8 Prova 2: 9.3 Digite as notas do aluno 8 Prova 0: 8.3 Prova 1: 6.9 Prova 2: 7.3 Digite as notas do aluno 9 Prova 0: 7.2 Prova 1: 9.5 Prova 2: 7.8
...
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
A soma desta coluna começa em 0.
n1 10
notas 6.8 7.9 7.6
5.4 6.8 9.8
8.6 9.5 8.2
7.6 8.7 6.8
5.8 7.2 9.5
9.5 7.3 8.8
6.7 8.8 10
6.2 6.8 9.3
8.3 6.9 7.3
7.2 9.5 7.8
n2 3
i 10 j 0
soma 0
Prova 1: 6.8 Prova 2: 9.3 Digite as notas do aluno 8 Prova 0: 8.3 Prova 1: 6.9 Prova 2: 7.3 Digite as notas do aluno 9 Prova 0: 7.2 Prova 1: 9.5 Prova 2: 7.8
...
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
Para cada linha i desta coluna j, colocar o valor em soma.
n1 10
notas 6.8 7.9 7.6
5.4 6.8 9.8
8.6 9.5 8.2
7.6 8.7 6.8
5.8 7.2 9.5
9.5 7.3 8.8
6.7 8.8 10
6.2 6.8 9.3
8.3 6.9 7.3
7.2 9.5 7.8
n2 3
i 10 j 0
soma 72.1
Prova 1: 6.8 Prova 2: 9.3 Digite as notas do aluno 8 Prova 0: 8.3 Prova 1: 6.9 Prova 2: 7.3 Digite as notas do aluno 9 Prova 0: 7.2 Prova 1: 9.5 Prova 2: 7.8
...
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
Imprimimos a média do somatório desta coluna
n1 10
notas 6.8 7.9 7.6
5.4 6.8 9.8
8.6 9.5 8.2
7.6 8.7 6.8
5.8 7.2 9.5
9.5 7.3 8.8
6.7 8.8 10
6.2 6.8 9.3
8.3 6.9 7.3
7.2 9.5 7.8
n2 3
i 1 j 0
soma 72.1
Prova 2: 9.3 Digite as notas do aluno 8 Prova 0: 8.3 Prova 1: 6.9 Prova 2: 7.3 Digite as notas do aluno 9 Prova 0: 7.2 Prova 1: 9.5 Prova 2: 7.8 Média na prova 0: 7.21
...
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
Fazemos o mesmo para as outras colunas
n1 10
notas 6.8 7.9 7.6
5.4 6.8 9.8
8.6 9.5 8.2
7.6 8.7 6.8
5.8 7.2 9.5
9.5 7.3 8.8
6.7 8.8 10
6.2 6.8 9.3
8.3 6.9 7.3
7.2 9.5 7.8
n2 3
i 10 j 3
soma 85.1
Prova 0: 8.3 Prova 1: 6.9 Prova 2: 7.3 Digite as notas do aluno 9 Prova 0: 7.2 Prova 1: 9.5 Prova 2: 7.8 Média na prova 0: 7.21 Média na prova 1: 7.94 Média na prova 2: 8.51
...
Fim do programa
n1 10
notas 6.8 7.9 7.6
5.4 6.8 9.8
8.6 9.5 8.2
7.6 8.7 6.8
5.8 7.2 9.5
9.5 7.3 8.8
6.7 8.8 10
6.2 6.8 9.3
8.3 6.9 7.3
7.2 9.5 7.8
n2 3
i 10 j 3
soma 85.1
Prova 0: 8.3 Prova 1: 6.9 Prova 2: 7.3 Digite as notas do aluno 9 Prova 0: 7.2 Prova 1: 9.5 Prova 2: 7.8 Média na prova 0: 7.21 Média na prova 1: 7.94 Média na prova 2: 8.51
...
#include <iostream>using namespace std; int main(){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.
Utilizando apenas critério de parada
• É muito comum repetir comandos não só uma certa quantidade de vezes mas até que uma condição ocorra
• Esfregar um prato até ele esteja limpo
Utilizando apenas critério de parada
• Às vezes, queremos que um bloco de comandos seja repetido até que uma certa condição ocorra mas esta condição não está associada especificamente a um contador
• Nestes casos, usa-se o comando while (enquanto) para definir a condição do laço
while (condição){ comandos;}.
Enquanto a condição entre parênteses for atendida, o bloco de comandos será executado.
while (condição){ comandos;}.
Enquanto a condição entre parênteses for atendida, o bloco de comandos será executado.
Repare que, diferentemente do comando for, não há comandos para inicialização ou incremento pois o while não está diretamente ligado a um contador.
while (condição){ comandos;}.
int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = "; cout << numero * numero << endl;}.
Exemplo
while (condição){ comandos;}.
int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = "; cout << numero * numero << endl;}.
Exemplo
Enquanto o número for diferente de zero, o usuário digitará um número que será elevado ao quadrado.
#include <iostream>using namespace std; int main(){ int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }.
Inicializamos as variáveis
numero 1
#include <iostream>using namespace std; int main() { int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }.
Enquanto numero for diferente de 0
numero 1
#include <iostream>using namespace std; int main(){ int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }.
true
numero 7
#include <iostream>using namespace std; int main() { int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }.
Digite um número: 7 Número ao quadrado = 49
Enquanto numero for diferente de 0
numero 7
#include <iostream>using namespace std; int main(){ int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }.
Digite um número: 7 Número ao quadrado = 49
true
numero 5
#include <iostream>using namespace std; int main() { int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }.
Digite um número: 7 Número ao quadrado = 49 Digite um número: 5 Número ao quadrado = 25
Enquanto numero for diferente de 0
numero 5
#include <iostream>using namespace std; int main(){ int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }.
Digite um número: 7 Número ao quadrado = 49 Digite um número: 5 Número ao quadrado = 25
true
numero 0
#include <iostream>using namespace std; int main() { int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }.
Digite um número: 7 Número ao quadrado = 49 Digite um número: 5 Número ao quadrado = 25 Digite um número: 0 Número ao quadrado = 0
Enquanto numero for diferente de 0
numero 0
#include <iostream>using namespace std; int main(){ int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }.
Digite um número: 7 Número ao quadrado = 49 Digite um número: 5 Número ao quadrado = 25 Digite um número: 0 Número ao quadrado = 0
false
numero 0
#include <iostream>using namespace std; int main() { int numero = 1; while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }.
Digite um número: 7 Número ao quadrado = 49 Digite um número: 5 Número ao quadrado = 25 Digite um número: 0 Número ao quadrado = 0
Convertendo while em for
while (condição){ comandos;}.
for ( ;condição; ){ comandos;}.
Para ter o efeito de um while com um for, basta
deixar em branco as condições de inicialização
e de incremento deste for.
Convertendo while em for
while (condição){ comandos;}.
for ( ;condição; ){ comandos;}.
while (numero != 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = "; cout << numero * numero << endl;}
for (;numero != 0;){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = "; cout << numero * numero << endl;}
Convertendo for em while
inicialização; while (condição){ comandos; incremento;}.
for (inicialização;condição;incremento){ comandos;}.
Para ter o efeito de um for com um while, basta inicializar e incrementar o
contador com um comando próprio.
Convertendo for em while
inicialização; while (condição){ comandos; incremento;}.
for (inicialização;condição;incremento){ comandos;}.
i = 0; while (i < 10){ cout << i << endl; i++;}
for (i = 0; i < 10; i++){ cout << i << endl;}
Convertendo for e while• Embora seja tecnicamente possível
converter um for em um while ou um while em for, a estrutura mais apropriada deve ser utilizada para cada ocasião
• Utilize for para repetições muito baseadas em contadores
• Utilize while para repetições dependentes em condições de parada específicas
Laços infinitos• É necessário tomar cuidado com laços infinitos,
ou seja, laços onde a condição é sempre verdadeira e por isto nunca encerram
• Isto pode ser feito propositalmente com:
• while (true){ comandos;}
• for (inicializa; true; incremento){ comandos;}
Instrução do-while
• Existe ainda uma situação onde apenas sabemos se a condição de repetição será atendida após a primeira iteração
• Este é caso comum em menus, onde uma das opções é sair
• Nestes casos existe a opção da instrução do-while
do-while
do { comandos;} while (condição);
O bloco de comandos é sempre executado 1 vez e apenas após a primeira execução é feito o teste da
condição para as próximas iterações.
do { comandos;} while (condição);
Exemplo
int x = 5; int y = 7; int opcao;do { cout << "[1] Somar" << endl; cout << "[2] Multiplicar" << endl; cout << "[0] Sair do programa" << endl; cout << "Digite uma opcao: "; cin >> opcao; if (opcao == 1){ cout << x + y << endl; } else if (opcao == 2){ cout << x * y << endl; }. } while (opcao != 0);
do { comandos;} while (condição);
Exemplo
int x = 5; int y = 7; int opcao;do { cout << "[1] Somar" << endl; cout << "[2] Multiplicar" << endl; cout << "[0] Sair do programa" << endl; cout << "Digite uma opcao: "; cin >> opcao; if (opcao == 1){ cout << x + y << endl; } else if (opcao == 2){ cout << x * y << endl; }. } while (opcao != 0);
Um menu é apresentado.
Cada opção faz uma tarefa
Enquanto a opção não for 0
do { comandos;} while (condição);
Exemplo
int x = 5; int y = 7; int opcao;do { cout << "[1] Somar" << endl; cout << "[2] Multiplicar" << endl; cout << "[0] Sair do programa" << endl; cout << "Digite uma opcao: "; cin >> opcao; if (opcao == 1){ cout << x + y << endl; } else if (opcao == 2){ cout << x * y << endl; }. } while (opcao != 0);
Esta é a condição perfeita para um
do-while pois é um caso onde a primeira iteração sempre deve
acontecer para determinar as
próximas
Convertendo do-while e while
• É possível obter o efeito de um do-while com um while se repetirmos o comando da primeira iteração antes do laço
• Porém, apesar de tecnicamente possível, é sempre melhor utilizar a estrutura mais apropriada em cada caso
do { comandos;} while (condição);
comandos; while (condição) { comandos;}.
do { comandos;} while (condição);
comandos; while (condição) { comandos;}.
A repetição dos comandos antes do laço garante que eles serão executados pelo menos uma vez. Isto,
porém, é uma solução pouco desejável.
/
Escopo de variáveis• Como vimos em nossos exemplos, um
programa é composto de blocos que estão sempre entre chaves { }
• A função principal (main) é composta de um bloco
• Cada estrutura de controle contém ao menos um bloco (if, if-else, for, while)
Escopo de variáveis• Escopo de bloco
• Quando declaramos uma variável local em um bloco, ela pode ser apenas utilizada neste bloco e nos blocos que estão dentro deste bloco. O escopo de bloco começa da declaração na variável e termina na chave } que fecha o bloco.
• Escopo de arquivo
• Um identificador criado fora de qualquer função ou classe é uma variável global e é conhecido em qualquer ponto do programa.
Escopo de variáveis
• Escopo de bloco
• Quando há um bloco aninhado mais interno e os dois blocos contém uma variável com o mesmo nome, a variável do bloco mais externo fica oculta até que o bloco interno termine.
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
Criamos uma variável x que pertence ao bloco externo
x
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5
i 0
A variável contadora i é agora criada no escopo do bloco do for
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5
i 0
true
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5
i 0
É criada uma variável x dentro no escopo do bloco do for.
x
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5
i 0
Isto faz com que a variável x do bloco externo fique oculta.
x
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5
i 0
As alterações são então feitas na variável não oculta
x 7
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5 x interno = 7
i 0 x 7
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5 x interno = 7 i interno = 0
i 0 x 7
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5 x interno = 7 i interno = 0
i 1 x 7
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5 x interno = 7 i interno = 0
i 1 x 7
false
Como a condição de repetição não é mais atendida, o bloco do for é encerrado
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5 x interno = 7 i interno = 0 x externo = 5
Como as variáveis o bloco interno não existem mais, o x do bloco externo não está mais oculto
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
x externo = 5 x interno = 7 i interno = 0 x externo = 5
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
Se tentássemos inserir esta linha ao código, teríamos um erro pois não existe variável i neste ponto do código. Criar a
variável no bloco externo, resolveria este problema.
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; cout << "i = " << i << endl; return 0; }.
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
Agora, como a variável i foi declarada no bloco externo, ela pode ser acessada no bloco externo. Porém, não é
recomendada a prática de se utilizar nomes de variáveis que ocultam outras variáveis no escopo mais externo. Isto pode ser corrigido apenas com um outro nome para o x interno.
#include <iostream>using namespace std; int main(){ int x; int i; x = 5; cout << "x externo = " << x << endl; for (i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i externo = " << i << endl; }. cout << "x externo = " << x << endl; cout << "i = " << i << endl; return 0; }.
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
#include <iostream>using namespace std; int main(){ int x; int i; x = 5; cout << "x externo = " << x << endl; for (i = 0; i < 1; i++){ int y; y = 7; cout << "y interno = " << y << endl; cout << "i externo = " << i << endl; }. cout << "x externo = " << x << endl; cout << "i = " << i << endl; return 0; }.
Ponteiros• Vimos que os dados de cada variável
contêm um endereço na memória que pode ser acessado com o operador &.
• x (valor de x) &x (endereço de x)
• Ponteiros são variáveis que guardam em seus dados endereços da memória
• Quando um ponteiro guarda um endereço de um dado, dizemos que ele está apontando para aquele dado
Imagine várias posições na memória de um computador
24
25
26
27
28
29
30
31
32
33
34
35
Criamos agora um ponteiro para um inteiro, que se chamará px.
24
x 5 25
px 26
27
28
29
30
31
32
33
34
35
int x;x = 5; int *px;
O operador * indica que px é um ponteiro para um int e não um int
24
x 5 25
px 26
27
28
29
30
31
32
33
34
35
int x;x = 5; int *px;
Guardamos agora o endereço de x em px.
24
x 5 25
px 25 26
27
28
29
30
31
32
33
34
35
int x;x = 5; int *px; px = &x;
Note que px tem: * Endereço 26 * Valor 25
Assim, px aponta para um dado: * Endereço 25 * Valor 5
Nomes Valores Endereço
x 5 25
px 25 26
27
28
29
30
31
32
33
34
35
O comando &px nos dá o endereço de px.
Nomes Valores Endereço
x 5 25
px 25 26
27
28
29
30
31
32
33
34
35
O comando px nos dá o valor de px, que no caso o endereço de x.
Nomes Valores Endereço
x 5 25
px 25 26
27
28
29
30
31
32
33
34
35
O comando *px desreferencia px. Ou seja, ele retorna o valor apontado por px. Neste exemplo, este é também o valor de x.
Nomes Valores Endereço
x 5 25
px 25 26
27
28
29
30
31
32
33
34
35
Sabemos que na memória os ponteiros fisicamente guardam representações de outros endereços.
Porém, quando representamos graficamente as variáveis isto é indicado por uma seta.
Nomes Valores Endereço
x 5 25
px 25 26
27
28
29
30
31
32
33
34
35
Nomes Valores Endereço
x 5 25
px 25 26
27
28
29
30
31
32
33
34
35
px
x 5
Representação gráfica
Representação física na memória
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
Criamos uma variável x que será apontada por ponteiros.
x
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
Criamos dois ponteiros para números inteiros
x
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
px py
x 5
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
px py
x 5
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
px py
px recebe o endereço de x, o que o faz apontar para x
x 5
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
px py
py recebe o valor de px, que é o endereço x. Assim, py aponta também para x.
x 5
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
px py
Imprimimos o valor de x.
x = 5
x 5
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
px py
Imprimimos o endereço de x. Endereços reais na memória são números menos simples.
x = 5 &x = 0x7fff571abb68
x 5
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
px py
Imprimimos o valor de px, que é o endereço de x.
x = 5 &x = 0x7fff571abb68 px = 0x7fff571abb68
x 5
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
px py
Imprimimos o valor apontado por px, que é o valor de x.
x = 5 &x = 0x7fff571abb68 px = 0x7fff571abb68 *px = 5
x 5
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
px py
Imprimimos o valor apontado por py, que é também valor de x.
x = 5 &x = 0x7fff571abb68 px = 0x7fff571abb68 *px = 5 *py = 5
x 5
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
px py
Apesar de apontarem para x, px e py são variáveis que contêm seus próprios endereços.
x = 5 &x = 0x7fff571abb68 px = 0x7fff571abb68 *px = 5 *py = 5 &px = 0x7fff5b810b40 &py = 0x7fff5b810b38
x 5
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
px py
x = 5 &x = 0x7fff571abb68 px = 0x7fff571abb68 *px = 5 *py = 5 &px = 0x7fff5b810b40 &py = 0x7fff5b810b38
Ponteiros
• Se os ponteiros apenas guardam endereços na memória, por que sua sintaxe nos obriga a dizer que tipo de dado ele aponta?
• int *px;
• Isto ocorre para que seja possível a operação de desreferenciação, que retorna o valor apontado.
• Esta operação depende do tipo de dado para saber como interpretar os dados naquele endereço da memória
Expressões com ponteiros• Se px aponta para x, *px pode ser utilizado em
qualquer lugar que x seria usado. Por exemplo:
• int *px;int x;px = &x;*px = 5;(*px)++;cout << x << endl;
• O exemplo imprimiria 6 pois o valor 5 foi colocado em x através de uma desreferenciação em px e depois x foi incrementado da mesma maneira.
Aritmética com ponteiros• É possível fazer aritmética com ponteiros. Por exemplo:
• px++ faz px apontar para o próximo endereço na memória.
• É preciso tomar cuidado com este recurso pois (*px)++ é diferente de *(px++)
• O primeiro incrementa o valor do dado na posição apontada por px
• O segundo faz px apontar para o próximo endereço e o desreferencia
Aritmética com ponteiros• Devemos evitar aritmética com ponteiros
pois:
• Nem sempre sabemos o que está no endereço seguinte da memória
• O novo endereço pode não pertencer à área na memória do programa (falha de segmentação)
• O próximo endereço da memória pode ter um dado de outro tipo do ponteiro
#include <iostream>using namespace std; int main() { int x; x = 5; int *px; int **ppx; px = &x; ppx = &px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "&px = " << &px << endl; cout << "&ppx = " << &ppx << endl; cout << "ppx = " << ppx << endl; cout << "*ppx = " << *ppx << endl; cout << "**ppx = " << **ppx << endl; return 0; }.
Podemos criar ponteiros para ponteiros utilizando mais uma vez o operador *.
Criamos x, um ponteiro px para x, e um ponteiro ppx para px.
x 5
#include <iostream>using namespace std; int main() { int x; x = 5; int *px; int **ppx; px = &x; ppx = &px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "&px = " << &px << endl; cout << "&ppx = " << &ppx << endl; cout << "ppx = " << ppx << endl; cout << "*ppx = " << *ppx << endl; cout << "**ppx = " << **ppx << endl; return 0; }.
px
ppx
Como vimos no exemplo anterior, px possui seu próprio endereço e guarda o endereço de x
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; int *px; int **ppx; px = &x; ppx = &px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "&px = " << &px << endl; cout << "&ppx = " << &ppx << endl; cout << "ppx = " << ppx << endl; cout << "*ppx = " << *ppx << endl; cout << "**ppx = " << **ppx << endl; return 0; }.
px
ppx
x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20
Da mesma maneira, a variável ppx possui seu próprio endereço
x 5
#include <iostream>using namespace std; int main() { int x; x = 5; int *px; int **ppx; px = &x; ppx = &px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "&px = " << &px << endl; cout << "&ppx = " << &ppx << endl; cout << "ppx = " << ppx << endl; cout << "*ppx = " << *ppx << endl; cout << "**ppx = " << **ppx << endl; return 0; }.
px
ppx
x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20 &ppx = 0x7fff55568b18
A variável ppx guarda então o endereço de px, o mesmo que foi impresso com &px
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; int *px; int **ppx; px = &x; ppx = &px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "&px = " << &px << endl; cout << "&ppx = " << &ppx << endl; cout << "ppx = " << ppx << endl; cout << "*ppx = " << *ppx << endl; cout << "**ppx = " << **ppx << endl; return 0; }.
px
ppx
x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20 &ppx = 0x7fff55568b18 ppx = 0x7fff55568b20
Desreferenciando ppx, temos o valor de px, que é o endereço de x, ou seja, &x
x 5
#include <iostream>using namespace std; int main() { int x; x = 5; int *px; int **ppx; px = &x; ppx = &px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "&px = " << &px << endl; cout << "&ppx = " << &ppx << endl; cout << "ppx = " << ppx << endl; cout << "*ppx = " << *ppx << endl; cout << "**ppx = " << **ppx << endl; return 0; }.
px
ppx
x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20 &ppx = 0x7fff55568b18 ppx = 0x7fff55568b20 *ppx = 0x7fff55568b28
Desreferenciando duplamente ppx, temos o valor de px desreferenciado, que é o valor de x
x 5
#include <iostream>using namespace std; int main(){ int x; x = 5; int *px; int **ppx; px = &x; ppx = &px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "&px = " << &px << endl; cout << "&ppx = " << &ppx << endl; cout << "ppx = " << ppx << endl; cout << "*ppx = " << *ppx << endl; cout << "**ppx = " << **ppx << endl; return 0; }.
px
ppx
x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20 &ppx = 0x7fff55568b18 ppx = 0x7fff55568b20 *ppx = 0x7fff55568b28 **ppx = 5
x 5
#include <iostream>using namespace std; int main() { int x; x = 5; int *px; int **ppx; px = &x; ppx = &px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "&px = " << &px << endl; cout << "&ppx = " << &ppx << endl; cout << "ppx = " << ppx << endl; cout << "*ppx = " << *ppx << endl; cout << "**ppx = " << **ppx << endl; return 0; }.
px
ppx
x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20 &ppx = 0x7fff55568b18 ppx = 0x7fff55568b20 *ppx = 0x7fff55568b28 **ppx = 5
Ponteiros e arranjos
• Como vimos anteriormente, arranjos são endereços na memória onde começa um espaço alocado para uma sequência de dados de mesmo tipo
• Ponteiros e arranjos estão muito relacionados pois ponteiros podem apontar para dados deste arranjo
Suponha um arranjo x de tamanho 5
Nomes Valores Endereço
x[0] 5 25
x[1] 3 26
x[2] 6 27
x[3] 7 28
x[4] 3 29
30
31
32
33
34
35
} xCriaremos agora um
ponteiro px
Nomes Valores Endereço
x[0] 5 25
x[1] 3 26
x[2] 6 27
x[3] 7 28
x[4] 3 29
px 30
31
32
33
34
35
int *px;
} x
Como x retorna o endereço de onde começa o arranjo, podemos fazer
px apontar para o primeiro elemento do
arranjo de duas maneiras:
Nomes Valores Endereço
x[0] 5 25
x[1] 3 26
x[2] 6 27
x[3] 7 28
x[4] 3 29
px 25 30
31
32
33
34
35
px = x;
px = &x[0];
} x
Agora, se desreferenciarmos px com *px, obteremos o valor de
x[0]
Nomes Valores Endereço
x[0] 5 25
x[1] 3 26
x[2] 6 27
x[3] 7 28
x[4] 3 29
px 25 30
31
32
33
34
35
cout << *px << endl;
5
Como x guarda elementos em posições contíguas,
podemos fazer operações com o ponteiro para achar
outros elementos do arranjo.
Nomes Valores Endereço
x[0] 5 25
x[1] 3 26
x[2] 6 27
x[3] 7 28
x[4] 3 29
px 25 30
31
32
33
34
35
cout << *(px+2) << endl;
6
Podemos até desreferenciar px com o operador de subscrito [ ].
Nomes Valores Endereço
x[0] 5 25
x[1] 3 26
x[2] 6 27
x[3] 7 28
x[4] 3 29
px 25 30
31
32
33
34
35
cout << px[0] << endl;
5
Outros subscritos somam um número e procuram o
que há em posições seguintes na memória. Por isto, é importante
utilizar este recurso com cuidado.
Nomes Valores Endereço
x[0] 5 25
x[1] 3 26
x[2] 6 27
x[3] 7 28
x[4] 3 29
px 25 30
31
32
33
34
35
cout << px[3] << endl;
7
Usualmente, só usamos operadores de subscrito para arranjos. Porém, as operações abaixo são
equivalentes.
Nomes Valores Endereço
x[0] 5 25
x[1] 3 26
x[2] 6 27
x[3] 7 28
x[4] 3 29
px 25 30
31
32
33
34
35
cout << px[i] << endl;
cout << *(px+i) << endl;
Usualmente, só usamos operadores de subscrito para arranjos. Porém, as operações abaixo são
equivalentes.
Nomes Valores Endereço
x 5 25
3 26
6 27
7 28
3 29
px 25 30
31
32
33
34
35
cout << px[i] << endl;
cout << *(px+i) << endl;
ATENÇÃO:
Um ponteiro é uma variável que guarda um endereço na memória.
Um arranjo é um endereço na memória, onde começa uma sequência de elementos.
Podemos criar ponteiros que apontem para arranjos.
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
Criamos um vetor de int chamado x e um ponteiro para int chamado px
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
Como x é um arranjo é um arranjo é o endereço de seu primeiro elemento, px aponta
para o primeiro elemento de x
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
Se usarmos x diretamente vemos o endereço do primeiro elemento do arranjo na memória
x = 0x7fff52294b10
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
Este trecho de código imprime todos os elementos do arranjo através de seus índices de
0 a 4
x = 0x7fff52294b10 x[0] a x[4]: 6 2 8 4 9
x[0] x[1] x[2] x[3] x[4]
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
O valor de px é também o endereço do primeiro elemento do arranjo
x = 0x7fff52294b10 x[0] a x[4]: 6 2 8 4 9 px = 0x7fff52294b10
x[0] x[1] x[2] x[3] x[4]
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
Como ele aponta para o primeiro elemento do arranjo, px desreferenciado retorna 6
x = 0x7fff52294b10 x[0] a x[4]: 6 2 8 4 9 px = 0x7fff52294b10 *px = 6
x[0] x[1] x[2] x[3] x[4]
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
Assim como nos arranjos, podemos desreferenciar um ponteiro para arranjo com o
operador de subscrito []
x = 0x7fff52294b10 x[0] a x[4]: 6 2 8 4 9 px = 0x7fff52294b10 *px = 6 px[0] = 6
x[0] x[1] x[2] x[3] x[4]
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
O operador subscrito com um número i diferente de 0, pega o elemento que estiver i
posições à frente. Cuidado com esta operação!
x = 0x7fff52294b10 x[0] a x[4]: 6 2 8 4 9 px = 0x7fff52294b10 *px = 6 px[0] = 6 px[3] = 4
x[0] x[1] x[2] x[3] x[4]
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
Conseguimos o mesmo resultado com aritmética de ponteiros. Adicionamos ao endereço o tamanho de 3 ints e chegamos a x[3].
x = 0x7fff52294b10 x[0] a x[4]: 6 2 8 4 9 px = 0x7fff52294b10 *px = 6 px[0] = 6 px[3] = 4 *(px+3) = 4
x[0] x[1] x[2] x[3] x[4]
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
A operação px++ faz px apontar para o próximo int na memória depois de ser
desreferenciado
x = 0x7fff52294b10 x[0] a x[4]: 6 2 8 4 9 px = 0x7fff52294b10 *px = 6 px[0] = 6 px[3] = 4 *(px+3) = 4 *px++ = 6
x[0] x[1] x[2] x[3] x[4]
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
px[3] retorna 3 posições após a posição apontada por px, que agora é x[4].
x = 0x7fff52294b10 x[0] a x[4]: 6 2 8 4 9 px = 0x7fff52294b10 *px = 6 px[0] = 6 px[3] = 4 *(px+3) = 4 *px++ = 6 px[3] = 9
x[0] x[1] x[2] x[3] x[4]
x 6 2 8 4 9
px
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
x = 0x7fff52294b10 x[0] a x[4]: 6 2 8 4 9 px = 0x7fff52294b10 *px = 6 px[0] = 6 px[3] = 4 *(px+3) = 4 *px++ = 6 px[3] = 9
x[0] x[1] x[2] x[3] x[4]
Exercício - Qual a saída? int x = 5; int *px; px = &x; cout << x << endl; cout << &x << endl; cout << &px << endl; cout << px << endl; cout << *px << endl; int v[5] = {4, 2, 3, 4, 5}; cout << v[0] << endl; cout << v << endl; cout << &v << endl; cout << *v << endl; px = v; cout << px << endl; cout << &px << endl; cout << *px << endl; cout << *(px+1) << endl;
#include <iostream>using namespace std; int main(){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }.
#include <iostream>using namespace std; int main(){ int x; int *px; int *py; x = 5; px = &x; py = px; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "*py = " << *py << endl; cout << "&px = " << &px << endl; cout << "&py = " << &py << endl; return 0; }.
Podemos criar ponteiros que apontem para arranjos.
#include <iostream>using namespace std; int main(){ int x[5] = {6,2,8,4,9}; int *px; px = x; cout << "x = " << x << endl; cout << "x[0] a x[4]: "; for (int i=0; i<5; i++){ cout << x[i] << " "; } cout << endl; cout << "px = " << px << endl; cout << "*px = " << *px << endl; cout << "px[0] = " << px[0] << endl; cout << "px[3] = " << px[3] << endl; cout << "*(px+3) = " << *(px+3) << endl; cout << "*px++ = " << *px++ << endl; cout << "px[3] = " << px[3] << endl; return 0; }.
Funções• Veja a letra de música abaixo:Me chama (Lobão)
Chove lá foraE aqui tá tanto frio Me dá vontade de saber...
Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!
Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!
Nem sempre se vê!Lágrima no escuroLágrima no escuroLágrima!
Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
Nem sempre se vê!Lágrima no escuroLágrima no escuroLágrima!
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama...
Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
Me chama (Lobão)
Chove lá foraE aqui tá tanto frio Me dá vontade de saber...
Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!
REFRÃO 1:Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama…
REFRÃO 2: Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
REFRÃO 1
REFRÃO 2
REFRÃO 1
• Veja agora a mesma letra de outra maneira:
Me chama (Lobão)
Chove lá foraE aqui tá tanto frio Me dá vontade de saber...
PARTE 2: Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!
REFRÃO 1:Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
PARTE 2
REFRÃO 2: Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
REFRÃO 1
REFRÃO 2
REFRÃO 1
• Ou assim:Me chama (Lobão)
Chove lá foraE aqui tá tanto frio Me dá vontade de saber...
PARTE 2: Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!
REFRÃO 1:Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
PARTE 2
REFRÃO 2: Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
REFRÃO 1
REFRÃO 2
REFRÃO 1
• As pessoas não dizem “refrão" quando chegam no segundo refrão.
• Pessoas voltam onde o refrão foi definido e cantam esta parte.
• Isto nos dá um grande poder de síntese para expressar idéias.
Me chama (Lobão) Partes:
PARTE 2: Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!…
REFRÃO 1:Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!…
REFRÃO 2: Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!…
Música:
Chove lá foraE aqui tá tanto frio Me dá vontade de saber…
PARTE 2
REFRÃO 1
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
PARTE 2
REFRÃO 1
REFRÃO 2
REFRÃO 1
• Outra possibilidade é definir todas as partes no início e depois ter a música completa usando apenas as definições.
• É de maneira análoga que funções de um programa podem ser definidas e depois chamadas.
Funções• Unidade autônoma de código, que cumpre
uma tarefa particular
• Programas em C e C++ são formados por funções
• Por enquanto estivemos colocando todo código em nossa função principal (main) porém programas que resolvem problemas maiores são usualmente divididos em mais funções
Minha primeira função• Funções são muito úteis para dividir
problemas em problemas menores
• Tarefas que são repetidas várias vezes podem ser colocadas em funções para simplificar o código
• Uma função que será utilizada na função main deve ser declarada antes da função main para que seja reconhecida
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
A função exemplo() é criada antes da função main().
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
A palavra chave void na frente de nossa função exemplo() indica que esta função não retorna nenhum valor. Isto será discutido mais
adiante.
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
Apesar disto, note que a sintaxe das duas funções é muito similar. Um nome de função,
parênteses e um bloco de comandos delimitado por chaves { }.
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
Assim como em qualquer programa, a execução se inicia na função main
Exemplo de função simples
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
Nesta linha de código, a função exemplo() é chamada. A função main fica em espera até
que os comandos da função exemplo() sejam executados.
Exemplo de função simples
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
A função exemplo imprime um “Olá Mundo!” com 3 comandos separados.
Exemplo de função simples Olá Mundo!
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
Ao fim da execução da função, voltamos para a função que a chamou. O próximo comando de main, é mais uma chamada à função exemplo().
Exemplo de função simples Olá Mundo!
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
A função é executada mais uma vez.
Exemplo de função simples Olá Mundo! Olá Mundo!
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
Exemplo de função simples Olá Mundo! Olá Mundo!
Minha primeira função• Este exemplo mostrou como criar novas
funções com blocos de código que são sempre executados.
• Isto pode nos ajudar a organizar o problema em problemas menores
• Nossas funções precisam ser declaradas antes da função main para que possam ser reconhecidas
Cabeçalhos de função
• Por questão de organização é usualmente melhor analisar a função main antes de analisar outras funções
• Assim, seria bom poder definir as funções no código após a função main
• Isto é possível através do uso de cabeçalhos
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
#include <iostream>using namespace std;
void exemplo(); int main(){ cout << "Exemplo de função" << endl; exemplo(); exemplo(); return 0; }.
void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;}.
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
#include <iostream>using namespace std;
void exemplo(); int main(){ cout << "Exemplo de função" << endl; exemplo(); exemplo(); return 0; }.
void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;}.
O cabeçalho declara a função, de modo que a função main a reconheça.
Após a função main, definimos a função declarada no cabeçalho.
#include <iostream>using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;} int main(){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }
#include <iostream>using namespace std;
void exemplo(); int main(){ cout << "Exemplo de função" << endl; exemplo(); exemplo(); return 0; }.
void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl;}.
Agora é possível ler a definição da função main antes da definição da função exemplo
Funções e suas variáveis• Nossas funções, assim como a função main, podem ter suas próprias variáveis.
• Devido ao escopo de bloco, as funções não terão acesso às variáveis de outras funções, nem mesmo às variáveis da função que a chamou
• Por isto, não há problema em se repetir identificadores da função chamadora
#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
x 2
Criamos duas variáveis x e y no escopo de main.#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
y 6
main
x 2
A soma das variáveis é impressa normalmente na função main
#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
y 6
x+y = 8
main
x 2
A função main agora chama a função soma e fica em espera até que ela termine
#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
y 6
x+y = 8
main
x 2
A função soma cria duas variáveis em seu próprio escopo.
#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
y 6
x+y = 8
main
x a
soma
x 2
Repare que não há conflito de identificadores pois são escopos completamente diferentes
#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
y 6
x+y = 8
main
x a
soma
x 2
Pelo mesmo motivo, soma não tem acesso às variáveis de main e vice-versa.
#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
y 6
x+y = 8
main
x a
soma
x 2
#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
y 6
x+y = 8
main
x 4 a 1
soma
x 2
#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
y 6
x+y = 8 x+a = 5
main
x 4 a 1
soma
soma imprime x+a de acordo com as variáveis de seu escopo.
x 2
#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
y 6
x+y = 8 x+a = 5
main
Retornamos à função main e as variáveis de soma deixam de existir.
x 2
#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
y 6
x+y = 8 x+a = 5 x+y = 8
main
x+y novamente é 8, de acordo com as variáveis de main
x 2
#include <iostream>using namespace std; void soma();int main(){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl;}.
y 6
x+y = 8 x+a = 5 x+y = 8
main
Fim do programa. Note como as funções podem dividir problemas em subproblemas independentes. Funções com retorno de valor
• A palavra chave void antes das funções que criamos indicam que estas funções não retornam nada
• Já a palavra chave int antes da função main indica que ela retorna um int
• Este retorno acontece no comando return 0; que finaliza o programa
• O comando return 0; está ali para indicar que o programa encerrou sem erros
Funções com retorno de valor• Podemos então fazer com que funções
retornem valores de qualquer tipo
• O valor retornado, é pode ser utilizado na função chamadora como um dado daquele tipo, que pode:
• Ser diretamente utilizado
• Ser guardado em uma variável daquele tipo
#include <iostream>using namespace std; double pi();int main(){ double x; x = pi(); cout << "O valor de pi é " << x << endl; cout << "O valor de pi é " << pi() << endl; return 0; }. double pi(){ return 3.14; }.
x
Criamos uma variável x no escopo de main
main
#include <iostream>using namespace std; double pi();int main(){ double x; x = pi(); cout << "O valor de pi é " << x << endl; cout << "O valor de pi é " << pi() << endl; return 0; }. double pi(){ return 3.14; }.
x
x recebe o que for retornado pela função pi. A função main fica em espera para a função pi.
main
#include <iostream>using namespace std; double pi();int main(){ double x; x = pi(); cout << "O valor de pi é " << x << endl; cout << "O valor de pi é " << pi() << endl; return 0; }. double pi(){ return 3.14; }.
x
O primeiro comando de pi já retorna 3.14, que é capturado pela função main, que a chamou.
main
#include <iostream>using namespace std; double pi();int main(){ double x; x = pi(); cout << "O valor de pi é " << x << endl; cout << "O valor de pi é " << pi() << endl; return 0; }. double pi(){ return 3.14; }.
pi
x 3.14
Voltamos para a função main, onde o valor retornado por pi() é atribuído a x.
main
#include <iostream>using namespace std; double pi();int main(){ double x; x = pi(); cout << "O valor de pi é " << x << endl; cout << "O valor de pi é " << pi() << endl; return 0; }. double pi(){ return 3.14; }.
x 3.14
A instrução de impressão cout funciona normalmente.main
#include <iostream>using namespace std; double pi();int main(){ double x; x = pi(); cout << "O valor de pi é " << x << endl; cout << "O valor de pi é " << pi() << endl; return 0; }. double pi(){ return 3.14; }.
O valor de pi é 3.14
x 3.14
Neste cout, o valor 3.14 é retornado direto da função para o comando de impressão.
main
#include <iostream>using namespace std; double pi();int main(){ double x; x = pi(); cout << "O valor de pi é " << x << endl; cout << "O valor de pi é " << pi() << endl; return 0; }. double pi(){ return 3.14; }.
O valor de pi é 3.14 O valor de pi é 3.14
x 3.14
Fim do programa
main
#include <iostream>using namespace std; double pi();int main(){ double x; x = pi(); cout << "O valor de pi é " << x << endl; cout << "O valor de pi é " << pi() << endl; return 0; }. double pi(){ return 3.14; }.
O valor de pi é 3.14 O valor de pi é 3.14
Neste exemplo tivemos uma função que retornava o valor de pi. Funções específicas permitem a outras funções
chamadoras tomar este subproblema como resolvido e utilizar a função onde o resultado da solução do problema
for esperado.
Funções com parâmetros• Imagine a tarefa de comprar um
microondas.
OK
OK
• A tarefa de se comprar qualquer outra coisa é muito simples se já conhecemos como comprar um microondas.
OK
• Neste caso, é como se nossa função fosse a ação de comprar algo enquanto o parâmetro é o que usamos para especificar o que vai ser comprado.
Me chama (Lobão) Partes:
PARTE 2: Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!…
REFRÃO 1:Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!
REFRÃO 2: Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
Música:
Chove lá foraE aqui tá tanto frio Me dá vontade de saber…
PARTE 2
REFRÃO 1
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
PARTE 2
REFRÃO 1
REFRÃO 2
REFRÃO 1
• Veja a letra de música abaixo:Me chama (Lobão) Partes:
PARTE 2: Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!…
REFRÃO 1:Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!
REFRÃO 2: Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
Música:
Chove lá foraE aqui tá tanto frio Me dá vontade de saber…
PARTE 2
REFRÃO 1
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
PARTE 2
REFRÃO 1
REFRÃO 2
REFRÃO 1
• Repare como os dois refrões são parecidos:
Me chama (Lobão) Partes:
PARTE 2: Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!…
REFRÃO 1:Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!
REFRÃO 2: Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
Música:
Chove lá foraE aqui tá tanto frio Me dá vontade de saber…
PARTE 2
REFRÃO 1
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
PARTE 2
REFRÃO 1
REFRÃO 2
REFRÃO 1
• As únicas diferenças são os pares Lágrima/Mágica e escuro/absurdo:
Me chama (Lobão) Partes:
PARTE 2: Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!…
REFRÃO 1:Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!
REFRÃO 2: Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
Música:
Chove lá foraE aqui tá tanto frio Me dá vontade de saber…
PARTE 2
REFRÃO 1
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
PARTE 2
REFRÃO 1
REFRÃO 2
REFRÃO 1
• Não fosse por estas palavras, poderíamos ter apenas um refrão:
REFRÃO:Nem sempre se vê(Palavra 1) no (Palavra 2)(Palavra 1) no (Palavra 2)(Palavra 1)!
Me chama (Lobão) Partes:
PARTE 2: Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!…
REFRÃO 1:Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!
REFRÃO 2: Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
Música:
Chove lá foraE aqui tá tanto frio Me dá vontade de saber…
PARTE 2
REFRÃO 1
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
PARTE 2
REFRÃO 1
REFRÃO 2
REFRÃO 1
• Neste novo refrão, as palavras 1 e 2 são parâmetros que indicam o que deve ser cantado para que o refrão esteja correto.
REFRÃO:Nem sempre se vê(Palavra 1) no (Palavra 2)(Palavra 1) no (Palavra 2)(Palavra 1)!
Me chama (Lobão) Partes:
PARTE 2: Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!…
REFRÃO 1:Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!
REFRÃO 2: Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
Música:
Chove lá foraE aqui tá tanto frio Me dá vontade de saber…
PARTE 2
REFRÃO (Lágrima, escuro)
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
PARTE 2
REFRÃO (Lágrima, escuro)
REFRÃO (Mágica, absurdo)
REFRÃO (Lágrima, escuro)
• Se indicarmos as palavras que serão utilizadas na própria música, o novo refrão pode ser utilizado.
REFRÃO:Nem sempre se vê(Palavra 1) no (Palavra 2)(Palavra 1) no (Palavra 2)(Palavra 1)!
Me chama (Lobão) Partes:
PARTE 2: Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!…
REFRÃO 1:Nem sempre se vêLágrima no escuroLágrima no escuroLágrima!
REFRÃO 2: Nem sempre se vê!Mágica no absurdoMágica no absurdoMágica!
Música:
Chove lá foraE aqui tá tanto frio Me dá vontade de saber…
PARTE 2
REFRÃO (Lágrima, escuro)
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
PARTE 2
REFRÃO (Lágrima, escuro)
REFRÃO (Mágica, absurdo)
REFRÃO (Lágrima, escuro)
• Desta maneira não precisamos nem mesmo das definições antigas de refrão.
REFRÃO:Nem sempre se vê(Palavra 1) no (Palavra 2)(Palavra 1) no (Palavra 2)(Palavra 1)!
Me chama (Lobão) Partes:
PARTE 2: Aonde está você?Me telefonaMe Chama! Me Chama!Me Chama!…
REFRÃO:Nem sempre se vê(Palavra 1) no (Palavra 2)(Palavra 1) no (Palavra 2)(Palavra 1)!
Música:
Chove lá foraE aqui tá tanto frio Me dá vontade de saber…
PARTE 2
REFRÃO (Lágrima, escuro)
Tá tudo cinza sem vocêTá tão vazio E a noite fica Sem porque…
PARTE 2
REFRÃO (Lágrima, escuro)
REFRÃO (Mágica, absurdo)
REFRÃO (Lágrima, escuro)
• Veja então como é ainda muito mais concisa a explicação da música apenas com o refrão que usa parâmetros .
Funções com parâmetros• As funções são frequentemente utilizadas para
resolver subproblemas, mas às vezes subproblemas dependem de alguma informação sobre o problema para poderem ser resolvidos
• Este tipo de informação pode ser passado para as funções através dos parâmetros
• Os parâmetros de uma função são passados para ela entre parênteses, após seu identificador
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double a){ return a * a * a;}.
x 4
Criamos e inicializamos uma variável x através de uma entrada do usuário
main
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double a){ return a * a * a;}.
Digite um número: 4
x 4
Imprimimos o valor de x e o valor de x ao cubo.
main
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double a){ return a * a * a;}.
Digite um número: 4
Não temos uma variável com o valor de x ao cubo mas a função cubo tem esta capacidade de fazer
este cálculo e retornar o resultado.
x 4
A função main fica em espera da função cubo().
main
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double a){ return a * a * a;}.
Digite um número: 4
Note que mesmo sem ter o valor de x ao cubo em nenhuma variável, podemos dividir o problema em
subproblemas pois sabemos que há uma função que resolve isto e retorna o que queremos.
x 4
main
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double a){ return a * a * a;}.
Digite um número: 4
Note também que para calcular o valor de x ao cubo, o valor de x precisou ser enviado à função
x 4
A função cubo se inicia. Mais do que isto, ela já inicia com uma variável a, que é um parâmetro
da funçãomain
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double a){ return a * a * a;}.
Digite um número: 4
a 4
cubo
x 4
O valor da parâmetro a foi enviado pela função chamadora, e é uma cópia de x
main
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double a){ return a * a * a;}.
Digite um número: 4
a 4
cubo
x 4
Como são dois escopos diferentes, note que não haveria problema algum se a se chamasse x
main
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double x){ return x * x * x;}.
Digite um número: 4
x 4
cubo
x 4
Note que a é neste caso apenas uma cópia de x. Qualquer alteração em a não altera x.
main
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double a){ return a * a * a;}.
Digite um número: 4
a 4
cubo
x 4
O único comando de cubo() retorna a * a * a, ou a ao cubo
main
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double a){ return a * a * a;}.
Digite um número: 4
a 4
cubo
x 4
Ao término da função cubo(), a função main retorna com o valor retornado por cubo()
main
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double a){ return a * a * a;}.
Digite um número: 4 4 ao cubo é 64
64
x 4
Fim do programa.
main
#include <iostream>using namespace std; double cubo(double a);int main(){ int x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é " << cubo(x) << endl; return 0; }. double cubo(double a){ return a * a * a;}.
Digite um número: 4 4 ao cubo é 64
Funções com parâmetros
• Parâmetros aumentam muito a utilidade das funções
• É possível aumentar mais ainda a utilidade de funções com mais de um parâmetro
#include <iostream>using namespace std; double eleva(double base, int exp);int main(){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; cout << x << " elevado a " << y << " = " << eleva(x,y) << endl; return 0; }. double eleva(double base, int exp){ double resultado; resultado = 1; for (int i=0; i<exp; ++i){ resultado *= base; }. return resultado;}.
Declaramos a função eleva, que eleva qualquer base a qualquer expoente inteiro não negativo
#include <iostream>using namespace std; double eleva(double base, int exp);int main(){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; cout << x << " elevado a " << y << " = " << eleva(x,y) << endl; return 0; }. double eleva(double base, int exp){ double resultado; resultado = 1; for (int i=0; i<exp; ++i){ resultado *= base; }. return resultado;}.
#include <iostream>using namespace std; double eleva(double base, int exp);int main(){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; cout << x << " elevado a " << y << " = " << eleva(x,y) << endl; return 0; }. double eleva(double base, int exp){ double resultado; resultado = 1; for (int i=0; i<exp; ++i){ resultado *= base; }. return resultado;}.
x 4.4
Inicializamos variáveis x e y onde o usuário escolhe uma base e um expoente
main
Digite a base: 4.4 Digite o expoente: 5
y 5
#include <iostream>using namespace std; double eleva(double base, int exp);int main(){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; cout << x << " elevado a " << y << " = " << eleva(x,y) << endl; return 0; }. double eleva(double base, int exp){ double resultado; resultado = 1; for (int i=0; i<exp; ++i){ resultado *= base; }. return resultado;}.
x 4.4
O comando cout precisa do resultado da função eleva. Por isto a função main fica em espera.
main
Digite a base: 4.4 Digite o expoente: 5
y 5
#include <iostream>using namespace std; double eleva(double base, int exp);int main(){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; cout << x << " elevado a " << y << " = " << eleva(x,y) << endl; return 0; }. double eleva(double base, int exp){ double resultado; resultado = 1; for (int i=0; i<exp; ++i){ resultado *= base; }. return resultado;}.
x 4.4
A função eleva se inicia com base como uma cópia de x e exp como uma cópia de y.
main
Digite a base: 4.4 Digite o expoente: 5
y 5
base 4.4
eleva
exp 5
#include <iostream>using namespace std; double eleva(double base, int exp);int main(){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; cout << x << " elevado a " << y << " = " << eleva(x,y) << endl; return 0; }. double eleva(double base, int exp){ double resultado; resultado = 1; for (int i=0; i<exp; ++i){ resultado *= base; }. return resultado;}.
x 4.4
Uma variável onde será calculado o resultado. Esta variável se inicia com 1.
main
Digite a base: 4.4 Digite o expoente: 5
y 5
base 4.4
eleva
exp 5
resultado 1
#include <iostream>using namespace std; double eleva(double base, int exp);int main(){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; cout << x << " elevado a " << y << " = " << eleva(x,y) << endl; return 0; }. double eleva(double base, int exp){ double resultado; resultado = 1; for (int i=0; i<exp; ++i){ resultado *= base; }. return resultado;}.
x 4.4
resultado é multiplicado por base. Este processo se repete exp vezes.
main
Digite a base: 4.4 Digite o expoente: 5
y 5
base 4.4
eleva
exp 5
resultado 1649.1622
#include <iostream>using namespace std; double eleva(double base, int exp);int main(){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; cout << x << " elevado a " << y << " = " << eleva(x,y) << endl; return 0; }. double eleva(double base, int exp){ double resultado; resultado = 1; for (int i=0; i<exp; ++i){ resultado *= base; }. return resultado;}.
x 4.4
O valor de resultado é retornado para a função chamadora.
main
Digite a base: 4.4 Digite o expoente: 5
y 5
base 4.4
eleva
exp 5
resultado 1649.1622
1649.1622
#include <iostream>using namespace std; double eleva(double base, int exp);int main(){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; cout << x << " elevado a " << y << " = " << eleva(x,y) << endl; return 0; }. double eleva(double base, int exp){ double resultado; resultado = 1; for (int i=0; i<exp; ++i){ resultado *= base; }. return resultado;}.
x 4.4
A função eleva é encerrada e a função main volta a executar com o valor retornado.
main
Digite a base: 4.4 Digite o expoente: 5 4.4 elevado a 5 = 1649.1622
y 5
1649.1622
#include <iostream>using namespace std; double eleva(double base, int exp);int main(){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; cout << x << " elevado a " << y << " = " << eleva(x,y) << endl; return 0; }. double eleva(double base, int exp){ double resultado; resultado = 1; for (int i=0; i<exp; ++i){ resultado *= base; }. return resultado;}.
x 4.4
Fim do programa.
main
Digite a base: 4.4 Digite o expoente: 5 4.4 elevado a 5 = 1649.1622
y 5
Passagem de parâmetros
• Em várias linguagens de programação, há duas maneiras de se passar parâmetros para uma função:
• por valor
• por referência
Passagem de parâmetros por valor
• Este é o modo de passagem de parâmetros que estivemos utilizando até agora
• A função recebe uma cópia da variável da função chamadora
• Ao final do processo as cópias são eliminadas
#include <iostream>using namespace std; double cubo(double a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double a){ a = a * a * a; return a;}.
x 4
Inicialização...
main
Digite um número: 4 4 ao cubo é
#include <iostream>using namespace std; double cubo(double a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double a){ a = a * a * a; return a;}.
x 4
Como cout depende de cubo, a função main fica em espera.
main
Digite um número: 4 4 ao cubo é
#include <iostream>using namespace std; double cubo(double a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double a){ a = a * a * a; return a;}.
x 4
Note que a é neste caso apenas uma cópia do valor de x. Alterações em a não alteram x.
main
Digite um número: 4 4 ao cubo é
a 4
cubo
#include <iostream>using namespace std; double cubo(double a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double a){ a = a * a * a; return a;}.
x 4
Note que a é neste caso apenas uma cópia do valor de x. Alterações em a não alteram x.
main
Digite um número: 4 4 ao cubo é
a 64
cubo
#include <iostream>using namespace std; double cubo(double a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double a){ a = a * a * a; return a;}.
x 4
O valor de a é retornado.
main
Digite um número: 4 4 ao cubo é
a 64
cubo
#include <iostream>using namespace std; double cubo(double a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double a){ a = a * a * a; return a;}.
64
x 4
Função é encerrada e main volta à execução com o valor retornado
main
Digite um número: 4 4 ao cubo é 64
#include <iostream>using namespace std; double cubo(double a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double a){ a = a * a * a; return a;}.
64
x 4
Valor de x é impresso.
main
Digite um número: 4 4 ao cubo é 64 x = 4
#include <iostream>using namespace std; double cubo(double a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double a){ a = a * a * a; return a;}.
x 4
Note como durante a execução do programa o valor de x não foi alterado.
main
Digite um número: 4 4 ao cubo é 64 x = 4
#include <iostream>using namespace std; double cubo(double a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double a){ a = a * a * a; return a;}.
Passagem de parâmetros por referência
• A função recebe uma referência para a variável da função chamadora
• A variável da função chamada é apenas um apelido para a variável da função chamadora
• Não precisamos copiar todos os dados para executar a função chamadora
• Alterações na variável da função alteram também a variável na função chamadora
• Para indicar que o parâmetro será passado por referência, utiliza-se um & (e comercial)
#include <iostream>using namespace std; double cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double &a){ a = a * a * a; return a;}.
Declaramos a função. O & (e comercial) indica que a função recebe a variável por referência.
Digite um número: 4 4 ao cubo é
#include <iostream>using namespace std; double cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double &a){ a = a * a * a; return a;}.
x 4
Inicialização...
main
Digite um número: 4 4 ao cubo é
#include <iostream>using namespace std; double cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double &a){ a = a * a * a; return a;}.
x 4
Como cout depende de cubo, a função main fica em espera.
main
Digite um número: 4 4 ao cubo é
#include <iostream>using namespace std; double cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double &a){ a = a * a * a; return a;}.
x 4
a é agora um apelido para o x da função chamadora. Alterações em a alterarão x!
main
Digite um número: 4 4 ao cubo é
a x
cubo
#include <iostream>using namespace std; double cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double &a){ a = a * a * a; return a;}.
x 64
Como a é só um apelido para o x da função main. As alterações em a ocorrem em x!
main
Digite um número: 4 4 ao cubo é
cubo
#include <iostream>using namespace std; double cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double &a){ a = a * a * a; return a;}.
a x
x 64
O valor de a (64) é retornado para o cout da função main.main
Digite um número: 4 4 ao cubo é
cubo
#include <iostream>using namespace std; double cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double &a){ a = a * a * a; return a;}.
64
a x
x 64
Função é encerrada e main volta à execução com o valor retornado
main
Digite um número: 4 4 ao cubo é 64
#include <iostream>using namespace std; double cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double &a){ a = a * a * a; return a;}.
64
x 64
Valor de x é impresso.
main
Digite um número: 4 4 ao cubo é 64 x = 64
#include <iostream>using namespace std; double cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double &a){ a = a * a * a; return a;}.
x 64
Note como durante a execução do programa o valor de x foi alterado.
main
Digite um número: 4 4 ao cubo é 64 x = 64
#include <iostream>using namespace std; double cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. double cubo(double &a){ a = a * a * a; return a;}.
Funções para alteração de resultados
• Como a passagem de parâmetros por referência altera diretamente as variáveis da função chamadora, ela pode ser criada justamente para alterar algumas variáveis
• Estas funções podem ter o tipo de retorno void
#include <iostream>using namespace std; void cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cubo(x); cout << x << endl; return 0; }. void cubo(double &a){ a = a * a * a;}.
Declaramos a função. O & (e comercial) indica que a função recebe a variável por referência.
Desta vez, a função não retorna nada.
Digite um número: 4 4 ao cubo é
#include <iostream>using namespace std; void cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cubo(x); cout << x << endl; return 0; }. void cubo(double &a){ a = a * a * a;}.
x 4
Inicialização...
main
Digite um número: 4 4 ao cubo é
#include <iostream>using namespace std; void cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cubo(x); cout << x << endl; return 0; }. void cubo(double &a){ a = a * a * a;}.
x 4
A função cubo é chamada para alterar o valor de x. A função main fica em espera.
main
Digite um número: 4 4 ao cubo é
#include <iostream>using namespace std; void cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cubo(x); cout << x << endl; return 0; }. void cubo(double &a){ a = a * a * a;}.
x 4
a é agora uma referência para o x da função chamadora. Alterações em a alterarão x!
main
Digite um número: 4 4 ao cubo é
a x
cubo
#include <iostream>using namespace std; void cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cubo(x); cout << x << endl; return 0; }. void cubo(double &a){ a = a * a * a;}.
x 64
Como a é só um apelido para o x da função main, as alterações em a ocorrem em x!
main
Digite um número: 4 4 ao cubo é
cubo
#include <iostream>using namespace std; void cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cubo(x); cout << x << endl; return 0; }. void cubo(double &a){ a = a * a * a;}.
a x
x 64
A função cubo é encerrada e, apesar de não retornar nada, o valor de x foi alterado.
main
Digite um número: 4 4 ao cubo é
#include <iostream>using namespace std; void cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cubo(x); cout << x << endl; return 0; }. void cubo(double &a){ a = a * a * a;}.
x 64
O novo valor de x é impresso ainda na mesma linha.
main
Digite um número: 4 4 ao cubo é 64
#include <iostream>using namespace std; void cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cubo(x); cout << x << endl; return 0; }. void cubo(double &a){ a = a * a * a;}.
x 64
Fim do programa
main
Digite um número: 4 4 ao cubo é 64
#include <iostream>using namespace std; void cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cubo(x); cout << x << endl; return 0; }. void cubo(double &a){ a = a * a * a;}.
Retornando mais de um valor• Cada função pode retornar apenas um
elemento de um certo de tipo
• No exemplo anterior, utilizamos passagem de parâmetros por referência para influenciar a função chamadora sem precisarmos de utilizar do recurso de retorno
• Quando queremos retornar mais de um elemento de uma função, este é o melhor recurso que temos
#include <iostream>using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
A função maxmin retorna o mínimo e o máximo entre 3
números. Como queremos retornar dois valores, a variáveis int minimo
e int maximo são passadar por referência para guardar os
resultados.
#include <iostream>using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
Declaramos a função maxmin, que tem dois parâmetros passados por referência.
#include <iostream>using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x
Criamos 5 variáveis.
main
y
z
menor maior
#include <iostream>using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
Os valores de x, y e z são dados pelo usuário.
main
Digite 3 números: 6 3 9
y 3
z 9
menor maior
Os valores de menor e maior serão dados pela função.
#include <iostream>using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
A função main fica em espera até que a função maxmin seja executada.
main
Digite 3 números: 6 3 9
y 3
z 9
menor maior
void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
a, b e c são recebidos por valor enquanto minimo e maximo são recebidos por referência
main
Digite 3 números: 6 3 9
y 3
z 9
menor maior
maxmin
a 6
minimo menor maximo maior
b 3 c 9
void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
main
Digite 3 números: 6 3 9
y 3
z 9
menor maior
maxmin
a 6
minimo menor maximo maior
b 3 c 9
true
void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
main
Digite 3 números: 6 3 9
y 3
z 9
menor 3 maior 6
maxmin
a 6
minimo menor maximo maior
b 3 c 9
void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
main
Digite 3 números: 6 3 9
y 3
z 9
menor 3 maior 6
maxmin
a 6
minimo menor maximo maior
b 3 c 9
false
void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
main
Digite 3 números: 6 3 9
y 3
z 9
menor 3 maior 6
maxmin
a 6
minimo menor maximo maior
b 3 c 9
true
void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
main
Digite 3 números: 6 3 9
y 3
z 9
menor 3 maior 9
maxmin
a 6
minimo menor maximo maior
b 3 c 9
#include <iostream>using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
main
Digite 3 números: 6 3 9
y 3
z 9
menor 3 maior 9
A função maxmin termina sem retornar nada.
#include <iostream>using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
main
Digite 3 números: 6 3 9 O menor é 3
y 3
z 9
menor 3 maior 9
#include <iostream>using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
main
Digite 3 números: 6 3 9 O menor é 3 O maior é 9
y 3
z 9
menor 3 maior 9
using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo);int main(){ int x, y, z, menor, maior; cout << "Digite 3 números: "; cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; cout << "O maior é " << maior << endl; return 0; }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }.
x 6
main
Digite 3 números: 6 3 9 O menor é 3 O maior é 9
y 3
z 9
menor 3 maior 9
Variáveis não alteradas• Do ponto de vista de resultados, se uma
variável não será alterada dentro da função, as passagens por valor ou por referência têm os mesmos resultados
• Do ponto de vista de eficiência, se uma variável não é alterada dentro da função, a passagem por referência é usualmente mais eficiente pois não é necessário o procedimento de cópia
Arranjos como parâmetros• Como vimos anteriormente, arranjos são endereços de
memória onde se inicia uma sequência de valores do mesmo tipo
• Por este motivo, arranjos são passados por referência, já que apenas o endereço do arranjo é passado como parâmetro e não seus elementos
• Como são passados sempre por referência, não se utiliza o operador & para arranjos passados por referência
• Para passar arranjos por valor, uma cópia do arranjo deve ser feita manualmente na função chamadora
#include <iostream>using namespace std; void incrementa(int a[], int n);int main(){ int x[] = {3,4,2,6}; incrementa(x,4); cout << x[0] << " "; cout << x[1] << " "; cout << x[2] << " "; cout << x[3] << " "; return 0; }. void incrementa(int a[], int n){ for (int i = 0; i < n; ++i){ a[i]++; }. }.
Declaramos a função incrementa, que incrementa em 1 cada elemento do arranjo a. O arranjo é passado por referência, mesmo sem ter um &. A
tamanho n do arranjo é passado por valor.
#include <iostream>using namespace std; void incrementa(int a[], int n);int main(){ int x[] = {3,4,2,6}; incrementa(x,4); cout << x[0] << " "; cout << x[1] << " "; cout << x[2] << " "; cout << x[3] << " "; return 0; }. void incrementa(int a[], int n){ for (int i = 0; i < n; ++i){ a[i]++; }. }.
x 3 4 2 6
Criamos um arranjo de tamanho 4.
main
#include <iostream>using namespace std; void incrementa(int a[], int n);int main(){ int x[] = {3,4,2,6}; incrementa(x,4); cout << x[0] << " "; cout << x[1] << " "; cout << x[2] << " "; cout << x[3] << " "; return 0; }. void incrementa(int a[], int n){ for (int i = 0; i < n; ++i){ a[i]++; }. }.
x 3 4 2 6
a recebe o endereço do arranjo x por referência e n recebe por valor o número 4
main
incrementa
a x n 4
#include <iostream>using namespace std; void incrementa(int a[], int n);int main(){ int x[] = {3,4,2,6}; incrementa(x,4); cout << x[0] << " "; cout << x[1] << " "; cout << x[2] << " "; cout << x[3] << " "; return 0; }. void incrementa(int a[], int n){ for (int i = 0; i < n; ++i){ a[i]++; }. }.
x 4 5 3 7
Neste laço, cada elemento de a é incrementado em 1
main
incrementa
a x n 4
#include <iostream>using namespace std; void incrementa(int a[], int n);int main(){ int x[] = {3,4,2,6}; incrementa(x,4); cout << x[0] << " "; cout << x[1] << " "; cout << x[2] << " "; cout << x[3] << " "; return 0; }. void incrementa(int a[], int n){ for (int i = 0; i < n; ++i){ a[i]++; }. }.
x 4 5 3 7
A função incrementa termina sem retornar nada e o arranjo x agora tem seus elementos
incrementados.main
#include <iostream>using namespace std; void incrementa(int a[], int n);int main(){ int x[] = {3,4,2,6}; incrementa(x,4); cout << x[0] << " "; cout << x[1] << " "; cout << x[2] << " "; cout << x[3] << " "; return 0; }. void incrementa(int a[], int n){ for (int i = 0; i < n; ++i){ a[i]++; }. }.
x 4 5 3 7
Os elementos do arranjo x são impressos.
main
#include <iostream>using namespace std; void incrementa(int a[], int n);int main(){ int x[] = {3,4,2,6}; incrementa(x,4); cout << x[0] << " "; cout << x[1] << " "; cout << x[2] << " "; cout << x[3] << " "; return 0; }. void incrementa(int a[], int n){ for (int i = 0; i < n; ++i){ a[i]++; }. }.
4 5 3 7
x 4 5 3 7
Fim do programa. Note como o arranjo foi passado por referência sem o &.
main
#include <iostream>using namespace std; void incrementa(int a[], int n);int main(){ int x[] = {3,4,2,6}; incrementa(x,4); cout << x[0] << " "; cout << x[1] << " "; cout << x[2] << " "; cout << x[3] << " "; return 0; }. void incrementa(int a[], int n){ for (int i = 0; i < n; ++i){ a[i]++; }. }.
4 5 3 7
Passagem de ponteiros por valor• A passagem de variáveis por referência
não é a única maneira de uma função alterar valores da função chamadora
• Imagine um ponteiro com o endereço de uma variável da função chamadora. Se este ponteiro é passado para uma função, ele ainda aponta na memória para onde está a variável da função chamadora
#include <iostream>using namespace std; void cubo(int *x);int main(){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x);}.
Declaramos a função cubo, que recebe um ponteiro para um int, o desreferencia e o eleva
ao cubo.
#include <iostream>using namespace std; void cubo(int *x);int main(){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x);}.
#include <iostream>using namespace std; void cubo(int *x);int main(){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x);}.
Inicializamos uma variável num.
main
num 5
Digite um número: 5 5 ao cubo é
#include <iostream>using namespace std; void cubo(int *x);int main(){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x);}.
A função main fica em espera até que a função cubo seja executada.
main
num 5
Digite um número: 5 5 ao cubo é
#include <iostream>using namespace std; void cubo(int *x);int main(){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x);}.
Note que num não pode ser enviado diretamente para cubo, pois cubo espera um ponteiro para
um int e não um int.main
num 5
Digite um número: 5 5 ao cubo é
cubo
x
#include <iostream>using namespace std; void cubo(int *x);int main(){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x);}.
Como ponteiros guardam endereços de variáveis na memória, a função main envia para a função
cubo o endereço de num.main
num 5
Digite um número: 5 5 ao cubo é
cubo
x &num
#include <iostream>using namespace std; void cubo(int *x);int main(){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x);}.
Como x tem o endereço de num, isso faz com que x aponte para num mesmo o endereço tendo
sido passado por valor.main
num 5
Digite um número: 5 5 ao cubo é
cubo
x
#include <iostream>using namespace std; void cubo(int *x);int main(){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x);}.
Quando desrefenciamos x com um *, trabalhamos com a variável referenciada por x,
que é neste caso elevada ao cubo.main
num 125
Digite um número: 5 5 ao cubo é
cubo
x
#include <iostream>using namespace std; void cubo(int *x);int main(){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x);}.
A função encerra sem retornar nada e a função main retoma a execução com o valor de num
alterado.main
num 125
Digite um número: 5 5 ao cubo é
#include <iostream>using namespace std; void cubo(int *x);int main(){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x);}.
Imprimimos o valor alterado de num ainda na mesma linha.
main
num 125
Digite um número: 5 5 ao cubo é 125
#include <iostream>using namespace std; void cubo(int *x);int main(){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x);}.
main
num 125
Digite um número: 5 5 ao cubo é 125
Passagem de ponteiros por valor• A passagem de ponteiros por valor era
especialmente usada em C
• Isso ocorria pois C não tinha o recurso de se passar parâmetros por referência
• Assim, este era o único modo de se alterar valores da função chamadora
• Porém, em C++ este é um recurso que pode ser pouco interessante já que precisamos saber na função chamadora se um ponteiro é esperado pela função chamada
Funções recursivas
• Normalmente, organizamos um programa de maneira hierárquica, e que algumas funções chamam as outras
• Já uma função recursiva, é uma funcão que direta ou indiretamente chama a si mesma
Funções recursivas• Usualmente, quando funções recursivas são
chamadas, elas só sabem resolver problemas simples, chamados de caso base.
• Se ela é chamada para um problema mais complexo, ela o divide em duas partes, a parte que sabe fazer e a parte que não sabe fazer. Para que a recursão funcione, a última parte deve um problema parecido porém um pouco menor.
• A função chama uma cópia dela para trabalhar no problema menor, o que é o passo de recursão.
Funções recursivas• A função fica esperando que sua cópia
seja executada para resolver o problema menor.
• O próprio passo de recursão pode levar a várias outras cópias da função com problemas menores.
• Esta sequência de problemas menores deve convergir finalmente ao caso base.
Funções recursivas• O valor de n! (n fatorial) pode ser calculado
iterativamente (não recursivamente) como:
• n . (n-1) . (n-2) . ... . 3 . 2 . 1
• Já recursivamente, o valor de n! pode ser definido como:
• n! = n.(n-1)! (Passo recursivo)
• 1! = 1 (Caso base)
• Note que o passo recursivo usa a própria definição de um número fatorial, porém para um problema menor
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
Declaramos uma função iterativa fatorial que retorna n!.#include <iostream>
using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
Inicializamos uma variável num.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
Função main aguarda retorno da função fatorial.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
O parâmetro n recebeu o valor de num
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5
A variável resultado receberá as multiplicações pelos valores menores que n.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 1
É criado no escopo do for o contador i, que percorrerá os valores entre n e 1.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 1 i 5
Enquanto i for maior ou igual a 1...
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 1 i 5
Resultado é multiplicado por i
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 5 i 5
i passa para o próximo número
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 5 i 4
i >= 1 é true
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 5 i 4
resultado é multiplicado por 4
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 20 i 4
i passa para 3
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 20 i 3
i >= 1 é true
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 20 i 3
resultado é multiplicado por 3
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 60 i 3
i passa para 2
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 60 i 2
i >= 1 é true
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 60 i 2
resultado é multiplicado por 2
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 120 i 2
i passa para 1
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 120 i 1
i >= 1 é true
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 120 i 1
resultado é multiplicado por 1
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 120 i 1
i passa para 0
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 120 i 0
i >= 1 é false, pois i deve ir até 1
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 120 i 0
O for termina, seu escopo é encerrado e resultado é retornado
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
fatorial
n 5 resultado 120
120
Função fatorial é encerrada, e main retoma sua execução com o valor retornado
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
120
5! = 120
Esta foi uma versão iterativa da função fatorial.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado;}.
5! = 120
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
Considere agora a solução do mesmo problema com uma função recursiva
Declaramos uma função recursiva fatorial que retorna n!. Note que não há diferença no modo
como a função é declarada.#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
Inicializamos uma variável num no escopo da função main.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
A função main fica em espera até que a função fatorial seja executada.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
Função fatorial recebe o valor de num em n.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
Como n não é 0, a função fatorial tenta retornar n * fatorial(n-1)
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
Ao tentar retornar n * fatorial(n-1), a função é colocada em espera do retorno de uma
outra função fatorialmain
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
Esta outra função fatorial, porém, tem um problema menor do que o problema original.
Este é o passo recursivo.main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
Um novo escopo para a função é criado. Esta cópia da função recebe 4 como parâmetro.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
Esta cópia da função tenta retornar 4 * fatorial(3), o que a deixa também em espera
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
A cópia da função recebe o valor 3 como parâmetro.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial
n 3
Esta versão da função tenta retornar 3 * fatorial(2), o que a deixa em espera
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial
n 3
A função fatorial recebe o valor 2
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial
n 3
fatorial
n 2
Ao tentar retornar 2 * fatorial(1), ela entra em espera
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial
n 3
fatorial
n 2
Esta chamada da função fatorial recebe o valor 1...
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial
n 3
fatorial
n 2
fatorial
n 1
E tenta retornar 1 * fatorial(0)
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial
n 3
fatorial
n 2
fatorial
n 1
A chamada da função recebe 0, que é o caso base, ou seja, o problema que ela sabe resolver
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial
n 3
fatorial
n 2
fatorial
n 1
fatorial
n 0
Esta função retorna 1 para a função que a chamou
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial
n 3
fatorial
n 2
fatorial
n 1
fatorial
n 0
fatorial(0) -> 1
fatorial(1) sai de espera e pode retornar para fatorial(2) seu resultado
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial
n 3
fatorial
n 2
fatorial
n 1
fatorial(1) -> 1
fatorial(2) sai de espera e pode retornar para fatorial(3) seu resultado
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial
n 3
fatorial
n 2
fatorial(2) -> 2
fatorial(3) sai de espera e pode retornar para fatorial(4) seu resultado
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial
n 3
fatorial(3) -> 6
fatorial(4) sai de espera e pode retornar para fatorial(5) seu resultado
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial
n 4
fatorial(4) -> 24
fatorial(5) sai de espera e pode retornar para main seu resultado
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
fatorial
n 5
fatorial(5) -> 120
120
Função main sai de espera e volta a funcionar com o valor retornado.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
120
5! = 120
Fim do programa.
main
num 5
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
5! = 120
Recursão• A recursividade demonstra o poder de funções
para dividir problemas em problemas menores
• Alguns problemas podem ser definidos recursivamente de maneira bem clara
• Como visto no exemplo anterior, as chamadas recursivas criam uma pilha de cópias de funções o que pode gastar muita memória
• Por este motivo, nem sempre que houver uma solução recursiva ela é a mais apropriada
Recursão• Qualquer problema resolvido recursivamente
pode ser resolvido iterativamente
• Recursão pode tornar o programa mais fácil de entender ou depurar
• Algumas vezes, a solução iterativa não é evidente
• Devido à pilha de chamadas de função, evite usar recursividade em situações de desempenho
Recursão• É preciso tomar cuidado para garantir que
as funções recursivas levem a um caso base
• Caso contrário, pode ocorrer uma recursão infinita
• A recursão infinita será esgotada quando acabar a memória para a pilha de funções
• Este problema é análogo a um laço infinito em uma função iterativa
Exercício - Sequência de Fibonacci
// Exemplo fatorial int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }}
Exercício - Sequência de Fibonacci
// Resposta int fib(int n){ if (n <= 2){ return 1; } else { return fib(n-1) + fib(n-2); }}
#include <iostream>using namespace std; double eleva(double base, int exp);int main(){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; cout << x << " elevado a " << y << " = " << eleva(x,y) << endl; return 0; }. double eleva(double base, int exp){ double resultado; resultado = 1; for (int i=0; i<exp; ++i){ resultado *= base; }. return resultado;}.
#include <iostream>using namespace std; void cubo(double &a);int main(){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cubo(x); cout << x << endl; return 0; }. void cubo(double &a){ a = a * a * a;}.
#include <iostream>using namespace std; void incrementa(int a[], int n);int main(){ int x[] = {3,4,2,6}; incrementa(x,4); cout << x[0] << " "; cout << x[1] << " "; cout << x[2] << " "; cout << x[3] << " "; return 0; }. void incrementa(int a[], int n){ for (int i = 0; i < n; ++i){ a[i]++; }. }.
#include <iostream>using namespace std; int fatorial(int n);int main(){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }.
Considere agora a solução do mesmo problema com uma função recursiva
Estruturas• Estruturas (ou registros) são conjuntos de
elementos agrupados de dados
• São uma ferramenta para nos permitir criar novos tipos de dados a partir dos tipos existentes
• Estes são declarados em C++ com a instrução struct
• Os elementos de dados de uma estrutura são chamados de membros
• Cada membro da estrutura pode ser de um tipo diferente de dados
Sintaxe
struct nome_do_tipo { tipo_do_membro1 nome_do_membro1; tipo_do_membro2 nome_do_membro2; tipo_do_membro3 nome_do_membro3;};
Sintaxe
struct nome_do_tipo { tipo_do_membro1 nome_do_membro1; tipo_do_membro2 nome_do_membro2; tipo_do_membro3 nome_do_membro3;};
nome_do_tipo é o nome da estrutura
Sintaxe
struct nome_do_tipo { tipo_do_membro1 nome_do_membro1; tipo_do_membro2 nome_do_membro2; tipo_do_membro3 nome_do_membro3;};
Entre chaves { }, temos uma lista de membros de dados.
Cada membro tem um tipo e um identificador.
Sintaxe
struct nome_do_tipo { tipo_do_membro1 nome_do_membro1; tipo_do_membro2 nome_do_membro2; tipo_do_membro3 nome_do_membro3;};
Estas estruturas podem ser utilizadas para criar novos tipos de dados a partir dos tipos de dados
já existentes
Sintaxestruct nome_do_tipo { tipo_do_membro1 nome_do_membro1; tipo_do_membro2 nome_do_membro2; tipo_do_membro3 nome_do_membro3;};
Exemplo: uma estrutura para representar produtos
struct produto { double preco; double peso; string nome;};
Sintaxestruct produto { double preco; double peso; string nome;};
Isto declara um novo tipo de dados chamado produto. Este tipo contém dois membros
double e um membro string.
Sintaxestruct produto { double preco; double peso; string nome;};
O novo tipo produto já pode ser utilizado para declararmos variáveis do novo tipo em nosso
programa com:
produto maca; produto banana; produto abacaxi;
Sintaxestruct produto { double preco; double peso; string nome;};
O membros destas variáveis podem ser acessados diretamente com um ponto (.) entre o
nome do objeto e do membro.
produto pera; pera.peso = 0.3; pera.nome = "Pêra Williams"; cout << "Digite o preço: "; cin >> pera.preco; cout << "Peso da pêra: " << pera.peso << endl;
#include <iostream>using namespace std; struct produto { double preco; double peso; string nome;}; int main(){ produto x; x.peso = 0.3; x.nome = "Pêra"; cout << "Digite o preço: "; cin >> x.preco; cout << "Peso da " << x.nome << ": " << x.peso << endl; return 0; }.
É declarado o novo tipo de dados produto.#include <iostream>using namespace std; struct produto { double preco; double peso; string nome;};int main(){ produto x; x.peso = 0.3; x.nome = "Pêra"; cout << "Digite o preço: "; cin >> x.preco; cout << "Peso da " << x.nome << ": " << x.peso << endl; return 0; }.
É criado um objeto x do tipo produto. Observe que x tem 3 membros.
main
x
#include <iostream>using namespace std; struct produto { double preco; double peso; string nome;};int main(){ produto x; x.peso = 0.3; x.nome = "Pêra"; cout << "Digite o preço: "; cin >> x.preco; cout << "Peso da " << x.nome << ": " << x.peso << endl; return 0; }.
Atualizamos o valor do segundo membro de x.
main
x 0.3
#include <iostream>using namespace std; struct produto { double preco; double peso; string nome;};int main(){ produto x; x.peso = 0.3; x.nome = "Pêra"; cout << "Digite o preço: "; cin >> x.preco; cout << "Peso da " << x.nome << ": " << x.peso << endl; return 0; }.
Atualizamos o valor do terceiro membro de x.
main
x 0.3 Pêra
#include <iostream>using namespace std; struct produto { double preco; double peso; string nome;};int main(){ produto x; x.peso = 0.3; x.nome = "Pêra"; cout << "Digite o preço: "; cin >> x.preco; cout << "Peso da " << x.nome << ": " << x.peso << endl; return 0; }.
Usuário atualiza o valor do primeiro membro de x através do fluxo de entrada.
main
x 2.3 0.3 Pêra
#include <iostream>using namespace std; struct produto { double preco; double peso; string nome;};int main(){ produto x; x.peso = 0.3; x.nome = "Pêra"; cout << "Digite o preço: "; cin >> x.preco; cout << "Peso da " << x.nome << ": " << x.peso << endl; return 0; }.
Digite o preço: 2.3
Imprimimos o segundo e o terceiro membros do objeto x.
main
x 2.3 0.3 Pêra
#include <iostream>using namespace std; struct produto { double preco; double peso; string nome;};int main(){ produto x; x.peso = 0.3; x.nome = "Pêra"; cout << "Digite o preço: "; cin >> x.preco; cout << "Peso da " << x.nome << ": " << x.peso << endl; return 0; }.
Digite o preço: 2.3 Peso da Pêra: 0.3
main
x 2.3 0.3 Pêra
#include <iostream>using namespace std; struct produto { double preco; double peso; string nome;};int main(){ produto x; x.peso = 0.3; x.nome = "Pêra"; cout << "Digite o preço: "; cin >> x.preco; cout << "Peso da " << x.nome << ": " << x.peso << endl; return 0; }.
Digite o preço: 2.3 Peso da Pêra: 0.3
Arranjos de estruturas
• Vimos então que as estruturas servem para definir novos tipos de dados a partir dos tipos já conhecidos
• Como estruturas são tipos de dados, elas também podem ser utilizadas como tipos de arranjos
#include <iostream>#include <string>using namespace std; struct produto{ double preco; double peso; string nome;}; int main(){ const int n = 5; produto p[n]; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. for (int i=0; i<n; ++i){ cout << p[i].nome << "\t"; cout << "R$" << p[i].preco << "\t"; cout << p[i].peso << "kg" << endl; }. return 0; }.
#include <iostream>#include <string>using namespace std; struct produto{ double preco; double peso; string nome;};int main(){ const int n = 5; produto p[n]; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. for (int i=0; i<n; ++i){ cout << p[i].nome << "\t"; cout << "R$" << p[i].preco << "\t"; cout << p[i].peso << "kg" << endl; }. return 0; }.
Como estruturas são tipos de dados, elas também podem ser utilizadas como tipos de
arranjos.
#include <iostream>#include <string>using namespace std; struct produto{ double preco; double peso; string nome;};int main(){ const int n = 5; produto p[n]; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. for (int i=0; i<n; ++i){ cout << p[i].nome << "\t"; cout << "R$" << p[i].preco << "\t"; cout << p[i].peso << "kg" << endl; }. return 0; }.
É declarado o novo tipo de dados produto.
using namespace std; struct produto{ double preco; double peso; string nome;}; int main(){ const int n = 5; produto p[n]; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. for (int i=0; i<n; ++i){ cout << p[i].nome << "\t"; cout << "R$" << p[i].preco << "\t"; cout << p[i].peso << "kg" << endl; }. return 0; }.
Criamos um arranjo de produtos p. Cada elemento do arranjo tem espaço para os 3
membros de um produto.main
p p[0] p[1]
... p[2] p[3]
... p[4]
n 5
using namespace std; struct produto{ double preco; double peso; string nome;};int main(){ const int n = 5; produto p[n]; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. for (int i=0; i<n; ++i){ cout << p[i].nome << "\t"; cout << "R$" << p[i].preco << "\t"; cout << p[i].peso << "kg" << endl; }. return 0; }.
Na primeira iteração do for, damos valores aos membros do primeiro produto.
main
p 2.3 0.3 Pêra p[1]
... p[2] p[3]
... p[4]
i 0n 5
Produto 0 Digite o preço: 2.3 Digite o peso: 0.3 Digite o nome: Pêra
using namespace std; struct produto{ double preco; double peso; string nome;}; int main(){ const int n = 5; produto p[n]; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. for (int i=0; i<n; ++i){ cout << p[i].nome << "\t"; cout << "R$" << p[i].preco << "\t"; cout << p[i].peso << "kg" << endl; }. return 0; }.
No conjunto de iterações, damos valores a todos os membros de todos os produtos.
main
p 2.3 0.3 Pêra 8.6 0.2 Kiwi
... 1.5 1.2 Lima 6.5 2.3 Maçã
... 7.2 0.56 Uva
i 5n 5
... Digite o nome: Lima Produto 3 Digite o preço: 6.5 Digite o peso: 2.3 Digite o nome: Maçã Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva
using namespace std; struct produto{ double preco; double peso; string nome;};int main(){ const int n = 5; produto p[n]; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. for (int i=0; i<n; ++i){ cout << p[i].nome << "\t"; cout << "R$" << p[i].preco << "\t"; cout << p[i].peso << "kg" << endl; }. return 0; }.
Neste outro conjunto de iterações, imprimimos todos os produtos do arranjo.
main
p 2.3 0.3 Pêra 8.6 0.2 Kiwi
... 1.5 1.2 Lima 6.5 2.3 Maçã
... 7.2 0.56 Uva
i 5n 5
... Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva Pêra R$2.3 0.3kg Kiwi R$8.6 0.2kg Lima R$1.5 1.2kg Maçã R$6.5 2.3kg Uva R$7.2 0.56kg
using namespace std; struct produto{ double preco; double peso; string nome;}; int main(){ const int n = 5; produto p[n]; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. for (int i=0; i<n; ++i){ cout << p[i].nome << "\t"; cout << "R$" << p[i].preco << "\t"; cout << p[i].peso << "kg" << endl; }. return 0; }.
main
p 2.3 0.3 Pêra 8.6 0.2 Kiwi
... 1.5 1.2 Lima 6.5 2.3 Maçã
... 7.2 0.56 Uva
n 5
... Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva Pêra R$2.3 0.3kg Kiwi R$8.6 0.2kg Lima R$1.5 1.2kg Maçã R$6.5 2.3kg Uva R$7.2 0.56kg
Ponteiros para estruturas• Quando temos um ponteiro px para um
estrutura x podemos acessar os membros de x com (*px).identificador
• Porém, podemos fazer o mesmo com o operador de seta (->), que existe para isto:
• px->identificador
• O operador de seta desreferencia px e retorna o membro indicado
#include <iostream>#include <string>using namespace std; struct produto{ double preco; double peso; string nome;};int main(){ const int n = 5; produto p[n]; produto *barato; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. barato = &p[0]; for (int i=1; i<n; ++i){ if (p[i].preco < barato->preco){ barato = &p[i]; }. }. cout << "Produto mais barato:" << endl; cout << barato->nome << "\t"; cout << "R$" << barato->preco << "\t"; cout << barato->peso << "kg" << endl; return 0; }.
Neste exemplo, temos um ponteiro para um produto que se chama barato. Ele
apontará para o produto mais barato do arranjo.
#include <iostream>#include <string>using namespace std; struct produto{ double preco; double peso; string nome;}; int main(){ const int n = 5; produto p[n]; produto *barato; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. barato = &p[0]; for (int i=1; i<n; ++i){ if (p[i].preco < barato->preco){ barato = &p[i]; }. }. cout << "Produto mais barato:" << endl; cout << barato->nome << "\t"; cout << "R$" << barato->preco << "\t"; cout << barato->peso << "kg" << endl; return 0; }.
#include <iostream>#include <string>using namespace std; struct produto{ double preco; double peso; string nome;};int main(){ const int n = 5; produto p[n]; produto *barato; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. barato = &p[0]; for (int i=1; i<n; ++i){ if (p[i].preco < barato->preco){ barato = &p[i]; }. }. cout << "Produto mais barato:" << endl; cout << barato->nome << "\t"; cout << "R$" << barato->preco << "\t"; cout << barato->peso << "kg" << endl; return 0; }.
É declarado o novo tipo de dados produto.
using namespace std; struct produto{ double preco; double peso; string nome;};int main(){ const int n = 5; produto p[n]; produto *barato; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. barato = &p[0]; for (int i=1; i<n; ++i){ if (p[i].preco < barato->preco){ barato = &p[i]; }. }. cout << "Produto mais barato:" << endl; cout << barato->nome << "\t"; cout << "R$" << barato->preco << "\t"; cout << barato->peso << "kg" << endl; return 0; }.
Como no exemplo anterior, damos valores a todos os produtos.
main
p 2.3 0.3 Pêra 8.6 0.2 Kiwi
... 1.5 1.2 Lima 6.5 2.3 Maçã
... 7.2 0.56 Uva
i 5
n 5
... Digite o nome: Lima Produto 3 Digite o preço: 6.5 Digite o peso: 2.3 Digite o nome: Maçã Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva
barato
};int main(){ const int n = 5; produto p[n]; produto *barato; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. barato = &p[0]; for (int i=1; i<n; ++i){ if (p[i].preco < barato->preco){ barato = &p[i]; }. }. cout << "Produto mais barato:" << endl; cout << barato->nome << "\t"; cout << "R$" << barato->preco << "\t"; cout << barato->peso << "kg" << endl; return 0; }.
O ponteiro barato aponta para o primeiro elemento do arranjo.
main
p 2.3 0.3 Pêra 8.6 0.2 Kiwi
... 1.5 1.2 Lima 6.5 2.3 Maçã
... 7.2 0.56 Uva
i 5
n 5
... Digite o nome: Lima Produto 3 Digite o preço: 6.5 Digite o peso: 2.3 Digite o nome: Maçã Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva
barato
};int main(){ const int n = 5; produto p[n]; produto *barato; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. barato = &p[0]; for (int i=1; i<n; ++i){ if (p[i].preco < barato->preco){ barato = &p[i]; }. }. cout << "Produto mais barato:" << endl; cout << barato->nome << "\t"; cout << "R$" << barato->preco << "\t"; cout << barato->peso << "kg" << endl; return 0; }.
Se o elemento p[1] do arranjo fosse mais barato que o apontado por barato, ele
apontaria para o p[1]. Note o operador ->.main
p 2.3 0.3 Pêra 8.6 0.2 Kiwi
... 1.5 1.2 Lima 6.5 2.3 Maçã
... 7.2 0.56 Uva
i 1
n 5
... Digite o nome: Lima Produto 3 Digite o preço: 6.5 Digite o peso: 2.3 Digite o nome: Maçã Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva
barato
};int main(){ const int n = 5; produto p[n]; produto *barato; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. barato = &p[0]; for (int i=1; i<n; ++i){ if (p[i].preco < barato->preco){ barato = &p[i]; }. }. cout << "Produto mais barato:" << endl; cout << barato->nome << "\t"; cout << "R$" << barato->preco << "\t"; cout << barato->peso << "kg" << endl; return 0; }.
p[2] é mais barato que o elemento apontado por barato, então ele passa a ser o apontado.
main
p 2.3 0.3 Pêra 8.6 0.2 Kiwi
... 1.5 1.2 Lima 6.5 2.3 Maçã
... 7.2 0.56 Uva
i 2
n 5
... Digite o nome: Lima Produto 3 Digite o preço: 6.5 Digite o peso: 2.3 Digite o nome: Maçã Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva
barato
};int main(){ const int n = 5; produto p[n]; produto *barato; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. barato = &p[0]; for (int i=1; i<n; ++i){ if (p[i].preco < barato->preco){ barato = &p[i]; }. }. cout << "Produto mais barato:" << endl; cout << barato->nome << "\t"; cout << "R$" << barato->preco << "\t"; cout << barato->peso << "kg" << endl; return 0; }.
Ao fim do for, fazemos isto para todos os elementos mas nenhum é mais barato que p[2].
main
p 2.3 0.3 Pêra 8.6 0.2 Kiwi
... 1.5 1.2 Lima 6.5 2.3 Maçã
... 7.2 0.56 Uva
i 2
n 5
... Digite o nome: Lima Produto 3 Digite o preço: 6.5 Digite o peso: 2.3 Digite o nome: Maçã Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva
barato
};int main(){ const int n = 5; produto p[n]; produto *barato; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. barato = &p[0]; for (int i=1; i<n; ++i){ if (p[i].preco < barato->preco){ barato = &p[i]; }. }. cout << "Produto mais barato:" << endl; cout << barato->nome << "\t"; cout << "R$" << barato->preco << "\t"; cout << barato->peso << "kg" << endl; return 0; }.
Utilizamos novamente o operador de seta (->) para imprimir o elemento mais barato apontado.
main
p 2.3 0.3 Pêra 8.6 0.2 Kiwi
... 1.5 1.2 Lima 6.5 2.3 Maçã
... 7.2 0.56 Uva
i 2
n 5
... Digite o preço: 6.5 Digite o peso: 2.3 Digite o nome: Maçã Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva Produto mais barato: Lima R$1.5 1.2kg
barato
};int main(){ const int n = 5; produto p[n]; produto *barato; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. barato = &p[0]; for (int i=1; i<n; ++i){ if (p[i].preco < barato->preco){ barato = &p[i]; }. }. cout << "Produto mais barato:" << endl; cout << barato->nome << "\t"; cout << "R$" << barato->preco << "\t"; cout << barato->peso << "kg" << endl; return 0; }.
main
p 2.3 0.3 Pêra 8.6 0.2 Kiwi
... 1.5 1.2 Lima 6.5 2.3 Maçã
... 7.2 0.56 Uva
i 2
n 5
... Digite o preço: 6.5 Digite o peso: 2.3 Digite o nome: Maçã Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva Produto mais barato: Lima R$1.5 1.2kg
barato
Alocação Automática de Memória
• Para cada variável de nosso programa, há uma quantidade a ser alocada de memória
• Quando executamos uma função ou bloco de código, o sistema operacional aloca a memória necessária para todas as suas variáveis
• Esta é a memória automaticamente alocada
• Por isto, é importante dizermos, por exemplo, o tamanho dos arranjos presentes em nosso programa diretamente ou através de constantes
Alocação Automática de Memória
#include <iostream>#include <string>using namespace std; int main(){ int x = 4; int *px = &x; int a[] = {2,4,5,3}; int b[5]; int i; for (i=0; i<5; ++i){ b[i] = a[0] + i; }. const int n = 5; int c[n]; for (i=0; i<n; ++i){ c[i] = a[1] + i; }. return 0; }.
Alocação Automática de Memória
• Antes de iniciar main, o sistema operacional já aloca memória para 1+4+5+1+5 = 16 inteiros e 1 ponteiro para inteiro.
• Esta é a memória alocada de maneira automática para o main.
#include <iostream>#include <string>using namespace std; int main(){ int x = 4; int *px = &x; int a[] = {2,4,5,3}; int b[5]; int i; for (i=0; i<5; ++i){ b[i] = a[0] + i; }. const int n = 5; int c[n]; for (i=0; i<n; ++i){ c[i] = a[1] + i; }. return 0; }.
xpx
a[0]a[1]a[2]a[3]b[0]b[1]b[2]b[3]b[4]i
c[0]c[1]c[2]c[3]c[4]
Alocação Automática de Memória
#include <iostream>#include <string>using namespace std; int main(){ int x = 4; int *px = &x; int a[] = {2,4,5,3}; int b[5]; int i; for (i=0; i<5; ++i){ b[i] = a[0] + i; }. const int n = 5; int c[n]; for (i=0; i<n; ++i){ c[i] = a[1] + i; }. return 0; }.
xpx
a[0]a[1]a[2]a[3]b[0]b[1]b[2]b[3]b[4]i
c[0]c[1]c[2]c[3]c[4]
Repare que o valor de n é constante. Valores de
constantes não podem ser alterados durante o programa.
Repare também que não existe memória alocada para o valor
de n, pois este valor é constante.
Alocação Automática de Memória
#include <iostream>#include <string>using namespace std; int main(){ int x = 4; int *px = &x; int a[] = {2,4,5,3}; int b[5]; int i; for (i=0; i<5; ++i){ b[i] = a[0] + i; }. const int n = 5; int c[n]; for (i=0; i<n; ++i){ c[i] = a[1] + i; }. return 0; }.
xpx
a[0]a[1]a[2]a[3]b[0]b[1]b[2]b[3]b[4]i
c[0]c[1]c[2]c[3]c[4]
Não é necessário alocar memória para n pois sabemos que seu valor nunca se altera.
É simplesmente como se todas as aparições de n no código fossem substituídas por seu
valor.
const int n = 5; int c[n]; for (i=0; i<n; ++i){ c[i] = a[1] + i; }
int c[5]; for (i=0; i<5; ++i){ c[i] = a[1] + i; }=
Alocação Automática de Memória• De maneira análoga, o
trecho de código ao lado leva a uma mensagem de erro ou o compilador tentará encontrar alguma memória já alocada no que chamamos de stack (memória alocada para variáveis do programa).
• O sistema não consegue determinar quanta memória será necessária para a função.
#include <iostream>#include <string>using namespace std; int main(){ int n; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; int x[n]; for (int i=0; i < n; ++i){ x[i] = i+1; } return 0; }
Alocação Dinâmica de Memória• Em várias situações, não sabemos a quantidade de memória
necessária para fazermos tudo que precisamos.
• Isto é comum quando a quantidade de memória depende de uma resposta do usuário.
• Neste caso, é necessário pedir ao sistema para alocar dinamicamente mais memória do que aquela inicialmente reservada para o programa
• Esta memória está no que chamamos de heap (memória não utilizada pelo programa que pode ser alocada enquanto o programa executa)
• Esta memória é liberada pelo sistema durante a execução do programa, diferentemente da memória alocada de maneira automática, antes do programa iniciar
Alocação Dinâmica de Memória
• Os operadores new e delete permitem fazer a alocação dinâmica de memória
• Imagine que temos uma função com três variáveis alocadas automaticamente:
funcao
i 2x 5
px
Alocação Dinâmica de Memória
funcao
i 2x 5
px
x e i são variáveis do tipo int enquanto px é um ponteiro para int que até o momento não aponta para ninguém.
Alocação Dinâmica de Memória
funcao
i 2x 5
px
O operador new pede ao sistema para dinamicamente
alocar memória para mais uma variável do tipo int.
Esta variável é alocada fora da função.
new int;
Alocação Dinâmica de Memória
funcao
i 2x 5
px
Um problema com este int alocado é que não podemos acessá-la. Para resolver este problema, o operador new retorna também o endereço onde foi alocada a memória para o int de modo que um ponteiro pode guardar este
endereço.
px = new int;
Alocação Dinâmica de Memória
funcao
i 2x 5
px
Agora sim podemos acessar esta memória desreferenciando
este ponteiro.
4
px = new int; *px = 3; (*px)++; cout << *px << endl;
4
Alocação Dinâmica de Memória
funcao
i 2x 5
px
Considere agora que usamos o comando new duas vezes.
Temos também um problema pois não temos como acessar a
memória alocada para o primeiro int.
4 px = new int; *px = 3; px = new int; *px = 4;
3
Alocação Dinâmica de Memória
funcao
i 2x 5
px
A quando uma memória fica alocada porém não temos como acessá-la, diz-se que houve uma vazamento de memória. Este é um problema sério pois nossa memória é um recurso finito.
4 px = new int; *px = 3; px = new int; *px = 4;
3
vazamento de memória
Alocação Dinâmica de Memória
funcao
i 2x 5
px
Considere agora a função abaixo:
4
void funcao(){ int x = 5; int i = 2; int *px; px = new int; *px = 4; }.
Alocação Dinâmica de Memória
funcao
i 2x 5
px
Quando chegamos ao fim da função, px deixa de existir também e não há nenhum ponteiro para a memória
alocada, causando novamente vazamento de memória.
4
void funcao(){ int x = 5; int i = 2; int *px; px = new int; *px = 4; }.
vazamento de memória
Alocação Dinâmica de Memória
funcao
i 2x 5
px
É muito comum que a memória alocada seja utilizada apenas durante um período de tempo. Por isto, o comando delete pode ser usado para liberar esta memória para outros
pedidos de alocação.
4
void funcao(){ int *px; px = new int; *px = 4; delete px;}.
Alocação Dinâmica de Memória
funcao
i 2x 5
px
Repare que a função delete libera a memória apontada por px e não apaga a variável px! Isto nem seria possível, pois px está automaticamente alocado.
4
void funcao(){ int *px; px = new int; *px = 4; delete px;}.
Alocação Dinâmica de Memória
funcao
i 2x 5
px
Em outro exemplo da utilização de delete, px aponta para um
inteiro (3), ele é apagado e depois aponta para outro (4).
4
int *px; px = new int; *px = 3; delete px; px = new int; *px = 4;
3
Alocação Dinâmica de Memória
funcao
i 2n 4
px
O operador new[] pede ao sistema para dinamicamente alocar memória para várias
variáveis do tipo int, através de um arranjo.
int n = 4; new int[n];
Alocação Dinâmica de Memória
funcao
i 2n 4
px
Note que n agora não precisa mais ser uma constante, pois a
memória está sendo dinamicamente alocada.
int n = 4; new int[n];
Alocação Dinâmica de Memória
funcao
i 2n 7
px
Isto nos permite até mesmo associar o tamanho do arranjo
a uma resposta do usuário.
int n;cout << "Quantos elementos? "; cin >> n;new int[n];
Quantos elementos? 7
Alocação Dinâmica de Memória
funcao
i 2n 4
px
De maneira análoga a new, new[] retorna o endereço do primeiro elemento do arranjo
alocado.
int n = 4; px = new int[n];
Alocação Dinâmica de Memória
funcao
i 2n 4
px
Com um ponteiro para um arranjo, podemos
desreferenciá-lo com o operador * ou operador de
subscrito [], como se fosse um arranjo automaticamente
alocado.
4 3 5 2
int n = 4; px = new int[n];*px = 4; // px[0]px[1] = 3; // *(px+1) px[2] = 5; px[3] = 2;
Alocação Dinâmica de Memória
funcao
i 2n 4
px
Ao fim da utilização desta memória, é importante liberá-la para que não haja vazamento
de memória. Para apagar arranjos, usamos delete[]. Não confundir com o delete
simples!
int n = 4; px = new int[n];delete[] px;
Alocação Dinâmica de Memória
funcao
i 2n 4
px
Liberar toda a memória alocada após utilizá-la é
fundamental. Para que px pare de apontar para um endereço
onde não há memória alocada, o alocamos para nullptr. Isto
previne erros.
int n = 4; px = new int[n];delete[] px;px = nullptr;
#include <iostream>using namespace std; int main(){ int n; int *x; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; x = new int[n]; for (int i=0; i < n; ++i){ x[i] = i+1; }. delete[] x; x = nullptr; return 0; }.
Antes de se iniciar a função main, o compilador sabe que ela terá duas variáveis.#include <iostream>
using namespace std; int main(){ int n; int *x; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; x = new int[n]; for (int i=0; i < n; ++i){ x[i] = i+1; }. delete[] x; x = nullptr; return 0; }.
main
nx
Estas variáveis não existem ainda, mas o espaço para elas já foi automaticamente alocado.
Passa a existir a variável n#include <iostream>using namespace std; int main(){ int n; int *x; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; x = new int[n]; for (int i=0; i < n; ++i){ x[i] = i+1; }. delete[] x; x = nullptr; return 0; }.
main
nx
Passa a existir o ponteiro x#include <iostream>using namespace std; int main(){ int n; int *x; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; x = new int[n]; for (int i=0; i < n; ++i){ x[i] = i+1; }. delete[] x; x = nullptr; return 0; }.
main
nx
O usuário dá o valor que deseja para n#include <iostream>using namespace std; int main(){ int n; int *x; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; x = new int[n]; for (int i=0; i < n; ++i){ x[i] = i+1; }. delete[] x; x = nullptr; return 0; }.
main
n 5x
Digite o tamanho desejado de arranjo: 5
É alocada memória para um arranjo de tamanho 5 e x aponta para ele#include <iostream>
using namespace std; int main(){ int n; int *x; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; x = new int[n]; for (int i=0; i < n; ++i){ x[i] = i+1; }. delete[] x; x = nullptr; return 0; }.
main
n 5x
Digite o tamanho desejado de arranjo: 5
Note que a memória foi alocada em main, mas ela não pertence a main. Apenas conseguimos acessá-la através do ponteiro que está em main.#include <iostream>
using namespace std; int main(){ int n; int *x; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; x = new int[n]; for (int i=0; i < n; ++i){ x[i] = i+1; }. delete[] x; x = nullptr; return 0; }.
main
n 5x
Digite o tamanho desejado de arranjo: 5
O arranjo recebe os valores de 1 até n. Este trecho de código pode ser substituído por outra
operação qualquer sobre arranjos.#include <iostream>using namespace std; int main(){ int n; int *x; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; x = new int[n]; for (int i=0; i < n; ++i){ x[i] = i+1; }. delete[] x; x = nullptr; return 0; }.
main
n 5x
Digite o tamanho desejado de arranjo: 5
1 2 3 4 5
Ao chegar em um ponto onde não precisamos mais do arranjo alocado, o apagamos.#include <iostream>
using namespace std; int main(){ int n; int *x; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; x = new int[n]; for (int i=0; i < n; ++i){ x[i] = i+1; }. delete[] x; x = nullptr; return 0; }.
main
n 5x
Digite o tamanho desejado de arranjo: 5
Fazemos que x pare de apontar para aquela posição de memória também, já que não temos
mais nosso arranjo lá.#include <iostream>using namespace std; int main(){ int n; int *x; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; x = new int[n]; for (int i=0; i < n; ++i){ x[i] = i+1; }. delete[] x; x = nullptr; return 0; }.
main
n 5x
Digite o tamanho desejado de arranjo: 5
#include <iostream>using namespace std; int main(){ int n; int *x; cout << "Digite o tamanho desejado de arranjo: "; cin >> n; x = new int[n]; for (int i=0; i < n; ++i){ x[i] = i+1; }. delete[] x; x = nullptr; return 0; }.
main
n 5x
Digite o tamanho desejado de arranjo: 5
Alocação de arranjos multidimensionais
Alocação de arranjo simples
int *x; x = new int[10]; delete[] x;
main
x
x[0] x[1] x[2] x[3] x[4]int
*int
Alocação de arranjos multidimensionais
Alocação de arranjo multidimensional
int **x; // Apenas para C++11 // x = new int[5][5]; x = new *int[5]; for (int i=0; i<5; i++){ x[i] = new int[5]; } for (i=0; i<5; i++){ delete[] x[i]; } delete[] x;
main
x
x[0] x[1] x[2] x[3] x[4]
x[0][0] x[0][1] x[0][2] x[0][3] x[0][4]
x[1][0] x[1][1] x[1][2] x[1][3] x[1][4]
x[2][0] x[2][1] x[2][2] x[2][3] x[2][4]
x[3][0] x[3][1] x[3][2] x[3][3] x[3][4]
x[4][0] x[4][1] x[4][2] x[4][3] x[4][4]
int
int
int
int
int
*int
**int
Arquivos• Os dados das variáveis em nossos
programas são temporários. Todos eles deixam de existir após o fim do programa.
• Os arquivos em unidades externas de armazenamento são utilizados para guardar estes dados de modo permanente.
Arquivos• Os objetos cin e cout, são criados quando <iostream> é incluído
• O fluxo destes objetos criam um canal de comunicação do programa com dispositivos de entrada e saída
• Com a inserção de <fstream>, podemos criar objetos que possibilitam a comunicação do programa com arquivos
Arquivos
iostream
fstream
Arquivos• Os objetos de <fstream> podem ser
manipulados assim como os de <iostream>
• Objetos dos tipos ofstream ou ifstream funcionam de maneira similar aos objetos cout e cin
• O operador << insere dados no arquivo
• O operador >> lê dados do arquivo
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
Como mencionado, a inserção de <iostream> cria os objetos cin e cout, que fazem fluxo de
saída e entrada. Estes objetos estão constantemente disponíveis.
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
cout cin
Com a inserção de <fstream>, podemos criar outros objetos que façam fluxo de saída e
entrada com arquivos do computador.
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
cout cin
novo objeto
Na primeira linha de código já criamos um objeto do tipo ofstream para saída de dados. Este objeto é conectado a um arquivo chamado
pessoas.txt
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
main
fout pessoas.txt
pessoas.txt
Criamos outras variáveis antes de entrar no laço#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
main
fout pessoas.txt
pessoas.txt
opcao
nome idade
Atualizamos as variáveis através dos fluxos cin e cout.
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
main
fout pessoas.txt
pessoas.txt
opcao
nome João idade 27
Digite um nome: João Digite a idade de João: 27
Colocamos agora os valores de nome e idade em nosso arquivo através do objeto fout.
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
main
fout pessoas.txt
pessoas.txt
opcao
nome João idade 27
Digite um nome: João Digite a idade de João: 27
João 27
O usuário escolhe continuar com uma opção diferente de 0, que é a condição do laço.
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
main
fout pessoas.txt
pessoas.txt
opcao 1
nome João idade 27
Digite um nome: João Digite a idade de João: 27 Deseja continuar? (0 = Não, 1 = Sim): 1
João 27
Repetimos o processo então mais algumas vezes.#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
main
fout pessoas.txt
pessoas.txt
opcao 0
nome José idade 30
Digite um nome: João Digite a idade de João: 27 Deseja continuar? (0 = Não, 1 = Sim): 1 Digite um nome: Maria Digite a idade de Maria: 25 Deseja continuar? (0 = Não, 1 = Sim): 1 Digite um nome: José Digite a idade de José: 30 Deseja continuar? (0 = Não, 1 = Sim): 0
João 27 Maria 25 José 30
Como a opção foi 0, saimos do laço e fechamos o arquivo antes de encerrar o programa.
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
main
fout opcao 0
nome José idade 30
Digite um nome: João Digite a idade de João: 27 Deseja continuar? (0 = Não, 1 = Sim): 1 Digite um nome: Maria Digite a idade de Maria: 25 Deseja continuar? (0 = Não, 1 = Sim): 1 Digite um nome: José Digite a idade de José: 30 Deseja continuar? (0 = Não, 1 = Sim): 0
A função close pertence ao objeto fout. A função open poderia ser utilizada associar fout a outro
arquivo.
Fim do programa.#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
main
fout opcao 0
nome José idade 30
Digite um nome: João Digite a idade de João: 27 Deseja continuar? (0 = Não, 1 = Sim): 1 Digite um nome: Maria Digite a idade de Maria: 25 Deseja continuar? (0 = Não, 1 = Sim): 1 Digite um nome: José Digite a idade de José: 30 Deseja continuar? (0 = Não, 1 = Sim): 0
Em nossa memória secundária, temos o arquivo pessoas.txt com as seguintes informações:
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ofstream fout("pessoas.txt"); string nome; int idade; int opcao; do { cout << "Digite um nome: "; cin >> nome; cout << "Digite a idade de " << nome << ": "; cin >> idade; fout << nome << " " << idade << endl; cout << "Deseja continuar? (0 = Não, 1 = Sim): "; cin >> opcao; } while (opcao!=0); fout.close(); return 0; }.
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
Neste exemplo, criamos um objeto para um fluxo de entrada através de arquivo, em vez de saída. O arquivo já contém informações que serão lidas.
main
fin pessoas.txt
pessoas.txtJoão 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
Criamos variáveis para armazenar temporariamente as informações do arquivo.
main
fin pessoas.txt
pessoas.txt
nome idade
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
A função eof (end of file - fim de arquivo) retorna um bool indicando se já estamos no fim
do arquivo.main
fin pessoas.txt
pessoas.txt
nome idade
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
No momento ela retornará false pois acabamos de abrir o arquivo e estamos ainda no início dele.
main
fin pessoas.txt
pessoas.txt
nome idade
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
A expressão completa do while diz que repetiremos este bloco de comandos enquanto
não estivermos no fim do arquivo.main
fin pessoas.txt
pessoas.txt
nome idade
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
Usamos o objeto fin para ler o nome do arquivo para a variável. Veja que o funcionamento é
muito similar ao cin.main
fin pessoas.txt
pessoas.txt
nome João idade
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
main
fin pessoas.txt
pessoas.txt
nome João idade 27
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
main
fin pessoas.txt
pessoas.txt
nome João idade 27
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27
main
fin pessoas.txt
pessoas.txt
nome João idade 27
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27
Ainda não é o fim do arquivo
main
fin pessoas.txt
pessoas.txt
nome Maria idade 27
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27
Lemos o próximo nome
main
fin pessoas.txt
pessoas.txt
nome Maria idade 25
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27
Lemos a próxima idade
main
fin pessoas.txt
pessoas.txt
nome Maria idade 25
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27 Maria 25
Imprimimos com cout
main
fin pessoas.txt
pessoas.txt
nome Maria idade 25
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27 Maria 25
Ainda não é o fim do arquivo
main
fin pessoas.txt
pessoas.txt
nome José idade 25
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27 Maria 25
Lemos o nome
main
fin pessoas.txt
pessoas.txt
nome José idade 30
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27 Maria 25
Lemos a idade
main
fin pessoas.txt
pessoas.txt
nome José idade 30
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27 Maria 25 José 30
Imprimimos o resultado
main
fin pessoas.txt
pessoas.txt
nome José idade 30
João 27 Maria 25 José 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27 Maria 25 José 30
Chegamos ao fim do arquivo e por isto o bloco de comandos não se repete
main
fin
nome José idade 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27 Maria 25 José 30
Fechamos então o arquivo antes de encerrar o programa. O comando open poderia ser
utilizado para associar fin a outro arquivo.
João 27 Maria 25 José 30
main
fin
nome José idade 30
#include <iostream>#include <fstream>#include <string>using namespace std; int main(){ ifstream fin("pessoas.txt"); string nome; int idade; while (!fin.eof()){ fin >> nome; fin >> idade; cout << nome << " " << idade << endl; } fin.close(); return 0; }.
João 27 Maria 25 José 30
Fim do programa. O arquivo pessoas.txt continua em nossa memória secundária e não foi alterado.
João 27 Maria 25 José 30
Exercício• Definir uma estrutura aluno com nome e nota (struct)
• Alocar memória para um arranjo de n alunos (new[])
• Preencher o arranjo (for i=0 enquanto i<n)
• Imprimir o aluno com maior nota (Usar um ponteiro e operador ->)
• Desalocar o arranjo (delete[])
Formato base de programa#include <iostream>using namespace std;int main(){
...return 0;
}
Tipos de dados fundamentais
Lógico bool
Inteiro short < int < long
Real float < double
Caractere char
Cadeias de caracteres string #include <string>
Operadores básicos
= + - / * % ++ –- += -= *= /=
Operadores de relação
> >= < <= == !=
Operadores Lógicos
&& || !
Estruturas Condicionaisif (condição){
...} else {
...}
x = condição?expressão1:expressão2;
switch(variável){case constante1:
...break;
case constante2:...break;
case ......default:
...;}
Estruturas de Repetiçãofor (inicializa; condição; incremento){
...}
while (condição) {...
}
do {...
} while (condição);
Entrada e saídacout << “Mensagem na tela” << endl;cin >> variavel; // leitura pelo teclado
Vetores (Alocação estática, ou seja, tamanho fixo)Tipo nome_do_vetor[tamanho_do_vetor];nome_do_vetor[posição] = valor;
MatrizesTipo nome[tamanho1][tamanho2];nome[posição1][posição2] = valor;
PonteirosTipo *px; // ponteiro para o tipo Tipopx = &x; // ponteiro = endereço de x*px ou p[0] // Valor de xpx // Valor de (endereço salvo em) px&nomep // Endereço do ponteiro px*(px+1) ou p[1] // Elemento salvo após x*px+1 // Mesmo que x + 1
Funçõestipo nome(tipo parametro, tipo
parametro, ...);...int main(){
...}
tipo nome(tipo parametro, tipo parametro,...){
...}
Passagem por valor e referênciaTipo funcao(tipo por_valor, tipo &por_referência)...
Registrosstruct Nome{
tipo variavel1;tipo variavel 2;...
};Nome x; // Cria variável do tipo Nomex.variavel1 = valor; // AtribuiçãoNome *px = x; // Ponteiro para registropx->variavel1 = valor; // Atribuição
Alocação dinâmica de vetorescin >> n; // n é o tamanho do vetortipo *v = NULL; // v aponta para nadav = new tipo[n]; // v aponta para vetor…delete [] v; // deleta o vetorv = NULL; // v aponta para nada de novo
Entrada e saída de arquivos#include <fstream>...ofstream arquivo_saida(“saida.txt”);istream arquivo_entrada(“entrada.txt”);arquivo_saida << variavel;arquivo_entrada >> variavel;arquivo_saida.close();arquive_entrada.close();
ProvasProva 1 - 13 de maio - 5 pontos Prova 2 - 17 de junho - 5 pontos
Exercícios - 1 ponto www.alandefreitas.com (Material)
Programação de Computadores Introdução a C++
Alan R R Freitas