• Nenhum resultado encontrado

Chamada de Função Membro expression.function_name(expression 1 , expression 2 , , expression n )

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.