Você está na página 1de 110

5

Instruções
de controle:
parte 2

Copyright © 2006 by Pearson Education


OBJETIVOS
OBJETIVOS
Neste capítulo, você aprenderá:
 Os princípios básicos da repetição controlada por
contador.
 Como utilizar as instruções de repetição for e
do...while para executar instruções em um programa
repetidamente.
 A entender a seleção múltipla utilizando a instrução de
seleção switch.
 Como utilizar as instruções break e continue para
alterar o fluxo de controle.
 Como utilizar os operadores lógicos para formar
expressões condicionais complexas em instruções de
controle.
 A evitar as conseqüências de confundir os operadores
de igualdade com os operadores de atribuição.
2
Copyright © 2006 by Pearson Education
5.1 Introdução

• Continuação à discussão sobre programação


estruturada
– Introdução às estruturas de controle remanescentes do C+
+
• for, do…while, switch

3
Copyright © 2006 by Pearson Education
5.2 Princípios básicos de repetição
controlada por contador
• A repetição controlada por contador exige:
– Nome da variável de controle (contador de loop)
– Valor inicial da variável de controle
– Condição de continuação do loop que testa o valor final da
variável de controle
– Incremento/decremento da variável de controle de cada
iteração

4
Copyright © 2006 by Pearson Education
Resumo
fig05_01.cpp

O nome da variável de controle


é counter com uma
variável inicial de valor 1.

A condição testa o valor


final de counter.

Incrementa o valor
em counter.
5
Copyright © 2006 by Pearson Education
Erro comum de programação 5.1

Os valores de ponto flutuante são aproximados, portanto


controlar a contagem de loops com variáveis de ponto
flutuante pode gerar valores de contador imprecisos e
testes imprecisos para terminação.

6
Copyright © 2006 by Pearson Education
Dica de prevenção de erro 5.1

Controle a contagem do loop com valores de inteiro.

7
Copyright © 2006 by Pearson Education
Boa prática de programação 5.1

Coloque uma linha em branco antes e depois de cada


instrução de controle para destacá-la no programa.

8
Copyright © 2006 by Pearson Education
Boa prática de programação 5.2

Muitos níveis de aninhamento podem tornar um


programa difícil de entender. De modo geral, tente evitar o
uso de mais de três níveis de recuo.

9
Copyright © 2006 by Pearson Education
Boa prática de programação 5.3

O espaçamento vertical acima e abaixo de instruções de


controle e o recuo do corpo das instruções de controle
dentro dos cabeçalhos de instrução de controle dão aos
programas uma aparência bidimensional que melhora
significativamente a legibilidade.

10
Copyright © 2006 by Pearson Education
5.3 A instrução de repetição for

• A instrução de repetição for


– Detalha a repetição controlada por contador em uma única
linha de código.

11
Copyright © 2006 by Pearson Education
Resumo
fig05_02.cpp

Incremento de
counter.

O nome da variável de controle é A condição testa o valor


counter com o valor inicial 1. final de counter.

12
Copyright © 2006 by Pearson Education
Erro comum de programação 5.2

Utilizar um operador relacional incorreto ou um valor


final incorreto de um contador de loop na condição de
uma instrução while ou for pode causar erros off-by-
one.

13
Copyright © 2006 by Pearson Education
Fig. 5.3 | Componentes de cabeçalho de instrução for.

14
Copyright © 2006 by Pearson Education
Boa prática de programação 5.4
Utilizar o valor final na condição de uma instrução while ou for e
utilizar o operador <= relacional ajudará a evitar erros off-by-one.
Para um loop utilizado para imprimir os valores de 1 a 10, por
exemplo, a condição de continuação do loop deve ser counter <= 10
em vez de counter < 10 (que é um erro off-by-one) ou counter < 11
(que, porém, é correto). Muitos programadores preferem a chamada
contagem baseada em zero, em que, para contar 10 vezes pelo loop,
counter seria inicializado como zero e o teste de continuação do loop
seria counter < 10.

15
Copyright © 2006 by Pearson Education
5.3 A instrução de repetição for (cont.)

• Forma geral da instrução for


