Por que programar? Programação de Computadores Introdução a C++ É tudo questão de automatizar coisas. Alan de Freitas

Tamanho: px
Começar a partir da página:

Download "Por que programar? Programação de Computadores Introdução a C++ É tudo questão de automatizar coisas. Alan de Freitas"

Transcrição

1 Por que programar? Programação de Computadores Introdução a C++ Utilizar computadores é claramente uma vantagem em nossas vidas... Nos ajuda a comunicar Nos ajuda a fazer planos Nos permite trabalhar menos Alan de Freitas É 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. Nos provê diversão Mas por que fazer nossos próprios programas? 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...

2 Agricultura Cinema Engenharia Música Política Entretenimento Linguística Comunicação Contabilidade Física anufaturas Programação é muito necessária em tarefas avançadas de todas as áreas do Nutrição conhecimento humano. Arquitetura Estatística Economia Jornalismo Medicina Direito Biologia Política Matemática Para fazer cálculos Saber por que um computador falha Te ajuda a pensar e quebrar problemas em partes muito pequenas. O único limite no seu programa é sua imaginação. Programadores usualmente reconhecem o motivo de erros em programas. Isso, porque já passaram pelos mesmos erros em seus próprios programas. Uma idéia simples pode mudar a vida de milhões de pessoas.

3 Desenvolvido por Bjarne Stroustrup [ˈbjɑːnә ˈsdʁʌʊ ˀsdʁɔb] do Bell Labs, durante a década de Como o Unix era escrito em C, deverse-ia manter a compatibilidade. C++ 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?

4 O compilador é a ferramenta que nos serve como uma ponte para fazer esta comunicação. Primeiramente escreveremos nossa mensagem para o computador em uma linguagem de programação de nossa preferência. Compilador Código em linguagem de programação Compilador Compilador recebe o código Compilador Código transformado em linguagem de máquina Compilador

5 Tipos de dados e seus tamanhos Compilador Computador recebe os comandos em linguagem de máquina Tipos de dados e seus tamanhos Tipos de dados e seus tamanhos a? 4? F? 3.5?????? Tipo lógico bool V ou F Números inteiros short < int < long... -3, -2, -1, 0, 1, 2, 3... Números reais Caracteres float < double char 3.32, 4.78, 7.24, -3.14, 0.01 a, b, c, d, e, f #, $, [,., \

6 Primeiro Programa em C++ Primeiro Programa em C++ #include <iostream> int () { std::cout << "Olá, Mundo!" << std::endl; return 0; }. #include <iostream> int () { 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++ Primeiro Programa em C++ #include <iostream> int () { std::cout << "Olá, Mundo!" << std::endl; return 0; }. #include <iostream> int () { std::cout << "Olá, Mundo!" << std::endl; return 0; }. Aqui começa a função principal () de nosso programa. As chaves { e } indicam onde começa e termina a função. 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.

7 Primeiro Programa em C++ Primeiro Programa em C++ #include <iostream> int () { 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. #include <iostream> int () { 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++ Primeiro Programa em C++ #include <iostream> int () { std::cout << "Olá, Mundo!" << std::endl; return 0; }. #include <iostream> int () { 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. 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.

8 Primeiro Programa em C++ Primeiro Programa em C++ #include <iostream> int () { std::cout << "Olá, Mundo!" << std::endl; return 0; }. #include <iostream> int () { 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. 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++ Primeiro Programa em C++ #include <iostream> int () { std::cout << "Olá, Mundo!" << std::endl; return 0; }. #include <iostream> int () { std::cout << "Olá, Mundo!" << std::endl; return 0; }. O int antes da definição () indica que a função () vai retornar um int. A função é obrigatória em todos os programas!

9 Primeiro Programa em C++ Segundo Programa em C++ #include <iostream> int () { std::cout << "Olá, Mundo!" << std::endl; return 0; }. Este é o resultado do programa: Olá, Mundo! #include <iostream> using namespace std; int () { cout << "Olá, Mundo!" << endl; return 0; }. Segundo Programa em C++ #include <iostream> using namespace std; int () { 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 () { 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.

10 Segundo Programa em C++ Comentários #include <iostream> using namespace std; int () { cout << "Olá, Mundo!" << endl; return 0; }. Olá, Mundo!??? 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 () { 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; }.

11 #include <iostream> using namespace std; int () { 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; }. Esta linha inteira é ignorada #include <iostream> using namespace std; int () { 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á, Mundo! Olá! Mais uma vez! #include <iostream> using namespace std; int () { 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; }. 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 a variável Olá, Mundo! Olá! Mais uma vez! Damos para cada variável um nome identificador que a referencia c false 20 true

12 numero #include <iostream> using namespace std; int () { 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 () { 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 numero letra Repare que a variável numero é escrita sem acentos #include <iostream> using namespace std; int () { 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 () { 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; }.

13 numero letra num_real numero letra num_real teste #include <iostream> using namespace std; int () { 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 () { 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 Identificadores #include <iostream> using namespace std; int () { 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; }. Este programa criou 4 variáveis! 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 estão errados. É sensível a maiúsculas: x é diferente de X

14 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 numero #include <iostream> using namespace std; int () { int numero; numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }. Variável é criada #include <iostream> using namespace std; int () { int numero; numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }.

15 numero 4 numero 4 #include <iostream> using namespace std; int () { int numero; numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }. O operador = diz que a variável numero receberá o valor 4. Ela não diz que #include <iostream> using namespace std; int () { int numero; numero é igual a 4. numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }. numero 4 numero 4 #include <iostream> using namespace std; int () { int numero; numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }. Ao imprimir a mensagem, a palavra numero é substituida pelo valor da variável numero #include <iostream> using namespace std; int () { int numero; numero = 4; cout << "A variável numero do tipo int tem valor " << numero << endl; return 0; }. A variável numero do tipo int tem valor 4 A variável numero do tipo int tem valor 4

16 Fluxo de entrada Fluxo de entrada O objeto cin é utilizado para que o usuário possa fazer entradas no programa. variável 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 Comandos que criam variáveis #include <iostream> using namespace std; int () { 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 () { 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

17 #include <iostream> using namespace std; int () { 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 () { 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 numero1 numero2 numero2 soma Imprime mensagem pedindo ao usuário para executar uma ação #include <iostream> using namespace std; int () { 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: Repare que não há comando endl para passar para a próxima linha #include <iostream> using namespace std; int () { 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 numero1 numero2 numero2 soma soma

18 cin é usado para obter um valor do teclado #include <iostream> using namespace std; int () { 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: O programa fica parado até que o usuário digite um valor e aperte a tecla Enter #include <iostream> using namespace std; int () { 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 numero1 numero2 numero2 soma soma Suponha que o valor 3.14 tenha sido digitado Digite o primeiro número: é guardado na variável e vamos para o próximo passo Digite o primeiro número: 3.14 Digite o segundo número: #include <iostream> using namespace std; int () { 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 () { 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 numero numero2 numero2 soma soma

19 Programa espera entrada de dados novamente Digite o primeiro número: 3.14 Digite o segundo número: 2.7 Atribuiremos a soma o valor numero1 + numero2 Digite o primeiro número: 3.14 Digite o segundo número: 2.7 #include <iostream> using namespace std; int () { 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 () { 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; }. numero numero numero2 numero2 2.7 soma soma Digite o primeiro número: 3.14 Digite o segundo número: 2.7 Digite o primeiro número: 3.14 Digite o segundo número: 2.7 A soma dos números é 5.84 #include <iostream> using namespace std; int () { 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 () { 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; }. numero numero numero2 2.7 numero2 2.7 soma 5.84 soma 5.84

20 Fim do programa #include <iostream> using namespace std; int () { 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; }. numero numero2 2.7 soma 5.84 Digite o primeiro número: 3.14 Digite o segundo número: 2.7 A soma dos números é 5.84 #include <iostream> using namespace std; int () { 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; }. Fim do programa Alterações possíveis Lista separada por vírgulas para declação de várias variáveis do mesmo tipo. cout << "A soma dos números é " << soma << endl; return 0; #include <iostream> using namespace std; int () { 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; } Fim do programa Alterações possíveis Operadores aritméticos #include <iostream> using namespace std; int () { 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 () { 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. 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

21 Operadores aritméticos Operador Comando Já utilizamos o operador aritmético + no exemplo anterior Podem ser utilizados para outros tipos de dados, tendo nestes casos outros significados Adição + Subtração - Multiplicação * Divisão / Resto da divisão inteira % #include <iostream> using namespace std; int () { 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 () { 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; }. São criadas as variáveis numero1 numero2 r

22 #include <iostream> using namespace std; int () { 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; }. O usuário atribui valores às variáveis numero1 e numero2 numero1 7 numero2 2 r #include <iostream> using namespace std; int () { 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; }. Operador de adição numero1 7 numero2 2 r 9 Digite o primeiro número: 7 Digite o segundo número: 2 Digite o primeiro número: 7 Digite o segundo número: 2 #include <iostream> using namespace std; int () { 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 7 numero2 2 r 9 #include <iostream> using namespace std; int () { 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; }. Operador de subtração numero1 7 numero2 2 r 5 Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9

23 #include <iostream> using namespace std; int () { 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 7 numero2 2 r 5 #include <iostream> using namespace std; int () { 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; }. Operador de multiplicação numero1 7 numero2 2 r 14 Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Subtração dos números = 5 Digite o primeiro número: 7 Digite o segundo número: 2 Adição dos números = 9 Subtração dos números = 5 #include <iostream> using namespace std; int () { 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 7 numero2 2 r 14 #include <iostream> using namespace std; int () { 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; }. Operador de divisão numero1 7 numero2 2 r 3 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 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

24 #include <iostream> using namespace std; int () { 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; }. Repare que o resultado é 3 e não 3.5 pois r é uma variável do tipo int numero1 7 numero2 2 r 3 #include <iostream> using namespace std; int () { 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 7 numero2 2 r 3 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 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 #include <iostream> using namespace std; int () { 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; }. Operador de resto da divisão inteira numero1 7 numero2 2 r 1 #include <iostream> using namespace std; int () { 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 7 numero2 2 r 1 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 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

25 #include <iostream> using namespace std; int () { 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 Fim do programa r 1 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ável variável1 6 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 () { 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; }.

26 #include <iostream> using namespace std; São criadas as variáveis int () { int numero1; int numero2; numero1 cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero2 numero1 += numero2; cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }. #include <iostream> using namespace std; São atribuídos valores às variáveis int () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 8 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; numero2 3 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; }. Digite o primeiro número: 8 Digite o segundo número: 3 #include <iostream> using namespace std; Mesmo que numero1 = numero1 + numero2; int () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 11 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; numero2 3 cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }. #include <iostream> using namespace std; int () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 11 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; numero2 3 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; }. Digite o primeiro número: 8 Digite o segundo número: 3 Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11

27 #include <iostream> using namespace std; Mesmo que numero1 = numero1 - numero2; int () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 8 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; numero2 3 cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; }. #include <iostream> using namespace std; int () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 8 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; numero2 3 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; }. Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8 #include <iostream> using namespace std; int () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 24 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; numero2 3 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; }. Mesmo que numero1 = numero1 * numero2; #include <iostream> using namespace std; int () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 24 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; numero2 3 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; }. Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8 Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8 Multiplicando por 3 -> 24

28 #include <iostream> using namespace std; int () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 8 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; numero2 3 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; }. Mesmo que numero1 = numero1 / numero2; #include <iostream> using namespace std; int () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 8 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; numero2 3 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; }. Digite o primeiro número: 8 Digite o segundo número: 3 Somando 3 -> 11 Subtraindo 3 -> 8 Multiplicando por 3 -> 24 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 () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 2 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; numero2 3 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; }. Mesmo que numero1 = numero1 % numero2; #include <iostream> using namespace std; int () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 2 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; numero2 3 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; }. 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 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

29 #include <iostream> using namespace std; int () { int numero1; int numero2; cout << "Digite o primeiro número: "; numero1 2 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; numero2 3 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; }. 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ósincremento Operadores de incremento e decremento 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 Utiliza e depois incrementa Incrementa e depois utiliza Utiliza e depois decrementa Decrementa e depois utiliza i++ ++i i-- --i

30 #include <iostream> using namespace std; int () { 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 () { 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; }. É criada a variável x x #include <iostream> using namespace std; int () { 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 é inicializado com 0 x 0 #include <iostream> using namespace std; int () { 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; }. Operador de pós-incremento x 0

31 #include <iostream> using namespace std; int () { 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; }. 1) x é utilizado x 0 #include <iostream> using namespace std; int () { 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; }. 2) x é incrementado x 1 x = 0 x = 0 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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; }. Operador de incremento prefixado x 1 x = 0 x = 1 x = 0 x = 1

32 #include <iostream> using namespace std; int () { 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; }. 1) Variável x é incrementada x 2 #include <iostream> using namespace std; int () { 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; }. 2) Variável x é utilizada x 2 x = 0 x = 1 x = 0 x = 1 x = 2 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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; }. Operador de pós-decremento x 2 x = 0 x = 1 x = 2 x = 2 x = 0 x = 1 x = 2 x = 2

33 #include <iostream> using namespace std; int () { 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; }. 1) Utiliza x 2 #include <iostream> using namespace std; int () { 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; }. 1) Decrementa x 1 x = 0 x = 1 x = 2 x = 2 x = 2 x = 0 x = 1 x = 2 x = 2 x = 2 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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; }. Operador de decremento prefixado x 1 x = 0 x = 1 x = 2 x = 2 x = 2 x = 1 x = 0 x = 1 x = 2 x = 2 x = 2 x = 1

34 #include <iostream> using namespace std; int () { 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; }. 1) Decrementa x 0 #include <iostream> using namespace std; int () { 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; }. 2) Utiliza x 0 x = 0 x = 1 x = 2 x = 2 x = 2 x = 1 x = 0 x = 1 x = 2 x = 2 x = 2 x = 1 x = 0 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 x = 0 x = 1 x = 2 x = 2 x = 2 x = 1 x = 0 x = 0

35 Exercício Revisão Digite o lado do quadrado: 4.2 A área do quadrado é #include <iostream> using namespace std; int () { cout << "Olá, Mundo!" << endl; return 0; }. Revisão #include <iostream> using namespace std; Função principal int () { cout << "Olá, Mundo!" << endl; }. return 0; Retorno Biblioteca de entrada e saída Espaço de nomes padrão Impressão na tela Operadores aritméticos e de atribuição #include <iostream> using namespace std; int () { }. Criando variáveis 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; Fluxo de entrada

36 Operadores de atribuição aritméticos #include <iostream> using namespace std; int () { int numero1; int numero2; cout << "Digite o primeiro número: "; cin >> numero1; cout << "Digite o segundo número: "; cin >> numero2; numero1 += numero2; }. cout << "Somando " << numero2 << " -> " << numero1 << endl; numero1 -= numero2; cout << "Subtraindo " << numero2 << " -> " << numero1 << endl; numero1 *= numero2; cout << "Multiplicando por " << numero2 << " -> " << numero1 << endl; numero1 /= numero2; cout << "Dividindo por " << numero2 << " -> " << numero1 << endl; numero1 %= numero2; cout << "Resto da divisão por " << numero2 << " -> " << numero1 << endl; return 0; #include <iostream> using namespace std; int () { 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)

37 #include <iostream> using namespace std; int () { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }. #include <iostream> using namespace std; int () { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }. É criada a variável var1 var1 #include <iostream> using namespace std; int () { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }. var1 recebe true (verdadeiro) var1 true #include <iostream> using namespace std; int () { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }. É criada a variável var2 var1 var2 true

38 #include <iostream> using namespace std; int () { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }. var2 recebe false (falso) var1 var2 true false #include <iostream> using namespace std; int () { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }. cout imprime true como 1 e false como 0 var1 var2 true false var1 = 1 var2 = 0 #include <iostream> using namespace std; int () { bool var1; var1 = true; bool var2; var2 = false; cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; return 0; }. var1 var2 true false Operadores relacionais São utilizados para comparar variáveis de qualquer tipo var1 = 1 var2 = 0 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

39 Operadores relacionais Operadores relacionais Significado Em C++ Em álgebra Maior que > > Maior ou igual >= Menor que < < Menor ou igual <= Igual == = Diferente!= Significado Em C++ Em álgebra Maior que > > Não Maior confundir ou igual o operador >= relacional == (que representa Menor que igualdade) < com o operador < de atribuição = Menor ou igual <= Igual == = Diferente!= #include <iostream> using namespace std; int () { bool x; x = 2 < 9; cout << x << endl; cout << (2 < 3) << endl; cout << (4 > 5) << endl; cout << (1 <= 7) << endl; cout << (2 >= 2) << endl; cout << (4 == 4) << endl; cout << (4!= 4) << endl; return 0; }. #include <iostream> using namespace std; int () { 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; }. É criada a variável x x

40 #include <iostream> using namespace std; int () { 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 recebe bool que diz se 2 é menor que 9 x true #include <iostream> using namespace std; int () { 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; }. Imprime x, onde true é representado por 1 x true 1 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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

41 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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

42 #include <iostream> using namespace std; int () { 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 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 Exemplos Expressão Resultado ((2 > 7) && (6 > 3)) false OU lógico Não lógico ou Negação! se um de dois bools é true o inverso de um bool ((2 < 7) && (6 > 3)) true ((2 < 7) (6 < 3)) true ((7 < 2) (6 < 3)) false!(2 < 3) false

43 Resumo do operador && Atenção Expressão 1 Expressão 2 Expressão 1 && Expressão 2 false false false false true false true false false 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. true true true Resumo do operador Resumo do operador! Expressão 1 Expressão 2 Expressão 1 && Expressão 2 false false false Expressão! Expressão false true true true false true false true true true true false true

44 #include <iostream> using namespace std; int () { 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 () { 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 () { 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 () { 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

45 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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

