258
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...

Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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...

Page 2: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 3: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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?

Page 4: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 5: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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 … #, $, [, ., \ …

Page 6: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 7: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 8: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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!

Page 9: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 10: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 11: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 12: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 13: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 14: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 15: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 16: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 17: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 18: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 19: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 20: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

+

Page 21: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 22: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 23: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 24: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 25: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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; }.

Page 26: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 27: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 28: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 29: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 30: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 31: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 32: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 33: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 34: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 35: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 36: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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)

Page 37: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 38: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

>

Page 39: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 40: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 41: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 42: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 43: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 44: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 45: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 46: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 47: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 48: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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)

Page 49: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 50: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 51: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 52: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 53: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 54: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 55: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 56: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 57: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 58: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 59: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 60: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 61: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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)

Page 62: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 63: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 64: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 65: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 66: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 67: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]

Page 68: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 69: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]

Page 70: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 71: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 72: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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";

Page 73: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]

Page 74: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 75: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 76: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 77: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 78: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 79: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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}};

Page 80: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 81: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 82: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 83: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 84: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 85: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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.

Page 86: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 87: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 88: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 89: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 90: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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!

Page 91: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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!

Page 92: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 93: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 94: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 95: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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!

Page 96: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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!

Page 97: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 98: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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!

Page 99: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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!

Page 100: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 101: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 102: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 103: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 104: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 105: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 106: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 107: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 108: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 109: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 110: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 111: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 112: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 113: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 114: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 115: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 116: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 117: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 118: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 119: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 120: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 121: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 122: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 123: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 124: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 125: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 126: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 127: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 128: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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; }.

Page 129: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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; }.

Page 130: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 131: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]

Page 132: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 133: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]

Page 134: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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].

Page 135: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]

Page 136: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]

Page 137: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 138: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 139: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 140: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 141: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 142: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 143: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 144: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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; }.

Page 145: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 146: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

...

Page 147: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 148: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 149: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 150: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 151: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 152: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 153: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 154: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

/

Page 155: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 156: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 157: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 158: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 159: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 160: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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;

Page 161: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 162: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 163: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 164: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 165: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 166: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 167: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 168: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 169: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 170: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 171: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 172: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]

Page 173: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]

Page 174: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]

Page 175: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 176: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 177: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }

Page 178: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 179: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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!

Page 180: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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;}.

Page 181: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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;}.

Page 182: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 183: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 184: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 185: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 186: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 187: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 188: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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)!

Page 189: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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 .

Page 190: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 191: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 192: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 193: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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;}.

Page 194: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 195: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 196: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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;}.

Page 197: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 198: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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)

Page 199: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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;}.

Page 200: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 201: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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;}.

Page 202: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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;}.

Page 203: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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;}.

Page 204: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 205: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 206: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 207: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 208: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]++; }. }.

Page 209: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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]++; }. }.

Page 210: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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);}.

Page 211: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 212: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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 é

Page 213: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 214: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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;}.

Page 215: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 216: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 217: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 218: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 219: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 220: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 221: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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); }. }.

Page 222: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 223: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 224: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 225: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 226: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 227: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 228: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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;}.

Page 229: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 230: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 231: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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;

Page 232: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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; }.

Page 233: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 234: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 235: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 236: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 237: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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

Page 238: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

};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

Page 239: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 240: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 241: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 242: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 243: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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];

Page 244: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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;

Page 245: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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.

Page 246: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 247: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 248: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

#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.

Page 249: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 250: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 251: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 252: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 253: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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; }.

Page 254: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 255: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 256: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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

Page 257: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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[])

Page 258: Por que programar? - DECOM-UFOP · 2016. 1. 29. · •Saber por que um computador falha Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram

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