– for ( inicialização; condiçãoDeContinuaçãoDoLoop; incremento )
– instrução
• Normalmente, pode ser reescrita como:
– inicialização;
while ( condiçãoDeContinuaçãoDoLoop )
• {
instrução;
incremento;
}
• Se a variável de controle for declarada na
expressão inicialização
– Não será conhecida fora da instrução for. 16
Copyright © 2006 by Pearson Education
Erro comum de programação 5.3

Quando a variável de controle de uma instrução for é


declarada na seção de inicialização do cabeçalho de
instrução for, a utilização da variável de controle após
o corpo da instrução é um erro de compilação.

17
Copyright © 2006 by Pearson Education
Dica de portabilidade 5.1
No padrão C++, o escopo da variável de controle declarada na seção
de inicialização de uma instrução for difere do escopo em
compiladores C++ mais antigos. Em compiladores pré-padrão, o
escopo da variável de controle não termina no fim do bloco que define
o corpo da instrução for; em vez disso, o escopo termina no fim do
bloco que inclui a instrução for. O código C++ criado com
compiladores C++ pré-padrão pode quebrar quando compilado em
compiladores compatíveis com o padrão. Se você estiver trabalhando
com compiladores pré-padrão e quiser certificar-se de que seu código
funcionará com compiladores compatíveis com o padrão, há duas
estratégias de programação defensivas que você pode utilizar:
declarar as variáveis de controle com nomes diferentes em cada
instrução for, ou, se preferir utilizar o mesmo nome para a variável
de controle em várias instruções for, declarar a variável de controle
antes da primeira instrução for.

18
Copyright © 2006 by Pearson Education
Boa prática de programação 5.5

Coloque apenas expressões que envolvem as


variáveis de controle nas seções de inicialização e
incremento de uma instrução for. As manipulações
de outras variáveis devem aparecer antes do loop (se
tiverem de executar apenas uma vez, como as
instruções de inicialização) ou no corpo do loop (se
tiverem de executar uma vez por repetição, como as
instruções de incremento ou decremento).

19
Copyright © 2006 by Pearson Education
5.3 A instrução de repetição for (cont.)

• As expressões inicialização e incremento podem


ser listas de expressão separadas por vírgulas.
– Essas vírgulas são operadores vírgula
• O operador vírgula tem a menor precedência de todos os
operadores.
– As expressões são avaliadas da esquerda para a direita.
– O valor e o tipo da lista inteira são o valor e o tipo das
expressões mais à direita.

20
Copyright © 2006 by Pearson Education
Erro comum de programação 5.4

Utilizar vírgulas em vez de dois ponto-e-vírgulas


obrigatórios em um cabeçalho for é um erro de
sintaxe.

21
Copyright © 2006 by Pearson Education
Erro comum de programação 5.5

Colocar um ponto-e-vírgula imediatamente à direita do


parêntese direito de um cabeçalho for torna o corpo
dessa instrução for uma instrução vazia. Isso
normalmente é um erro de lógica.

22
Copyright © 2006 by Pearson Education
Observação de engenharia de
software 5.1
Costuma-se às vezes colocar ponto-e-vírgula logo
depois de um cabeçalho for para criar um loop
chamado loop de retardo. Esse loop for com um
corpo vazio ainda assim realiza o loop pelo número
indicado de vezes, não fazendo nada além de contar.
Por exemplo, seria possível utilizar um loop de retardo
para tornar lento um programa que está produzindo
saídas na tela rápido demais para serem lidas. Mas
cuidado, porque um retardo assim pode variar entre
sistemas com diferentes velocidades de processador.

23
Copyright © 2006 by Pearson Education
Dica de prevenção de erro 5.2

Embora o valor da variável de controle possa ser alterado


no corpo de uma instrução for, evite fazê-lo porque isso
pode provocar erros de lógica.

24
Copyright © 2006 by Pearson Education
Fig. 5.4 | Diagrama de atividades UML para a instrução for na Figura 5.2.

