• Nenhum resultado encontrado

Sintaxe 2.1: Comando de saída 51

Sintaxe 2.2: Definição de variável 52

Dica de qualidade 2.1: Inicialize variáveis ao defini-las 52

Dica de qualidade 2.2: Escolha nomes descritivos para variáveis 54

Tópico avançado 2.1:

Limites numéricos e precisão 55

Tópico avançado 2.2: Sintaxe alternativa de comentário 55

Sintaxe 2.3: Comentário 56

Fato histórico 2.1: O erro de ponto flutuante do Pentium 56

2.2 Entrada e saída 57

Sintaxe 2.4: Comando de entrada 59

2.3 Atribuição 61

Sintaxe 2.5: Atribuição 62

Erro freqüente 2.1: Erros de arredondamento 64

Tópico avançado 2.3: Casts 64

Conteúdo do capítulo

2

Capítulo

Tipos de Dados

Fundamentais

Objetivos do capítulo

• Entender números inteiros e em ponto flutuante • Escrever expressões aritméticas em C++

• Avaliar a importância de comentários e de um bom leiaute de código • Tornar-se apto a definir e inicializar variáveis e constantes

• Reconhecer as limitações dos tipos int e double e de erros de estouro e arre- dondamento que podem resultar

• Aprender como ler dados de entrada do usuário e exibir a saída do programa • Estar apto a alterar valores de variáveis através de atribuição

• Usar o tipo string padrão de C++ para definir e tratar seqüências de caracteres • Estar apto a escrever programas simples que leiam números e texto, processem os

dados de entrada e exibam os resultados

Neste e nos seguintes capítulos, você vai aprender as habilidades básicas necessárias pa- ra escrever programas em C++. Este capítulo ensina a você como manipular números e strings de caracteres em C++. O objetivo deste capítulo é escrever programas simples usan- do esses tipos de dados básicos.

2.1

Tipos numéricos

Considere o seguinte problema simples. Eu tenho 8 moedas de 1 centavo, 4 de 10 centavos e 3 de 25 centavos em minha carteira. Qual é o valor total das moedas? Aqui está um programa em C++ que resolve este problema.

Arquivo coins1.cpp 1 #include <iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 int pennies = 8; 8 int dimes = 4; 9 int quarters = 3; 10

11 double total = pennies * 0.01 + dimes * 0.10

12 + quarters * 0.25; /* valor total das moedas */

13

14 cout << "Valor total = " << total << "\n";

15

16 return 0;

17 }

Este programa manipula duas espécies de números. As quantidades de moedas (8, 4, 3) são in- teiros. Inteiros são números integrais, sem uma parte fracionária (zero e números integrais negati- vos são inteiros). Os valores numéricos das moedas (0.01, 0.10e 0.25) são números em pon- to flutuante. Números em ponto flutuante podem ter ponto decimal. Eles são chamados de “ponto flutuante” devido à sua representação interna no computador. Os números 250, 2.5, 0.25 e 0.025 são todos representados de modo similar; mais exatamente, como uma seqüência de dígitos signi- ficativos – 2500000 – e uma indicação da posição do ponto decimal. Quando os valores são multi- plicados e divididos por 10, somente a posição do ponto decimal se altera; ela “flutua”(na verda- de, internamente os números são representados em base 2, mas o princípio é o mesmo). Você pro- vavelmente adivinhou que int é o nome C++ para um inteiro. O nome para um número em pon- to flutuante usado neste livro é double; a razão é discutida no Tópico Avançado 2.1.

Sintaxe 2.6: Cast 65

Dica de produtividade 2.1: Evite leiaute instável 65

Tópico avançado 2.4: Combinando atribuição e aritmética 66

2.4 Constantes 67

Sintaxe 2.7: Definição de constante 67

Dica de qualidade 2.3: Não use números mágicos 68

Tópico avançado 2.5: Tipos enumerados 69

2.5 Aritmética 70

Sintaxe 2.8: Chamada de função 72

Erro freqüente 2.2: Divisão inteira 72

Erro freqüente 2.3:

Parênteses desbalanceados 73

Erro freqüente 2.4: Esquecer arquivos de cabeçalho 74

Tópico avançado 2.6: Resto de inteiros negativos 75

Dica de produtividade 2.2: Ajuda online 75

Dica de qualidade 2.4: Espaço em branco 76

Dica de qualidade 2.5: Coloque em evidência código comum 76

2.6 Strings 77

Sintaxe 2.9: Chamada de função membro 78

Tópico avançado 2.7: Caracteres e strings em C 79

Por que existem dois tipos numéricos? Alguém poderia simplesmente usar double pennies = 8;

