Você está na página 1de 112

4

Instruções de
controle:
parte 1

Copyright © 2006 by Pearson Education


OBJETIVOS
OBJETIVOS
Neste capítulo, você aprenderá:
 Técnicas básicas para solução de problemas.
 A desenvolver algoritmos por meio do processo de
refinamento passo a passo de cima para baixo.
 A utilizar as instruções de seleção if e if...else para
escolher entre ações alternativas.
 A utilizar a instrução de repetição while para executar
instruções em um programa repetidamente.
 Repetição controlada por contador e repetição
controlada por sentinela.
 Como utilizar os operadores de incremento,
decremento e atribuição.

2
Copyright © 2006 by Pearson Education
4.1 Introdução
• Antes de escrever um programa
– Tente compreender integralmente o problema.
– Planeje cuidadosamente a abordagem que adotará para
resolvê-lo.
• Enquanto estiver escrevendo um programa
– Procure saber que ‘blocos de construção’ estão disponíveis.
– Utilize princípios de programação adequados.

3
Copyright © 2006 by Pearson Education
4.2 Algoritmos
• Algoritmos
– Ações a serem executadas.
– Ordem segundo a qual essas ações serão executadas.
• Controle do programa
– Especifica a ordem segundo a qual as ações serão
executadas em um programa.
– Executado no C++ com instruções de controle.

4
Copyright © 2006 by Pearson Education
4.3 Pseudocódigo
• Pseudocódigo
– Linguagem artificial e informal utilizada para desenvolver
algoritmos
• Usada para conceber um programa antes de escrevê-lo em
uma linguagem de programação.
– É fácil de ser convertida em um programa C++.
– Semelhante à língua cotidiana
• Descreve apenas instruções executáveis.
– Não há necessidade de declarar variáveis.
– Não é executado em computadores.

5
Copyright © 2006 by Pearson Education
Fig. 4.1 | Pseudocódigo para o programa de adição da Figura 2.5.

6
Copyright © 2006 by Pearson Education
4.4 Estruturas de controle
• Execução seqüencial
– As instruções são executadas em ordem seqüencial.
• Transferência de controle
– A instrução seguinte a ser executada não é a instrução
seguinte na seqüência.
• Programação estruturada
– As instruções goto são eliminadas.

7
Copyright © 2006 by Pearson Education
4.4 Estrutura de controle (cont.)
• São necessárias apenas três estruturas de controle.
– Não há instruções goto.
– Isso foi demonstrado por Böhm e Jacopini.
– Três estruturas de controle
• Estrutura de seqüência
– Os programas são executados seqüencialmente por
padrão.
• Estruturas de seleção
– if, if…else, switch
• Estruturas de repetição
– while, do…while, for

8
Copyright © 2006 by Pearson Education
4.4 Estruturas de controle (cont.)
• Diagrama de atividades UML
– Modela o fluxo de trabalho
• Símbolos de estado de ação
– Retângulos com as laterais encurvadas.
• Círculos pequenos
– O círculo sólido é o estado inicial.
– O círculo sólido cercado por um círculo vazio é o estado
final.
– Setas de transição: representam o fluxo da atividade.
• Notas comentadas
– São conectadas ao diagrama por linhas pontilhadas.

9
Copyright © 2006 by Pearson Education
Fig. 4.2 | Diagrama de atividades da estrutura de seqüência.

10
Copyright © 2006 by Pearson Education
4.4 Estruturas de controle (cont.)

• Instruções de controle de entrada única/saída


única
– Três tipos de instruções de controle
• Instrução de seqüência
• Instruções de seleção
• Instruções de repetição
– As instruções combinam-se de duas maneiras
• Empilhamento de instruções de controle
– Conecta a extremidade de saída de uma instrução à
extremidade de entrada da instrução seguinte.
• Aninhamento de instruções de controle

11
Copyright © 2006 by Pearson Education
Fig. 4.3 | Palavras-chave do C++.

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

Usar uma palavra-chave como um identificador é um


erro de sintaxe.

13
Copyright © 2006 by Pearson Education
Erro comum de programação 4.2

Escrever uma palavra-chave com alguma letra maiúscula


é um erro de sintaxe. Todas as palavras-chave do C++
têm apenas letras minúsculas.

14
Copyright © 2006 by Pearson Education
Observação de engenharia de
software 4.1
Qualquer programa C++ que criemos pode ser
construído com base, unicamente, em sete tipos diferentes
de instrução de controle (seqüência, if, if...else,
switch, while, do...while e for), combinados
de duas maneiras apenas (empilhamento de instruções de
controle e aninhamento de instruções de controle).