25
Copyright © 2006 by Pearson Education
5.4 Exemplos com a estrutura for
• Exemplos de instrução for
– Altere a variável de controle de 1 a 100 em incrementos de 1.
– for ( int i = 1; i <= 100; i++ )
– Altere a variável de controle de 100 para baixo até 1 em incrementos de –
1 (isto é, decrementos de 1).
– for ( int i = 100; i >= 1; i-- )
– Altere a variável de controle de 7 a 77 em passos de 7.
– for ( int i = 7; i <= 77; i += 7 )
– Altere a variável de controle de 20 para baixo até 2 em passos de –2.
– for ( int i = 20; i >= 2; i -= 2 )
– Altere a variável de controle sobre a seguinte seqüência de valores: 2, 5, 8,
11, 14, 17, 20.
– for ( int i = 2; i <= 20; i += 3 )
– Altere a variável de controle sobre a seguinte seqüência de valores: 99, 88,
77, 66, 55, 44, 33, 22, 11, 0.
– for ( int i = 99; i >= 0; i -= 11 ) 26
Copyright © 2006 by Pearson Education
Erro comum de programação 5.6

Não utilizar o operador relacional adequado na condição


de continuação do loop de um loop que conta para baixo
(como utilizar incorretamente i <= 1 em vez de i >= 1 em
um loop que conta para baixo até 1) é normalmente um
erro de lógica que gera resultados incorretos quando o
programa é executado.

27
Copyright © 2006 by Pearson Education
Resumo
fig05_05.cpp

Altera o número de 2
para 20 em
incrementos de 2.

Adiciona o valor atual


de number ao total.

28
Copyright © 2006 by Pearson Education
5.4 Exemplos com a estrutura for (cont.)

• Usando uma lista de expressões separadas por


vírgula
– As linhas 12-13 da Fig. 5.5 podem ser reescritas da seguinte
forma:
– for ( int number = 2; // inicialização
number <= 20; // condição de continuação do
loop
total += number, number += 2 ) // total e
// incremento
– ; // corpo vazio

29
Copyright © 2006 by Pearson Education
Boa prática de programação 5.6

Embora as instruções que precedem um for e as


instruções no corpo de um for possam ser
freqüentemente fundidas no cabeçalho for, isso pode
tornar o programa mais difícil de ler, manter, modificar e
depurar.

30
Copyright © 2006 by Pearson Education
Boa prática de programação 5.7

Limite o tamanho dos cabeçalhos da instrução de controle


a uma única linha, se possível.

31
Copyright © 2006 by Pearson Education
5.4 Exemplos com a estrutura for (cont.)

• Função de biblioteca-padrão std::pow


– Calcula um expoente
– Exemplo
• pow( x, y )
– Calcula o valor de x elevado à yésima potência.
– Exige o arquivo de cabeçalho <cmath>.

32
Copyright © 2006 by Pearson Education
Resumo
fig05_06.cpp
(1 de 2)

O manipulador de fluxo setw


configurará a largura de campo.

Função de biblioteca-padrão
pow (no arquivo de
cabeçalho <cmath>)

C++ trata os valores


de ponto flutuante
como tipo double.

Especifica que o resultado do valor


seguinte deve aparecer em uma
largura de campo de 21.

33
Copyright © 2006 by Pearson Education
Resumo
fig05_06.cpp
(2 de 2)

Calcula o valor
dentro da instrução
for.

Usa o manipulador de fluxo


setw para configurar a
largura de campo.

34
Copyright © 2006 by Pearson Education
Erro comum de programação 5.7

Em geral, esquecer de incluir o arquivo de cabeçalho


apropriado ao utilizar funções de biblioteca-padrão (por
exemplo, <cmath> em um programa que utiliza funções
de biblioteca de matemática) é um erro de compilação.

35
Copyright © 2006 by Pearson Education
Boa prática de programação 5.8
Não utilize variáveis de tipo float ou double para
realizar cálculos monetários. A imprecisão de números de
ponto flutuante pode causar erros que resultam em
valores monetários incorretos. Nos Exercícios, exploramos
o uso de inteiros para realizar cálculos monetários. [Nota:
Alguns fornecedores independentes vendem bibliotecas de
classes C++ que realizam cálculos monetários precisos.
Incluímos vários URLs no Apêndice I.]

36
Copyright © 2006 by Pearson Education
5.4 Exemplos com a estrutura for (cont.)

• Formantando saída numéricas


– Manipulador de fluxo setw
• Configura a largura de campo
– É alinhado à direita por padrão.
• Manipulador de fluxo left para alinhar à esquerda
• Manipulador de fluxo right para alinhar à direita
• Aplica-se apenas ao valor de saída seguinte.
– Manipuladores de fluxo fixed e setprecision
• Configurações aderentes
– Têm efeito até que sejam alteradas.