Existem duas razões para ter tipos separados – uma filosófica e uma pragmática. Ao indicar que a quantidade de moedas de 1 centavo é um inteiro, fazemos uma suposição explícita: pode existir apenas um número integral de moedas de 1 centavo na carteira. O programa poderia ter trabalhado igualmente bem com números em ponto flutuante para contar as moedas, mas é ge- ralmente uma boa idéia escolher soluções de programação que documentem as intenções de al- guém. Pragmaticamente falando, inteiros são mais eficientes do que números em ponto flutuan- te. Eles usam menos espaço de memória e são processados mais rapidamente.

Em C++, a multiplicação é indicada por um asterisco *, e não por um ponto · ou um sinal de vezes (não existem teclas para estes símbolos na maioria dos teclados). Por exemplo, d · 10 é es- crito como d * 10. Não insira vírgulas ou espaços em números em C++. Por exemplo, 10,150.75 dever ser digitado como 10150.75. Para escrever números em notação exponencial em C++, use um Eem vez de “⋅ 10n”. Por exemplo, 5.0 ⋅ 10-3se torna 5.0E-3.

O comando de saída

cout << "Valor total= " << total << "\n";

mostra um recurso útil: stream de saída. Você pode exibir tantos itens quantos quiser (nesse caso, o string"Valor Total = ") seguido pelo valor de total e um string contendo um caracte- re de nova linha, para mover o cursor para a linha seguinte. Apenas separe os itens que você dese- ja imprimir por <<(veja Sintaxe 2.1). Alternativamente, você pode escrever três comandos de saí- da separados

cout << "Valor total = "; cout << total;

cout << "\n";

Isso tem exatamente o mesmo efeito que exibir os três itens em um comando. Observe o comentário

/* valor total das moedas */

próximo à definição de total. Este comentário é basicamente para beneficiar o leitor humano, para explicar em mais detalhes o significado de total. Qualquer coisa colocada entre /* e */ é completamente ignorada pelo compilador. Comentários são usados para explicar o programa a ou- tros programadores ou para você mesmo. Existe um segundo estilo de comentário, usando o sím- bolo //, que é bastante popular. Veja o Tópico Avançado 2.2 para detalhes.

A característica mais importante de nosso programa exemplo é a introdução de nomes simbó- licos. Você poderia ter apenas programado

int main() {

cout << "Valor total = "

<< 8 * 0.01 + 4 * 0.10 + 3 * 0.25 << "\n";

Sintaxe 2.1: Comando de Saída

cout << expression1 << expression2 <<. . . << expressionn;

Exemplo:

cout << pennies;

cout << "Valor total= " << total << \n"; Finalidade:

return 0; }

Esse programa fornece a mesma resposta. Porém, compare esse com o primeiro programa. Qual é mais fácil de ler? Qual é mais fácil de alterar se nós necessitarmos trocar os contadores de moedas, tais como adicionar moedas de 5 centavos? Ao darmos nomes simbólicos, pennies, di-

mese quarters aos contadores, tornamos o programa mais legível e manutenível. Esta é uma consideração importante. Você introduz nomes simbólicos para explicar o que um programa faz, assim como você usa nomes de variáveis tais como p, d, e q em álgebra.

Em C++, cada variável possui um tipo. Ao definir int pennies, você estabelece que pen-

nies somente pode conter valores inteiros. Se você tentar colocar um valor em ponto flutuante numa variável pennies, a parte fracionária será perdida. Você define uma variável primeiramen- te determinando seu tipo e então seu nome, tal como em int pennies.

Você pode acrescentar um valor de inicialização, tal como = 8. Então você termina a definição com um ponto-e-vírgula (ver Sintaxe 2.2). Embora a inicialização seja opcional, é uma boa idéia sem- pre inicializar variáveis com um valor específico. Veja a Dica de Qualidade 2.1 para saber a razão.

Nomes de variáveis em álgebra são geralmente formados por uma única letra, tal como p ou A, e talvez com um subscrito como em p1. Em C++, é comum escolher nomes mais longos e mais des-

critivos, tal como preco ou area. Você não pode digitar subscritos; somente acrescente um ín- dice atrás do nome: preco1. Você pode escolher nomes para variáveis a seu gosto, desde que si- ga umas poucas regras simples. Nomes devem iniciar com uma letra e os caracteres restantes de- vem ser letras, números, ou o caractere sublinhado (_). Você não pode usar símbolos, como $ ou %. Espaços não são permitidos dentro de nomes. Além disso, você não pode usar palavras reser- vadas tais como double ou return como nomes, pois estas palavras são reservadas exclusi- vamente para seus significados especiais em C++. Nomes de variáveis também são sensíveis a maiúsculas e minúsculas, isto é Area e area são nomes diferentes. Pode não ser uma boa idéia misturar os dois no mesmo programa, porque isto poderia tornar a leitura deste programa muito confusa. Para evitar qualquer possível confusão, nunca vamos usar letras maiúsculas em nomes de variáveis neste livro. Você vai ver que muitos programadores usam nomes como listaPreco; entretanto, sempre vamos escolher lista_preco em vez disso (como espaços não são permi- tidos dentro de nomes, a alternativa lista preco não pode ser usada).