Dica de Produtividade 2
Sintaxe 2.9: Chamada de Função Membro expression.function_name(expression 1 , expression 2 , , expression n )
Exemplo: name.length()
name.substr(0, n – 1) Finalidade:
O resultado da chamada de uma função membro é fornecer os valores para os parâme- tros da função.
O operador + concatena dois strings. O string resultante é "HarryHacker". Na verdade, não é exatamente aquilo que queríamos. Nós gostaríamos que o primeiro e o segundo nome fossem se- parados por um espaço. Sem problema:
string name = fname + " " + lname;
Agora concatenamos três strings, "Harry", " "e "Hacker". O resultado é "Harry Hacker".
Você deve ser cuidadoso ao usar + para strings. Um ou ambos os strings junto ao + deve ser uma variável string. A expressãofname + " " está OK, mas a expressão"Harry" + " " não es- tá. Isto não é um grande problema; no segundo caso, você pode simplesmente escrever "Harry ". Aqui está um programa simples que coloca estes conceitos a funcionar. O programa solicita seu nome completo e imprime suas iniciais. Por exemplo, se você fornece seu nome como "Harold Joseph Hacker", o programa diz para você que suas iniciais são HJH.
Arquivo initials.cpp 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 int main() 7 {
8 cout << "Forneça seu nome completo (primeiro meio último): ";
9 string first;
10 string middle;
11 string last;
12 cin >> first >> middle >> last;
13 string initials = first.substr(0, 1)
14 + middle.substr(0, 1) + last.substr(0, 1);
15 cout << "Suas iniciais são " << initials << "\n";
16
17 return 0;
18 }
A operação first.substr(0, 1)forma um string consistindo de um caractere, buscado no começo de first. O programa faz o mesmo para os stringsmiddlee last. A seguir ele concatena os três strings de um caractere para obter um string de tamanho 3, o stringinitials
(ver Figura 9).
Tópico Avançado
2.7
Caracteres e strings em C
C++ possui um tipo de dado charpara indicar caracteres individuais. Na linguagem C, a precur- sora de C++, a única maneira de implementar strings era como seqüências de caracteres indivi- Tabela 3 Funções String
Nome Finalidade
s.length() O tamanho de s
s.substr(i, n) O substring de tamanho n de s iniciando no índice i getline(f, s) Leitura do strings do stream de entrada f
duais. Você pode reconhecer strings C em código em C ou C++, procurando por tipos como
char* ou char[]. Caracteres individuais são colocados entre apóstrofes. Por exemplo, 'a' é
o caractere a, enquanto que "a"é um string contendo o único caractere a.
Usar seqüências de caracteres para strings provoca um grande aborrecimento ao programador para conseguir manualmente espaço de memória para estas seqüências. Em C, um erro comum é mover um string para uma variável que seja pequena demais para todos os seus caracteres. Por ra- zões de eficiência, não existe verificação contra esta possibilidade e é muito fácil para programa- dores inexperientes corromper variáveis adjacentes.
Os strings padrão C++ tratam completamente destas pequenas tarefas automaticamente. Para a maioria das tarefas de programação você não necessita o tipo de dado charpara nada. Em vez dis- so, somente use strings de tamanho 1 para caracteres individuais. O Capítulo 9 contém uma breve introdução a strings C.
2.6.4 Saída formatada
Quando você exibe diversos números, cada um deles é impresso com o número mínimo de dígitos ne- cessários para mostrar o valor. Isso freqüentemente produz uma saída feia. Aqui está um exemplo.
cout << pennies << " " << pennies * 0.01 << "\n"; cout << nickels << " " << nickels * 0.05 << "\n"; cout << dimes << " " << dimes * 0.10 << "\n"; cout << quarters << " " << quarters * 0.25 << "\n";
Uma saída típica poderia parecer assim: 1 0.01
12 0.6 4 0.4 120 30
Que confusão! As colunas não estão alinhadas e os valores monetários não mostram dólares e centavos. Precisamos formatar a saída. Vamos fazer cada coluna com oito caracteres de largura e usar dois dígitos de precisão para números em ponto flutuante.
Você usa o manipuladorsetw para configurar a largura do próximo campo de saída. Por exemplo, se você quer que o próximo número seja impresso em uma coluna de oito caracteres de largura, você usa
cout << setw(8);
Este comando não produz nenhuma saída; apenas manipula o stream para que ele altere o for- mato de saída do próximo valor. Para usar os manipuladores de stream, você deve incluir o cabe- çalho iomanip:
#include <iomanip> Figura 9
Outro manipulador, setprecision, é usado para configurar a precisão do próximo número em ponto flutuante:
cout << setprecision(2);
Você pode combinar manipuladores com valores de saída: cout << setprecision(2) << setw(8) << x;
Este comando imprime o valor x em um campo de largura 8 e com dois dígitos de precisão, por exemplo
···34.95
(onde cada ·representa um espaço). A configuração de precisão não possui influência sobre cam- pos inteiros. Infelizmente, simplesmente usar setprecisionnão é suficiente para imprimir ze- ros não significativos. Por exemplo, 0.1 ainda será impresso como 0.1, e não como 0.10. Você tem que selecionar formato fixo, com o comando
cout << fixed;
Alguns compiladores antigos não suportam o manipulador fixed. Neste caso, use o coman- do mais arcaico
cout << setiosflags(ios::fixed);
Combinando estes três manipuladores finalmente conseguimos o resultado desejado: cout << fixed << setprecision(2) << setw(8) << x;
Felizmente, os manipuladores setprecisione fixedsomente necessitam ser usados uma vez; o stream lembra as diretivas de formatação. Entretanto, setw deve ser especificado para ca- da novo item. Existem mais comandos de formatação, mas estes são os mais comumente usados. Veja, por exemplo, a referência [2] para uma lista completa de opções.
Aqui está uma seqüência de instruções que podem ser usadas para embelezar a tabela. cout << fixed << setprecision(2);
cout << setw(8) << pennies << " "
<< setw(8) << pennies * 0.01 << "\n"; cout << setw(8) << nickels << " "
<< setw(8) << nickels * 0.05 << "\n"; cout << setw(8) << dimes << " "
<< setw(8) << dimes * 0.10 << "\n"; cout << setw(8) << quarters << " "
<< setw(8) << quarters * 0.25 << "\n"; Agora a saída é 1 0.01 12 0.60 4 0.40 120 30.00
Resumo do capítulo
1. C++ possui vários tipos de dados para números. Os tipos mais comuns são double
e int. Números em ponto flutuante podem ter valores fracionários; inteiros não po- dem. De vez em quando, outros tipos numéricos são exigidos para valores maiores ou maior precisão.
2. Números, strings e outros valores podem ser armazenados em variáveis. Uma variá- vel possui um nome que indica sua função para o leitor humano. Uma variável pode armazenar diferentes valores durante a execução do programa.
3. Números e strings podem ser lidos de um stream de entrada com o operador >>. Eles são escritos em um stream de saída com o operador <<. A saída usa um formato geral; use manipuladores de stream para conseguir formatos especiais.
4. Quando uma variável é inicialmente preenchida com um valor, ela é inicializada. O valor inicial pode ser mais tarde substituído por outro por um processo denominado atribuição. Em C++, a atribuição é indicada pelo operador =,uma escolha um pou- co infeliz, por que o significado em C++ de = não é o mesmo que a igualdade mate- mática.
5. Constantes são valores com um nome simbólico. Constantes não podem ser altera- das, uma vez que tenham sido inicializadas. Constantes com nomes devem ser usa- das em lugar de números para tornar os programas mais fáceis de ler e de manter. 6. Todas as operações aritméticas comuns são fornecidas em C++; entretanto, os sím-
bolos são diferentes da notação matemática. Em particular, * indica multiplicação. Não existe traço de fração horizontal e / deve ser usada para divisão. Para calcular uma potência abou uma raiz quadrada , as funções powe root devem ser usa- das. Outras funções, tais como sine log, também estão disponíveis. O operador %
calcula o resto de uma divisão inteira.
7. Strings são seqüências de caracteres. Strings podem ser concatenados; isto é, colo- cados juntos para formar um string mais longo. Em C++, a concatenação de strings é indicada pelo operador +.A função substr extrai substrings.