46 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 () { 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 () { 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

47 #include <iostream> using namespace std; int () { 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 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 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 Comandos Comandos Comandos Comandos Comandos Condição Comandos Comandos

48 Se Comandos Condição A instrução if (se) é uma instrução de uma única seleção Seleciona ou ignora um grupo de ações Comandos Comandos Comandos Comandos Se Esta condição... Condição Comandos Comandos...pode fazer ignorarmos ou não este bloco de comandos Toda instrução de controle espera um dado do tipo bool indicando se a condição é true (verdadeira) ou false (falsa) Comandos

49 Se - Sintaxe Se - Sintaxe A condição entre parênteses deve ser um dado do tipo bool if (condição){ comandos; comandos; }. if (condição){ comandos; comandos; }. Se - Sintaxe Se - Sintaxe Este bool pode ser simplesmente true ou false mas normalmente é uma expressão que retorne um bool como (x < 3) if (condição){ comandos; comandos; }. if (condição){ comandos; comandos; }. O motivo disto é que caso contrário a condição seria sempre verdadeira ou sempre falsa As chaves { e } indicam onde se inicia e termina o bloco de comandos que serão executados apenas se a condição for verdadeira

50 Se - Sintaxe Se - Sintaxe Entre as chaves, podem ser inseridos quantos comandos forem necessários if (condição){ comandos; comandos; }. Perceba que os comandos pertencentes ao if estão alinhados mais à direita do restante do código if (condição){ comandos; comandos; }. Isto é fundamental para legibilidade do código. Esta organização se chama indentação. #include <iostream> using namespace std; int () { 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 () { 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

51 Testada a condição 5 0 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 O comando dentro do bloco é executado pois a condição retornou true Digite a largura do quadrado: 5 Digite a largura do quadrado: 5 A área do quadrado é 25 Suponha agora que o usuário digitou -3 #include <iostream> using namespace std; int () { 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-3 >= 0 é false #include <iostream> using namespace std; int () { 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 Digite a largura do quadrado: -3

52 #include <iostream> using namespace std; int () { double largura; cout << "Digite a largura do quadrado: "; cin >> largura; if (largura >= 0){ cout << "A área do quadrado é " << largura * largura << endl; } return 0; }. Digite a largura do quadrado: -3 largura -3 Bloco do false é ignorado e programa é encerrado sem a mensagem 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? Se-Senão Comandos Condiçã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 Comandos Comandos Comandos Comandos

53 Comandos Se-Senão - Sintaxe Esta condição... Condição Comandos Comandos...decide qual bloco de comandos utilizaremos Comandos Comandos if (condição){ comandos; comandos; } else { comandos; comandos; }. Comandos Se-Senão - Sintaxe A condição entre parênteses deve ser um dado do tipo bool if (condição){ comandos; comandos; } else { comandos; comandos; }. 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

54 Se-Senão - Sintaxe Se-Senão - Sintaxe Este bloco é executado se a condição for true if (condição){ comandos; comandos; } else { comandos; comandos; }. if (condição){ comandos; comandos; } else { comandos; comandos; }. Este bloco é executado se a condição for false Perceba a indentação #include <iostream> using namespace std; int () { 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 () { 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; }. Digite um número: 7 numero 7

55 Testa se a divisão do número por 2 tem resto 0 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 Digite um número: 7 O número é ímpar #include <iostream> using namespace std; int () { 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; }. Digite um número: 7 O número é ímpar numero 7 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.

56 Se-Senão aninhados Se-Senão aninhados Extrato Saldo Saque Depósito Tela 1 Tela 2 Tela 3 Tela 4 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 Comandos Condições Há agora um grupo de condições... Condições... que escolhem entre grupos de blocos de comandos. Comandos Comandos Comandos Comandos Comandos Comandos Comandos Comandos Comandos Comandos Comandos Comandos Comandos Comandos

57 Se-Senão - Sintaxe if (condição){ comandos; comandos; } else if (condição){ comandos; comandos; } else if (condição){ comandos; comandos; } else { comandos; comandos; }. Se-Senão aninhados - Sintaxe if (condição){ Há agora várias comandos; comandos; condições } else if (condição){ comandos; comandos; } else if (condição){ comandos; comandos; } else { comandos; comandos; }. Podem ser criados quantos blocos forem necessários Se-Senão aninhados - Sintaxe Se-Senão aninhados - Sintaxe if (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 A primeira condição que for true determina qual bloco será executado if (condição){ comandos; comandos; } else if (condição){ comandos; comandos; } else if (condição){ comandos; comandos; } else { comandos; comandos; }. Se nenhuma for true, o bloco do else é executado

58 Se-Senão - Sintaxe 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 () { 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 indentação se mantém #include <iostream> using namespace std; int () { 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 #include <iostream> A nota não é maior que 90 using namespace std; int () { 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 Digite a nota do aluno: 74

59 #include <iostream> A nota não é maior que 80 using namespace std; int () { 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 #include <iostream> Mas a nota é maior que 70 using namespace std; int () { 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 Digite a nota do aluno: 74 #include <iostream> Executa-se então o bloco de comandos using namespace std; correpondente int () { 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 #include <iostream> Saímos do bloco aninhado using namespace std; int () { 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 O conceito do aluno é C Digite a nota do aluno: 74 O conceito do aluno é C

60 #include <iostream> using namespace std; int () { 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; Digite a nota do aluno: 74 O conceito do aluno é C nota 74 }. 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 Operador Ternário condicao?expressao1:expressao2; Sintaxe if (condicao){ expressao1; } else { expressao2; }. condicao?expressao1:expressao2; max=(x>y)?1:0; Sintaxe Exemplo if (condicao){ expressao1; } else { expressao2; }. if (x>y){ max = 1; } else { max = 0; }

61 Operador Ternário Faz o mesmo que um if-else (sesenão) Uso deve ser evitado pois dificulta a leitura do código Switch switch(variável){ case constante1: comandos; break; case constante2: comandos; break; default: comandos; }. Sintaxe if (variável == contante1){ comandos; } else if (variável == constante2){ comandos; } else { comandos; }. switch(variável){ case constante1: comandos; break; case constante2: comandos; break; default: comandos; }. Switch 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; } Switch Pode ser substituído por um if-else aninhado Sintaxe if (variável == contante1){ comandos; } else if (variável == constante2){ comandos; } else { comandos; }. Exemplo 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; } É um recurso muito utilizado para apresentar um menu de opções para o usuário (assim como if-else aninhado)

62 Exercício Digite o primeiro número: 7 Digite o segundo número: 15 Você digitou 0 números pares e 2 números ímpares #include <iostream> using namespace std; int () { 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 () { 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 () { 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; }.

63 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 double largura; largura = 5; largura 5 Cada valor precisa ficar em uma posição da memória largura 5 Cada uma destas posições tem um endereço Nome das variáveis largura Endereços das variáveis Valores na memória Valores das variáveis

64 O nome da uma variável já nos retorna seu valor largura #include <iostream> using namespace std; int () { 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; }. O operador de endereço é usado para nos retornar o endereço de uma variável Criamos uma variável num #include <iostream> using namespace std; int () { 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 () { 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 Suponha que neste trecho de código, o usuário dê um valor qualquer a num #include <iostream> using namespace std; int () { 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 Como estamos acostumados, cout imprime o valor do número num #include <iostream> using namespace std; int () { 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 Digite um número: 65 O número é 65 Agora utilizamos &num em vez de num e o endereço de num na memória é exibido #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 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. Digite um número: 65 O número é 65 O endereço do número é 0xbf8d456c Digite um número: 65 O número é 65 O endereço do número é 0xbf8d456c

66 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 Arranjos x x Este é um arranjo de números inteiros chamado x. x nada mais é que o endereço do primeiro elemento deste arranjo de números inteiros.

67 x x x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] 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 x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] x x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] Repare que o primeiro índice i é 0 Repare que o último índice i é 7, ou seja, um a menos que o número de elementos

68 Suponha variáveis a e b do tipo inteiro a 3 b 2 x x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] x x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] Os índices são simplesmente números inteiros ou uma expressão do tipo inteiro Podemos acessar x[a+b] para retornar o elemento x[5] Os endereços dos elementos do arranjo estão em sequência na memória. a 3 b 2 Endereço x x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] x x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7]

69 Para criar um arranjo inicial em branco use: int x[10]; x 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 x Variáveis 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] }x Endereços x Valores Os índices indicam quantas posições somamos ao endereço da variável para encontrar um elemento x Posições 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 Valores Endereços &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! x Posições x[9] 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 Valores 33???? Endereços

70 #include <iostream> using namespace std; int () { 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; }. É criado um arranjo a com 6 elementos #include <iostream> using namespace std; int () { 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 a[0] a[1] a[2] a[3] a[4] a[5] Criada uma variável soma #include <iostream> using namespace std; int () { 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 a[0] a[1] a[2] soma a[3] a[4] a[5] soma recebe #include <iostream> using namespace std; int () { 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 a[0] a[1] a[2] soma 10 a[3] a[4] a[5]

71 #include <iostream> using namespace std; int () { 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 a[0] a[1] a[2] a[3] a[4] a[5] soma 10 #include <iostream> using namespace std; int () { 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 a[0] a[1] a[2] a[3] a[4] a[5] soma 10 a[0] + a[2] + a[4] -> 10 a[0] + a[2] + a[4] -> 10 Endereço do arranjo -> 0x7fff5f6bdb70 #include <iostream> using namespace std; int () { 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[2] + a[4] -> 10 Endereço do arranjo -> 0x7fff5f6bdb70 a a[0] a[1] a[2] a[3] a[4] a[5] soma 10 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

72 Cadeias de caracteres As cadeias de caracteres são arranjos de char que terminam o caractere especial \0, que representa o fim da cadeia O caractere \0 mostra que ali termina a palavra b a b a c a t e \0 b a b a c a t e \0 Este é um arranjo de char chamado b e que carrega a palavra abacate. São necessários assim 8 elementos para uma palavra de 7 letras Este arranjo poderia ter sido criado diretamente com o comando: Porém existe um atalho equivalente: char b[] = {'a', 'b', 'a', 'c', 'a', 't', 'e', '\0'}; char b[] = "abacate"; b a b a c a t e \0 b a b a c a t e \0

73 Em um comando: Porém, o comando cin >> b; é muito perigoso pois a pessoa pode digitar mais que 7 letras e haverá uma tentativa de inserir elementos além do arranjo cin >> b; Se a pessoa digita laranjada : b l a r a n j a d a \0 b a b a c a t e \0 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. 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 a b a c a t e \0 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 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.

74 #include <iostream> using namespace std; int () { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. #include <iostream> using namespace std; int () { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. É criado um arranjo de char com 10 elementos nome #include <iostream> using namespace std; int () { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. Um nome é inserido no arranjo #include <iostream> using namespace std; int () { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. nome[2] nome M a r i a \0 nome M a r i a \0 Digite seu nome: Maria Digite seu nome: Maria Terceira letra de seu nome é r

75 #include <iostream> using namespace std; int () { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. #include <iostream> using namespace std; int () { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. Repare que este código é propenso a erros. nome M a r i a \0 nome M a r i a \0 Digite seu nome: Maria A quinta letra de seu nome é a Digite seu nome: Maria A quinta letra de seu nome é a #include <iostream> using namespace std; int () { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. O nome digitado poderia ter mais de 9 letras #include <iostream> using namespace std; int () { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. O nome poderia ter menos de 3 letras nome M a r i a \0 nome M a r i a \0 Digite seu nome: Maria A quinta letra de seu nome é a Digite seu nome: Maria A quinta letra de seu nome é a

76 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 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 Suponha que b agora é uma string e não um arranjo simples de char b a b a c a t e \0 b a b a c a t e \0 Esta string pode ser criada com o comando: string b( abacate ); 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

77 Suponha que b agora é uma string e não um arranjo simples de char b a b a c a t e \0 Se tentarmos executar o comando: b = laranjada ; Mais espaço é alocado para atender à demanda. #include <iostream> #include <string> using namespace std; int () { string nome; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. 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 () { 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 () { string nome; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. É criada uma string que terá a capacidade que for demandada nome

78 #include <iostream> #include <string> using namespace std; int () { string nome; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. É alocado um arranjo com o espaço para o nome digitado #include <iostream> #include <string> using namespace std; int () { string nome; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }. nome[2] nome M a r i a \0 nome M a r i a \0 Digite seu nome: Maria Digite seu nome: Maria Terceira letra de seu nome é r #include <iostream> #include <string> using namespace std; int () { 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 M a r i a \0 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

79 Exemplo de arranjo bidimensional Se acessam os elementos com dois índices x Coluna 0 Coluna 1 Coluna 2 Coluna 3 x Coluna 0 Coluna 1 Coluna 2 Coluna 3 Linha Linha 0 x[0][0] x[0][1] x[0][2] x[0][3] Linha Linha 1 x[1][0] x[1][1] x[1][2] x[1][3] Linha 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 Este arranjo pode ser criado com: int x[3][4] = {{3,4,7,5},{4,7,4,2},{7,8,3,6}}; x Coluna 0 Coluna 1 Coluna 2 Coluna 3 x 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]

80 Este arranjo pode ser criado com: int x[3][4] = {{3,4,7,5},{4,7,4,2},{7,8,3,6}}; x Isto ocorre porque um arranjo multidimensional é um arranjo de arranjos x Um arranjo multidimensional também ocupa posições contíguas na memória Variáveis { 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 Valores Endereços x Isso porque nada mais são do que arranjos de arranjos Posições 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 Valores } } } x[0] x[1] x[2] Endereços 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

81 #include <iostream> using namespace std; int () { 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; }. #include <iostream> using namespace std; int () { 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]. x #include <iostream> using namespace std; int () { 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; }. Cada linha da matriz representará um aluno e cada coluna uma prova feita por ele. x #include <iostream> using namespace std; int () { 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 resultado

82 #include <iostream> using namespace std; int () { 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; }. A posição x[0][0] se refere à primeira linha e primeira coluna. x resultado #include <iostream> using namespace std; int () { 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; }. 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. x resultado Digite a nota do aluno 0 na prova 0: 7.3 Digite a nota do aluno 0 na prova 0: 7.3 #include <iostream> using namespace std; int () { 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 resultado #include <iostream> using namespace std; int () { 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 resultado 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 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

83 #include <iostream> using namespace std; int () { 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 resultado #include <iostream> using namespace std; int () { 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; }. Somamos todos os elementos da coluna 0 e dividimos por 3 para saber qual foi a nota média nesta prova. x resultado 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 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 = #include <iostream> using namespace std; int () { 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; }. Somamos todos os elementos da linha 1 e dividimos por 2 para saber qual foi a nota final deste aluno. x resultado 7.9 #include <iostream> using namespace std; int () { 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 resultado 7.9 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 = Nota final do aluno 1 = 7.9 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 = Nota final do aluno 1 = 7.9

84 Digite o número x[0]: 5 Digite o número x[1]: 4 Digite o número x[2]: é ímpar é par #include <iostream> using namespace std; int () { 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 () { 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 () { char nome[10]; cout << "Digite seu nome: "; cin >> nome; cout << "Terceira letra de seu nome é " << nome[2] << endl; return 0; }.

85 #include <iostream> #include <string> using namespace std; int () { 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 () { 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 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. Imagine quanto tempo demoraria para enviar uma carta para um milhão de pessoas. Imagine agora quanto tempo demora enviar um para um milhão de pessoas.

86 Estruturas de repetição Estrutura 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 Comandos Comandos Comandos Comandos Comandos Comandos Condição Comandos Laços com contadores Variável contadora O caso mais simples de repetição é aquele no qual queremos repetir exatamente a mesma tarefa um certo número de vezes 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

87 Repetição controlada por contador Controle de Fluxo - for 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 O comando for é utilizado para repetições controladas por variável contadora for (inicialização; condição; incremento){ comandos; }. Sintaxe Controle de Fluxo - for Controle de Fluxo - for for (inicialização; condição; incremento){ comandos; }. A condição de inicialização é utilizada para inicializar a variável contadora. 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.

88 Controle de Fluxo - for 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. 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 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. for (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.

89 #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. Criada a variável contadora #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. i #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. Contador é inicializado com zero #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. A condição é testada e o bloco de comandos será executado pois i < 10 é true. i 0 i 0

90 #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. Todo o bloco é executado. #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. Ao fim da execução do bloco, o comando de incremento é executado. i 0 i 1 #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. A condição de parada é testada e o comando será executado pois 1 < 10 é true #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. i 1 i 1

91 #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. 2 < 10 == true i 2 i 2 #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. i 2 i 3

92 #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. 3 < 10 == true #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. i 3 i 3 #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. Após as 10 iterações deste laço, teremos o seguinte estado... #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. i chega a 10 i 9 i 10

93 #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. i < 10 == false e o bloco não é mais executado. #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. Fim do programa i 10 i 10 Repetições determinadas pelo usuário #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. #include <iostream> using namespace std; int () { cout << "" << endl; cout << "" << endl; cout << "" << endl; cout << "" << endl; cout << "" << endl; cout << "" << endl; cout << "" << endl; cout << "" << endl; cout << "" << endl; cout << "" << endl; return 0; } Do ponto de vista de resultados, os dois programas são equivalentes. 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

94 6 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; } #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. Criada a variável contadora i #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. Criada a variável para o número de repetições i n

95 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i n n 6 Quantas vezes você quer a mensagem? Quantas vezes você quer a mensagem? 6 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 0 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 0 n 6 n 6 Quantas vezes você quer a mensagem? 6 Quantas vezes você quer a mensagem? 6

96 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 1 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. true i 1 n 6 n 6 Quantas vezes você quer a mensagem? 6 Quantas vezes você quer a mensagem? 6 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 1 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 2 n 6 n 6 Quantas vezes você quer a mensagem? 6 Quantas vezes você quer a mensagem? 6

97 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. true i 2 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 2 n 6 n 6 Quantas vezes você quer a mensagem? 6 Quantas vezes você quer a mensagem? 6 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 3 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. true i 3 n 6 n 6 Quantas vezes você quer a mensagem? 6 Quantas vezes você quer a mensagem? 6

98 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 3 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 4 n 6 n 6 Quantas vezes você quer a mensagem? 6 Quantas vezes você quer a mensagem? 6 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. true i 4 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 4 n 6 n 6 Quantas vezes você quer a mensagem? 6 Quantas vezes você quer a mensagem? 6

99 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 5 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. true i 5 n 6 n 6 Quantas vezes você quer a mensagem? 6 Quantas vezes você quer a mensagem? 6 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 5 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 6 n 6 n 6 Quantas vezes você quer a mensagem? 6 Quantas vezes você quer a mensagem? 6

100 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. false i 6 #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. i 6 n 6 n 6 Quantas vezes você quer a mensagem? 6 Quantas vezes você quer a mensagem? 6 Repetição de processos similares Olá 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

101 #include <iostream> using namespace std; int () { 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 () { 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 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. Criada a variável contadora i #include <iostream> using namespace std; int () { 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 n

102 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. Usuário escolhe um número i #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. i é inicializado com 0 i 0 n 5 n 5 Digite o número final: 5 Digite o número final: 5 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. i é impresso e seguido de um espaço i 0 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. i é incrementado i 1 n 5 n 5 Digite o número final: 5 0 Digite o número final: 5 0

103 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. Agora a condição de parada é que i seja menor ou igual a n, pois queremos imprimir o número n também i 1 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. i é impresso i 1 n 5 n 5 Digite o número final: 5 0 Digite o número final: #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. i é incrementado i 2 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. i ainda é menor ou igual a n i 2 n 5 n 5 Digite o número final: Digite o número final: 5 0 1

104 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. i é impresso i 2 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. Ao continuar executando o laço, todos os números 5 serão impressos até que i seja 6 i 6 n 5 n 5 Digite o número final: Digite o número final: #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. i 6 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 0; i <= n; i++){ cout << i << " "; } return 0; }. O programa pode aceitar qualquer número n i 57 n 5 n 56 Digite o número final: Digite o número final:

105 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 #include <iostream> using namespace std; int () { 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; }. Neste exemplo, a variável soma terá o somatório de todos os números entre 1 e n. Soma = n-1 + n #include <iostream> using namespace std; int () { 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 () { 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 n

106 #include <iostream> using namespace std; int () { 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 guardar o somatório dos números i n soma #include <iostream> using namespace std; int () { 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; }. i n 4 soma Digite o número final: 4 #include <iostream> using namespace std; int () { 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; }. Somatório começa em 0 e será incrementado durante o laço i n 4 soma 0 #include <iostream> using namespace std; int () { 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; }. Contador i inicia em 1 pois não precisamos somar 0 i 1 n 4 soma 0 Digite o número final: 4 Digite o número final: 4

107 #include <iostream> using namespace std; int () { 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; }. true i 1 n 4 #include <iostream> using namespace std; int () { 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; }. i 1 n 4 soma 0 soma 1 Digite o número final: 4 Digite o número final: 4 #include <iostream> using namespace std; int () { 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; }. i 2 n 4 #include <iostream> using namespace std; int () { 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; }. true i 2 n 4 soma 1 soma 1 Digite o número final: 4 Digite o número final: 4

108 #include <iostream> using namespace std; int () { 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; }. i 2 n 4 #include <iostream> using namespace std; int () { 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; }. i 3 n 4 soma 3 soma 3 Digite o número final: 4 Digite o número final: 4 #include <iostream> using namespace std; int () { 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; }. true i 3 n 4 #include <iostream> using namespace std; int () { 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; }. i 3 n 4 soma 3 soma 6 Digite o número final: 4 Digite o número final: 4

109 #include <iostream> using namespace std; int () { 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; }. i 4 n 4 #include <iostream> using namespace std; int () { 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; }. true i 4 n 4 soma 6 soma 6 Digite o número final: 4 Digite o número final: 4 #include <iostream> using namespace std; int () { 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; }. i 4 n 4 #include <iostream> using namespace std; int () { 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; }. i 5 n 4 soma 10 soma 10 Digite o número final: 4 Digite o número final: 4

110 #include <iostream> using namespace std; int () { 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; }. false i 5 n 4 #include <iostream> using namespace std; int () { 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; }. soma = i 5 n 4 soma 10 soma 10 Digite o número final: 4 Digite o número final: 4 Somatório = 10 #include <iostream> using namespace std; int () { 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; }. i 5 n 4 soma 10 #include <iostream> using namespace std; int () { 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; }. Outro exemplo... Perceba como estruturas de repetição nos permite realizar tarefas muito mais complexas i 101 n 100 soma 5050 Digite o número final: 4 Somatório = 10 Digite o número final: 100 Somatório = 5050

111 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 () { 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 () { 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á #include <iostream> using namespace std; int () { 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; }. Digite o número final: 100 Criadas e inicializadas as variáveis i n 100 soma 0

112 #include <iostream> using namespace std; int () { 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; }. i inicia em 1 pois não precisamos somar 0 i 1 n 100 soma 0 #include <iostream> using namespace std; int () { 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; }. Se o resto da divisão de i por 3 for 0, o comando é executado. Neste caso, nada acontece. false i 1 n 100 soma 0 Digite o número final: 100 Digite o número final: 100 #include <iostream> using namespace std; int () { 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; }. i 2 n 100 soma 0 #include <iostream> using namespace std; int () { 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; }. true i 2 n 100 soma 0 Digite o número final: 100 Digite o número final: 100

113 #include <iostream> using namespace std; int () { 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; }. false i 2 n 100 soma 0 #include <iostream> using namespace std; int () { 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; }. i 3 n 100 soma 0 Digite o número final: 100 Digite o número final: 100 #include <iostream> using namespace std; int () { 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 () { int i; int n; int soma; cout << "Digite o número final: "; cin >> n; true i 3 soma = 0; for (i = 1; i <= n; i++){ if (i % 3 == 0){ soma += i; true i 3 } n 100 n 100 soma 0 }. } cout << "Somatório = " << soma << endl; return 0; Como a condição é verdadeira, este valor será adicionado à soma soma 0 Digite o número final: 100 Digite o número final: 100

114 #include <iostream> using namespace std; int () { 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; }. i 3 n 100 soma 3 #include <iostream> using namespace std; int () { 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; }. O processo se repete até que i seja 101 e a condição de repetição seja falsa i 101 n 100 soma 1683 Digite o número final: 100 Digite o número final: 100 #include <iostream> using namespace std; int () { 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; }. i 101 n 100 soma 1683 #include <iostream> using namespace std; int () { 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; }. i 101 n 100 soma 1683 Digite o número final: 100 Somatório = 1683 Digite o número final: 100 Somatório = 1683

115 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 () { 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; }. #include <iostream> using namespace std; int () { 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 numerador denominador n 50 soma 0 #include <iostream> using namespace std; int () { 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; }. i é inicializado em 3 i 3 numerador denominador n 50 soma 0 Digite o contador final: 50 Digite o contador final: 50

116 #include <iostream> using namespace std; int () { 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; }. True i 3 numerador denominador n 50 soma 0 #include <iostream> using namespace std; int () { 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; }. soma recebe 5/3 i 3 numerador 5 denominador 3 n 50 soma Digite o contador final: 50 Digite o contador final: 50 #include <iostream> using namespace std; int () { 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; }. i 4 numerador 5 denominador 3 n 50 soma #include <iostream> using namespace std; int () { 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; }. True i 4 numerador 5 denominador 3 n 50 soma Digite o contador final: 50 Digite o contador final: 50

117 #include <iostream> using namespace std; int () { 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; }. soma é incrementado de 7/4 i 4 numerador 7 denominador 4 n 50 soma #include <iostream> using namespace std; int () { 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; }. Processo se repete até que i seja n + 1, ou 51 i 51 numerador 99 denominador 50 n 50 soma Digite o contador final: 50 Digite o contador final: 50 #include <iostream> using namespace std; int () { 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; }. 5/3 + 7/4 + 9/5 + 11/6 99/50 i 51 numerador 99 denominador 50 n 50 soma #include <iostream> using namespace std; int () { 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; }. i 51 numerador 99 denominador 50 n 50 soma Digite o contador final: 50 Somatório = Digite o contador final: 50 Somatório =

118 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 () { 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 #include <iostream> using namespace std; int () { 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; }. Criadas e inicializadas as variáveis i n 1000 #include <iostream> using namespace std; int () { 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 i 7 n 1000 soma 0 soma 0 Digite o número final: 1000 Digite o número final: 1000

119 #include <iostream> using namespace std; int () { 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; }. Como ele é menor que o número final, executamos os comandos true i 7 n 1000 #include <iostream> using namespace std; int () { 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; }. Como ele é menor que o número final, executamos os comandos i 7 n 1000 soma 0 soma 7 Digite o número final: 1000 Digite o número final: 1000 #include <iostream> using namespace std; int () { 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; }. Já incrementamos i em 7 para a próxima iteração i 14 n 1000 #include <iostream> using namespace std; int () { 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; }. true i 14 n 1000 soma 7 soma 7 Digite o número final: 1000 Digite o número final: 1000

120 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 soma 21 Digite o número final: 1000 Digite o número final: 1000 #include <iostream> using namespace std; int () { 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; }. true i 21 n 1000 #include <iostream> using namespace std; int () { 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; }. Processo se repete enquanto i seja menor ou igual a 1000 i 1001 n 1000 soma 21 soma Digite o número final: 1000 Digite o número final: 1000

121 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 soma Digite o número final: 1000 Somatório = Digite o número final: 1000 Somatório = #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }. #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }. Criadas e inicializadas as variáveis i n Digite o número final: Imprimiremos todas potências de 2 entre 2 e n

122 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }. i é inicializado no primeiro item da série i 2 #include <iostream> using namespace std; int () { 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 n Digite o número final: Digite o número final: #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }. true i 4 n n Digite o número final: Digite o número final:

123 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { 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 n Digite o número final: Digite o número final: #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }. true i 8 #include <iostream> using namespace std; int () { 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 n Digite o número final: Digite o número final:

124 #include <iostream> using namespace std; int () { 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 i #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número final: "; cin >> n; for (i = 2; i < n; i*=2){ cout << i << " "; } return 0; }. i n n Digite o número final: Digite o número final: #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }. #include <iostream> using namespace std; int () { 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 Imprimiremos a sequência n n-1 n-2 n

125 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }. i inicia no primeiro item da série, que é n i 50 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }. Bloco de comandos se repetirá enquanto i for maior que 0. true i 50 n 50 n 50 Digite o número inicial: 50 Digite o número inicial: 50 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }. i 50 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }. i é decrementado i 49 n 50 n 50 Digite o número inicial: Digite o número inicial: 50 50

126 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }. true i 49 #include <iostream> using namespace std; int () { 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 n 50 Digite o número inicial: Digite o número inicial: #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }. i 48 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }. true i 48 n 50 n 50 Digite o número inicial: Digite o número inicial:

127 #include <iostream> using namespace std; int () { 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 #include <iostream> using namespace std; int () { int i; int n; cout << "Digite o número inicial: "; cin >> n; for (i = n; i > 0; i--){ cout << i << " "; } return 0; }. i 0 n 50 n 50 Digite o número inicial: Digite o número inicial: Exercício Exercício Quantos 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 Quantos 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

128 #include <iostream> using namespace std; int () { int i; // contador for (i = 0; i < 10; i++){ cout << "" << endl; } return 0; }. #include <iostream> using namespace std; int () { int i; int n; cout << "Quantas vezes você quer a mensagem? "; cin >> n; for (i = 0; i < n; i++){ cout << "" << endl; } return 0; }. #include <iostream> using namespace std; int () { 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 () { 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; }. Neste exemplo, a variável soma terá o somatório de todos os números entre 1 e n. Soma = n-1 + n

129 #include <iostream> using namespace std; int () { 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 () { 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 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 () { 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; }.

130 #include <iostream> using namespace std; int () { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) { cout << "Digite a nota do aluno " << i << ": "; cin >> notas[i]; } soma = 0; for(i = 0; i < n; i++) { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }. A instrução const na frente de int indica que esta é uma constante. Constantes não podem ser alteradas. n 5 #include <iostream> using namespace std; int () { 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. notas n 5 #include <iostream> using namespace std; int () { 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; }. soma receberá a soma de todas as notas notas n 5 soma #include <iostream> using namespace std; int () { 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; }. Variável contadora notas n 5 i soma

131 #include <iostream> using namespace std; int () { 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; }. Variável contadora inicializa em 0 para trabalhar com a posição notas[0] notas n 5 notas[i] soma i 0 #include <iostream> using namespace std; int () { 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; }. Pedimos para o usuário a nota do aluno que está na posição i, que vale 0 notas n 5 notas[i] soma i 0 Digite a nota do aluno 0: #include <iostream> using namespace std; int () { 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; }. Guardamos o resultado em notas[i], indicada pela seta n 5 notas 6.7 notas[i] soma i 0 #include <iostream> using namespace std; int () { 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; }. Passamos para o próximo aluno i. Note que notas[i] passa a representar outra posição do arranjo. n 5 notas 6.7 soma i 1 notas[i] Digite a nota do aluno 0: 6.7 Digite a nota do aluno 0: 6.7

132 #include <iostream> using namespace std; int () { 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; }. #include <iostream> using namespace std; int () { const int n = 5; double notas[n]; double soma; true n 5 soma int i; for(i=0; i<n; i++) n 5 { notas 6.7 i 1 notas[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 1 notas[i] Digite a nota do aluno 0: 6.7 Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 #include <iostream> using namespace std; int () { 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; }. Ao fazer i++, alteramos também o significado de notas[i]. n 5 notas soma i 2 notas[i] #include <iostream> using namespace std; int () { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) true { 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; }. n 5 soma i 2 notas notas[i] Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8 Digite a nota do aluno 0: 6.7 Digite a nota do aluno 1: 7.8

133 #include <iostream> using namespace std; int () { 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; }. n 5 soma i 2 notas notas[i] #include <iostream> using namespace std; int () { 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; }. n 5 soma i 3 notas notas[i] 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 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 () { 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; }. #include <iostream> using namespace std; int () { const int n = 5; double notas[n]; double soma; true n 5 soma int i; for(i=0; i<n; i++) n 5 { i 3 notas notas[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; soma i 3 notas notas[i] 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 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

134 #include <iostream> using namespace std; int () { 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; }. n 5 soma i 4 notas notas[i] #include <iostream> using namespace std; int () { const int n = 5; double notas[n]; double soma; int i; for(i=0; i<n; i++) true { 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; }. n 5 soma i 4 notas notas[i] 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 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 () { 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; }. n 5 soma i 4 notas notas[i] #include <iostream> using namespace std; int () { 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; }. Ao fazer i++, notas[i] passa a representar uma posição fora do arranjo. O programa daria um erro se tentássemos acessar notas[i]. n 5 soma i 5 notas nota 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 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

135 #include <iostream> using namespace std; int () { 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; Condição de repetição não é atendida e prosseguimos com o código. false n 5 soma i 5 notas nota #include <iostream> using namespace std; int () { 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; }. 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 i 5 soma 0 notas nota 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 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 () { 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; }. i volta a ser 0 nesta nova estrutura de repetição e notas[i] volta a indicar notas[0] n 5 i 0 soma 0 notas notas[i] #include <iostream> using namespace std; int () { 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; }. soma é incrementado de notas[0] n 5 notas notas[i] i 0 soma 6.7 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 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

136 #include <iostream> using namespace std; int () { 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; }. n 5 soma 6.7 i 1 notas notas[i] #include <iostream> using namespace std; int () { 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++) true { soma += notas[i]; } cout << "Média das notas: " << soma/n << endl; return 0; }. n 5 soma 6.7 i 1 notas notas[i] 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 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 () { 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; }. soma é incrementado de notas[1] n 5 i 1 soma 14.5 notas notas[i] #include <iostream> using namespace std; int () { 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; }. n 5 soma 14.5 i 2 notas notas[i] 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 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

137 #include <iostream> using namespace std; int () { 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; }. Ao fim do processo, soma terá o somatório das notas n 5 i 5 soma 36.4 notas notas #include <iostream> using namespace std; int () { 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; }. n 5 soma 36.4 i 5 notas notas 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 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 () { 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; }. 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 n 5 soma 36.4 i 5 notas notas 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

138 #include <iostream> using namespace std; int () { 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 () { 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 () { 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 () { 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: Inicializamos as variáveis n 5 i j 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.

139 #include <iostream> using namespace std; int () { 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; }. i começa em 1 e ele irá até n n 5 i 1 j #include <iostream> using namespace std; int () { 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; }. 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 i 1 j 0 Digite um número: 5 Digite um número: 5 #include <iostream> using namespace std; int () { 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; }. n 5 i 1 j 0 #include <iostream> using namespace std; int () { 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; }. false n 5 i 1 j 1 Digite um número: 5 1 Digite um número: 5 1

140 #include <iostream> using namespace std; int () { 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; }. endl passa para o próxima linha e encerra-se assim o laço externo n 5 i 1 j 1 #include <iostream> using namespace std; int () { 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; }. i é incrementado e vamos para a próxima iteração true n 5 i 2 j 1 Digite um número: 5 1 Digite um número: 5 1 #include <iostream> using namespace std; int () { 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; }. Laço interno imprime i vezes o valor de i. n 5 i 2 j 2 #include <iostream> using namespace std; int () { 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; }. endl passa para a próxima linha. n 5 i 2 j 2 Digite um número: Digite um número:

141 #include <iostream> using namespace std; int () { 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; }. i é incrementado e vamos para a próxima iteração n 5 i 3 j 2 #include <iostream> using namespace std; int () { 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; }. O laço interno imprime i vezes o valor de i e endl passa para o próxima linha n 5 i 3 j 3 Digite um número: Digite um número: #include <iostream> using namespace std; int () { 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; }. O processo se repete até que i seja 6 n 5 i 6 j 5 #include <iostream> using namespace std; int () { 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; }. n 5 i 6 j 5 Digite um número: Digite um número:

142 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 (){ 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 (){ 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 (){ 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.

143 #include <iostream> using namespace std; int (){ const int n1 = 10; const int n2 = 3; notas int i; int j; double soma; double notas[n1][n2]; n1 10 n2 3 for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i j cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }. Inicializamos as variáveis #include <iostream> using namespace std; int (){ const int n1 = 10; const int n2 = 3; notas int i; int j; double soma; double notas[n1][n2]; n1 10 n2 3 for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 0 j cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma 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 (que representa um aluno) #include <iostream> using namespace std; int (){ const int n1 = 10; const int n2 = 3; notas int i; int j; double soma; double notas[n1][n2]; n1 10 n2 3 for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 0 j cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma 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 #include <iostream> using namespace std; int (){ const int n1 = 10; const int n2 = 3; notas int i; int j; double soma; double notas[n1][n2]; n1 10 n2 3 for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 0 j 0 cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma 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... Digite as notas do aluno 0 Digite as notas do aluno 0

144 #include <iostream> using namespace std; int (){ const int n1 = 10; const int n2 = 3; notas int i; int j; double soma; double notas[n1][n2]; n1 10 n2 3 for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 0 j 0 cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma 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 #include <iostream> using namespace std; int (){ const int n1 = 10; const int n2 = 3; int i; notas 6.8 int j; double soma; double notas[n1][n2]; n1 10 n2 3 for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 0 j 0 cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }. E salvamos em notas[i][j] Digite as notas do aluno 0 Prova 0: Digite as notas do aluno 0 Prova 0: 6.8 #include <iostream> using namespace std; O laço interno finaliza as colunas do aluno int (){ const int n1 = 10; const int n2 = 3; int i; notas int j; double soma; double notas[n1][n2]; n1 10 n2 3 for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 0 j 3 cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma 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 (){ 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; }. O fim do bloco do laço interno é também o fim do bloco do laço externo e atualizamos i. n1 10 n2 3 for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 1 j 3 cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; notas Digite as notas do aluno 0 Prova 0: 6.8 Prova 1: 7.9 Prova 2: 7.6 Digite as notas do aluno 0 Prova 0: 6.8 Prova 1: 7.9 Prova 2: 7.6

145 #include <iostream> using namespace std; int (){ 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; }. Como não se acabaram os alunos, vamos para a próxima iteração. n1 10 n2 3 for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 1 j 3 cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; notas #include <iostream> using namespace std; int (){ 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; }. A iteração seguinte faz o mesmo para a próxima linha. n1 10 n2 3 for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 1 j 3 cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; notas Digite as notas do aluno 0 Prova 0: 6.8 Prova 1: 7.9 Prova 2: 7.6 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 (){ 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; }.... 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 E o conjunto de todas as iterações completa a tabela. n1 10 n2 3 for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 10 j 3 cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; notas #include <iostream> using namespace std; int (){ 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; }. O próximo laço externo percorrerá as colunas j. Para cada coluna calculamos sua média. n1 10 n2 3 for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 10 j 0 cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 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 notas

146 #include <iostream> using namespace std; A soma desta coluna começa em 0. int (){ const int n1 = 10; const int n2 = 3; int i; notas int j; double soma; double notas[n1][n2]; n1 10 n for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 10 j cin >> notas[i][j]; } } for(j=0; j<n2; j++){ soma = 0; soma for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 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 (){ const int n1 = 10; const int n2 = 3; int i; int j; double soma; double notas[n1][n2]; n1 10 n2 3 for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 10 j 0 cin >> notas[i][j]; }. }. for(j=0; j<n2; j++){ soma 72.1 soma = 0; for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 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 Para cada linha i desta coluna j, colocar o valor em soma. notas #include <iostream> using namespace std; int (){ const int n1 = 10; const int n2 = 3; int i; notas int j; double soma; double notas[n1][n2]; n1 10 n for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 1 j cin >> notas[i][j]; } } for(j=0; j<n2; j++){ soma = 0; soma for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.... 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 Imprimimos a média do somatório desta coluna #include <iostream> using namespace std; Fazemos o mesmo para as outras colunas int (){ const int n1 = 10; const int n2 = 3; int i; notas int j; double soma; double notas[n1][n2]; n1 10 n 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]; i 10 j } } for(j=0; j<n2; j++){ soma = 0; soma for (i=0; i<n1; i++){ soma += notas[i][j]; } cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.... 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

147 #include <iostream> using namespace std; Fim do programa int (){ const int n1 = 10; const int n2 = 3; int i; notas int j; double soma; double notas[n1][n2]; n1 10 n for(i=0; i<n1; i++){ cout << "Digite as notas do aluno "<< i << endl; for (j=0; j<n2; j++){ cout << "Prova " << j << ": " ; i 10 j cin >> notas[i][j]; } } for(j=0; j<n2; j++){ soma = 0; soma for (i=0; i<n1; i++){ soma += notas[i][j]; }. cout << "Média na prova " << j << ": " << soma/n1 << endl; }. return 0; }.... 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 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 Enquanto a condição entre parênteses for atendida, o bloco de comandos será executado. while (condição){ comandos; }. Nestes casos, usa-se o comando while (enquanto) para definir a condição do laço

148 Enquanto a condição entre parênteses for atendida, o bloco de comandos será executado. while (condição){ comandos; }. while (condição){ comandos; }. 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. Exemplo int numero = 1; while (numero!= 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = "; cout << numero * numero << endl; }. while (condição){ comandos; }. Exemplo int numero = 1; while (numero!= 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = "; cout << numero * numero << endl; }. #include <iostream> using namespace std; int (){ int numero = 1; while (numero!= 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }. Enquanto o número for diferente de zero, o usuário digitará um número que será elevado ao quadrado.

149 Inicializamos as variáveis #include <iostream> using namespace std; int () { int numero = 1; while (numero!= 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }. numero 1 Enquanto numero for diferente de 0 #include <iostream> using namespace std; int () { int numero = 1; while (numero!= 0){ true cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }. numero 1 #include <iostream> using namespace std; int () { int numero = 1; while (numero!= 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }. numero 7 Enquanto numero for diferente de 0 #include <iostream> using namespace std; int () { int numero = 1; while (numero!= 0){ true cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }. numero 7 Digite um número: 7 Número ao quadrado = 49 Digite um número: 7 Número ao quadrado = 49

150 #include <iostream> using namespace std; int () { int numero = 1; while (numero!= 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }. numero 5 Enquanto numero for diferente de 0 #include <iostream> using namespace std; int () { int numero = 1; while (numero!= 0){ true cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }. numero 5 Digite um número: 7 Número ao quadrado = 49 Digite um número: 5 Número ao quadrado = 25 Digite um número: 7 Número ao quadrado = 49 Digite um número: 5 Número ao quadrado = 25 #include <iostream> using namespace std; int () { int numero = 1; while (numero!= 0){ cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }. numero 0 Enquanto numero for diferente de 0 #include <iostream> using namespace std; int () { int numero = 1; while (numero!= 0){ false cout << "Digite um número: "; cin >> numero; cout << "Número ao quadrado = " << numero * numero << endl; } return 0; }. numero 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 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

151 #include <iostream> using namespace std; int () { 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 numero 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 Convertendo for em while 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; } for (inicialização;condição;incremento){ comandos; }. inicialização; while (condição){ comandos; incremento; }. Para ter o efeito de um for com um while, basta inicializar e incrementar o contador com um comando próprio.

152 Convertendo for em while Convertendo for e while for (inicialização;condição;incremento){ comandos; }. inicialização; while (condição){ comandos; incremento; }. for (i = 0; i < 10; i++){ cout << i << endl; } i = 0; while (i < 10){ cout << i << endl; i++; } 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 Instrução do-while É 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; } 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

153 do-while do { comandos; } while (condição); Exemplo 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. 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); do { comandos; } while (condição); Exemplo Exemplo Um menu é apresentado. Cada opção faz uma tarefa Enquanto a opção não for 0 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 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);

154 Convertendo do-while e while É possível obter o efeito de um dowhile 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.

155 Escopo de variáveis Como vimos em nossos exemplos, um programa é composto de blocos que estão sempre entre chaves { } A função principal () é 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 (){ 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; }.

156 #include <iostream> using namespace std; int (){ int x; x = 5; cout << "x externo = " << x << endl; for (int i = 0; i < 1; i++){ int x; x = 7; cout << "x interno = " << x << endl; cout << "i interno = " << i << endl; }. cout << "x externo = " << x << endl; return 0; }. Criamos uma variável x que pertence ao bloco externo x #include <iostream> using namespace std; int (){ 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 (){ 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 (){ 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; }. A variável contadora i é agora criada no escopo do bloco do for i 0 x 5 x externo = 5 x externo = 5

157 #include <iostream> using namespace std; int (){ 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; }. true i 0 x 5 #include <iostream> using namespace std; int (){ 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; }. É criada uma variável x dentro no escopo do bloco do for. i 0 x 5 x x externo = 5 x externo = 5 #include <iostream> using namespace std; int (){ 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; }. Isto faz com que a variável x do bloco externo fique oculta. i 0 x 5 x #include <iostream> using namespace std; int (){ 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; }. As alterações são então feitas na variável não oculta i 0 x 5 x 7 x externo = 5 x externo = 5

158 #include <iostream> using namespace std; int (){ 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 i 0 x 7 #include <iostream> using namespace std; int (){ 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 i 0 x 7 x externo = 5 x interno = 7 x externo = 5 x interno = 7 i interno = 0 #include <iostream> using namespace std; int (){ 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 i 1 x 7 #include <iostream> using namespace std; int (){ 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; }. Como a condição de repetição não é mais atendida, o bloco do for é encerrado false x 5 i 1 x 7 x externo = 5 x interno = 7 i interno = 0 x externo = 5 x interno = 7 i interno = 0

159 #include <iostream> using namespace std; int (){ 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; }. 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 (){ 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 x externo = 5 x interno = 7 i interno = 0 x externo = 5 x externo = 5 x interno = 7 i interno = 0 x externo = 5 #include <iostream> using namespace std; int (){ 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 (){ 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 (){ 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 (){ 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; }. 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. 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.

160 Ponteiros #include <iostream> using namespace std; int (){ 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 (){ 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; }. 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 Criamos agora um ponteiro para um inteiro, que se chamará px int x; x = 5; int *px; 24 x 5 25 px

161 O operador * indica que px é um ponteiro para um int e não um int Guardamos agora o endereço de x em px x 5 25 x 5 25 px 26 px int x; x = 5; int *px; int x; x = 5; int *px; px = &x; Nomes Valores Endereço x 5 25 px Note que px tem: * Endereço 26 * Valor 25 Nomes Valores Endereço x 5 25 px Assim, px aponta para um dado: * Endereço 25 * Valor O comando &px nos dá o endereço de px.

162 Nomes Valores Endereço Nomes Valores Endereço x 5 25 px O comando px nos dá o valor de px, que no caso o endereço de x. x 5 25 px 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 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. Representação física na memória Nomes Valores Endereço x 5 25 px px x 5 Representação gráfica

163 #include <iostream> using namespace std; int (){ 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; }. #include <iostream> using namespace std; int (){ 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 (){ 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 px x py #include <iostream> using namespace std; int (){ 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 x 5 py

164 #include <iostream> using namespace std; int (){ 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 recebe o endereço de x, o que o faz apontar para x px x 5 py #include <iostream> using namespace std; int (){ 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; }. py recebe o valor de px, que é o endereço x. Assim, py aponta também para x. px x 5 py #include <iostream> using namespace std; int (){ 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; }. Imprimimos o valor de x. px py x 5 #include <iostream> using namespace std; int (){ 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; }. Imprimimos o endereço de x. Endereços reais na memória são números menos simples. px x 5 py x = 5 x = 5 &x = 0x7fff571abb68

165 #include <iostream> using namespace std; int (){ 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; }. Imprimimos o valor de px, que é o endereço de x. px x 5 py #include <iostream> using namespace std; int (){ 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; }. Imprimimos o valor apontado por px, que é o valor de x. px x 5 py x = 5 &x = 0x7fff571abb68 px = 0x7fff571abb68 x = 5 &x = 0x7fff571abb68 px = 0x7fff571abb68 *px = 5 #include <iostream> using namespace std; int (){ 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; }. Imprimimos o valor apontado por py, que é também valor de x. px x 5 py #include <iostream> using namespace std; int (){ 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; }. Apesar de apontarem para x, px e py são variáveis que contêm seus próprios endereços. px x 5 py x = 5 &x = 0x7fff571abb68 px = 0x7fff571abb68 *px = 5 *py = 5 x = 5 &x = 0x7fff571abb68 px = 0x7fff571abb68 *px = 5 *py = 5 &px = 0x7fff5b810b40 &py = 0x7fff5b810b38

166 #include <iostream> using namespace std; int (){ 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; }. x = 5 &x = 0x7fff571abb68 px = 0x7fff571abb68 *px = 5 *py = 5 &px = 0x7fff5b810b40 &py = 0x7fff5b810b38 px x 5 py 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

167 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 () { 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 *. #include <iostream> using namespace std; int () { 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; }. Criamos x, um ponteiro px para x, e um ponteiro ppx para px. ppx px x 5 #include <iostream> using namespace std; int () { 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; }. Como vimos no exemplo anterior, px possui seu próprio endereço e guarda o endereço de x ppx px x 5 x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20

168 #include <iostream> using namespace std; int () { 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; }. Da mesma maneira, a variável ppx possui seu próprio endereço ppx px x 5 #include <iostream> using namespace std; int () { 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; }. A variável ppx guarda então o endereço de px, o mesmo que foi impresso com &px ppx px x 5 x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20 &ppx = 0x7fff55568b18 x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20 &ppx = 0x7fff55568b18 ppx = 0x7fff55568b20 #include <iostream> using namespace std; int () { 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; }. Desreferenciando ppx, temos o valor de px, que é o endereço de x, ou seja, &x ppx px x 5 #include <iostream> using namespace std; int () { 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; }. Desreferenciando duplamente ppx, temos o valor de px desreferenciado, que é o valor de x ppx px x 5 x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20 &ppx = 0x7fff55568b18 ppx = 0x7fff55568b20 *ppx = 0x7fff55568b28 x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20 &ppx = 0x7fff55568b18 ppx = 0x7fff55568b20 *ppx = 0x7fff55568b28 **ppx = 5

169 #include <iostream> using namespace std; int () { 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; }. x = 5 &x = 0x7fff55568b28 px = 0x7fff55568b28 *px = 5 &px = 0x7fff55568b20 &ppx = 0x7fff55568b18 ppx = 0x7fff55568b20 *ppx = 0x7fff55568b28 **ppx = 5 ppx px x 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 Nomes Valores Endereço Nomes Valores Endereço x[0] 5 25 x[1] 3 26 x[2] 6 27 x[3] 7 28 x[4] }x Suponha um arranjo x de tamanho 5 x[0] 5 25 x[1] 3 26 x[2] 6 27 x[3] 7 28 x[4] 3 29 px }x Criaremos agora um ponteiro px int *px;

170 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 }x Como x retorna o endereço de onde começa o arranjo, podemos fazer px apontar para o primeiro elemento do arranjo de duas maneiras: Nomes Valores Endereço x[0] 5 25 x[1] 3 26 x[2] 6 27 x[3] 7 28 x[4] 3 29 px Agora, se desreferenciarmos px com *px, obteremos o valor de x[0] px = x; cout << *px << endl; 35 px = &x[0]; 35 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 px 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 Podemos até desreferenciar px com o operador de subscrito [ ] cout << *(px+2) << endl; cout << px[0] << endl;

171 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 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 Usualmente, só usamos operadores de subscrito para arranjos. Porém, as operações abaixo são equivalentes cout << px[3] << endl; cout << px[i] << endl; cout << *(px+i) << endl; Usualmente, só usamos ATENÇÃO: x 5 25 operadores de subscrito 3 26 para arranjos. Porém, as 6 27 Um ponteiro 7 28 é uma variável operações que abaixo guarda são um 3 29 endereço na memória. equivalentes. Nomes Valores Endereço px Um arranjo 33 é um endereço cout << na px[i] memória, << endl; onde 34 começa 35 uma sequência de elementos. cout << *(px+i) << endl; #include <iostream> using namespace std; int (){ 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; }. Podemos criar ponteiros que apontem para arranjos.

172 #include <iostream> using namespace std; int (){ 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 px x #include <iostream> using namespace std; int (){ 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 px x #include <iostream> using namespace std; int (){ 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 px x #include <iostream> using namespace std; int (){ 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 px x x[0] x[1] x[2] x[3] x[4] x = 0x7fff52294b10 x = 0x7fff52294b10 x[0] a x[4]:

173 #include <iostream> using namespace std; int (){ 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 px x x[0] x[1] x[2] x[3] x[4] #include <iostream> using namespace std; int (){ 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 px x x[0] x[1] x[2] x[3] x[4] x = 0x7fff52294b10 x[0] a x[4]: px = 0x7fff52294b10 x = 0x7fff52294b10 x[0] a x[4]: px = 0x7fff52294b10 *px = 6 #include <iostream> using namespace std; int (){ 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 [] px x x[0] x[1] x[2] x[3] x[4] #include <iostream> using namespace std; int (){ 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! px x x[0] x[1] x[2] x[3] x[4] x = 0x7fff52294b10 x[0] a x[4]: px = 0x7fff52294b10 *px = 6 px[0] = 6 x = 0x7fff52294b10 x[0] a x[4]: px = 0x7fff52294b10 *px = 6 px[0] = 6 px[3] = 4

174 #include <iostream> using namespace std; int (){ 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]. px x x[0] x[1] x[2] x[3] x[4] #include <iostream> using namespace std; int (){ 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 px x x[0] x[1] x[2] x[3] x[4] x = 0x7fff52294b10 x[0] a x[4]: px = 0x7fff52294b10 *px = 6 px[0] = 6 px[3] = 4 *(px+3) = 4 x = 0x7fff52294b10 x[0] a x[4]: px = 0x7fff52294b10 *px = 6 px[0] = 6 px[3] = 4 *(px+3) = 4 *px++ = 6 #include <iostream> using namespace std; int (){ 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]. px x x[0] x[1] x[2] x[3] x[4] #include <iostream> using namespace std; int (){ 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 x x[0] x[1] x[2] x[3] x[4] x = 0x7fff52294b10 x[0] a x[4]: px = 0x7fff52294b10 *px = 6 px[0] = 6 px[3] = 4 *(px+3) = 4 *px++ = 6 px[3] = 9 x = 0x7fff52294b10 x[0] a x[4]: px = 0x7fff52294b10 *px = 6 px[0] = 6 px[3] = 4 *(px+3) = 4 *px++ = 6 px[3] = 9