15
Copyright © 2006 by Pearson Education
4.5 Instrução de seleção if
• Instruções de seleção
– Utilizadas para escolher entre cursos de ação alternativos.
– Exemplo de pseudocódigo
• Se a nota do aluno for maior que ou igual a 60
– Imprima “Passed”
– Se a condição for true
• A instrução de impressão será executada e o programa
atende à instrução seguinte do programa.
– Se a condição for false
• A instrução de impressão será ignorada e o programa
continuará.
– O recuo facilita a leitura dos programas.
• O C++ ignora caracteres de espaço em branco.
16
Copyright © 2006 by Pearson Education
4.5 Instrução de seleção if (cont.)
• Instruções de seleção (cont.)
– Tradução para C++
• if ( grade >= 60 )
cout << "Passed";
– Qualquer expressão pode ser usada como condição.
• Se for considerada falsa, será tratada como falsa.
• O símbolo de losango na modelagem UML
– Indica que uma decisão deve ser tomada.
– Contém condições de guarda
• Condição de teste
• Seguem o caminho correto

17
Copyright © 2006 by Pearson Education
Boa prática de programação 4.1

Aplicar consistentemente convenções razoáveis de


recuo ao longo de todos os seus programas melhora
significativamente a legibilidade do programa.
Sugerimos três espaços por recuo. Algumas pessoas
preferem utilizar tabulações, mas elas podem variar
de um editor para outro, o que faz com que um
programa escrito em um editor seja alinhado
diferentemente quando utilizado com outro.

18
Copyright © 2006 by Pearson Education
Fig. 4.4 | Diagrama de atividades de uma instrução de seleção única if.

19
Copyright © 2006 by Pearson Education
Dica de portabilidade 4.1

Para compatibilidade com versões anteriores do C, que


utilizavam inteiros para valores booleanos, o valor bool
true também pode ser representado por qualquer
valor não-zero (compiladores normalmente utilizam 1) e
o valor bool false também pode ser representado
como o valor zero.

20
Copyright © 2006 by Pearson Education
4.6 A instrução de seleção dupla if…
else
• if
– Executa uma ação se a condição for verdadeira.
• if…else
– Executa uma ação se a condição for verdadeira e uma ação
diferente se for falsa.
• Pseudocódigo
– Se a nota do aluno for maior ou igual a 60
imprima “Passed”
Caso contrário
imprima “Failed”
• Código C++
– if ( grade >= 60 )
cout << "Passed";
else
cout << "Failed";
21
Copyright © 2006 by Pearson Education
Boa prática de programação 4.2

Recue as duas instruções do corpo de uma instrução


if... else.

22
Copyright © 2006 by Pearson Education
Boa prática de programação 4.3

Se houver vários níveis de recuo, cada nível deverá ser


recuado com o mesmo valor adicional de espaço.

23
Copyright © 2006 by Pearson Education
Fig. 4.5 | Diagrama de atividades de uma instrução de seleção dupla if...else.

24
Copyright © 2006 by Pearson Education
4.6 A instrução de seleção dupla if…
else (cont.)
• Operador condicional ternário (?:)
– Três argumentos (condição, valor se true, valor se
false)
• O código poderia ser assim escrito:
– cout << ( grade >= 60 ? “Passed” : “Failed” );

Condição Valor se Valor se falsa


verdadeira

25
Copyright © 2006 by Pearson Education
Dica de prevenção de erro 4.1

Para evitar problemas de precedência (e por clareza),


coloque as expressões condicionais (que aparecem em
expressões maiores) entre parênteses.

26
Copyright © 2006 by Pearson Education
4.6 A instrução de seleção dupla if…
else (cont.)
• Instruções if…else aninhadas
– Uma dentro da outra, testam múltiplos casos.
– Quando uma condição é atendida, outras instruções são saltadas.
– Exemplo
– Se a nota do aluno for maior que ou igual a 90
– Imprima “A”
– Caso contrário
Se a nota do aluno for maior que ou igual a 80
Imprima “B”
– Caso contrário
Se a nota do aluno for maior que ou igual a 70
Imprima “C”
Caso contrário
Se a nota do aluno for maior que ou igual a 60
Imprima “D”
Caso contrário
• Imprima “F”
27
Copyright © 2006 by Pearson Education
4.6 A instrução de seleção dupla if…
else (cont.)
• Instruções if…else aninhadas (cont.)
– Escritas em C++
• if ( studentGrade >= 90 )
cout << "A";
else
if (studentGrade >= 80 )
cout << "B";
else
if (studentGrade >= 70 )
cout << "C";
else
if ( studentGrade >= 60 )
cout << "D";
else
cout << "F";