37
Copyright © 2006 by Pearson Education
Dica de desempenho 5.1

Evite colocar expressões cujos valores não mudam dentro


dos loops — contudo, mesmo se colocá-las, muitos dos
sofisticados compiladores modernos de otimização
colocarão automaticamente essas expressões fora dos
loops no código de linguagem de máquina gerado.

38
Copyright © 2006 by Pearson Education
Dica de desempenho 5.2

Muitos compiladores contêm recursos de otimização que


aprimoram o desempenho do código que você escreve,
mas ainda assim é melhor escrever corretamente o código
desde o início.

39
Copyright © 2006 by Pearson Education
5.5 Instrução de repetição do…while

• Instrução do…while
– Semelhante à instrução while.
– Testa a continuação de loop depois de executar o corpo do
loop.
• O corpo do loop sempre é executado pelo menos uma vez.

40
Copyright © 2006 by Pearson Education
Boa prática de programação 5.9

Incluir sempre as chaves em uma instrução


do...while ajuda a eliminar a ambigüidade entre a
instrução while e a instrução do...
while contendo uma instrução.

41
Copyright © 2006 by Pearson Education
Resumo
fig05_07.cpp

Declara e inicializa a variável


de controle counter.

O loop do…while exibe o


valor de counter antes de
testar o valor final de counter.

42
Copyright © 2006 by Pearson Education
Fig. 5.8 | O diagrama de atividades UML para a instrução de repetição do...while da
Figura 5.7.

43
Copyright © 2006 by Pearson Education
5.6 A estrutura de seleção múltipla switch

• Instrução switch
– É usada para seleções múltiplas.
– Testa uma variável ou expressão.
• É comparada com expressões inteiras constantes para
determinar a ação a ser executada.
• Qualquer combinação de constantes de caractere e
constantes inteiras que são avaliadas como um valor
constante inteiro.

44
Copyright © 2006 by Pearson Education
Resumo
fig05_09.cpp

Variável de contador para


cada categoria de nota.

45
Copyright © 2006 by Pearson Education
Resumo
fig05_10.cpp
(1 de 5)

Inicializa cada variável


de contador em 0.

46
Copyright © 2006 by Pearson Education
Resumo
fig05_10.cpp
(2 de 5)

47
Copyright © 2006 by Pearson Education
Resumo
fig05_10.cpp
(3 de 5)

A condição de loop usa a função


cin.get para determinar se há
mais dados para entrar.

grade é a expressão de controle.

A instrução switch determina que


rótulo case deve executar,
dependendo da expressão de controle.

Rótulos case para uma nota A.

A instrução break transfere o


controle para depois do fim da
instrução switch.
48
Copyright © 2006 by Pearson Education
Resumo
fig05_10.cpp
(4 de 5)

Ignorar caracteres de espaço em branco


não exibe uma mensagem de erro.

Caso default para uma


letra de nota inválida.

49
Copyright © 2006 by Pearson Education
Resumo
fig05_10.cpp
(5 de 5)

50
Copyright © 2006 by Pearson Education
5.6 A estrutura de seleção múltipla switch
(cont.)
• Lendo a entrada de caracteres
– Função cin.get()
• Lê um caractere do teclado.
– Valor inteiro de um caractere
• static_cast< int >( character )
– Conjunto de caracteres ASCII
• Tabela de caracteres e seus equivalentes decimais.
– EOF
• <ctrl> d no UNIX/Linux
• <ctrl> z no Windows

51
Copyright © 2006 by Pearson Education
Dica de portabilidade 5.2

As combinações de teclas pressionadas para inserir o fim


do arquivo dependem do sistema.

52
Copyright © 2006 by Pearson Education
Dica de portabilidade 5.3

Testar a constante simbólica EOF em vez de –1 torna os


programas mais portáveis. O padrão ANSI/ISO C, a partir
do qual o C++ adota a definição de EOF, declara que EOF é
um valor inteiro negativo (mas não necessariamente –1),
então EOF poderia ter diferentes valores em sistemas
diferentes.