175 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 (){ 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 (){ 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; }. #include <iostream> using namespace std; int (){ 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; }. Podemos criar ponteiros que apontem para arranjos.

176 Funções Veja a letra de música abaixo: Me chama (Lobão) Chove lá fora E aqui tá tanto frio Me dá vontade de saber... Aonde está você? Me telefona Me Chama! Me Chama! Me Chama! Nem sempre se vê Lágrima no escuro Lágrima no escuro Lágrima! Tá tudo cinza sem você Tá tão vazio E a noite fica Sem porque Aonde está você? Me telefona Me Chama! Me Chama! Me Chama... Nem sempre se vê! Mágica no absurdo Mágica no absurdo Mágica! Nem sempre se vê! Lágrima no escuro Lágrima no escuro Lágrima! Nem sempre se vê! Mágica no absurdo Mágica no absurdo Mágica! Nem sempre se vê! Lágrima no escuro Lágrima no escuro Lágrima! Veja agora a mesma letra de outra maneira: Me chama (Lobão) Chove lá fora E aqui tá tanto frio Me dá vontade de saber... Aonde está você? Me telefona Me Chama! Me Chama! Me Chama! REFRÃO 1: Nem sempre se vê Lágrima no escuro Lágrima no escuro Lágrima! Tá tudo cinza sem você Tá tão vazio E a noite fica Sem porque Aonde está você? Me telefona Me Chama! Me Chama! Me Chama REFRÃO 2: Nem sempre se vê! Mágica no absurdo Mágica no absurdo Mágica! REFRÃO 1 REFRÃO 2 REFRÃO 1 Ou assim: Me chama (Lobão) Chove lá fora E aqui tá tanto frio Me dá vontade de saber... PARTE 2: Aonde está você? Me telefona Me Chama! Me Chama! Me Chama! REFRÃO 1: Nem sempre se vê Lágrima no escuro Lágrima no escuro Lá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 absurdo Mágica no absurdo Mágica! REFRÃO 1 REFRÃO 2 REFRÃO 1 As pessoas não dizem refrão" quando chegam no segundo refrão. Pessoas voltam onde o refrão foi definido e cantam esta parte. Isto nos dá um grande poder de síntese para expressar idéias. Me chama (Lobão) Chove lá fora E aqui tá tanto frio Me dá vontade de saber... PARTE 2: Aonde está você? Me telefona Me Chama! Me Chama! Me Chama! REFRÃO 1: Nem sempre se vê Lágrima no escuro Lágrima no escuro Lá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 absurdo Mágica no absurdo Mágica! REFRÃO 1 REFRÃO 2 REFRÃO 1

177 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. Me chama (Lobão) Partes: PARTE 2: Aonde está você? Me telefona Me Chama! Me Chama! Me Chama! REFRÃO 1: Nem sempre se vê Lágrima no escuro Lágrima no escuro Lágrima! REFRÃO 2: Nem sempre se vê! Mágica no absurdo Mágica no absurdo Mágica! Música: Chove lá fora E 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 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 () 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 deve ser declarada antes da função para que seja reconhecida #include <iostream> using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; }

178 #include <iostream> using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; } #include <iostream> using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; } A função exemplo() é criada antes da função (). 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 (){ 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> Assim como em qualquer programa, a using namespace std; execução se inicia na função void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; } Exemplo de função simples

179 #include <iostream> using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; } Nesta linha de código, a função exemplo() é chamada. A função fica em espera até que os comandos da função exemplo() sejam executados. #include <iostream> A função exemplo imprime um Olá Mundo! using namespace std; com 3 comandos separados. void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; } Exemplo de função simples Exemplo de função simples Olá Mundo! #include <iostream> using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ 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, é mais uma chamada à função exemplo(). #include <iostream> A função é executada mais uma vez. using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; } Exemplo de função simples Olá Mundo! Exemplo de função simples Olá Mundo! Olá Mundo!

180 #include <iostream> using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ 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 para que possam ser reconhecidas Cabeçalhos de função Por questão de organização é usualmente melhor analisar a função antes de analisar outras funções Assim, seria bom poder definir as funções no código após a função Isto é possível através do uso de cabeçalhos #include <iostream> using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; } #include <iostream> using namespace std; void exemplo(); int (){ cout << "Exemplo de função" << endl; exemplo(); exemplo(); return 0; }. void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; }.

181 O cabeçalho declara a função, de modo que a função a reconheça. #include <iostream> using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; } #include <iostream> using namespace std; void exemplo(); int (){ cout << "Exemplo de função" << endl; exemplo(); exemplo(); return 0; }. void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; }. #include <iostream> using namespace std; void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; } int (){ cout << "Exemplo de função simples" << endl; exemplo(); exemplo(); return 0; } #include <iostream> using namespace std; void exemplo(); int (){ cout << "Exemplo de função" << endl; exemplo(); exemplo(); return 0; }. void exemplo(){ cout << "Olá "; cout << "Mundo!"; cout << endl; }. Após a função, definimos a função declarada no cabeçalho. Agora é possível ler a definição da função antes da definição da função exemplo Funções e suas variáveis Nossas funções, assim como a função, 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 (){ 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; }.

182 #include <iostream> using namespace std; void soma(); int (){ 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; }. Criamos duas variáveis x e y no escopo de. x 2 y 6 #include <iostream> using namespace std; void soma(); int (){ 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; }. A soma das variáveis é impressa normalmente na função x 2 y 6 x+y = 8 #include <iostream> using namespace std; void soma(); int (){ 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; }. A função agora chama a função soma e fica em espera até que ela termine x 2 y 6 #include <iostream> using namespace std; void soma(); int (){ 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; }. A função soma cria duas variáveis em seu próprio escopo. soma x 2 x y 6 a x+y = 8 x+y = 8

183 #include <iostream> using namespace std; void soma(); int (){ 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; }. Repare que não há conflito de identificadores pois são escopos completamente diferentes soma x 2 x y 6 a #include <iostream> using namespace std; void soma(); int (){ 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; }. Pelo mesmo motivo, soma não tem acesso às variáveis de e vice-versa. soma x 2 x y 6 a x+y = 8 x+y = 8 #include <iostream> using namespace std; void soma(); int (){ 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; }. soma x 2 y 6 x 4 a 1 #include <iostream> using namespace std; void soma(); int (){ 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; }. soma imprime x+a de acordo com as variáveis de seu escopo. soma x 2 y 6 x 4 a 1 x+y = 8 x+y = 8 x+a = 5

184 #include <iostream> using namespace std; void soma(); int (){ 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; }. Retornamos à função e as variáveis de soma deixam de existir. x 2 y 6 #include <iostream> using namespace std; void soma(); int (){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl; }. x+y novamente é 8, de acordo com as variáveis de x 2 y 6 x+y = 8 x+a = 5 x+y = 8 x+a = 5 x+y = 8 #include <iostream> using namespace std; void soma(); int (){ int x; int y; x = 2; y = 6; cout << "x+y = " << x + y << endl; soma(); cout << "x+y = " << x + y << endl; return 0; }. void soma(){ int x; int a; x = 4; a = 1; cout << "x+a = " << x + a << endl; }. x+y = 8 x+a = 5 x+y = 8 Fim do programa. Note como as funções podem dividir problemas em subproblemas independentes. x 2 y 6 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 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

185 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 #include <iostream> using namespace std; double pi(); int (){ 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; }. Ser guardado em uma variável daquele tipo #include <iostream> using namespace std; double pi(); int (){ 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; }. Criamos uma variável x no escopo de x #include <iostream> using namespace std; double pi(); int (){ 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 recebe o que for retornado pela função pi. A função fica em espera para a função pi. x

186 #include <iostream> using namespace std; double pi(); int (){ 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 primeiro comando de pi já retorna 3.14, que é capturado pela função, que a chamou. pi x #include <iostream> using namespace std; double pi(); int (){ 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; }. Voltamos para a função, onde o valor retornado por pi() é atribuído a x. x 3.14 #include <iostream> using namespace std; double pi(); int (){ 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; }. A instrução de impressão cout funciona normalmente. x 3.14 #include <iostream> using namespace std; double pi(); int (){ 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; }. Neste cout, o valor 3.14 é retornado direto da função para o comando de impressão. x 3.14 O valor de pi é 3.14 O valor de pi é 3.14 O valor de pi é 3.14

187 #include <iostream> using namespace std; double pi(); int (){ 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; }. Fim do programa x 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 O valor de pi é 3.14 O valor de pi é 3.14 A tarefa de se comprar qualquer outra coisa é muito simples se já conhecemos como comprar um microondas. 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. OK OK

188 Veja a letra de música abaixo: Me chama (Lobão) Partes: PARTE 2: Aonde está você? Me telefona Me Chama! Me Chama! Me Chama! REFRÃO 1: Nem sempre se vê Lágrima no escuro Lágrima no escuro Lágrima! REFRÃO 2: Nem sempre se vê! Mágica no absurdo Mágica no absurdo Mágica! Música: Chove lá fora E 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 telefona Me Chama! Me Chama! Me Chama! REFRÃO 1: Nem sempre se vê Lágrima no escuro Lágrima no escuro Lágrima! REFRÃO 2: Nem sempre se vê! Mágica no absurdo Mágica no absurdo Mágica! Música: Chove lá fora E 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: Não fosse por estas palavras, poderíamos ter apenas um refrão: Me chama (Lobão) Partes: PARTE 2: Aonde está você? Me telefona Me Chama! Me Chama! Me Chama! REFRÃO 1: Nem sempre se vê Lágrima no escuro Lágrima no escuro Lágrima! REFRÃO 2: Nem sempre se vê! Mágica no absurdo Mágica no absurdo Mágica! Música: Chove lá fora E 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 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 telefona Me Chama! Me Chama! Me Chama! REFRÃO 1: Nem sempre se vê Lágrima no escuro Lágrima no escuro Lágrima! REFRÃO 2: Nem sempre se vê! Mágica no absurdo Mágica no absurdo Mágica! Música: Chove lá fora E 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

189 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. Se indicarmos as palavras que serão utilizadas na própria música, o novo refrão pode ser utilizado. Me chama (Lobão) Partes: Música: Me chama (Lobão) Partes: Música: REFRÃO: Nem sempre se vê (Palavra 1) no (Palavra 2) (Palavra 1) no (Palavra 2) (Palavra 1)! PARTE 2: Aonde está você? Me telefona Me Chama! Me Chama! Me Chama! REFRÃO 1: Nem sempre se vê Lágrima no escuro Lágrima no escuro Lágrima! REFRÃO 2: Nem sempre se vê! Mágica no absurdo Mágica no absurdo Mágica! Chove lá fora E 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 REFRÃO: Nem sempre se vê (Palavra 1) no (Palavra 2) (Palavra 1) no (Palavra 2) (Palavra 1)! PARTE 2: Aonde está você? Me telefona Me Chama! Me Chama! Me Chama! REFRÃO 1: Nem sempre se vê Lágrima no escuro Lágrima no escuro Lágrima! REFRÃO 2: Nem sempre se vê! Mágica no absurdo Mágica no absurdo Mágica! Chove lá fora E 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. Veja então como é ainda muito mais concisa a explicação da música apenas com o refrão que usa parâmetros. 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 telefona Me Chama! Me Chama! Me Chama! REFRÃO 1: Nem sempre se vê Lágrima no escuro Lágrima no escuro Lágrima! REFRÃO 2: Nem sempre se vê! Mágica no absurdo Mágica no absurdo Mágica! Música: Chove lá fora E 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) Me chama (Lobão) Partes: PARTE 2: Aonde está você? Me telefona Me 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á fora E 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)

190 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 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. 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 (){ 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; }. Criamos e inicializamos uma variável x através de uma entrada do usuário x 4 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. Imprimimos o valor de x e o valor de x ao cubo. x 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. Digite um número: 4 Digite um número: 4

191 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. A função fica em espera da função cubo(). x 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. #include <iostream> using namespace std; double cubo(double a); int (){ 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 Note também que para calcular o valor de x ao cubo, o valor de x precisou ser enviado à função Digite um número: 4 Digite um número: 4 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. A função cubo se inicia. Mais do que isto, ela já inicia com uma variável a, que é um parâmetro da função cubo x 4 a 4 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. O valor da parâmetro a foi enviado pela função chamadora, e é uma cópia de x cubo x 4 a 4 Digite um número: 4 Digite um número: 4

192 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. Como são dois escopos diferentes, note que não haveria problema algum se a se chamasse x cubo x 4 x 4 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. Note que a é neste caso apenas uma cópia de x. Qualquer alteração em a não altera x. cubo x 4 a 4 Digite um número: 4 Digite um número: 4 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. O único comando de cubo() retorna a * a * a, ou a ao cubo cubo x 4 a 4 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. Ao término da função cubo(), a função retorna com o valor retornado por cubo() 64 x 4 Digite um número: 4 Digite um número: 4 4 ao cubo é 64

193 #include <iostream> using namespace std; double cubo(double a); int (){ 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 Fim do programa. x 4 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 (){ 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 (){ 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; }.

194 #include <iostream> using namespace std; double eleva(double base, int exp); int (){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; Inicializamos variáveis x e y onde o usuário escolhe uma base e um expoente 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 y 5 #include <iostream> using namespace std; double eleva(double base, int exp); int (){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; O comando cout precisa do resultado da função eleva. Por isto a função fica em espera. 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 y 5 Digite a base: 4.4 Digite o expoente: 5 Digite a base: 4.4 Digite o expoente: 5 #include <iostream> using namespace std; double eleva(double base, int exp); int (){ 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; }. A função eleva se inicia com base como uma cópia de x e exp como uma cópia de y. eleva x 4.4 base 4.4 y 5 exp 5 #include <iostream> using namespace std; double eleva(double base, int exp); int (){ 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; }. Uma variável onde será calculado o resultado. Esta variável se inicia com 1. eleva x 4.4 base 4.4 resultado 1 y 5 exp 5 Digite a base: 4.4 Digite o expoente: 5 Digite a base: 4.4 Digite o expoente: 5

195 #include <iostream> using namespace std; double eleva(double base, int exp); int (){ 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; }. resultado é multiplicado por base. Este processo se repete exp vezes. eleva x 4.4 base 4.4 y 5 exp 5 resultado #include <iostream> using namespace std; double eleva(double base, int exp); int (){ 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; }. O valor de resultado é retornado para a função chamadora eleva x 4.4 base 4.4 y 5 exp 5 resultado Digite a base: 4.4 Digite o expoente: 5 Digite a base: 4.4 Digite o expoente: 5 #include <iostream> using namespace std; double eleva(double base, int exp); int (){ double x; int y; cout << "Digite a base: "; cin >> x; cout << "Digite o expoente: "; cin >> y; A função eleva é encerrada e a função volta a executar com o valor retornado. 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 y 5 Fim do programa. #include <iostream> using namespace std; double eleva(double base, int exp); int (){ double x; int y; x 4.4 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; }. y 5 Digite a base: 4.4 Digite o expoente: elevado a 5 = Digite a base: 4.4 Digite o expoente: elevado a 5 =

196 Passagem de parâmetros Passagem de parâmetros por valor Em várias linguagens de programação, há duas maneiras de se passar parâmetros para uma função: por valor por referência 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 (){ 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; }. #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. Digite um número: 4 4 ao cubo é Inicialização... x 4

197 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. Como cout depende de cubo, a função fica em espera. x 4 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. Note que a é neste caso apenas uma cópia do valor de x. Alterações em a não alteram x. cubo x 4 a 4 Digite um número: 4 4 ao cubo é Digite um número: 4 4 ao cubo é #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. Note que a é neste caso apenas uma cópia do valor de x. Alterações em a não alteram x. cubo x 4 a 64 #include <iostream> using namespace std; double cubo(double a); int (){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. 64 double cubo(double a){ a = a * a * a; return a; }. O valor de a é retornado. cubo x 4 a 64 Digite um número: 4 4 ao cubo é Digite um número: 4 4 ao cubo é

198 #include <iostream> using namespace std; double cubo(double a); int (){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; }. 64 double cubo(double a){ a = a * a * a; return a; }. Função é encerrada e volta à execução com o valor retornado x 4 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. Valor de x é impresso. x 4 Digite um número: 4 4 ao cubo é 64 Digite um número: 4 4 ao cubo é 64 x = 4 #include <iostream> using namespace std; double cubo(double a); int (){ 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; }. Digite um número: 4 4 ao cubo é 64 x = 4 Note como durante a execução do programa o valor de x não foi alterado. x 4 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)

199 #include <iostream> using namespace std; double cubo(double &a); int (){ 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; }. #include <iostream> using namespace std; double cubo(double &a); int (){ 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; }. Digite um número: 4 4 ao cubo é Declaramos a função. O & (e comercial) indica que a função recebe a variável por referência. #include <iostream> using namespace std; double cubo(double &a); int (){ 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; }. Inicialização... x 4 #include <iostream> using namespace std; double cubo(double &a); int (){ 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; }. Como cout depende de cubo, a função fica em espera. x 4 Digite um número: 4 4 ao cubo é Digite um número: 4 4 ao cubo é

200 #include <iostream> using namespace std; double cubo(double &a); int (){ 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 é agora um apelido para o x da função chamadora. Alterações em a alterarão x! cubo x 4 a x #include <iostream> using namespace std; double cubo(double &a); int (){ 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; }. Como a é só um apelido para o x da função. As alterações em a ocorrem em x! cubo x 64 a x Digite um número: 4 4 ao cubo é Digite um número: 4 4 ao cubo é #include <iostream> using namespace std; double cubo(double &a); int (){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; 64 }. double cubo(double &a){ a = a * a * a; return a; }. O valor de a (64) é retornado para o cout da função. cubo x 64 a x #include <iostream> using namespace std; double cubo(double &a); int (){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cout << cubo(x) << endl; cout << "x = " << x << endl; return 0; 64 }. double cubo(double &a){ a = a * a * a; return a; }. Função é encerrada e volta à execução com o valor retornado x 64 Digite um número: 4 4 ao cubo é Digite um número: 4 4 ao cubo é 64

201 #include <iostream> using namespace std; double cubo(double &a); int (){ 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; }. Valor de x é impresso. x 64 #include <iostream> using namespace std; double cubo(double &a); int (){ 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; }. Note como durante a execução do programa o valor de x foi alterado. x 64 Digite um número: 4 4 ao cubo é 64 x = 64 Digite um número: 4 4 ao cubo é 64 x = 64 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 (){ 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; }.

202 #include <iostream> using namespace std; void cubo(double &a); int (){ double x; cout << "Digite um número: "; cin >> x; cout << x << " ao cubo é "; cubo(x); cout << x << endl; return 0; }. void cubo(double &a) { a = a * a * a; }. Declaramos a função. O & (e comercial) indica que a função recebe a variável por referência. Desta vez, a função não retorna nada. #include <iostream> using namespace std; void cubo(double &a); int (){ 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; }. Inicialização... x 4 Digite um número: 4 4 ao cubo é Digite um número: 4 4 ao cubo é #include <iostream> using namespace std; void cubo(double &a); int (){ 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 função cubo é chamada para alterar o valor de x. A função fica em espera. x 4 #include <iostream> using namespace std; void cubo(double &a); int (){ 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 é agora uma referência para o x da função chamadora. Alterações em a alterarão x! cubo x 4 a x Digite um número: 4 4 ao cubo é Digite um número: 4 4 ao cubo é

203 #include <iostream> using namespace std; void cubo(double &a); int (){ 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; }. Como a é só um apelido para o x da função, as alterações em a ocorrem em x! cubo x 64 a x #include <iostream> using namespace std; void cubo(double &a); int (){ 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 função cubo é encerrada e, apesar de não retornar nada, o valor de x foi alterado. x 64 Digite um número: 4 4 ao cubo é Digite um número: 4 4 ao cubo é #include <iostream> using namespace std; void cubo(double &a); int (){ 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; }. O novo valor de x é impresso ainda na mesma linha. x 64 #include <iostream> using namespace std; void cubo(double &a); int (){ 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; }. Fim do programa x 64 Digite um número: 4 4 ao cubo é 64 Digite um número: 4 4 ao cubo é 64

204 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 (){ 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. Declaramos a função maxmin, que tem dois #include <iostream> using namespace std; parâmetros passados por referência. void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ 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; }. }. #include <iostream> using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ int x, y, z, menor, maior; x 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; menor }. 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; }. }. Criamos 5 variáveis. z y maior

205 Os valores de x, y e z são dados pelo usuário. #include <iostream> using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ int x, y, z, menor, maior; x 6 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; menor }. 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 > Digite maximo){ 3 números: maximo = c; }. }. z 9 y 3 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 (){ 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; }. Digite 3 números: x 6 menor z 9 y 3 maior A função fica em espera até que a função maxmin seja executada. void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ 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; }. x 6 y 3 void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; z 9 } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; menor maxmin minimo menor maior maximo maior }. }. a 6 b 3 c 9 a, b e c são recebidos por valor enquanto minimo e maximo são recebidos por referência void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ 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; }. x 6 y 3 void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ true z 9 minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; menor maxmin minimo menor maior maximo maior }. }. a 6 b 3 c 9 Digite 3 números: Digite 3 números: 6 3 9

206 void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ 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; }. x 6 y 3 void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; z 9 } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; menor maxmin minimo 3 menor maior maximo 6 maior }. }. a 6 b 3 c 9 void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ 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; }. x 6 y 3 void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; z 9 } else { minimo = a; maximo = b; menor 3 maior 6 }. if (c < minimo){ minimo = c; false maxmin } if (c > maximo){ maximo = c; minimo menor maximo maior }. }. a 6 b 3 c 9 Digite 3 números: Digite 3 números: void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ 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; }. x 6 y 3 void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; z 9 } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; true menor maxmin minimo 3 menor maior maximo 6 maior }. }. a 6 b 3 c 9 void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ 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; }. x 6 y 3 void maxmin(int a, int b, int c, int &minimo, int &maximo){ if (a > b){ minimo = b; maximo = a; z 9 } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; menor maxmin minimo 3 menor maior maximo 9 maior }. }. a 6 b 3 c 9 Digite 3 números: Digite 3 números: 6 3 9