28
Copyright © 2006 by Pearson Education
4.6 A instrução de seleção dupla if…
else (cont.)
• Instruções if…else aninhadas (cont.)
– Escritas em C++ (recuadas diferentemente)
• if ( studentGrade >= 90 )
cout << "A";
else if (studentGrade >= 80 )
cout << "B";
else if (studentGrade >= 70 )
cout << "C";
else if ( studentGrade >= 60 )
cout << "D";
else
cout << "F";

29
Copyright © 2006 by Pearson Education
Dica de desempenho 4.1

Uma instrução if...else aninhada pode ser


executada muito mais rapidamente que uma série de
instruções if de seleção única por causa da
possibilidade de saída prévia depois que uma das
condições é satisfeita.

30
Copyright © 2006 by Pearson Education
Dica de desempenho 4.2

Em uma instrução if...else aninhada, teste as


condições com maior probabilidade de serem true no
começo da instrução if...else aninhada. Isso
permitirá que a instrução if...else aninhada seja
executada mais rapidamente e saia mais cedo, do que
se testar primeiro os casos que ocorrem raramente.

31
Copyright © 2006 by Pearson Education
4.6 A instrução de seleção dupla if…
else (cont.)
• O problema do else oscilante
– O compilador associa else com o if imediatamente
precedente.
– Exemplo
• if ( x > 5 )
if ( y > 5 )
cout << "x and y are > 5";
else
cout << "x is <= 5";
– O compilador interpreta isso como
• if ( x > 5 )
if ( y > 5 )
cout << "x and y are > 5";
else
cout << "x is <= 5";
32
Copyright © 2006 by Pearson Education
4.6 A instrução de seleção dupla if…
else (cont.)
• O problema do else oscilante (cont.)
– Reescreva a instrução com chaves ({})
• if ( x > 5 )
{
if ( y > 5 )
cout << "x and y are > 5";
}
else
cout << "x is <= 5";
– As chaves indicam que a segunda instrução if está no corpo
da primeira e else é então associada à primeira instrução
if.

33
Copyright © 2006 by Pearson Education
4.6 A instrução de seleção dupla if…
else (cont.)
• Instrução composto
– Também chamada de bloco
• É um conjunto de instruções entre chaves.
• Usada para incluir múltiplas instruções em um corpo if.
– Exemplo
• if ( studentGrade >= 60 )
cout << "Passed.\n";
else
{
cout << "Failed.\n";
cout << "You must take this course again.\n";
}
– Sem as chaves,
– cout << "You must take this course again.\n";
– sempre é executada.
34
Copyright © 2006 by Pearson Education
Observação de engenharia de
software 4.2
Um bloco pode ser colocado em qualquer lugar em um
programa em que uma única instrução pode ser
colocada.

35
Copyright © 2006 by Pearson Education
Erro comum de programação 4.3

Esquecer uma ou ambas as chaves que delimitam um


bloco pode provocar erros de sintaxe ou erros de lógica
em um programa.

36
Copyright © 2006 by Pearson Education
Boa prática de programação 4.4

Colocar sempre as chaves em uma instrução


if...else (ou qualquer instrução de controle) ajuda
a evitar sua omissão acidental, especialmente ao
adicionar instruções a uma cláusula if ou else mais
tarde. Para evitar a omissão de uma ou das duas
chaves, alguns programadores preferem digitar as
chaves de abertura e fechamento de blocos antes de
digitar as instruções individuais dentro das chaves.

37
Copyright © 2006 by Pearson Education
4.6 A instrução de seleção dupla if…
else (cont.)
• Instrução vazia
– É representada por um ponto-e-vírgula (;) onde
normalmente entraria uma instrução.
– Não executa nenhuma ação.
– É também chamada de instrução nula.

38
Copyright © 2006 by Pearson Education
Erro comum de programação 4.4

Colocar um ponto-e-vírgula após a condição em uma


instrução if provoca um erro de lógica em instruções
de uma única seleção if e um erro de sintaxe em
instruções de seleção dupla if...else (quando a
parte if contém uma instrução de corpo real).

39
Copyright © 2006 by Pearson Education
4.7 Instrução de repetição while
• Instrução de repetição
– Uma ação é repetida enquanto uma condição permanecer
verdadeira.
– Pseudocódigo.
• Enquanto houver itens em minha lista de compras
• Compre o item seguinte e risque-o de minha lista
– O loop while repete até que a condição se torne false.
– Exemplo
• int product = 3;

while ( product <= 100 )


product = 3 * product;

40
Copyright © 2006 by Pearson Education
Erro comum de programação 4.5

Não fornecer, no corpo de uma instrução while, uma