53
Copyright © 2006 by Pearson Education
5.6 A estrutura de seleção múltipla switch
(cont.)
• Instrução switch
– Expressão de controle
• Expressão entre parênteses após a palavra-chave switch.
– Rótulos case
• Comparados com a expressão de controle.
• As instruções após o rótulo case correspondente são
executadas.
– Em um rótulo case, não é necessário colocar as
múltiplas instruções entre chaves.
– A instrução break faz com que a execução prossiga
com a primeira instrução após switch.
• Sem uma instrução break, a execução falha no
rótulo case seguinte.
54
Copyright © 2006 by Pearson Education
5.6 A estrutura de seleção múltipla switch
(cont.)
• Instrução switch (cont.)
– Caso default
• Executa se nenhum case correspondente for encontrado.
• É opcional.
– Se não houver correspondência e nenhum caso
default
• O controle simplesmente continua após switch.

55
Copyright © 2006 by Pearson Education
Erro comum de programação 5.8

Esquecer uma instrução break quando ela for necessária


em uma instrução switch é um erro de lógica.

56
Copyright © 2006 by Pearson Education
Erro comum de programação 5.9

Omitir o espaço entre a palavra case e o valor inteiro que


está sendo testado em uma instrução switch pode
causar um erro de lógica. Por exemplo, escrever case3:
em vez de case 3: simplesmente cria um rótulo não
utilizado. Falaremos mais sobre isso no Apêndice E,
“Tópicos do código legado C”. Nessa situação, a instrução
switch não realizará as ações apropriadas quando a
expressão de controle de switch tiver um valor de 3.

57
Copyright © 2006 by Pearson Education
Boa prática de programação 5.10
Forneça um caso default em instruções switch. Os
casos não explicitamente testados em uma instrução
switch sem um caso default são ignorados. Incluir um
caso default chama a atenção do programador para a
necessidade de processar condições excepcionais. Há
situações em que nenhum processamento default é
necessário. Embora as cláusulas case e default em uma
instrução switch possam ocorrer em qualquer ordem, é
comum colocar a cláusula default por último.

58
Copyright © 2006 by Pearson Education
Boa prática de programação 5.11

Em uma instrução switch que lista a cláusula


default por último, a cláusula default não requer
uma instrução break. Alguns programadores incluem
esse break para clareza e simetria com outros casos.

59
Copyright © 2006 by Pearson Education
Erro comum de programação 5.10

Não processar a nova linha e outros caracteres de espaço


em branco na entrada ao ler caracteres individualmente
(um caractere por vez) pode causar erros de lógica.

60
Copyright © 2006 by Pearson Education
Resumo
fig05_11.cpp
(1 de 2)

61
Copyright © 2006 by Pearson Education
Resumo
fig05_11.cpp
(2 de 2)

Uma mensagem de erro


é mostrada em resposta
a uma nota inválida.

62
Copyright © 2006 by Pearson Education
Erro comum de programação 5.11

Especificar uma expressão incluindo variáveis (por


exemplo, a + b) no rótulo case de uma instrução
switch é um erro de sintaxe.

63
Copyright © 2006 by Pearson Education
Fig. 5.12 | Diagrama de atividades UML de instrução de seleção múltipla switch com
instruções break.

64
Copyright © 2006 by Pearson Education
Erro comum de programação 5.12

Fornecer rótulos case idênticos em uma instrução


switch é um erro de compilação. Fornecer rótulos
case que contenham expressões diferentes e são
avaliadas como o mesmo valor também é um erro de
compilação. Por exemplo, colocar case 4 + 1: e
case 3 + 2: na mesma instrução switch é um
erro de compilação, porque ambos são equivalentes ao
case 5:.

65
Copyright © 2006 by Pearson Education
5.6 A estrutura de seleção múltipla switch
(cont.)
• Tipos de dados de inteiros
– short
• Abreviação de short int
• O intervalo mínimo é –32,768 a 32,767
– long
• Abreviação de long int
• O intervalo mínimo é –2,147,483,648 a 2,147,483,647
– int
• Equivalente a short ou long na maioria dos computadores.
– char
• Pode ser utilizado para representar inteiros menores.

66
Copyright © 2006 by Pearson Education
Dica de portabilidade 5.4

Como ints podem variar de tamanho entre sistemas,


utilize inteiros long se espera processar inteiros fora do
intervalo de –32.768 a 32.767 e quiser executar o
programa em diferentes sistemas de computador.

67
Copyright © 2006 by Pearson Education
Dica de desempenho 5.3

Se a memória for muito cara, talvez seja desejável utilizar


tamanhos de inteiro menores.