207 #include <iostream> using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ int x, y, z, menor, maior; cout << "Digite 3 números: "; x 6 y 3 cin >> x >> y >> z; maxmin(x, y, z, menor, maior); cout << "O menor é " << menor << endl; z 9 cout << "O maior é " << maior << endl; return 0; }. menor 3 maior 9 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 Digite = c; 3 números: }. }. 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 (){ 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; x 6 y 3 cout << "O maior é " << maior << endl; return 0; z 9 }. menor 3 maior 9 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; }. Digite 3 números: }. O menor é 3 #include <iostream> using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ 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; x 6 y 3 return 0; z 9 }. void maxmin(int a, int b, int c, int &minimo, int &maximo){ menor 3 maior 9 if (a > b){ minimo = b; maximo = a; } else { minimo = a; maximo = b; }. if (c < minimo){ minimo = c; } if (c > maximo){ maximo = c; }. }. Digite 3 números: O menor é 3 O maior é 9 using namespace std; void maxmin(int a, int b, int c, int &minimo, int &maximo); int (){ 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; x 6 y 3 }. z 9 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; }. }. menor 3 maior 9 Digite 3 números: O menor é 3 O maior é 9

208 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 (){ 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; void incrementa(int a[], int n); int (){ 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.

209 #include <iostream> using namespace std; void incrementa(int a[], int n); int (){ 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]++; }. }. Criamos um arranjo de tamanho 4. x #include <iostream> using namespace std; void incrementa(int a[], int n); int (){ 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]++; }. }. a recebe o endereço do arranjo x por referência e n recebe por valor o número 4 x incrementa a x n 4 #include <iostream> using namespace std; void incrementa(int a[], int n); int (){ 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]++; }. }. Neste laço, cada elemento de a é incrementado em 1 x incrementa a x n 4 #include <iostream> using namespace std; void incrementa(int a[], int n); int (){ 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]++; }. }. A função incrementa termina sem retornar nada e o arranjo x agora tem seus elementos incrementados. x

210 #include <iostream> using namespace std; void incrementa(int a[], int n); int (){ 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]++; }. }. Os elementos do arranjo x são impressos. x #include <iostream> using namespace std; void incrementa(int a[], int n); int (){ 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]++; }. }. Fim do programa. Note como o arranjo foi passado por referência sem o &. x 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 (){ 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); }.

211 #include <iostream> using namespace std; void cubo(int *x); int (){ int num; cout << "Digite um número: "; cin >> num; cout << num << " ao cubo é "; cubo(&num); cout << num << endl; return 0; }. void cubo(int *x){ *x = (*x) * (*x) * (*x); }. Declaramos a função cubo, que recebe um ponteiro para um int, o desreferencia e o eleva ao cubo. #include <iostream> using namespace std; void cubo(int *x); int (){ 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. num 5 Digite um número: 5 5 ao cubo é #include <iostream> using namespace std; void cubo(int *x); int (){ 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 fica em espera até que a função cubo seja executada. num 5 #include <iostream> using namespace std; void cubo(int *x); int (){ 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. cubo num 5 x Digite um número: 5 5 ao cubo é Digite um número: 5 5 ao cubo é

212 #include <iostream> using namespace std; void cubo(int *x); int (){ 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 envia para a função cubo o endereço de num. cubo num 5 x &num #include <iostream> using namespace std; void cubo(int *x); int (){ 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. cubo num 5 x Digite um número: 5 5 ao cubo é Digite um número: 5 5 ao cubo é #include <iostream> using namespace std; void cubo(int *x); int (){ 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. cubo num 125 x #include <iostream> using namespace std; void cubo(int *x); int (){ 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 retoma a execução com o valor de num alterado. num 125 Digite um número: 5 5 ao cubo é Digite um número: 5 5 ao cubo é

213 #include <iostream> using namespace std; void cubo(int *x); int (){ 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. num 125 #include <iostream> using namespace std; void cubo(int *x); int (){ 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); }. num 125 Digite um número: 5 5 ao cubo é 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

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

215 #include <iostream> using namespace std; int fatorial(int n); int (){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ int resultado = 1; for (int i=n; i >= 1; i--){ resultado *= i; } return resultado; }. Declaramos uma função iterativa fatorial que retorna n!. #include <iostream> using namespace std; int fatorial(int n); int (){ 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. num 5 #include <iostream> using namespace std; int fatorial(int n); int (){ 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 aguarda retorno da função fatorial. num 5 #include <iostream> using namespace std; int fatorial(int n); int (){ 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 fatorial num 5 n 5

216 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. A variável resultado receberá as multiplicações pelos valores menores que n. fatorial n 5 num 5 resul tado 1 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. É criado no escopo do for o contador i, que percorrerá os valores entre n e 1. fatorial n 5 num 5 resul tado 1 i 5 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. Enquanto i for maior ou igual a 1... fatorial n 5 num 5 resul tado 1 i 5 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. Resultado é multiplicado por i fatorial n 5 num 5 resul tado 5 i 5

217 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. i passa para o próximo número fatorial n 5 num 5 resul tado 5 i 4 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. i >= 1 é true fatorial n 5 num 5 resul tado 5 i 4 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. resultado é multiplicado por 4 fatorial n 5 num 5 resul tado 20 i 4 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. i passa para 3 fatorial n 5 num 5 resul tado 20 i 3

218 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. i >= 1 é true fatorial n 5 num 5 resul tado 20 i 3 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. resultado é multiplicado por 3 fatorial n 5 num 5 resul tado 60 i 3 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. i passa para 2 fatorial n 5 num 5 resul tado 60 i 2 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. i >= 1 é true fatorial n 5 num 5 resul tado 60 i 2

219 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. resultado é multiplicado por 2 fatorial n 5 num 5 resul tado 120 i 2 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. i passa para 1 fatorial n 5 num 5 resul tado 120 i 1 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. i >= 1 é true fatorial n 5 num 5 resul tado 120 i 1 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. resultado é multiplicado por 1 fatorial n 5 num 5 resul tado 120 i 1

220 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. i passa para 0 fatorial n 5 num 5 resul tado 120 i 0 #include <iostream> using namespace std; int fatorial(int n); int (){ 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; }. i >= 1 é false, pois i deve ir até 1 fatorial n 5 num 5 resul tado 120 i 0 #include <iostream> using namespace std; int fatorial(int n); int (){ 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 O for termina, seu escopo é encerrado e resultado é retornado fatorial n 5 num 5 resul tado 120 #include <iostream> using namespace std; int fatorial(int n); int (){ 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 fatorial é encerrada, e retoma sua execução com o valor retornado 120 num 5 5! = 120

221 #include <iostream> using namespace std; int fatorial(int n); int (){ 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 Esta foi uma versão iterativa da função fatorial. num 5 #include <iostream> using namespace std; int fatorial(int n); int (){ 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 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. 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 (){ 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. num 5

222 #include <iostream> using namespace std; int fatorial(int n); int (){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }. A função fica em espera até que a função fatorial seja executada. num 5 #include <iostream> using namespace std; int fatorial(int n); int (){ 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. num 5 fatorial n 5 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. Como n não é 0, a função fatorial tenta retornar n * fatorial(n-1) num 5 fatorial n 5 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. Ao tentar retornar n * fatorial(n-1), a função é colocada em espera do retorno de uma outra função fatorial num 5 fatorial n 5

223 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. Esta outra função fatorial, porém, tem um problema menor do que o problema original. Este é o passo recursivo. num 5 fatorial n 5 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. Um novo escopo para a função é criado. Esta cópia da função recebe 4 como parâmetro. num 5 fatorial n 5 fatorial n 4 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. Esta cópia da função tenta retornar 4 * fatorial(3), o que a deixa também em espera num 5 fatorial n 5 fatorial n 4 #include <iostream> using namespace std; int fatorial(int n); int (){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }. A cópia da função recebe o valor 3 como parâmetro. num 5 fatorial n 5 fatorial n 4 fatorial n 3

224 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. Esta versão da função tenta retornar 3 * fatorial(2), o que a deixa em espera num 5 fatorial n 5 fatorial n 4 fatorial n 3 #include <iostream> using namespace std; int fatorial(int n); int (){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }. A função fatorial recebe o valor 2 num 5 fatorial n 5 fatorial n 4 fatorial n 3 fatorial n 2 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. Ao tentar retornar 2 * fatorial(1), ela entra em espera num 5 fatorial n 5 fatorial fatorial n 3 fatorial n 2 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. Esta chamada da função fatorial recebe o valor 1... num 5 fatorial n 5 fatorial fatorial n 3 fatorial n 2 fatorial n 4 n 4 n 1

225 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. E tenta retornar 1 * fatorial(0) num 5 fatorial n 5 fatorial n 4 fatorial n 3 fatorial n 2 fatorial n 1 #include <iostream> using namespace std; int fatorial(int n); int (){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }. A chamada da função recebe 0, que é o caso base, ou seja, o problema que ela sabe resolver fatorial n 0 num 5 fatorial n 5 fatorial n 4 fatorial n 3 fatorial n 2 fatorial n 1 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. Esta função retorna 1 para a função que a chamou fatorial n 0 num 5 fatorial n 5 fatorial n 4 fatorial(0) -> 1 fatorial n 3 fatorial n 2 fatorial n 1 #include <iostream> using namespace std; int fatorial(int n); int (){ 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(1) sai de espera e pode retornar para fatorial(2) seu resultado num 5 fatorial n 5 fatorial n 4 fatorial n 3 fatorial n 2 fatorial(1) -> 1 fatorial n 1

226 #include <iostream> using namespace std; int fatorial(int n); int (){ 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(2) sai de espera e pode retornar para fatorial(3) seu resultado num 5 fatorial n 5 fatorial n 4 fatorial n 3 fatorial(2) -> 2 fatorial n 2 #include <iostream> using namespace std; int fatorial(int n); int (){ 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(3) sai de espera e pode retornar para fatorial(4) seu resultado num 5 fatorial n 5 fatorial n 4 fatorial n 3 fatorial(3) -> 6 #include <iostream> using namespace std; int fatorial(int n); int (){ 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(4) sai de espera e pode retornar para fatorial(5) seu resultado num 5 fatorial n 5 fatorial n 4 fatorial(4) -> 24 #include <iostream> using namespace std; int fatorial(int n); int (){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. 120 int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }. fatorial(5) sai de espera e pode retornar para seu resultado num 5 fatorial n 5 fatorial(5) -> 120

227 #include <iostream> using namespace std; int fatorial(int n); int (){ int num = 5; cout << num << "! = " << fatorial(num) << endl; return 0; }. 120 int fatorial(int n){ if (n == 0){ return 1; } else { return n * fatorial(n-1); }. }. Função sai de espera e volta a funcionar com o valor retornado. num 5 #include <iostream> using namespace std; int fatorial(int n); int (){ 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); }. }. Fim do programa. num 5 5! = 120 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

228 Recursão Exercício - Sequência de Fibonacci É 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 // Exemplo fatorial int fatorial(int n) { if (n == 0){ return 1; } else { return n * fatorial(n-1); } } Este problema é análogo a um laço infinito em uma função iterativa 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 (){ 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; }.

229 #include <iostream> using namespace std; void cubo(double &a); int (){ 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 (){ 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]++; }. }. Estruturas #include <iostream> using namespace std; int fatorial(int n); int (){ 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 (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

230 Sintaxe Sintaxe struct nome_do_tipo { tipo_do_membro1 nome_do_membro1; tipo_do_membro2 nome_do_membro2; tipo_do_membro3 nome_do_membro3; }; 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 Sintaxe struct nome_do_tipo { tipo_do_membro1 nome_do_membro1; tipo_do_membro2 nome_do_membro2; tipo_do_membro3 nome_do_membro3; }; 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. Estas estruturas podem ser utilizadas para criar novos tipos de dados a partir dos tipos de dados já existentes

231 Sintaxe Sintaxe struct nome_do_tipo { tipo_do_membro1 nome_do_membro1; tipo_do_membro2 nome_do_membro2; tipo_do_membro3 nome_do_membro3; }; struct produto { double preco; double peso; string nome; }; Exemplo: uma estrutura para representar produtos Isto declara um novo tipo de dados chamado produto. Este tipo contém dois membros double e um membro string. struct produto { double preco; double peso; string nome; }; Sintaxe Sintaxe struct produto { double preco; double peso; string nome; }; struct 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: O membros destas variáveis podem ser acessados diretamente com um ponto (.) entre o nome do objeto e do membro. produto maca; produto banana; produto abacaxi; 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;

232 #include <iostream> using namespace std; struct produto { double preco; double peso; string nome; }; int (){ 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; }. #include <iostream> using namespace std; struct produto { double preco; double peso; string nome; }; int (){ 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. É criado um objeto x do tipo produto. Observe que x tem 3 membros. #include <iostream> using namespace std; struct produto { double preco; double peso; string nome; }; int (){ 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; }. x #include <iostream> using namespace std; struct produto { double preco; double peso; string nome; }; int (){ 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. x 0.3

233 #include <iostream> using namespace std; struct produto { double preco; double peso; string nome; }; int (){ produto x; x.peso = 0.3; x.nome = "Pêra"; cout << "Digite o preço: "; cin >> x.preco; cout << "Peso da " << x.nome << ": " << x.peso << endl; return 0; }. Atualizamos o valor do terceiro membro de x. x 0.3 Pêra Usuário atualiza o valor do primeiro membro de x através do fluxo de entrada. #include <iostream> using namespace std; struct produto { double preco; double peso; string nome; }; int (){ 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; }. x Pêra Digite o preço: 2.3 #include <iostream> using namespace std; struct produto { double preco; double peso; string nome; }; int (){ 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; }. Imprimimos o segundo e o terceiro membros do objeto x. x Pêra #include <iostream> using namespace std; struct produto { double preco; double peso; string nome; }; int (){ 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; }. x Pêra Digite o preço: 2.3 Peso da Pêra: 0.3 Digite o preço: 2.3 Peso da Pêra: 0.3

234 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 (){ 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 (){ 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> É declarado o novo tipo de dados produto. #include <string> using namespace std; struct produto{ double preco; double peso; string nome; }; int (){ 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; }.

235 struct produto{ double preco; double peso; string nome; }; int (){ 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. p p[0] p[1]... p[2] p[3]... p[4] n 5 struct produto{ double preco; double peso; string nome; }; int (){ 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. p Pêra p[1]... p[2] p[3]... p[4] n 5 i 0 Produto 0 Digite o preço: 2.3 Digite o peso: 0.3 Digite o nome: Pêra struct produto{ double preco; double peso; string nome; }; int (){ 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. p Pêra Kiwi Lima Maçã Uva n 5 i 5 struct produto{ double preco; double peso; string nome; }; int (){ 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. p Pêra Kiwi Lima Maçã Uva n 5 i 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... Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva Pêra R$ kg Kiwi R$ kg Lima R$ kg Maçã R$ kg Uva R$ kg

236 struct produto{ double preco; double peso; string nome; }; int (){ 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; }.... Produto 4 Digite o preço: 7.2 Digite o peso: 0.56 Digite o nome: Uva Pêra R$ kg Kiwi R$ kg Lima R$ kg Maçã R$ kg Uva R$ kg p Pêra Kiwi Lima Maçã Uva n 5 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 (){ const int n = 5; produto p[n]; produto *barato; for (int i=0; i<n; ++i){ cout << "Produto " << i << endl; cout << "Digite o preço: "; cin >> p[i].preco; cout << "Digite o peso: "; cin >> p[i].peso; cout << "Digite o nome: "; cin >> p[i].nome; }. barato = &p[0]; for (int i=1; i<n; ++i){ if (p[i].preco < barato->preco){ barato = &p[i]; }. }. cout << "Produto mais barato:" << endl; cout << barato->nome << "\t"; cout << "R$" << barato->preco << "\t"; cout << barato->peso << "kg" << endl; return 0; }. #include <iostream> #include <string> using namespace std; struct produto{ double preco; double peso; string nome; }; int (){ 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.

237 #include <iostream> #include <string> É declarado o novo tipo de dados produto. using namespace std; struct produto{ double preco; double peso; string nome; }; int (){ 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; }. struct produto{ double preco; double peso; string nome; }; int (){ 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 Digite 0; 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 Como no exemplo anterior, damos valores a todos os produtos. p Pêra Kiwi Lima Maçã Uva n 5 barato i 5 }; int (){ 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. p Pêra Kiwi Lima Maçã Uva n 5 barato i 5 }; int (){ 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 ->. p Pêra Kiwi Lima Maçã Uva n 5 barato i 1... 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... 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

238 }; int (){ 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. p Pêra Kiwi Lima Maçã Uva n 5 barato i 2 }; int (){ 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]. p Pêra Kiwi Lima Maçã Uva n 5 barato i 2... 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... 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 }; int (){ 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. p Pêra Kiwi Lima Maçã Uva n 5 barato i 2 }; int (){ 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 Pêra Kiwi Lima Maçã Uva n 5 i 2 barato... 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$ kg... 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$ kg

239 Alocação Automática de Memória 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 #include <iostream> #include <string> using namespace std; int (){ 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 Alocação Automática de Memória #include <iostream> #include <string> using namespace std; int (){ 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; }. x px 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] Antes de iniciar, o sistema operacional já aloca memória para = 16 inteiros e 1 ponteiro para inteiro. Esta é a memória alocada de maneira automática para o. #include <iostream> #include <string> using namespace std; int (){ 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; }. 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. x px 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]

240 Alocação Automática de Memória Alocação Automática de Memória #include <iostream> #include <string> using namespace std; int (){ 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; }. 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; } x px 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] 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 (){ 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 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 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: 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 funcao x 5 px i 2

241 Alocação Dinâmica de Memória Alocação Dinâmica de Memória funcao x 5 px i 2 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. funcao x 5 px i 2 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 Alocação Dinâmica de Memória funcao x 5 px i 2 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; funcao x 5 px 4 i 2 Agora sim podemos acessar esta memória desreferenciando este ponteiro. px = new int; *px = 3; (*px)++; cout << *px << endl; 4

242 Alocação Dinâmica de Memória Alocação Dinâmica de Memória funcao x 5 px i 2 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. funcao x 5 px i 2 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. 3 4 px = new int; *px = 3; px = new int; *px = 4; 3 4 px = new int; *px = 3; px = new int; *px = 4; vazamento de memória Alocação Dinâmica de Memória Alocação Dinâmica de Memória funcao x 5 px 4 i 2 Considere agora a função abaixo: void funcao(){ int x = 5; int i = 2; int *px; px = new int; *px = 4; }. funcao x 5 px i 2 4 vazamento de memória 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. void funcao(){ int x = 5; int i = 2; int *px; px = new int; *px = 4; }.

243 Alocação Dinâmica de Memória Alocação Dinâmica de Memória funcao x 5 px i 2 É 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. funcao x 5 px i 2 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; }. 4 void funcao(){ int *px; px = new int; *px = 4; delete px; }. Alocação Dinâmica de Memória Alocação Dinâmica de Memória funcao x 5 px i 2 Em outro exemplo da utilização de delete, px aponta para um inteiro (3), ele é apagado e depois aponta para outro (4). funcao n 4 px i 2 O operador new[] pede ao sistema para dinamicamente alocar memória para várias variáveis do tipo int, através de um arranjo. 3 4 int *px; px = new int; *px = 3; delete px; px = new int; *px = 4; int n = 4; new int[n];

244 Alocação Dinâmica de Memória Alocação Dinâmica de Memória funcao funcao n 4 px i 2 Note que n agora não precisa mais ser uma constante, pois a memória está sendo dinamicamente alocada. n 7 px i 2 Isto nos permite até mesmo associar o tamanho do arranjo a uma resposta do usuário. int n = 4; new int[n]; int n; cout << "Quantos elementos? "; cin >> n; new int[n]; Quantos elementos? 7 Alocação Dinâmica de Memória Alocação Dinâmica de Memória funcao n 4 px i 2 De maneira análoga a new, new[] retorna o endereço do primeiro elemento do arranjo alocado. funcao n 4 px i 2 Com um ponteiro para um arranjo, podemos desreferenciá-lo com o operador * ou operador de subscrito [], como se fosse um arranjo automaticamente alocado. int n = 4; px = new int[n]; int n = 4; px = new int[n]; *px = 4; // px[0] px[1] = 3; // *(px+1) px[2] = 5; px[3] = 2;

245 Alocação Dinâmica de Memória Alocação Dinâmica de Memória funcao n 4 px i 2 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! funcao n 4 px i 2 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; int n = 4; px = new int[n]; delete[] px; px = nullptr; #include <iostream> using namespace std; int (){ 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; }. #include <iostream> using namespace std; int (){ 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, o compilador sabe que ela terá duas variáveis. x Estas variáveis não existem ainda, mas o espaço para elas já foi automaticamente alocado. n

246 #include <iostream> using namespace std; int (){ 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; }. Passa a existir a variável n x n #include <iostream> using namespace std; int (){ 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; }. Passa a existir o ponteiro x x n #include <iostream> using namespace std; int (){ 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; }. O usuário dá o valor que deseja para n x n 5 #include <iostream> using namespace std; int (){ 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; }. É alocada memória para um arranjo de tamanho 5 e x aponta para ele x n 5 Digite o tamanho desejado de arranjo: 5 Digite o tamanho desejado de arranjo: 5

247 #include <iostream> using namespace std; int (){ 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; }. Note que a memória foi alocada em, mas ela não pertence a. Apenas conseguimos acessá-la através do ponteiro que está em. x n 5 #include <iostream> using namespace std; int (){ 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; }. 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. x n Digite o tamanho desejado de arranjo: 5 Digite o tamanho desejado de arranjo: 5 #include <iostream> using namespace std; int (){ 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; }. Ao chegar em um ponto onde não precisamos mais do arranjo alocado, o apagamos. x n 5 #include <iostream> using namespace std; int (){ 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; }. Fazemos que x pare de apontar para aquela posição de memória também, já que não temos mais nosso arranjo lá. x n 5 Digite o tamanho desejado de arranjo: 5 Digite o tamanho desejado de arranjo: 5

248 #include <iostream> using namespace std; int (){ 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; }. x n 5 Alocação de arranjos multidimensionais *int x Alocação de arranjo simples int x[0] x[1] x[2] x[3] x[4] int *x; x = new int[10]; delete[] x; Digite o tamanho desejado de arranjo: 5 Alocação de arranjos multidimensionais Arquivos *int int int int int int **int 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] 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; 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.

249 Arquivos 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 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 #include <iostream> #include <fstream> #include <string> using namespace std; int (){ 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; }. O operador >> lê dados do arquivo

Puca Huachi Vaz Penna

Puca Huachi Vaz Penna Aula 3 C++: variáveis e expressões aritméticas 2017/1 BCC201 Introdução à Computação Turmas 61, 62, 63, 64, 65 e 66, 32 e 33 Puca Huachi Vaz Penna Departamento de Computação Universidade Federal de Ouro

Leia mais

ITENS FUNDAMENTAIS Programando em C++

ITENS FUNDAMENTAIS Programando em C++ INFORMÁTICA E COMPUTAÇÃO - CMP 1060 AULA 3 ITENS FUNDAMENTAIS Programando em C++ 1. Constantes São valores que são mantidos fixos pelo compilador. Tipo de Dado Exemplos de Constantes char b \n \0 int 2

Leia mais

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM C/C++ Prof. Dr. Daniel Caetano

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM C/C++ Prof. Dr. Daniel Caetano LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM C/C++ Prof. Dr. Daniel Caetano 2013-1 Objetivos Entender o mecanismo de um programa em C/C++ Apresentar e estrutura da Linguagem C/C++

Leia mais

Aula 4: Introdução à Linguagem C++

Aula 4: Introdução à Linguagem C++ CI208 - Programação de Computadores Aula 4: Introdução à Linguagem C++ Prof. MSc. Diego Roberto Antunes diegor@inf.ufpr.br www.inf.ufpr.br/diegor Universidade Federal do Paraná Setor de Ciências Exatas

Leia mais

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica.

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica. Computação L2 Linguagem C++ ovsj@cin.ufpe.br Observação: Material Baseado na Disciplina Computação Eletrônica. Alfabeto São os símbolos ( caracteres ) permitidos na linguagem: Letras (maiúsculas e minúsculas);

Leia mais

Conhecendo a Linguagem de Programação C

Conhecendo a Linguagem de Programação C Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Conhecendo a Linguagem de Programação C DCA0800 - Algoritmos e Lógica de Programação Heitor Medeiros 1 Como

Leia mais

Preparatório OBI. Prof. André Gustavo Duarte de Almeida docente.ifrn.edu.br/andrealmeida. Aula 01 Introdução a C++

Preparatório OBI. Prof. André Gustavo Duarte de Almeida docente.ifrn.edu.br/andrealmeida. Aula 01 Introdução a C++ Preparatório OBI Prof. André Gustavo Duarte de Almeida andre.almeida@ifrn.edu.br docente.ifrn.edu.br/andrealmeida Aula 01 Introdução a C++ Roteiro Introdução ao C++ Primeiro Programa Variáveis Operadores

Leia mais

INFORMÁTICA APLICADA AULA 03 LINGUAGEM DE PROGRAMAÇÃO C++

INFORMÁTICA APLICADA AULA 03 LINGUAGEM DE PROGRAMAÇÃO C++ UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: Bacharelado em Ciências e Tecnologia INFORMÁTICA APLICADA AULA 03 LINGUAGEM DE PROGRAMAÇÃO C++ Profª ª Danielle Casillo OPERADORES Um operador é um símbolo

Leia mais

Unidade 5: Introdução à Programação com C/C++ Prof. Daniel Caetano

Unidade 5: Introdução à Programação com C/C++ Prof. Daniel Caetano Lógica de Programação para Engenharia 1 Unidade 5: Introdução à Programação com C/C++ Prof. Daniel Caetano Objetivo: Explicitar os elementos básicos envolvidos na programação com a linguagem C/C++. Bibliografia:

Leia mais

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões. 1 Estruturas da linguagem C 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões. Identificadores Os identificadores seguem a duas regras: 1. Devem ser começados por letras

Leia mais

Linguagem C++ Estruturas de controle Parte II Estruturas de repetição

Linguagem C++ Estruturas de controle Parte II Estruturas de repetição Fundamentos de Programação Linguagem C++ Estruturas de controle Parte II Estruturas de repetição Prof. Bruno E. G. Gomes IFRN 1 Estruturas de Controle Permitem o controle da sequência de execução de um

Leia mais

PROGRAMAÇÃO COMPUTACIONAL

PROGRAMAÇÃO COMPUTACIONAL PROGRAMAÇÃO COMPUTACIONAL LINGUAGEM C/C++ REVISÃO 1 ANDRÉ LUÍS DUARTE Honra a teu pai e a tua mãe (que é o primeiro mandamento com promessa), para que te vá bem, e sejas de longa vida sobre a terra.(ef

Leia mais

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados Disciplina de Programação de Computadores I Universidade Federal de Ouro

Leia mais

Módulo 1. Introdução. AEDS I C++ (Rone Ilídio)

Módulo 1. Introdução. AEDS I C++ (Rone Ilídio) Módulo 1 Introdução AEDS I C++ (Rone Ilídio) Introdução Linguagens de Programação Fonte Compilador Executável SO I Hardware C++ - Características Evolução do C, ou seja, possui a mesma sintaxe É uma linguagem

Leia mais

exatasfepi.com.br Informática C/C++ André Luís Duarte Feliz é o homem que acha sabedoria, e o homem que adquire entendimento; Provérbios 3:13

exatasfepi.com.br Informática C/C++ André Luís Duarte Feliz é o homem que acha sabedoria, e o homem que adquire entendimento; Provérbios 3:13 exatasfepi.com.br Informática C/C++ André Luís Duarte Feliz é o homem que acha sabedoria, e o homem que adquire entendimento; Provérbios 3:13 Conceitos Fundamentos Estrutura sequencial Estruturas de seleção

Leia mais

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU Aula 5 Oficina de Programação Introdução ao C Profa. Elaine Faria UFU - 2017 Linguagem de Programação Para que o computador consiga ler um programa e entender o que fazer, este programa deve ser escrito

Leia mais

Linguagem C: Introdução

Linguagem C: Introdução Linguagem C: Introdução Linguagem C É uma Linguagem de programação genérica que é utilizada para a criação de programas diversos como: Processadores de texto Planilhas eletrônicas Sistemas operacionais

Leia mais

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Programação em C Variáveis e Expressões DCA0800 Algoritmos e Lógica de Programação Heitor Medeiros Florencio

Leia mais

Programação Computacional C/C++

Programação Computacional C/C++ exatasfepi.com.br Programação Computacional C/C++ André Luís Duarte Feliz é o homem que acha sabedoria, e o homem que adquire entendimento; Provérbios 3:13 Conceitos Fundamentos Estrutura sequencial Estruturas

Leia mais

Introdução e Conceitos

Introdução e Conceitos Introdução e Conceitos Aula 1 11/08/2017 diegoquirino@gmail.com 1 Agenda 1. Motivações: porque estudar linguagens de programação? 2. Breve Histórico sobre as Linguagens de Programação 3. Processos de Tradução

Leia mais

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM C/C++ Prof. Dr. Daniel Caetano

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM C/C++ Prof. Dr. Daniel Caetano LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM C/C++ Prof. Dr. Daniel Caetano 2018-1 Objetivos Entender o mecanismo de um programa em C/C++ Apresentar e estrutura da Linguagem C/C++

Leia mais

Algoritmos e Programação

Algoritmos e Programação Algoritmos e Programação Aula 3 Introdução a Linguagem C Profa. Marina Gomes marinagomes@unipampa.edu.br 1 Aula de Hoje - Criar programas simples em C utilizando a estrutura básica; - Declarar variáveis;

Leia mais

Unidade 5: Introdução à Programação com C/C++

Unidade 5: Introdução à Programação com C/C++ Lógica de Programação para Engenharia 1 Unidade 5: Introdução à Programação com C/C++ Prof. Daniel Caetano Objetivo: Explicitar os elementos básicos envolvidos na programação com a linguagem C/C++. Bibliografia:

Leia mais

PROGRAMAS BÁSICOS EM C++ Disciplina: Introdução à Ciência da Computação Prof. Modesto Antonio Chaves Universidade estadual do Sudoeste da Bahia

PROGRAMAS BÁSICOS EM C++ Disciplina: Introdução à Ciência da Computação Prof. Modesto Antonio Chaves Universidade estadual do Sudoeste da Bahia PROGRAMAS BÁSICOS EM C++ Disciplina: Introdução à Ciência da Computação Prof. Modesto Antonio Chaves Universidade estadual do Sudoeste da Bahia Calculo da área de um triângulo Algoritmo Área Var base,

Leia mais

ESTRUTURA COM DECISÃO COMPOSTA

ESTRUTURA COM DECISÃO COMPOSTA LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA ESTRUTURA COM DECISÃO COMPOSTA Prof. Dr. Daniel Caetano 2018-1 Objetivos Entender o que são decisões compostas Compreender como implementar decisões compostas Capacitar

Leia mais

Aula 8 Comandos de Seleção

Aula 8 Comandos de Seleção Aula 8 Comandos de Seleção Algoritmos e Programação de Computadores Profs: Ronaldo Castro de Oliveira ronaldo.co@ufu.br Anilton Joaquim da Silva anilton@ufu.br 1 Introdução Até agora não aprendemos a dizer

Leia mais

11 - Estrutura de um programa em C

11 - Estrutura de um programa em C 11 - Estrutura de um programa em C directivas para o compilador { main ( ) declarações instruções } -É possível utilizar comentários, exemplo: /* Comentário */ que não são traduzidos pelo compilador, pois

Leia mais

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES LINGUAGEM C: VARIÁVEIS E EXPRESSÕES Prof. André Backes LINGUAGENS DE PROGRAMAÇÃO Linguagem de Máquina Computador entende apenas pulsos elétricos Presença ou não de pulso 1 ou 0 Tudo no computador deve

Leia mais

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA ESTRUTURA COM DECISÃO MÚLTIPLA. Prof. Dr. Daniel Caetano

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA ESTRUTURA COM DECISÃO MÚLTIPLA. Prof. Dr. Daniel Caetano LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA ESTRUTURA COM DECISÃO MÚLTIPLA Prof. Dr. Daniel Caetano 2013-1 Objetivos Entender o que são decisões múltiplas Compreender como implementar decisões múltiplas Capacitar

Leia mais

Instituto Federal de Educação, Ciência e Tecnologia do RN Câmpus Currais Novos. LINGUAGEM C++ VARIÁVEIS COMPOSTAS Arrays Aula I

Instituto Federal de Educação, Ciência e Tecnologia do RN Câmpus Currais Novos. LINGUAGEM C++ VARIÁVEIS COMPOSTAS Arrays Aula I LINGUAGEM C++ VARIÁVEIS COMPOSTAS Arrays Aula I Prof. Bruno E. G. Gomes Uma variável em um algoritmo pode ser vista como uma gaveta. A declaração de uma variável reserva uma gaveta (posição) de um certo

Leia mais

Estrutura do programa

Estrutura do programa Linguagem C Estrutura do programa Exemplo: #include #include main() { printf( Ola, mundo! ); system( pause ); }

Leia mais

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA ESTRUTURA DE REPETIÇÃO Prof. Dr. Daniel Caetano 2013-2 Objetivos Entender o que é uma estrutura de repetição Compreender como implementar as repetições Capacitar para

Leia mais

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados Introdução à Programação Operadores, Expressões Aritméticas e Entrada/Saída de Dados Programa em C #include int main main ( ) { Palavras Reservadas } float celsius ; float farenheit ; celsius

Leia mais

1 Introdução e Conceitos básicos

1 Introdução e Conceitos básicos 1 Introdução e Conceitos básicos Aula 0 Sumário Capítulo 1 Introdução e Conceitos básicos 1.1. Definição 1.. Comandos Básicos 1..1. Comando de saída: impressão na tela 1... Case sensitive 1..3. Função

Leia mais

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

#include <stdio.h> Void main() { printf( Cheguei!\n); } INTRODUÇÃO A LINGUAGEM C #include Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C ANTES DO C ERA A LINGUAGEM B B foi essencialmente uma simplificação da linguagem BCPL. B só tinha um tipo de dado, que

Leia mais

Ambiente de desenvolvimento

Ambiente de desenvolvimento Linguagem C Ambiente de desenvolvimento Um programa em C passa por seis fases até a execução: 1) Edição 2) Pré-processamento 3) Compilação 4) Linking 5) Carregamento 6) Execução Etapa 1: Criação do programa

Leia mais

3. Linguagem de Programação C

3. Linguagem de Programação C Introdução à Computação I IBM1006 3. Linguagem de Programação C Prof. Renato Tinós Departamento de Computação e Matemática (FFCLRP/USP) 1 Principais Tópicos 3.2. Estrutura de Programas e Representação

Leia mais

Programação Aplicada à Engenharia

Programação Aplicada à Engenharia Universidade Federal Rural do Semi-Árido Departamento de Ciências Ambientais Programação Aplicada à Engenharia Aula 06: Introdução a C++ Silvio Fernandes 2009.1 1 História de C e C++ C++ é uma evolução

Leia mais

CCO 016 Fundamentos de Programação

CCO 016 Fundamentos de Programação CCO 016 Fundamentos de Programação Prof. Roberto Affonso da Costa Junior Universidade Federal de Itajubá Aula 05 Entrada de dados Leia scanf ou cin Entrada de Dados Entrada de dados compreende a operação

Leia mais

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática Capítulo 1: Introdução à Linguagem C Pontifícia Universidade Católica Departamento de Informática Programa Programa é um algoritmo escrito em uma linguagem de programação. No nosso caso, a linguagem C.

Leia mais

INFORMÁTICA APLICADA AULA 05 LINGUAGEM DE PROGRAMAÇÃO C++

INFORMÁTICA APLICADA AULA 05 LINGUAGEM DE PROGRAMAÇÃO C++ UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: Bacharelado em Ciências e Tecnologia INFORMÁTICA APLICADA AULA 05 LINGUAGEM DE PROGRAMAÇÃO C++ Profª ª Danielle Casillo LAÇOS Laços são comandos da linguagem

Leia mais

Fundamentos de Programação. Linguagem C++ Introdução, identificadores, tipos de dados. Prof. Bruno E. G. Gomes IFRN

Fundamentos de Programação. Linguagem C++ Introdução, identificadores, tipos de dados. Prof. Bruno E. G. Gomes IFRN Fundamentos de Programação Linguagem C++ Introdução, identificadores, tipos de dados Prof. Bruno E. G. Gomes IFRN 1 Linguagem de Programação Constituída por símbolos e por regras para combinar esses símbolos

Leia mais

Fábio da Fontoura Beltrão Felipe Augusto Chies Lucas Fialho Zawacki Marcos Vinicius Cavinato Matheus de Carvalho Proença

Fábio da Fontoura Beltrão Felipe Augusto Chies Lucas Fialho Zawacki Marcos Vinicius Cavinato Matheus de Carvalho Proença C++ Fábio da Fontoura Beltrão Felipe Augusto Chies Lucas Fialho Zawacki Marcos Vinicius Cavinato Matheus de Carvalho Proença Primeiro Programa //Primeiro Programa C++ #include int main() { std::cout

Leia mais

Conceitos Básicos Linguagem C

Conceitos Básicos Linguagem C Conceitos Básicos Linguagem C PROF. MAURÍCIO A DIAS MACDIASPAE@GMAIL.COM 2 Método Método básico para construção de algoritmos 1. Compreender completamente o problema a ser resolvido, se possível dividindo

Leia mais

Operações e Expressões

Operações e Expressões Operações e Expressões Objectivos Exemplos detalhados de tipos numéricos Trabalhar com expressões do tipo lógico (bool) Processamento de caracteres Estudar o operador de atribuição Utilizar operadores

Leia mais

Capítulo 2 Operadores. A função scanf()

Capítulo 2 Operadores. A função scanf() Capítulo 2 Operadores A função scanf() A função scanf() é outra das funções de E/S implementadas em todos os compiladores e nos permite ler dados formatados da entrada padrão (teclado). Sintaxe: scanf(

Leia mais

Anhanguera Educacional S.A. Centro Universitário Ibero-Americano

Anhanguera Educacional S.A. Centro Universitário Ibero-Americano O C++ foi inicialmente desenvolvido por Bjarne Stroustrup durante a década de 1980 com o objetivo de melhorar a linguagem de programação C, mantendo a compatibilidade com esta linguagem. Exemplos de Aplicações

Leia mais

Linguagem C Princípios Básicos (parte 1)

Linguagem C Princípios Básicos (parte 1) Linguagem C Princípios Básicos (parte 1) Objetivos O principal objetivo deste artigo é explicar alguns conceitos fundamentais de programação em C. No final será implementado um programa envolvendo todos

Leia mais

Introdução à Programação

Introdução à Programação Introdução à Programação Introdução a Linguagem C Construções Básicas Programa em C #include int main ( ) { Palavras Reservadas } float celsius ; float farenheit ; celsius = 30; farenheit = 9.0/5

Leia mais

1/50. Conceitos Básicos. Programa Básico

1/50. Conceitos Básicos. Programa Básico 1/50 Conceitos Básicos Programa Básico 2/50 Operações básicas de entrada e saída #include main retorna um inteiro int main() { std::cout

Leia mais

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO RIO GRANDE DO NORTE PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS Docente: Éberton da Silva Marinho e-mail: ebertonsm@gmail.com eberton.marinho@gmail.com

Leia mais

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados Métodos Computacionais Operadores, Expressões Aritméticas e Entrada/Saída de Dados Tópicos da Aula Hoje aprenderemos a escrever um programa em C que pode realizar cálculos Conceito de expressão Tipos de

Leia mais

Introdução a Programação de Jogos

Introdução a Programação de Jogos Introdução a Programação de Jogos Aula 03 Introdução a Linguagem C Edirlei Soares de Lima Estrutura de um Programa C Inclusão de bibliotecas auxiliares: #include Definição

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Programação com sequência Prof. M.Sc.: João Paulo Q. dos Santos E-mail: joao.queiroz@ifrn.edu.br Página: http://docente.ifrn.edu.br/joaoqueiroz/ Etapas de ação de um computador

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Linguagem C++: arrays - aula I Bruno Emerson Gurgel Gomes 1 1 Instituto Federal de Educação, Ciência e Tecnologia do RN (IFRN) 2012 Bruno Gomes (IFRN) Fundamentos de Programação

Leia mais

Conceitos Básicos da Linguagem C++ Prof. Leonardo Barreto Campos 1

Conceitos Básicos da Linguagem C++ Prof. Leonardo Barreto Campos 1 Conceitos Básicos da Linguagem C++ Prof. Leonardo Barreto Campos 1 Sumário As Origens da Linguagem C++; Primeiro Programa em C++; Declaração e Leitura de Variáveis; Estruturas de Seleção; if; switch; Estruturas

Leia mais

Programação de Computadores II Aula 03. Linguagem C I

Programação de Computadores II Aula 03. Linguagem C I Programação de Computadores II Slides cedidos por Karina Mochetti 2018.1 C vs Python Python é uma linguagem muito mais nova, de 1991. C é muito mais eciente, os programas rodam mais rápido. Seu objetivo

Leia mais

Computação Eletrônica. Tipos de dados, constantes, variáveis, operadores e expressões. Prof: Luciano Barbosa

Computação Eletrônica. Tipos de dados, constantes, variáveis, operadores e expressões. Prof: Luciano Barbosa Computação Eletrônica Tipos de dados, constantes, variáveis, operadores e expressões Prof: Luciano Barbosa Site da disciplina: www.cin.ufpe.br/~if165/ Recapitulando num cubo = n * n * n cubo Algoritmo

Leia mais

Introdução a Programação. Curso: Sistemas de Informação Programação I José R. Merlin

Introdução a Programação. Curso: Sistemas de Informação Programação I José R. Merlin Introdução a Programação Curso: Sistemas de Informação Programação I José R. Merlin Programas Programas são instruções para o computador executar uma tarefa Estas instruções seguem uma lógica Lógica: modo

Leia mais

INTRODUÇÃO À LÓGICA DE PROGRAMAÇÃO PROFESSOR EDUARDO PARETO

INTRODUÇÃO À LÓGICA DE PROGRAMAÇÃO PROFESSOR EDUARDO PARETO PROFESSOR EDUARDO PARETO LÓGICA A lógica é o ramo da filosofia que cuida das regras do bem pensar, ou do pensar correto, sendo, portanto, um instrumento do pensar. (disponível em: www.academia.edu/4435931/curso_completo_de_logica)

Leia mais

Compiladores. Análise Léxica

Compiladores. Análise Léxica Compiladores Análise Léxica Cristiano Lehrer, M.Sc. Introdução (1/3) Análise léxica é a primeira fase do compilador. A função do analisador léxico, também denominado scanner, é: Fazer a leitura do programa

Leia mais

Instruções, dados e expressões

Instruções, dados e expressões Instruções, dados e expressões Marina Andretta ICMC-USP 1 de março de 2016 Marina Andretta (ICMC-USP) sme0230-ipc 1 de março de 2016 1 / 50 Dados Um computador manipula informações presentes em sua memória.

Leia mais

Operadores. Tipo de operadores. Aritméticos. Relacionais. Lógicos. Bit a bit. Cálculos aritméticos: soma, subtracção, multiplicação, divisão, etc.

Operadores. Tipo de operadores. Aritméticos. Relacionais. Lógicos. Bit a bit. Cálculos aritméticos: soma, subtracção, multiplicação, divisão, etc. Operadores Tipo de operadores Aritméticos Cálculos aritméticos: soma, subtracção, multiplicação, divisão, etc. Relacionais Comparação entre entidades. Lógicos Bit a bit 1 Operadores Aritméticos Operadores

Leia mais

Programação Básica. Estrutura de um algoritmo

Programação Básica. Estrutura de um algoritmo Programação Básica Estrutura de um algoritmo Código-fonte Como vimos na aula anterior um algoritmo pode ser representado usando um fluxograma Um algoritmo pode também ser representado usando texto Esse

Leia mais

Aula 03: Introdução a C

Aula 03: Introdução a C Aula 03: Introdução a C Introdução a Programação Túlio Toffolo & Puca Huachi http://www.toffolo.com.br BCC201 2019/1 Departamento de Computação UFOP Aula Anterior O que é um computador Organização de um

Leia mais

Aula 01 Algoritmos e lógica de programação e introdução ao C++

Aula 01 Algoritmos e lógica de programação e introdução ao C++ Aula 01 Algoritmos e lógica de programação e introdução ao C++ Autor: José Martins de Castro Neto Carga Horária: 2h 21 de julho de 2015 1 Algoritmo e lógica de programação Ementa do curso 1. Definições

Leia mais

Aula 17: Funções (Parte III) e Introdução a Vetores

Aula 17: Funções (Parte III) e Introdução a Vetores Aula 17: Funções (Parte III) e Introdução a Vetores Introdução a Programação Túlio Toffolo & Puca Huachi http://www.toffolo.com.br BCC201 2018/2 Departamento de Computação UFOP Aula de Hoje 1 Exemplos

Leia mais

Aula 10: Manipulação do fluxo de laços

Aula 10: Manipulação do fluxo de laços Aula 10: Manipulação do fluxo de laços Introdução a Programação Túlio Toffolo & Puca Huachi http://www.toffolo.com.br BCC201 2018/2 Departamento de Computação UFOP Aula Anterior Laços aninhados Exemplos

Leia mais

Desenvolvido por: Juarez A. Muylaert Filho - Andréa T. Medeiros - Adriana S. Spallanzani -

Desenvolvido por: Juarez A. Muylaert Filho - Andréa T. Medeiros - Adriana S. Spallanzani - UAL é uma linguagem interpretada para descrição de algoritmos em Português. Tem por objetivo auxiliar o aprendizado do aluno iniciante em programação através da execução e visualização das etapas de um

Leia mais

Programação científica C++

Programação científica C++ Programação científica C++ NIELSEN CASTELO DAMASCENO Slide 2 Expressões Combinação de dados e operadores que resulta em um valor. expressão x = 2 * y + 4; variável operador constante Memória do computador

Leia mais

Aula 10 Comandos de Repetição

Aula 10 Comandos de Repetição Aula 10 Comandos de Repetição Algoritmos e Programação de Computadores Profs: Ronaldo Castro de Oliveira ronaldo.co@ufu.br Anilton Joaquim da Silva anilton@ufu.br 1 Introdução Em certas situações é necessária

Leia mais

Objectivos. Observar os tipos fornecidos pelo C++ Explicar as regras sintácticas para nomes de identificadores Estudar variáveis e constantes

Objectivos. Observar os tipos fornecidos pelo C++ Explicar as regras sintácticas para nomes de identificadores Estudar variáveis e constantes Tipos de Dados Objectivos Observar os tipos fornecidos pelo C++ São dados alguns exemplos Explicar as regras sintácticas para nomes de identificadores Estudar variáveis e constantes O que são Como se distinguem

Leia mais

GFM015 Introdução à Computação Algoritmos e Programação / Estrutura de Controle de Fluxo / Ambiente de Programação

GFM015 Introdução à Computação Algoritmos e Programação / Estrutura de Controle de Fluxo / Ambiente de Programação GFM015 Introdução à Computação Algoritmos e Programação / Estrutura de Controle de Fluxo / Ambiente de Programação Ilmério Reis da Silva ilmerio@facom.ufu.br www.facom.ufu.br/~ilmerio/ic UFU/FACOM Programa

Leia mais

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II Ponteiros Profa.: Simone Ceolin Slides (Prof.Tiago Rios da Rocha) Primeiro Semestre 2011 Sumário

Leia mais

Programação Orientada a Objetos

Programação Orientada a Objetos Programação Orientada a Objetos Professor: Diego Oliveira Conteúdo 05: Linguagem Java Conteúdo da Aula Linguagem Java Tipos Primitivos Operadores Aritiméticos Operadores Lógicos Precedência de Operadores

Leia mais

Aula 26: Estruturas heterogêneas

Aula 26: Estruturas heterogêneas Aula 26: Estruturas heterogêneas Introdução a Programação Túlio Toffolo & Puca Huachi http://www.toffolo.com.br BCC201 2018/2 Departamento de Computação UFOP Aulas anteriores Memória Ponteiro Utilização

Leia mais

Algoritmos: tipos de dados, variáveis e expressões

Algoritmos: tipos de dados, variáveis e expressões Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Algoritmos: tipos de dados, variáveis e expressões DCA0800 - Algoritmos e Lógica de Programação Heitor Medeiros

Leia mais

Introdução à Linguagem C Variáveis e Expressões

Introdução à Linguagem C Variáveis e Expressões INF1005: Programação 1 Introdução à Linguagem C Variáveis e Expressões 08/03/10 (c) Paula Rodrigues 1 Tópicos Principais Programando em C Funções Variáveis Define Operadores e Expressões Entrada e Saída

Leia mais

CIT Aula 02 Variáveis e Estruturas de desvio condicional. Autor: Max Rodrigues Marques Carga Horária: 2 h 22/07/15 1

CIT Aula 02 Variáveis e Estruturas de desvio condicional. Autor: Max Rodrigues Marques Carga Horária: 2 h 22/07/15 1 CIT 2015.2 Aula 02 Variáveis e Estruturas de desvio condicional Autor: Max Rodrigues Marques Carga Horária: 2 h 22/07/15 1 Variáveis Uma variável nada mais é que um nome que damos a uma determinada posição

Leia mais

Programação Estruturada Prof. Rodrigo Hausen VAMOS USAR O LINUX. SE TIVER ENTRADO NO WINDOWS, REINICIE O COMPUTADOR.

Programação Estruturada Prof. Rodrigo Hausen   VAMOS USAR O LINUX. SE TIVER ENTRADO NO WINDOWS, REINICIE O COMPUTADOR. Programação Estruturada Prof. Rodrigo Hausen http://progest.compscinet.org Expressões e Funções VAMOS USAR O LINUX. SE TIVER ENTRADO NO WINDOWS, REINICIE O COMPUTADOR. 1 TIPOS PRIMITIVOS EM C Numéricos:

Leia mais

INTRODUÇÃO A LINGUAGEM C

INTRODUÇÃO A LINGUAGEM C INTRODUÇÃO A LINGUAGEM C Aula 01 Programação em Microinformática Prof. Allbert Velleniche de Aquino Almeida E-mail: professor@allbert.com.br Site: http://www.allbert.com.br Histórico O C nasceu na década

Leia mais

Aula 4 - Operadores. Prof. Laura Silva de Assis. Engenharia de Computação 2 o Período

Aula 4 - Operadores. Prof. Laura Silva de Assis. Engenharia de Computação 2 o Período Programação I Aula 4 - Prof. Laura Silva de Assis Engenharia de Computação 2 o Período CEFET/RJ - Centro Federal de Educação Tecnológica Celso Suckow da Fonseca UnED Petrópolis 2 o semestre - 2015 1 Sumário

Leia mais

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA AMBIENTE DE PROGRAMAÇÃO. Prof. Dr. Daniel Caetano

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA AMBIENTE DE PROGRAMAÇÃO. Prof. Dr. Daniel Caetano LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA AMBIENTE DE PROGRAMAÇÃO Prof. Dr. Daniel Caetano 2013-2 Objetivos Entender como avaliar divisibilidade Conhecer as funções matemáticas prontas do C/C++ Capacitar o

Leia mais

INFORMÁTICA PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM PYTHON

INFORMÁTICA PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM PYTHON INFORMÁTICA PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM PYTHON Prof. Dr. Daniel Caetano 2019-1 Objetivos Entender a lógica do Python Apresentar e estrutura do Python Capacitar o aluno para escrever algoritmos

Leia mais

INFORMÁTICA PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM PYTHON

INFORMÁTICA PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM PYTHON INFORMÁTICA PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM PYTHON Prof. Dr. Daniel Caetano 2018-2 Objetivos Entender a lógica do Python Apresentar e estrutura do Python Capacitar o aluno para escrever algoritmos

Leia mais

Programação I A Linguagem C. Prof. Carlos Alberto

Programação I A Linguagem C. Prof. Carlos Alberto Programação I A Linguagem C Prof. Carlos Alberto carlos.batista@facape.br carlos36_batista@yahoo.com.br 2 Origem A linguagem C foi desenvolvida em 1972, nos Laboratórios Bell, por Dennis Ritchie. Implementada

Leia mais

Conceitos Básicos de Programação

Conceitos Básicos de Programação BCC 201 - Introdução à Programação Conceitos Básicos de Programação Guillermo Cámara-Chávez UFOP 1/53 Conceitos básicos I Variável 2/53 Conceitos básicos II Posição de memoria, identificada através de

Leia mais

1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 E-books PCNA. Vol. 1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 APRESENTANDO A LINGUAGEM C. Página 1

1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 E-books PCNA. Vol. 1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 APRESENTANDO A LINGUAGEM C. Página 1 1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 E-books PCNA Vol. 1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 APRESENTANDO A LINGUAGEM C Página 1 2 TECNOLOGIA ELEMENTAR CAPÍTULO 3 SUMÁRIO Apresentação -----------------------------------------------------------

Leia mais

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná Linguagem C IF61A/IF71A - Computação 1 Prof. Leonelo Almeida Universidade Tecnológica Federal do Paraná Até agora... Sabemos construir algoritmos que tenham: Variáveis Comandos sequenciais Entrada e saída

Leia mais

Linguagem C Operadores

Linguagem C Operadores Linguagem C Operadores Objetivos Abordar os conceitos sobre os Operadores demonstrando o seu uso com exemplos para um melhor aprendizado. Pré-requisitos É necessário que o leitor tenha acompanhado o artigo

Leia mais

Aula 12: Funções. CI208 - Programação de Computadores. Prof. MSc. Diego Roberto Antunes

Aula 12: Funções. CI208 - Programação de Computadores. Prof. MSc. Diego Roberto Antunes CI208 - Programação de Computadores Aula 12: Funções Prof. MSc. Diego Roberto Antunes diegor@inf.ufpr.br www.inf.ufpr.br/diegor Universidade Federal do Paraná Setor de Ciências Exatas Departamento de Informática

Leia mais

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery Linguagem de Programação JAVA Técnico em Informática Professora Michelle Nery Agenda Operações Operadores Operadores Delimitadores {} [] (). Operador de Atribuição = Agenda Operadores Aritméticos Operadores

Leia mais

TECNOLOGIA EM REDES DE COMPUTADORES. computadores. Aula 5

TECNOLOGIA EM REDES DE COMPUTADORES. computadores. Aula 5 TECNOLOGIA EM REDES DE COMPUTADORES Algoritmos e programação de computadores Aula 5 1 Agenda Algoritmos: Estruturas de controle Revisao Conectivos Condicionais simples Composta Encadeada. Programação Implementação

Leia mais

Computação. Introdução a C e Variáveis Inteiras

Computação. Introdução a C e Variáveis Inteiras Computação Eletrônica Introdução a C e Variáveis Inteiras O Computador RAM Dispositivo de Entrada (teclado) Unidade de Processamento (disco) CPU Dispositivo de Saída (monitor) O Computador A CPU (Central

Leia mais

Algoritmos: Conceitos Fundamentais. Slides de autoria de Rosely Sanches e Simone Senger de Souza

Algoritmos: Conceitos Fundamentais. Slides de autoria de Rosely Sanches e Simone Senger de Souza Algoritmos: Conceitos Fundamentais Slides de autoria de Rosely Sanches e Simone Senger de Souza DADOS E EXPRESSÕES Uso da Informação Computador manipula informações contidas em sua memória. Classificadas

Leia mais

Aula 05: Condicionais (Parte 2)

Aula 05: Condicionais (Parte 2) Aula 05: Condicionais (Parte 2) Introdução a Programação Túlio Toffolo & Puca Huachi http://www.toffolo.com.br BCC201 2018/2 Departamento de Computação UFOP Aula Anterior Breve Revisão Comandos de Decisão

Leia mais

Análise de Programação

Análise de Programação Análise de Programação Fundamentos da Linguagem de Programação Java Prof. Gilberto B. Oliveira Variáveis Atributos: Variáveis Declaradas fora de um método, sem o modificador static Variáveis membro ou

Leia mais