ação que conseqüentemente faz com que a condição na
while se torne falsa normalmente resulta em um erro de
lógica chamado loop infinito, no qual a instrução de
repetição nunca termina. Isso pode fazer com que um
programa pareça ‘travado’ ou ‘congelado’, se o corpo do
loop não contiver instruções que interajam com o
usuário.

41
Copyright © 2006 by Pearson Education
4.7 Instrução de repetição while (cont.)

• Símbolo de agregação da UML


– Une dois ou mais fluxos de atividade a um fluxo de
atividade.
– É representado por um losango.
• Diferentemente do símbolo de decisão, o símbolo de agregação tem
– Múltiplas setas de transição entrantes.
– Somente uma seta de transição sainte.
• Nã há condições de guarda nas setas de transição saintes.
– Não existe contraparte no código C++.

42
Copyright © 2006 by Pearson Education
Fig. 4.6 | Diagrama de atividades UML da instrução de repetição while.

43
Copyright © 2006 by Pearson Education
Dica de desempenho 4.3

Muitas das dicas de desempenho que mencionamos


neste texto oferecem apenas pequenas melhorias.
Portanto, o leitor pode até pensar em ignorá-las.
Entretanto, uma pequena melhoria de desempenho,
para um código que executa muitas vezes em um loop,
talvez acabe gerando uma melhoria significativa em
relação ao desempenho geral.

44
Copyright © 2006 by Pearson Education
4.8 Formulando algoritmos: repetição
controlada por contador
• Declaração de problema
– Uma classe de dez alunos se submeteu a um exame. As notas
(inteiros no intervalo 0 a 100) para esse exame estão
disponíveis. Calcule e exiba o total de todas as notas e a
média da classe no exame.
• Repetição controlada por contador
– O loop repete até que o contador alcance
determinado valor.
– É também conhecida por repetição definida.
• O número de repetições é conhecido antecipadamente.

45
Copyright © 2006 by Pearson Education
4.8 Formulando algoritmos: repetição
controlada por contador (cont.)
• Repetição controlada por contador (cont.)
– Variável contador
• Usada para contar.
– Em um exemplo, indica qual entre as dez notas
está sendo inserida.
– Variável total
• Usada para acumular a soma de vários valores.
• Em geral, é previamente iniciada do zero.
– Do contrário, incluiria o valor anterior
armazenado nessa posição da memória.

46
Copyright © 2006 by Pearson Education
Observação de engenharia de
software 4.3
A experiência tem mostrado que o mais difícil na
resolução de problemas em um computador é
desenvolver o algoritmo para isso. Assim que se
especifica um algoritmo correto, o processo de produção
de um programa C++ funcional com base nesse
algoritmo normalmente se torna simples e direto.

47
Copyright © 2006 by Pearson Education
Fig. 4.7 | Algoritmo em pseudocódigo que utiliza repetição controlada por contador para
resolver o problema de média de classe.

48
Copyright © 2006 by Pearson Education
Resumo
fig04_08.cpp

A função determineClassAverage
implementa o algoritmo de média da
classe descrito pelo pseudocódigo.

49
Copyright © 2006 by Pearson Education
Resumo
fig04_09.cpp
(1 de 3)

Se o nome do curso contiver


mais de 25 caracteres, seleciona
primeiramente 25 caracteres.

50
Copyright © 2006 by Pearson Education
A função Resumo
determineClassAverage fig04_09.cpp
implementa o algoritmo de (2 de 3)
média da classe descrito pelo
pseudocódigo.

Declara a variável total.

Declara a variável contadora


gradeCounter.

Inicializa a variável total em 0.

Inicializa a variável contadora


gradeCounter em 1.
51
Copyright © 2006 by Pearson Education
Continua o loop até que o valor Resumo
fig04_09.cpp
de gradeCounter seja (3 de 3)
menor que ou igual a 10.

Adiciona a nota atual ao total.

Aumenta o
contador em 1, o
que faz com que
gradeCounter
acabe
ultrapassando o
valor 10.

Executa o cálculo médio e


atribui o respectivo resultado
à variável average.
52
Copyright © 2006 by Pearson Education
Resumo
fig04_10.cpp

53
Copyright © 2006 by Pearson Education
Boa prática de programação 4.5

Separe as declarações de outras instruções nas funções


com uma linha em branco para aumentar a legibilidade.

54
Copyright © 2006 by Pearson Education
4.8 Formulando algoritmos: repetição
controlada por contador (cont.)
• Variáveis não inicializáveis
– Contém valores ‘lixo’ (ou indefinidos).
• Observações sobre divisão de inteiros e
truncamento
– Divisão de inteiros
• Ao dividir dois inteiros
• O resultado é truncado
– Uma fração do quociente resultante é perdida.

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