68
Copyright © 2006 by Pearson Education
Dica de desempenho 5.4

Utilizar tamanhos menores de inteiro pode resultar em


um programa mais lento se as instruções de máquina
para manipulá-los não forem tão eficientes quanto
aquelas para os inteiros de tamanho natural, isto é,
inteiros cujo tamanho é igual ao tamanho de palavra da
máquina (por exemplo, de 32 bits em uma máquina de
32 bits, de 64 bits em uma máquina de 64 bits). Sempre
teste ‘atualizações’ de eficiência propostas para
confirmar se de fato melhoram o desempenho.

69
Copyright © 2006 by Pearson Education
5.7 Instruções break e continue

• Instruções break/continue
– Alteram o fluxo do controle.
• Instrução break
– Faz com que o controle saia imediatamente da estrutura de
controle.
– Usada nas instruções while, for, do…while ou switch.
• Instrução continue
– Salta as instruções restantes em um corpo de loop.
• Prossegue para o incremento e teste de condição nos loops for.
• Prossegue para o teste de condição nos loops while/do…while.
– Posteriormente, executa a iteração seguinte (se não estiver
terminando).
– Usada nas instruções while, for ou do…while.
70
Copyright © 2006 by Pearson Education
Resumo
fig05_13.cpp

Executa o loop 10 vezes.

Sai da instrução for (com break)


quando count é igual a 5.

71
Copyright © 2006 by Pearson Education
Resumo
fig05_14.cpp

Executa o loop 10 vezes.

Pula a linha 14 e prossegue para a


linha 9 quando count é igual a 5.

72
Copyright © 2006 by Pearson Education
Boa prática de programação 5.12

Para alguns programadores, break e continue


violam a programação estruturada. Os efeitos dessas
instruções podem ser alcançados por técnicas de
programação estruturada que logo aprenderemos;
portanto, esses programadores não utilizam break e
continue. Para a maioria dos programadores, o uso
de break em instruções switch é aceitável.

73
Copyright © 2006 by Pearson Education
Dica de desempenho 5.5

As instruções break e continue, quando utilizadas


adequadamente, desempenham mais rapidamente que
as técnicas estruturadas correspondentes.

74
Copyright © 2006 by Pearson Education
Observação de engenharia de
software 5.2
Há uma tensão entre conseguir uma engenharia de
software de qualidade e conseguir o software de melhor
desempenho. Em geral, um objetivo é alcançado à
custa do outro. Para todas as situações, exceto as de
desempenho muito alto, aplique a seguinte regra:
primeiro, faça com que seu código seja simples e
preciso; então, faça com que se torne rápido e menor,
mas apenas se necessário.

75
Copyright © 2006 by Pearson Education
5.8 Operadores lógicos

• Operadores lógicos
– Permitem formar condições mais complexas.
• Combinam condições simples com condições complexas.
• Operadores lógicos C++
– && (E lógico)
– || (OU lógico)
– ! (NÃO lógico)

76
Copyright © 2006 by Pearson Education
5.8 Operadores lógicos (cont.)

• Operador lógico E (&&)


– Considere a instrução if seguinte
• if ( gender == 1 && age >= 65 )
• seniorFemales++;
– A condição combinada será true
• Se e somente se ambas as condições simples forem true.
– A condição combinada será false
• Se uma ou ambas as condições simples forem false.

77
Copyright © 2006 by Pearson Education
Erro comum de programação 5.13

Embora 3 < x < 7 seja uma condição matematicamente


correta, não é avaliada como você talvez imagine em C++.
Utilize ( 3 < x && x < 7 ) para obter a avaliação adequada
em C++.

78
Copyright © 2006 by Pearson Education
Fig. 5.15 | Tabela-verdade do operador && (E lógico).

79
Copyright © 2006 by Pearson Education
5.8 Operadores lógicos (cont.)

• Operador lógico OU (||)


