• Nenhum resultado encontrado

Construa uma classe que execute seus cálculos.

No documento Conceitos de Computação com Java_nodrm.pdf (páginas 161-166)

S INTAXE 4.3 Chamada de método estático

Passo 5 Construa uma classe que execute seus cálculos.

O Como fazer 3.1 explica como desenvolver uma classe localizando métodos e variá- veis de instância. No nosso caso, podemos encontrar três métodos:

void insert(double amount)

int giveFirstClassStamps()

int givePennyStamps()

O estado de uma máquina de venda automática pode ser descrito pela quantidade de dinheiro que o cliente tem disponível para compras. Portanto, fornecemos uma variá- vel de instância, money.

Eis a implementação:

public class StampMachine {

public StampMachine() {

money = 0; }

public void insert(double amount) {

money = money + amount; }

public int giveFirstClassStamps() {

int fi rstClassStamps = (int) (money / FIRST_CLASS_STAMP_PRICE); money = money - fi rstClassStamps * FIRST_CLASS_STAMP_PRICE; return fi rstClassStamps;

}

public int givePennyStamps() {

int pennyStamps = (int) Math.round(100 * money); money = 0;

return pennyStamps; }

public static fi nal double FIRST_CLASS_STAMP_PRICE = 0.39; private double money;

}

Passo 6 Teste sua classe.

Execute um programa de teste (ou utilize um ambiente integrado, como o BlueJ) para verifi car se os valores que sua classe calcula são os mesmos valores que você calculou manualmente. No nosso exemplo, tente as instruções

StampMachine machine = new StampMachine(); machine.insert(1);

System.out.print("First class stamps: ");

System.out.println(machine.giveFirstClassStamps()); System.out.println("Expected: 2");

System.out.print("Penny stamps: ");