Não inicializar contadores e totais pode provocar erros de


lógica.

56
Copyright © 2006 by Pearson Education
Dica de prevenção de erro 4.2

Inicialize cada contador e total, seja em sua declaração


ou em uma instrução de atribuição. Normalmente, os
totais são inicializados como 0. Os contadores
normalmente são inicializados como 0 ou 1, dependendo
de como são utilizados (mostraremos exemplos de quando
utilizar 0 e quando utilizar 1).

57
Copyright © 2006 by Pearson Education
Boa prática de programação 4.6

Declare cada variável em uma linha separada, com seu


próprio comentário, para melhorar a legibilidade do
programa.

58
Copyright © 2006 by Pearson Education
Erro comum de programação 4.7

Assumir que a divisão de inteiros arredonda (em lugar


de truncar) pode gerar resultados incorretos. Por
exemplo, 7 ÷ 4, que produz 1,75 na aritmética
convencional, é truncado para 1 na aritmética de
inteiros, em vez de arredondado para 2.

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

Utilizar uma variável de loop controlada por contador, em


um cálculo após o loop, costuma causar um erro de lógica
comum chamado off-by-one. Em um loop controlado por
contador incrementado em 1 a cada passagem pelo loop, o
loop termina quando o valor do contador é 1 a mais que
seu último valor legítimo (isto é, 11, no caso de contar de 1
a 10).

60
Copyright © 2006 by Pearson Education
4.9 Formulando algoritmos: repetição
controlada por sentinela
• Declaração do problema
– Desenvolver um programa de média da classe que processe as notas
para um número arbitrário de alunos toda vez que for executado.
• Repetição controlada por sentinela
– Também conhecida por repetição indefinida.
– Usar um valor de sentinela
• Indica o ‘final da entrada de dados’.
• Um valor de sentinela, além disso, não pode ser um valor de
entrada válido.
• É também conhecido por valor de sinal, valor fictício ou
valor de flag.

61
Copyright © 2006 by Pearson Education
Erro comum de programação 4.9

Escolher um valor de sentinela que também seja um valor


legítimo de dados é um erro de lógica.

62
Copyright © 2006 by Pearson Education
4.9 Formulando algoritmos: repetição
controlada por sentinela (cont.)
• Refinamento passo a passo de cima para baixo
– Técnica de desenvolvimento para programas bem
estruturados
– Topo
• Instrução única que fornece a função geral do programa.
• Exemplo
– Determine a média da classe em relação ao exame.
– Primeiro refinamento
• Multiplica instruções usando apenas a estrutura de seqüência.
• Exemplo
– Inicialize as variáveis.
– Insira, some e conte as notas do exame.
– Calcule e imprima o total de todas as notas de aluno e a
média da classe.
63
Copyright © 2006 by Pearson Education
Observação de engenharia de
software 4.4
Cada refinamento, bem como o topo, é uma
especificação completa do algoritmo; somente o nível de
detalhe varia.

64
Copyright © 2006 by Pearson Education
Observação de engenharia de
software 4.5
Muitos programas podem ser divididos logicamente
em três fases: fase de inicialização, que inicializa as
variáveis do programa; fase de processamento, que
insere os valores dos dados e ajusta as variáveis do
programa (como contadores e totais) de maneira
correspondente; e fase de término, que calcula e gera a
saída dos resultados finais.

65
Copyright © 2006 by Pearson Education
Erro comum de programação 4.10

A tentativa de dividir por zero normalmente provoca um


erro fatal de tempo de execução.

66
Copyright © 2006 by Pearson Education
Dica de prevenção de erro 4.3

Ao realizar divisão por uma expressão cujo valor


poderia ser zero, teste explicitamente essa
possibilidade e trate-a apropriadamente em seu
programa (por exemplo, imprimindo uma mensagem
de erro) em vez de permitir a ocorrência de um erro
fatal.

67
Copyright © 2006 by Pearson Education
4.9 Formulando algoritmos: repetição
controlada por sentinela (cont.)
• Refinamento passo a passo de cima para baixo
(cont.)
– Segundo refinamento
• Define variáveis específicas.
• Usa estruturas de controle específicas.
• Exemplo na Fig. 4.11
• Erro de lógica fatal
– Poderia fazer com que o programa falhasse.
• Em geral, é chamado de ‘bombing’ ou ‘crashing’.
– A divisão por zero normalmente é um erro de lógica fatal.

68
Copyright © 2006 by Pearson Education
Fig. 4.11 | Algoritmo em pseudocódigo do problema de média da classe com repetição
controlada por sentinela.