– Considere a seguinte instrução if
• if ( ( semesterAverage >= 90 ) ||
( finalExam >= 90 )
• cout << “Student grade is A” << endl;
– A condição combinada será true
• Se uma ou ambas as condições simples forem true.
– A condição combinada será false
• Se ambas as condições simples forem false.

80
Copyright © 2006 by Pearson Education
Fig. 5.16 | Tabela-verdade do operador || (OU lógico).

81
Copyright © 2006 by Pearson Education
5.8 Operadores lógicos (cont.)

• Avaliação de curto-circuito de condições


complexas
– As partes de uma expressão contendo operadores && ou ||
são avaliadas apenas até que se confirme se a condição é
verdadeira ou falsa.
– Exemplo
• ( gender == 1 ) && ( age >= 65 )
– Pára imediatamente se gender não for igual a 1.
• Visto que o lado esquerdo é false, toda a expressão
tem de ser false.

82
Copyright © 2006 by Pearson Education
Dica de desempenho 5.6

Em expressões que utilizam o operador &&, se as


condições separadas forem independentes uma da outra,
torne a condição mais provável de ser false a condição
mais à esquerda. Em expressões utilizando o operador ||,
torne a condição mais provável de ser true a condição
mais à esquerda. Esse tipo de avaliação em curto-circuito
pode reduzir o tempo de execução de um programa.

83
Copyright © 2006 by Pearson Education
5.8 Operadores lógicos (cont.)

• Operador de negação (!)


– Operador unário
– Retorna true quando seu operando é false, e vice-versa.
– Exemplo
• if ( !( grade == sentinelValue ) )
cout << "The next grade is " << grade <<
endl;
é equivalente a:
if ( grade != sentinelValue )
cout << "The next grade is " << grade <<
endl;
• Manipulador de fluxo boolalpha
– Exibe expressões bool em palavras, ‘true’ ou ‘false’.

84
Copyright © 2006 by Pearson Education
Fig. 5.17 | Tabela-verdade do operador ! (negação lógica).

85
Copyright © 2006 by Pearson Education
Resumo
fig05_18.cpp
O manipulador de fluxo boolalpha (1 de 2)
faz com que valores bool sejam
exibidos como ‘true’ ou ‘false’.

Usa o manipulador de fluxo


boolalpha em cout.

Cria a tabela-verdade para o


operador lógico E.

Cria a tabela-verdade para o


operador lógico OU.

Cria a tabela-verdade para o


operador lógico NÃO.

86
Copyright © 2006 by Pearson Education
Resumo
fig05_18.cpp
(2 de 2)

87
Copyright © 2006 by Pearson Education
Fig. 5.19 | Precedência e associatividade de operadores.

88
Copyright © 2006 by Pearson Education
5.9 Confundindo operadores de igualdade
(==) com operadores de atribuição (=)
• Troca acidental dos operadores == (igualdade) e
= (atribuição)
– Erro comum
• As instruções de atribuição produzem um valor (o valor a ser
atribuído).
• As expressões que tiverem um valor podem ser usadas para
decisão
– Zero = false, não-zero = true
– Em geral, não provoca erros de sintaxe.
• Alguns compiladores emitem um aviso quando = é utilizado
em um contexto em que normalmente se usaria ==

89
Copyright © 2006 by Pearson Education
5.9 Confundindo operadores de igualdade
(==) com operadores de atribuição (=) (cont.)
• Exemplo
• if ( payCode == 4 )
• cout << "You get a bonus!" << endl;
– Se paycode for 4, o bônus é concedido.
• Se == fosse substituído por =
• if ( payCode = 4 )
cout << "You get a bonus!" << endl;
– paycode é configurado como 4 (independentemente do
valor anterior).
– A condição é true (desde que 4 seja não-zero).
• O bônus é concedido em qualquer caso.

90
Copyright © 2006 by Pearson Education
Erro comum de programação 5.14

O uso do operador == para atribuição e do operador =


para igualdade constitui erro de lógica.

91
Copyright © 2006 by Pearson Education
Dica de prevenção de erro 5.3
Normalmente, os programadores escrevem condições
como x == 7 com o nome da variável à esquerda e a
constante à direita. Invertendo, para que a constante
esteja à esquerda e o nome da variável à direita, como em
7 == x, o programador que acidentalmente substituir o
operador == por = será protegido pelo compilador. O
compilador trata isso como um erro de compilação,
porque você não pode alterar o valor de uma constante.
Isso evitará a possibilidade de devastação de um erro de
lógica em tempo de execução.

92
Copyright © 2006 by Pearson Education
5.9 Confundindo operadores de igualdade
(==) com operadores de atribuição (=) (cont.)
• Lvalues
– Expressões que podem aparecer no lado esquerdo da
equação.
– Podem ser alteradas (isto é, são variáveis)
• x = 4;
• Rvalues
– Aparecem apenas no lado direito da equação.
– São constantes, como números (isto é, não é possível
escrever 4 = x;).
• É possível usar lvalues como rvalues, mas não o
inverso.
93
Copyright © 2006 by Pearson Education
Dica de prevenção de erro 5.4

Utilize seu editor de textos para procurar todas as


ocorrências de = no programa e confirme se você está
utilizando corretamente o operador de atribuição ou
operador lógico nos devidos lugares.

94
Copyright © 2006 by Pearson Education
5.10 Resumo de programação estruturada

• Programação estruturada
– Produz programas fáceis de compreender, testar, depurar e
modificar.
• Regras de programação estruturada
– Use apenas estruturas de controle de entrada única/saída
única.
– Regras (Fig. 5.21)
• A regra 2 é a regra de empilhamento.
• A regra 3 é a regra de aninhamento.

95
Copyright © 2006 by Pearson Education
Fig. 5.20 | As instruções de seqüência de entrada única/saída única, seleção e repetição
do C++.

96
Copyright © 2006 by Pearson Education
Fig. 5.21 | As regras para formar programas estruturados.

97
Copyright © 2006 by Pearson Education
Fig. 5.22 | Diagrama de atividades mais simples.

98
Copyright © 2006 by Pearson Education
Fig. 5.23 | Aplicando repetidamente a Regra 2 da Figura 5.21 ao mais simples diagrama
de atividades.

99
Copyright © 2006 by Pearson Education
Fig. 5.24 | Aplicando várias vezes a Regra 3 da Figura 5.21 ao mais simples diagrama de
atividades.

100
Copyright © 2006 by Pearson Education
5.10 Resumo de programação estruturada
(cont.)
• Estrutura de seqüência
– ‘Incorporada’ ao C++
• Estrutura de seleção
– if, if…else e switch
• Estrutura de repetição
– while, do…while e for

101
Copyright © 2006 by Pearson Education
Fig. 5.25 | O diagrama de atividades com sintaxe inválida.

102
Copyright © 2006 by Pearson Education
5.11 Estudo de caso de engenharia de software:
identificando estados e atividades dos objetos no
sistema ATM (opcional)
• Diagramas de estados de máquina
– Normalmente chamados de diagramas de estados.
– Modelam vários estados de um objeto.
• Mostram em que circunstâncias o objeto muda de estado.
• Focalizam o comportamento do sistema.
– Representação UML
• Estado inicial
– Círculo sólido
• Estado
– Retângulo arredondado
• Transições
– Setas

103
Copyright © 2006 by Pearson Education
Fig. 5.26 | Diagrama de estados do objeto ATM.

104
Copyright © 2006 by Pearson Education
Observação de engenharia de
software 5.3
Em geral, os engenheiros de software não criam
diagramas de estados que mostram cada estado possível e
transição de estado para todos os atributos —
simplesmente, existem muitos. Os diagramas de estados
em geral mostram apenas os estados e transições de estado
mais importantes ou complexos.

105
Copyright © 2006 by Pearson Education
5.11 Estudo de caso de engenharia de software:
identificando estados e atividades dos objetos no
sistema ATM (opcional)
• Diagramas de atividades
– Focalizam o comportamento do sistema.
– Modelam o fluxo de trabalho de um objeto durante a
execução do programa.
• As ações a serem executadas pelo objeto e a ordem em que
serão executadas.
– Representação UML
• Estado inicial
– Círculo sólido
• Estado de ação
– Retângulo com os lados encurvados para fora
• Ordem da ação
– Seta
• Estado final
– Círculo sólido dentro de um círculo vazado 106
Copyright © 2006 by Pearson Education
Fig. 5.27 | Diagrama de atividades de uma transação BalanceInquiry.

107
Copyright © 2006 by Pearson Education
Fig. 5.28 | Diagrama de atividades de uma transação Withdrawal.

108
Copyright © 2006 by Pearson Education
Fig. 5.29 | Diagrama de atividades de uma transação Deposit.

109
Copyright © 2006 by Pearson Education
Para fazer em trios de até 3: 5.6, 5.7, 5.8, 5.9, 5.17,
5.26

110
Copyright © 2006 by Pearson Education

Você também pode gostar