System.out.println(machine.givePennyStamps()); System.out.println("Expected: 22);

Verifi que se o resultado é

First class stamps: 2 Expected: 2

Penny stamps: 22 Expected: 22

4.6 Strings

Depois dos números, strings são o tipo de dados mais importante que a maioria dos pro- gramas usa. Uma string é uma seqüência de caracteres, como "Hello, World!". Em Java, strings fi cam entre aspas, que não são parte da string. Observe que, diferentemente dos números, strings são objetos. (Você pode dizer que String é o nome de uma classe por- que ela inicia com uma letra maiúscula. Os tipos primitivos int e double iniciam com letras minúsculas.)

O número de caracteres em uma string é chamado de compri- mento da string. Por exemplo, o comprimento de "Hello, World!" é 13. Você pode calcular o comprimento de uma string com o mé- todo length.

int n = message.length();

Uma string de comprimento zero, que não contém nenhum caractere, é chamada string vazia e é escrita como "".

Utilize o operador + para agrupar strings e formar uma string mais longa. String name = "Dave";

String message = "Hello, " + name;

O operador + concatena duas strings, desde que um dos argumen- tos, à esquerda ou à direita de um operador +, seja uma string. O outro argumento é automaticamente forçado a também se tornar uma string para que ambas sejam concatenadas.

Por exemplo, considere este código: String a = "Agent";

int n = 7;

String bond = a + n;

Como a é uma string, n é convertido do inteiro 7 para a string "7". As duas strings "Agent" e "7" são então concatenadas para formar a string "Agent7".

Essa concatenação é muito útil para reduzir o número de ins- truções System.out.print. Por exemplo, você pode combinar:

System.out.print("The total is "); System.out.println(total);

com a chamada

System.out.println("The total is " + total);

A concatenação "The total is " + total calcula uma única string que consiste na string "The total is ", seguida pela string equivalente ao número total.

Pode ocorrer que uma string contenha um número, normalmente inserido pelo usuá- rio. Por exemplo, suponha que a variável string input contenha o número "19". Para obter o valor inteiro 19, utilize o método parseInt estático da classe Integer.

int count = Integer.parseInt(input); // count é o inteiro 19

Uma string é uma seqüência de caracteres. Strings são objetos da classe

String.

Strings podem ser concatenadas, isto é, ligadas uma a outra para produzir uma string nova e mais longa. A concatenação de strings é indicada pelo operador +.

Sempre que um dos argumentos do operador

+ for uma string, o outro argumento é convertido em uma string.

Para converter uma string que contém dígitos de ponto fl utuante no valor de ponto fl utuante, utilize o método estático parseDouble da classe Double. Por exemplo, suponha que input seja a string "3.95".

double price = Double.parseDouble(input); // price é o número de ponto fl utuante 3.95

Mas se a string contiver espaços ou outros caracteres que não po- dem ocorrer em números, ocorrerá um erro. Por enquanto, iremos supor que a entrada do usuário nunca contém caracteres inválidos.

O método substring calcula substrings de uma string. A cha- mada

s.substring(start, pastEnd)

retorna uma string composta dos caracteres na string s, iniciando na posição start e contendo todos os caracteres até, mas sem incluir, a posição pastEnd. Eis um exemplo:

String greeting = "Hello, World!";

String sub = greeting.substring(0, 5); // sub é "Hello"

A operação substring cria uma string que consiste em cinco ca- racteres pegos da string greeting. Um aspecto curioso da operação substring é a numeração das posições inicial e fi nal. A primeira posição na string é rotulada como 0; a segunda, como 1; e assim por diante. Por exemplo, a Figura 3 mostra os números de posição na string greeting.

A posição do último caractere (12 para a string "Hello, World!") é sempre o compri- mento da string menos um.

Vamos pensar como extrair a substring "World". Conte os caracteres que iniciam em 0, não em 1. Você descobre que W, o oitavo caractere, tem número de posição 7. O primei- ro caractere que você não quer, !, é o caractere na posição 12 (veja Figura 4). Portanto, o comando apropriado de substring é

String sub2 = greeting.substring(7, 12);

É curioso que você precise especifi car a posição do primeiro caractere que você quer e então a do primeiro caractere que você não quer. Há uma vantagem nessa confi guração. Você pode calcular facilmente o comprimento da substring: Ele é pastEnd - start. Por exemplo, a string "World" tem comprimento 12 – 7 = 5.

Se uma string contiver os dígitos de um número, você pode utilizar o método

Integer.parseInt ou o

Double.parseDouble para obter o valor do número.

Utilize o método

substring para extrair uma parte de uma string.

Posições em strings são contadas iniciando em 0.

0 1 2 3 4 5 6 7 8 9 10 11 12

H e l l o , W o r l d !

Figura 3 Posições da string.

0 1 2 3 4 5 6 7 8 9 10 11 12

H e l l o , W o r l d !

5

Se você omitir o segundo parâmetro do método substring, então todos os caracteres a partir da posição inicial até o fi m da string são copiados. Por exemplo,

String tail = greeting.substring(7); // Copia todos os caracteres da posição 7 em //diante

confi gura tail como a string "World!".

Se fornecer uma posição inválida para a string (um número negativo ou um valor maior que o comprimento da string), seu programa termina com uma mensagem de erro.

Nesta seção, fi zemos a suposição de que cada caractere em uma string ocupa uma única posição. Infelizmente, essa suposição não é bem correta. Se você processar strings que contêm caracteres de outros alfabetos internacionais ou símbolos especiais, alguns desses caracteres podem ocupar duas posições – veja o Tópico Avançado 4.5.

AUTOVERIFICAÇÃODAAPRENDIZAGEM

13. Supondo que a variável Strings contenha o valor "Agent", qual é o efeito da atribuição s = s + s.length()?

14. Supondo que a variável Stringriver contenha o valor "Mississippi", qual é o va- lor de river.substring(1, 2)? E de river.substring(2, river.length() - 3)?

Lendo relatórios de exceções

Freqüentemente haverá programas que terminam e exibem uma mensagem de erro, como

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -4

at java.lang.String.substring(String.java:1444) at Homework1.main(Homework1.java:16)

Um número surpreendente de estudantes simplesmente desiste nesse ponto, dizendo “não funcionou”, ou “meu programa deu pau”, sem nunca ler a mensagem de erro. De fato, o formato do relatório de exceção não é muito amigável. Mas é fácil decifrá-lo.

Depois de examinar mais minuciosamente a mensagem de erro, você observará duas informações úteis:

1. O nome da exceção, como StringIndexOutOfBoundsException

2. O número da linha do código que continha a instrução que causou a exceção, como Homework1.java:16

O nome da exceção sempre está na primeira linha do relatório e termina em Exception. Se você recebe uma StringIndexOutOfBoundsException, há um problema de acesso a uma posição inválida em uma string. Essa é uma informação útil.

O número da linha do código com problemas é um pouco mais difícil de determinar. O relatório de exceção contém o rastreamento da pilha inteira – isto é, o nome de todos os métodos pendentes quando aconteceu a exceção. A primeira linha do rastreamento

da pilha é o método que realmente gerou a exceção. A última linha do rastreamento de pilha é uma linha em main. Na maioria das vezes essa exceção foi lançada por um mé- todo que está na biblioteca padrão. Procure a primeira linha no seu código que aparece no relatório de exceção. Por exemplo, pule a linha que se refere a

java.lang.String.substring(String.java:1444)

A próxima linha no nosso exemplo menciona um número de linha no seu código, Ho- mework1.java. Depois de descobrir o número da linha no seu código, abra o arquivo, vá até essa linha e a examine! Na grande maioria dos casos, saber o nome da exceção e a linha que a causou torna completamente óbvio descobrir o que deu errado para que você possa corrigir o erro facilmente.

Seqüências de escape

O Tópico Avançado 4.4 mostra como você pode inserir caracteres especiais (como aspas ou quebras de linha) em strings.

T

ÓPICOAVANÇADO

4.4

Strings e o tipo char

O Tópico Avançado 4.5 discute o tipo char. Strings são compostas de unidades de código do tipo char. Para a maioria das tarefas de programação, simplesmente utilize strings de comprimento 1 em vez de valores char.

T

ÓPICOAVANÇADO

4.5

Alfabetos internacionais

O Fato Aleatório 4.2 explica como o conjunto de caracteres Unicode fornece uma codifi cação para todos os caracteres que estão em uso no mundo, incluindo caracteres acentuados, alfabetos como o hebraico ou tailandês e milhares de ideogramas utiliza- dos na China, no Japão e na Coréia.

F

ATOALEATÓRIO

4.2

No documento Conceitos de Computação com Java_nodrm.pdf (páginas 161-166)