69
Copyright © 2006 by Pearson Education
Observação de engenharia de
software 4.6
Finalize o processo de refinamento passo a passo de
cima para baixo quando o algoritmo em pseudocódigo
for especificado em detalhes que lhe permitam
converter o pseudocódigo em C++. Em geral,
implementar o programa C++ torna-se então simples e
direto.

70
Copyright © 2006 by Pearson Education
Observação de engenharia de
software 4.7
Muitos programadores experientes escrevem programas
sem jamais utilizar ferramentas de desenvolvimento de
programa como pseudocódigo. Esses programadores
acreditam que seu objetivo final é resolver o problema em
um computador e que escrever pseudocódigo só retarda a
produção de saídas finais. Embora esse método possa
funcionar para problemas simples e familiares, pode
provocar sérias dificuldades em projetos complexos e
grandes.

71
Copyright © 2006 by Pearson Education
4.9 Formulando algoritmos: repetição
controlada por sentinela (cont.)
• Números de ponto flutuante
– Um número real com um ponto decimal.
– O C++ fornece os tipos de dados float e double.
• Os números double podem ter maior magnitude e mais
detalhes.
– Isso é chamado de precisão.
• Valores constantes de ponto flutuante são tratados como
valores double por padrão.
– Valores de ponto flutuante em geral são apenas
aproximações.

72
Copyright © 2006 by Pearson Education
Resumo
fig04_12.cpp

73
Copyright © 2006 by Pearson Education
Resumo
fixed força a impressão da saída fig04_13.cpp
(1 de 4)
no formato de ponto fixo (notação
não científica) e a impressão dos
zeros finais e dos pontos decimais.

O manipulador de fluxo setprecision (no cabeçalho


<iomanip>) define a precisão da saída numérica.

74
Copyright © 2006 by Pearson Education
Resumo
fig04_13.cpp
(2 de 4)

A função
determineClassAverage
implementa o algoritmo de
média da classe descrito pelo
pseudocódigo.

75
Copyright © 2006 by Pearson Education
Resumo
fig04_13.cpp
(3 de 4)

Declara as variáveis locais


int total,
gradeCounter e grade e a
variável average double.

O loop while itera


desde que grade não
seja igual ao valor de
sentinela -1.

76
Copyright © 2006 by Pearson Education
Resumo
fig04_13.cpp
(4 de 4)

Calcula a nota média usando


static_cast< double >
para executar uma conversão explícita.

77
Copyright © 2006 by Pearson Education
Resumo
fig04_14.cpp

78
Copyright © 2006 by Pearson Education
Boa prática de programação 4.7

Solicite cada entrada de teclado ao usuário. O prompt


deve indicar a forma da entrada e qualquer valor
especial de entrada. Por exemplo, em um loop
controlado por sentinela, os prompts que solicitam
entrada de dados devem lembrar explicitamente o
usuário do valor de sentinela.

79
Copyright © 2006 by Pearson Education
Erro comum de programação 4.11

Omitir as chaves que delimitam um bloco pode provocar


erros de lógica, como loops infinitos. Para evitar esse
problema, alguns programadores incluem o corpo de
cada instrução de controle entre chaves, mesmo que o
corpo contenha uma única instrução.

80
Copyright © 2006 by Pearson Education
Erro comum de programação 4.12

Utilizar números de ponto flutuante de uma maneira tal


que faça supor que estejam representados exatamente
(por exemplo, utilizando-os em comparações de
igualdade) pode gerar resultados incorretos. Os números
de ponto flutuante são representados apenas
aproximadamente pela maioria dos computadores.

81
Copyright © 2006 by Pearson Education
4.9 Formulando algoritmos: repetição
controlada por sentinela (cont.)
• Operador de coerção unário
– Cria uma cópia temporária de seu operando com um tipo
de dado diferente.
• Exemplo
– static_cast< double > ( total )
• Cria uma cópia do ponto flutuante temporária de
total.
– Conversão explícita.
• Promoção
– Conversão de um valor (por exemplo, int) em outro tipo
de dado (por exemplo, double) para realizar um cálculo.
– Conversão implícita.
82
Copyright © 2006 by Pearson Education
Erro comum de programação 4.13

O operador de coerção pode ser utilizado para converter


entre tipos numéricos fundamentais, como int e
double, e entre tipos de classe relacionados (como
discutiremos no Capítulo 13, “Programação orientada a
objetos. Polimorfismo”). Aplicar uma coerção ao tipo
errado pode provocar erros de compilação ou erros de
tempo de execução.

83
Copyright © 2006 by Pearson Education
4.9 Formulando algoritmos: repetição
controlada por sentinela (cont.)
• Formatando números de ponto flutuante
– Manipulador de fluxo parametrizado setprecision
• Especifica o número de dígitos de precisão para exibir à
direita do ponto decimal.
• A precisão-padrão é de seis dígitos.
– Manipulador de fluxo não parametrizado fixed
• Indica que os valores de ponto flutuante devem ser enviados
para a saída no formato de ponto fixo.
– Em oposição à notação científica (3.1 × 103).
– Manipulador de fluxo showpoint
• Força a exibição do ponto decimal.

84
Copyright © 2006 by Pearson Education
4.10 Formulando algoritmos: instruções
de controle aninhadas
• Declaração do problema
– Uma faculdade oferece um curso que prepara os candidatos a obter licença
estadual para corretores de imóveis. No ano passado, dez alunos que
concluíram esse curso prestaram esse exame. A universidade quer saber
como foi o desempenho dos alunos nesse exame. Você foi contratado para
escrever um programa que resuma os resultados. Para tanto, você recebeu
uma lista com dez desses alunos. Ao lado de cada nome é escrito 1 se o
aluno passou no exame ou 2 se o aluno foi reprovado.
– Seu programa deve analisar os resultados do exame assim:
• 1. Insira cada resultado de teste (isto é, 1 ou 2). Exiba a mensagem de
solicitação ‘Inserir resultado’ toda vez que o programa solicitar outro resultado
de teste.
• 2. Conte o número de cada tipo de resultado.
• 3. Exiba um resumo dos resultados do teste indicando o número de
alunos aprovados e reprovados.
• 4. Se mais de oito alunos tiverem sido aprovados no exame, imprima a
mensagem ‘Aumentar a mensalidade escolar’. 85
Copyright © 2006 by Pearson Education
4.10 Formulando algoritmos: instruções
de controle aninhadas (cont.)
• Observe que
– O programa processa dez resultados.
• Se o número for fixo, use loop controlado por contador.
– Todo resultado do teste pode ser 1 ou 2.
• Se não for 1, suponha que é 2.
– Dois contadores podem ser usados.
• Um conta o número de alunos que passaram.
• O outro conta o número de alunos que foram reprovados.
– É necessário determinar se mais de oito alunos passaram.

86
Copyright © 2006 by Pearson Education
4.10 Formulando algoritmos: instruções
de controle aninhadas (cont.)
• Representação da parte superior
– Analise os resultados do exame e decida se a mensalidade escolar deve
ser aumentada
• Primeiro refinamento
– Inicialize as variáveis
– Insira os 10 resultados dos exames e conte as aprovações e
reprovações
– Imprima um resumo dos resultados do exame e decida se a
mensalidade escolar deve ser aumentada
• Segundo refinamento
– Inicialize as variáveis
para
– Inicialize as aprovações como zero
– Inicialize as reprovações como zero
– Inicialize o contador de alunos como um
87
Copyright © 2006 by Pearson Education
4.10 Formulando algoritmos: instruções
de controle aninhadas (cont.)

• Segundo refinamento (cont.)


– Insira os 10 resultados dos exames e conte as aprovações e reprovações
– para
Enquanto o contador de alunos for menor ou igual a 10
– Solicite que o usuário insira o próximo resultado de exame
– Insira o próximo resultado de exame
– Se o aluno foi aprovado
– Adicione um a aprovações
– Caso contrário
– Adicione um a reprovações
– Adicione um ao contador de alunos

88
Copyright © 2006 by Pearson Education
4.10 Formulando algoritmos: instruções
de controle aninhadas (cont.)
• Segundo refinamento (cont.)
– Imprima um resumo dos resultados do exame e decida se a
mensalidade escolar deve ser aumentada
para
– Imprima o número de aprovações
– Imprima o número de reprovações
– Se mais de oito alunos forem aprovados
– Imprima ‘Aumentar a mensalidade
escolar’

89
Copyright © 2006 by Pearson Education
Fig. 4.15 | Pseudocódigo para o problema dos resultados do exame.

90
Copyright © 2006 by Pearson Education
Resumo
fig04_16.cpp

91
Copyright © 2006 by Pearson Education
Resumo
fig04_17.cpp
(1 de 2)

Declara as variáveis locais


da função
processExamResults.

92
Copyright © 2006 by Pearson Education
Resumo
fig04_17.cpp
(2 de 2)

Determina se esse aluno foi


aprovado ou reprovado e
incrementa a variável apropriada.

Determina se mais de oito


alunos foram aprovados.

93
Copyright © 2006 by Pearson Education
Resumo
fig04_18.cpp
(1 de 2)

94
Copyright © 2006 by Pearson Education
Resumo
fig04_18.cpp
(2 de 2)

Mais de oito alunos foram aprovados no exame.

95
Copyright © 2006 by Pearson Education
4.11 Operadores de atribuição
• Abreviatura de expressões de atribuição
– Operador de atribuição de adição
• Exemplo
– c = c + 3; pode ser abreviada como c += 3;
• Instruções na forma
• variável = variável operador expressão;
– podem ser reescritas como
• variável operador = expressão;
• Outros operadores de atribuição
– d -= 4 (d = d - 4)
– e *= 5 (e = e * 5)
– f /= 3 (f = f / 3)
– g %= 9 (g = g % 9)
96
Copyright © 2006 by Pearson Education
Fig. 4.19 | Operadores de atribuição aritméticos.

97
Copyright © 2006 by Pearson Education
4.12 Operadores de incremento e
decremento
• Operador de incremento ++
– Incrementa um ao valor da variável.
• Exemplo
– c++
• Operador de decremento --
– Decrementa um do valor da variável.
• Exemplo
– c--

98
Copyright © 2006 by Pearson Education
4.12 Operadores de incremento e
decremento (cont.)
• Pré-incremento
– Quando o operador é usado antes da variável (++c ou --c).
– A variável é alterada, então a expressão em que se encontra é
avaliada usando-se o novo valor.
• Pós-incremento
– Quando o operador é usado após a variável (c++ ou c--).
– A expressão em que a variável se encontra é executada usando-se
o valor original, então a variável é alterada.

99
Copyright © 2006 by Pearson Education
Fig. 4.20 | Operadores de incremento e de decremento.

100
Copyright © 2006 by Pearson Education
Boa prática de programação 4.8

Diferentemente dos operadores binários, os operadores


de incremento e decremento unários devem ser
colocados ao lado de seus operandos, sem espaços no
meio.

101
Copyright © 2006 by Pearson Education
Resumo
fig04_21.cpp

Pós-incrementando a variável c.

Pré-incrementando a variável c.

102
Copyright © 2006 by Pearson Education
4.12 Operadores de incremento e
decremento (cont.)
• Se c = 5, então
– cout << ++c;
• c é alterada para 6
• Então imprime 6
– cout << c++;
• Imprime 5 (cout é executado antes do incremento)
• c então passa a ser 6

103
Copyright © 2006 by Pearson Education
4.12 Operadores de incremento e
decremento (cont.)
• Quando a variável não se encontra em uma
expressão
– Pré-incrementar e pós-incrementar têm o mesmo efeito.
• Exemplo
– ++c;
cout << c;
e
c++;
cout << c;
continuam iguais.

104
Copyright © 2006 by Pearson Education
Erro comum de programação 4.14

Tentar utilizar o operador de incremento ou


decremento em uma expressão diferente da de um
nome variável ou referência modificável, por
exemplo, escrever ++(x + 1), é um erro de sintaxe.

105
Copyright © 2006 by Pearson Education
Fig. 4.22 | Ordem de precedência dos operadores encontrados até agora no texto.

106
Copyright © 2006 by Pearson Education
4.13 Estudo de caso de engenharia de software:
identificando atributos de classe no sistema ATM
(opcional)
• Identificando e modelando atributos
– Criar atributos e atribuí-los a classes
• Procure palavras e frases descritivas no documento de
requisitos.
• A cada atributo é dado um tipo de atributo.
• Alguns atributos podem ser um valor inicial.
• Exemplo
– userAuthenticated : Boolean = false
• O atributo userAuthenticated é um valor
Boolean e inicialmente é false.

107
Copyright © 2006 by Pearson Education
Fig. 4.23 | Palavras e frases descritivas nos requisitos do ATM.

108
Copyright © 2006 by Pearson Education
4.13 Estudo de caso de engenharia de
software: identificando atributos de classe
no sistema ATM (opcional) (cont.)

• Identificando e modelando atributos (cont.)


– Algumas classes podem acabar ficando sem atributo.
• Atributos adicionais podem ser acrescentados
posteriormente ao longo do projeto e do processo de
implementação.
– Os atributos de tipo de classe são modelados mais
claramente como associações.

109
Copyright © 2006 by Pearson Education
Fig. 4.24 | Classes com atributos.

110
Copyright © 2006 by Pearson Education
Observação de engenharia de
software 4.8
Nas etapas iniciais do processo de projeto,
freqüentemente faltam nas classes atributos (e
operações). Essas classes, porém, não devem
ser eliminadas, pois os atributos (e operações) podem
tornar-se evidentes nas fases posteriores do projeto e
da implementação.

111
Copyright © 2006 by Pearson Education
Para fazer (em trios de até 3)

4.11, 4.12, 4.13, 4.21, 4.20, 4.22, 4.30, 4.35

112
Copyright © 2006 by Pearson Education

Você também pode gostar