intro java cc

Upload: paulo-moreira

Post on 11-Jul-2015

123 views

Category:

Documents


0 download

TRANSCRIPT

UNIVERSIDADE DE SO PAULO INSTITUTO DE MATEMTICA E ESTATSTICA Departamento de Cincia da Computao

Introduo Cincia da Computao com Java e Orientao a Objetos1a edio

Alfredo Goldman Fabio Kon Paulo J. S. SilvaEditado e Revisado por: Raphael Y. de Camargo

Ficha Catalogrca Elaborada pela Biblioteca do IME-USP

QA724 K82i

Kon, Fabio; Goldman, Alfredo; Silva P. J. S. Introduo cincia da computao com Java e orientao a objetos, editado e revisado por Raphael Y. de Camargo. 1. ed. So Paulo : IME-USP, 2006. 190p. ISBN: 85-88697-10-6 1. Linguagem de Programao 2. Programao orientada a objeto 3. Java I. Goldman, Alfredo II. Silva, Paulo J. S. III. Camargo, Raphael Y. de, ed. e rev. IV. Universidade de So Paulo, Instituto de Matemtica e Estatstica. Departamento de Cincia da Computao.

CDD 600

i

C

O

M

M

O

N

S

D

E

E

D

Atribuio-Uso No-Comercial-Compartilhamento pela mesma licena 2.5 Voc pode: copiar, distribuir, exibir e executar a obra criar obras derivadas Sob as seguintes condies: Atribuio. Voc deve dar crdito ao autor original, da forma especicada pelo autor ou licenciante.

Uso No-Comercial. Voc no pode utilizar esta obra com nalidades comerciais.

Compartilhamento pela mesma Licena. Se voc alterar, transformar, ou criar outra obra com base nesta, voc somente poder distribuir a obra resultante sob uma licena idntica a esta. Para cada novo uso ou distribuio, voc deve deixar claro para outros os termos da licena desta obra. Qualquer uma destas condies podem ser renunciadas, desde que Voc obtenha permisso do autor. Qualquer direito de uso legtimo (ou "fair use") concedido por lei, ou qualquer outro direito protegido pela legislao local, no so em hiptese alguma afetados pelo disposto acima.

Este um sumrio para leigos da Licena Jurdica (que pode ser obtida na ntegra em http://creativecommons.org/licenses/by-nc-sa/2.5/legalcode). Termo de exonerao de responsabilidade Esta Licena Simplicada no uma licena propriamente dita. Ela apenas uma referncia til para entender a Licena Jurdica (a licena integral) - ela uma expresso dos seus termos-chave que pode ser compreendida por qualquer pessoa. A Licena Simplica em si no tem valor legal e seu contedo no aparece na licena integral. O Creative Commons no um escritrio de advocacia e no presta servios jurdicos. A distribuio, exibio ou incluso de links para esta Licena Simplicada no estabelece qualquer relao advocatcia.

ii

iii

Sugestes e CorreesSe voc encontrar erros ou tiver sugestes para melhorias neste livro, favor enviar para o email [email protected].

iv

v

A nossas esposas e lhos, fonte de fora e alegria em nossas vidas.

vi

vii

Agradecimentos

Este livro no seria possvel sem a colaborao de inmeros alunos e professores do IME/USP. Leo Kazuhiro Ueda e Nelson Posse Lago atuaram como assistentes de ensino na primeira vez em que esta disciplina foi ministrada e foram responsveis por inmeras contribuies. O apndice sobre o Dr. Java foi preparado pelo Leo. Fabiano Mitsuo Sato, George Henrique Silva e Igor Ribeiro Sucupira foram monitores da disciplina tambm em 2003 e colaboraram com alguns exerccios. Raphael Y. de Camargo realizou um excelente trabalho na edio e reviso do livro alm de colaborar com alguns exerccios. O Prof. Joo Eduardo Ferreira, nosso colega no ensino da disciplina de introduo, o Prof. Valdemar Setzer, nosso experiente e sbio colega de departamento, e o Prof. Marcos Chaim, da USPLeste, nos deram inmeras sugestes teis que, sempre que possvel, foram incorporadas ao texto nal. Agradecemos ao Prof. Walter Savitch da Universidade da California em San Diego por ter autorizado o uso de sua classe para entrada de dados. Agradecemos tambm a Giuliano Mega pela diagramao da capa e a Stefano Mega pelos objetos nadando na xcara de Java. Finalmente, agradecemos aos alunos e professores que no foram citados mas que deram sugestes e nos incentivaram a escrever este livro.

viii

SumrioPrefcio 1 Teatro de Objetos 1.1 Disputa de pnaltis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Histria da Computao 2.1 Histria da Computao e Arquitetura do Computador . . . . . . . . . . . . . . . . . . . . . 2.2 Evoluo das Linguagens de Programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversor de Temperaturas 3.1 Analogia entre dramatizao da disputa de pnaltis e Programao Orientada a Objetos . . . . 3.2 Um exemplo real em Java: um conversor de Celsius para Fahrenheit . . . . . . . . . . . . . . Testes Automatizados Mtodos com Vrios Parmetros 5.1 Atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 A importncia da escolha de bons nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . if else Encaixados Programas com Vrios Objetos Laos e Repeties 8.1 Laos em linguagens de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 O lao while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3 Nmeros primos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Expresses e Variveis Lgicas 9.1 Condies como expresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 Precedncia de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix xv 1 1 7 7 12 15 15 16 19 25 26 29 33 39 45 45 46 48 53 53 56 57

2

3

4 5

6 7 8

9

x

SUMRIO 61 61 63 64 67 67 69 73 73 74 77 77 78 81 83 87 87 88 90 93 93 94 95

10 Mergulhando no while 10.1 Um pouco mais sobre primos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Uma biblioteca de funes matemticas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3 do...while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Caracteres e Cadeias de Caracteres 11.1 Um tipo para representar caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Cadeias de caracteres (Strings) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 A Memria e as Variveis 12.1 A Memria do Computador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 O que so as Variveis? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Manipulando Nmeros Utilizando Diferentes Bases 13.1 Sistemas de numerao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2 Converso entre sistemas de numerao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Arrays (vetores) 14.1 Criao de programas Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 for, leitura do teclado e converso de Strings 15.1 O comando for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.2 Leitura do teclado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.3 Converso de String para nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Laos Encaixados e Matrizes 16.1 Laos encaixados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.2 Matrizes (arrays multidimensionais) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.3 Exemplo: LIFE, o jogo da vida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17 Busca e Ordenao 101 17.1 Busca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 17.2 Pondo ordem na casa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 18 Busca Binria e Fuso 105 18.1 Busca binria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 18.2 Complexidade Computacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 18.3 Fuso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 19 Construtores e Especicadores de Acesso 109 19.1 Construtores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 19.2 Especicadores de acesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

SUMRIO 20 Interfaces 20.1 O conceito de interfaces . . . . . . . . . . . . 20.2 Um primeiro exemplo . . . . . . . . . . . . . 20.3 Implementando mais de uma interface por vez 20.4 Um exemplo mais sosticado . . . . . . . . . 20.5 A importncia de interfaces . . . . . . . . . . 21 Herana 21.1 O Conceito de herana . . . . . . . . . . . . 21.2 Terminologia de herana . . . . . . . . . . . 21.3 Implementao de herana na linguagem Java 21.4 Hierarquia de classes . . . . . . . . . . . . . 21.5 Relacionamento um . . . . . . . . . . . . 21.6 Resumo . . . . . . . . . . . . . . . . . . . . 22 Javadoc 23 O C Que H em Java 23.1 O C que h em Java . . . . 23.2 Detalhes de entrada e sada 23.3 Declarao de variveis . . 23.4 Parmetros de funes . . 23.5 Um ltimo exemplo . . . .

xi 115 115 115 119 121 125 129 129 130 130 132 133 133 135 141 141 143 144 144 144

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

A Utilizando o Dr. Java 149 A.1 Conversor de Temperatura simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 A.2 Tratando erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 B Desenvolvimento Dirigido por Testes 157 B.1 O Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Bibliograa 173

xii

SUMRIO

Lista de Figuras2.1 2.2 Arquitetura do ENIAC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquitetura de Von Neumann . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 11

21.1 Diagrama de herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 21.2 Hierarquia de classes representando os seres vivos . . . . . . . . . . . . . . . . . . . . . . . . 132 21.3 Hierarquia errada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 22.1 Documentao gerada pelo Javadoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

xiii

xiv

LISTA DE FIGURAS

PrefcioCaros leitores, sejam bem-vindos ao maravilhoso mundo da Cincia da Computao. Com este livro, vocs tero a oportunidade de aprender os elementos bsicos da programao de computadores e tero contato com alguns dos conceitos fundamentais da Cincia da Computao. Este livro resultado da experincia dos autores na disciplina de Introduo Cincia da Computao ministrada no IME/USP utilizando orientao a objetos e a linguagem Java de 2003 a 2006. Desde 2005, esta abordagem tambm aplicada na USPLeste com os 180 alunos do curso de Sistemas de Informao. Inuenciada pelo mtodo proposto pela ACM (Association for Computing Machinery) e pelo IEEE (Institute of Electrical and Electronics Engineers) em seu currculo Objects-rst, nossa abordagem evita o problema de se ensinar a programar sem o uso de objetos para depois exigir do estudante uma mudana de paradigma com a introduo de objetos. Elimina-se assim a necessidade de dizer esquea a forma que programamos at agora; agora vamos aprender o jeito correto. Apresentando os conceitos de orientao a objetos desde o incio do ensino de programao, a abordagem adotada aqui permite que o aluno inicie sua formao em programao de forma equilibrada. Aprendendo conceitos tanto algortmicos quanto estruturais ao mesmo tempo em que toma contato com prticas fundamentais de programao como testes automatizados e o uso de nomes claros para os elementos do cdigo, o leitor obtm uma viso bsica porm ampla do que mais importante para o desenvolvimento de software. Esperamos que este livro seja til tanto para alunos de cursos superiores de Informtica quanto para prossionais do mercado e outros curiosos que queiram adquirir conhecimentos na rea de desenvolvimento de software. Nosso objetivo que este livro os ajude na fascinante empreitada de aprender a programar de forma elegante e ecaz e que ele permita um bom incio rumo a uma formao slida em programao que uma condio fundamental que os desaos da informtica do sculo XXI nos impem.

Abraos e boa jornada!

So Paulo, maro de 2006. Alfredo Goldman, Fabio Kon e Paulo J. S. Silva

xv

xvi

PREFCIO

Captulo 1

Teatro de ObjetosVamos iniciar a nossa jornada ao fascinante mundo da orientao a objetos de forma dramtica: com um Teatro de Objetos. Se voc est usando este livro em um curso, reserve juntamente com seu professor uma parte da primeira aula para realizar a encenao descrita neste captulo. Se voc trabalha em uma empresa, rena-se com colegas de trabalho ou com amigos interessados em programao para exercitar suas qualidades dramticas. Liberte o artista que existe dentro de voc! O objetivo do Teatro de Objetos fazer com que os alunos vivenciem um jogo interativo do qual participam vrios objetos realizando diferentes formas de aes e comunicaes. Os conceitos de orientao a objetos empregados no teatro no so explicitamente explicados j no primeiro captulo mas sero abordados ao longo do livro. Em um curso de Introduo Cincia da Computao, normalmente a primeira metade da primeira aula dedicada a uma conversa informal com os alunos explicando quais so os objetivos da disciplina (e do curso inteiro, se for o caso). sempre interessante tambm conversar sobre contatos prvios que os alunos tiveram com informtica e com programao. bom deixar claro que este livro pode ser acompanhado por uma pessoa que nunca viu um computador na frente em sua vida, mas que aprender a programar no uma tarefa fcil, preciso se empenhar. Na segunda metade da aula, exercitamos as habilidades dramticas: para ilustrar o funcionamento de um programa de computador complexo, vamos fazer de conta que somos partes de um programa de computador trabalhando em conjunto para atingir um certo objetivo. Se voc estiver organizando a encenao com seus colegas, voc pode fazer um certo suspense sobre qual o objetivo (simular uma disputa de pnaltis) e sobre como ele ser alcanado.

1.1

Disputa de pnaltis

A pea que encenaremos representar uma disputa de pnaltis entre dois times e contar com a participao de cerca de 26 atores desempenhando 8 papis. Se voc no tiver 26 atores disponveis, voc pode elaborar a sua prpria adaptao da pea. Os papis so: Tcnico (2 atores) Juiz (1 ator) Bandeirinha (2 atores) Gandula (1 ator) 1

2 Jogador. Os jogadores so divididos em dois tipos: Goleiro (2 atores desempenham este papel) Batedor de pnalti (10 atores) Torcedor. Os torcedores so divididos em dois tipos: Torcedor educado (4 atores) Torcedor mal-educado (4 atores)

CAPTULO 1. TEATRO DE OBJETOS

O professor (ou o diretor da pea, que pode ser voc) ser responsvel por escolher as pessoas que desempenharo cada papel. Se houver limitao de espao, conveniente que os 8 torcedores quem concentrados em uma rea separada (por exemplo, em uma suas prprias carteiras, se o local for uma sala de aula) para no tumultuar muito o ambiente. Obviamente, o diretor pode tambm aumentar ou diminuir o nmero de torcedores e de batedores de pnalti. Para desempenhar o papel de torcedores, uma boa dica o diretor escolher pessoas que paream bem barulhentas e faladoras (por exemplo, a turma do fundo numa sala de aula :-). Ao escolher os atores, o diretor dever entregar um carto preso com um barbante que car pendurado no pescoo do ator e conter informaes sobre o papel desempenhado pelo ator. As informaes so: 1. Nome do papel 2. Mensagens que o personagem capaz de entender 3. Atributos do personagem Os trs tipos de informao acima j devem vir pr-escritos caneta no carto mas os valores dos atributos do personagem devem ser escritos na hora a lpis pelo diretor. Alguns papis, como o de juiz, no possuem nenhum atributo. Outros papis podem possuir um ou mais atributos, o jogador, por exemplo, pode possuir como atributos o nome do time ao qual pertence e o nmero da sua camisa. No caso de o jogador ser um goleiro, o atributo nmero da camisa pode vir escrito a caneta como valendo 1. Alm do carto que ca pendurado no pescoo do ator, cada ator recebe um script descrevendo o seu comportamento: para cada mensagem recebida pelo ator, o script descreve quais aes devem ser tomadas pelo ator. O diretor no deve esquecer de trazer uma bola para esta atividade e deve tomar cuidado para que nenhuma janela seja quebrada durante a realizao da atividade. O tempo total estimado para a realizao da atividade de 50 minutos. A maior parte do tempo gasto explicando-se os procedimentos. A encenao em si, demora entre 5 e 10 minutos dependendo da qualidade dos batedores de pnalti e dos goleiros. Eis a descrio detalhada dos dados que devero aparecer nos cartes descritivos e no script (comportamento) de cada um dos 26 atores participantes da encenao. Para obter verses PDF dos cartes prontas para impresso, visite o stio deste livro: www.ime.usp.br/~kon/livros/Java

1.1. DISPUTA DE PNALTIS 1. Goleiro Carto de Identicao Nome do Papel: Goleiro Mensagens que entende: SuaVez, Cobrana Autorizada, VenceuOTimeX Atributos: Time: , Camisa nmero: 1 Comportamento (Script)

3

mensagem: SuaVez ao: posiciona-se na frente do gol e ca esperando pela cobrana do pnalti. mensagem: CobranaAutorizada ao: concentra-se na bola que ser chutada pelo adversrio e faz de tudo para no deixar que a bola entre no gol. O goleiro no pode se adiantar antes do chute do adversrio. Aps a cobrana sair do gol para dar lugar ao goleiro adversrio. mensagem: VenceuOTimeX ao: se TimeX igual ao atributo Time no seu carto de identicao, comemore; caso contrrio, xingue o juiz (polidamente! :-). 2. Batedor de Pnalti Carto de Identicao Nome do Papel: Batedor de Pnalti Mensagens que entende: SuaVez, CobranaAutorizada, VenceuOTimeX Atributos: Time: , Camisa nmero: Comportamento mensagem: SuaVez ao: posiciona-se na frente da bola e ca esperando pela autorizao do juiz. mensagem: CobranaAutorizada ao: chuta a bola tentando marcar um gol. Aps a cobrana voltar para junto do seu tcnico para dar lugar prxima cobrana. mensagem: VenceuOTimeX ao: se TimeX igual ao atributo Time no seu carto de identicao, comemore; caso contrrio, xingue o juiz (polidamente! :-). 3. Torcedor Educado Carto de Identicao Nome do Papel: Torcedor Educado Mensagens que entende: Ao, VenceuOTimeX Atributos: Time: , Camisa nmero: 12 Comportamento mensagem: Ao ao: assista ao jogo emitindo opinies inteligentes sobre o andamento da peleja e manifestando o seu apreo e desapreo pelo desenrolar da disputa. mensagem: VenceuOTimeX ao: se TimeX igual ao atributo Time no seu carto de identicao, comemore e faa um comentrio elogioso sobre o seu time; caso contrrio, elogie o adversrio e parabenize o seu time pelo empenho.

4 4. Torcedor Mal-Educado Carto de Identicao Nome do Papel: Torcedor Mal-Educado Mensagens que entende: Ao, VenceuOTimeX Atributos: Time: , Camisa nmero: 12 Comportamento

CAPTULO 1. TEATRO DE OBJETOS

mensagem: Ao ao: assista ao jogo emitindo opinies duvidosas sobre o andamento da peleja e manifestando a sua raiva ou alegria pelo desenrolar do jogo. mensagem: VenceuOTimeX ao: se TimeX igual ao atributo Time no seu carto de identicao, xingue o adversrio. Caso contrrio, xingue o adversrio desesperadamente (mas, por favor, no se esquea que estamos em uma universidade). 5. Juiz Carto de Identicao Nome do Papel: Juiz Mensagens que entende: Ao, Irregularidade Comportamento mensagem: Ao ao: coordene o andamento da disputa de pnaltis enviando mensagens SuaVez para o tcnico do time batedor e para o goleiro defensor a cada nova batida. Quando os personagens estiverem a postos, emita a mensagem CobranaAutorizada. Faa a contagem de gols e quando houver um vencedor, emita a mensagem VenceuOTimeX onde TimeX o nome do time vencedor. A disputa de pnaltis feita alternadamente, 5 cobranas para cada time. Se no houver um ganhador aps as 5 cobranas, so feitas novas cobranas alternadamente at que haja um vencedor. mensagem: Irregularidade ao: se a mensagem foi enviada por um Bandeirinha, ignore a cobrana recm-efetuada e ordene que ela seja realizada novamente enviando a mensagem RepitaCobrana ao tcnico apropriado. 6. Gandula Carto de Identicao Nome do Papel: Gandula Mensagens que entende: CobranaAutorizada Comportamento mensagem: CobranaAutorizada ao: preste ateno cobrana do pnalti. Aps a concluso da cobrana, pegue a bola e leve-a de volta marca de pnalti.

1.1. DISPUTA DE PNALTIS 7. Tcnico Carto de Identicao Nome do Papel: Tcnico Mensagens que entende: SuaVez, RepitaCobrana, VenceuOTimeX Atributos: Time: Comportamento

5

mensagem: SuaVez ao: escolha um dos seus jogadores para efetuar a cobrana e envie a mensagem SuaVez. No repita jogadores nas 5 cobranas iniciais. mensagem: RepitaCobrana ao: envie a mensagem SuaVez para o jogador que acabou de efetuar a cobrana. mensagem: VenceuOTimeX ao: se TimeX igual ao atributo Time no seu carto de identicao, comemore; caso contrrio, diga que o seu time foi prejudicado pela arbitragem e que futebol uma caixinha de surpresas. 8. Bandeirinha Carto de Identicao Nome do Papel: Bandeirinha Mensagens que entende: Cobrana Autorizada, VenceuOTimeX Comportamento mensagem: CobranaAutorizada ao: verique se o goleiro realmente no avana antes de o batedor chutar a bola. Caso ele avance, envie uma mensagem Irregularidade para o Juiz. mensagem: VenceuOTimeX ao: se TimeX no o nome do time da casa, distancie-se da torcida pois voc acaba de se tornar um alvo em potencial.

6

CAPTULO 1. TEATRO DE OBJETOS

Captulo 2

Histria da ComputaoQuais novidades veremos neste captulo? a histria da computao; evoluo da arquitetura do computador; evoluo das linguagens de programao.

A Computao tem sido considerada uma cincia independente desde meados do sculo XX. No entanto, desde a antiguidade, a humanidade busca formas de automatizar os seus cmputos e de criar mquinas e mtodos para facilitar a realizao de clculos. Neste captulo, apresentamos inicialmente uma linha do tempo que indica alguns dos principais eventos ocorridos na histria da computao e na evoluo da arquitetura dos computadores automticos. Em seguida, apresentamos uma linha do tempo da evoluo das linguagens de programao.

2.1

Histria da Computao e Arquitetura do Computador

baco (Soroban em japons) (criado ~2000 anos atrs) Blaise Pascal, 1642 (pai da calculadora) o primeiro computador digital hoje, diramos apenas que era uma calculadora super simplicada capaz de somar entrada atravs de discos giratrios ajudou seu pai, coletor de impostos Leibniz computador capaz de somar e multiplicar (inventou em 1671 e construiu em 1694) 7

8

CAPTULO 2. HISTRIA DA COMPUTAO criou o mecanismo de engrenagens do "vai-um" usado at hoje Joseph Marie Jacquard (1752 - 1834) 1790: criou um sistema de tear semi-automtico onde os desenhos de ores, folhas e guras geomtricas eram codicados em cartes perfurados 1812: havia cerca de 11 mil teares de Jacquard na Frana a mquina despertou muitos protestos de artesos que temiam o desemprego que a mquina poderia causar a mquina era capaz de desenhar padres de alta complexidade como, por exemplo, um auto-retrato de Jacquard feito com 10 mil cartes perfurados Charles Babbage (professor de Matemtica em Cambridge, Inglaterra) 1812: notou que muito do que se fazia em Matemtica poderia ser automatizado iniciou projeto do "Difference Engine" (Mquina/Engenho/Engenhoca de Diferenas) 1822: terminou um prottipo da mquina e obteve nanciamento do governo para constru-la 1823: iniciou a construo (usaria motor a vapor, seria totalmente automtico, imprimiria o resultado e teria um programa xo) 1833: depois de 10 anos teve uma idia melhor e abandonou tudo Nova idia: mquina programvel, de propsito geral: "Analytical Engine" (Mquina Analtica) manipularia nmeros de 50 dgitos memria de 1000 dgitos estaes de leitura leriam cartes perfurados similares ao de tear de Jacquard (nesta poca, o auto-retrato de Jacquard pertencia a Babbage) mas ele no conseguiu constru-lo tecnologia mecnica da poca era insuciente pouca gente via a necessidade para tal mquina Ada Lovelace (me da programao) escreveu programas para o engenho analtico; inventou a palavra algoritmo em homenagem ao matemtico Al-Khawarizmi (820 d.C.) Algoritmo: seqncia de operaes ou comandos que, aplicada a um conjunto de dados, permite solucionar classes de problemas semelhantes. Exemplos: algoritmo da diviso, da raiz cbica, para resoluo de equaes do segundo grau, etc. a mquina foi nalmente construda pelo governo ingls nos anos 1990 (e funciona!) Herman Hollerith, 1890 criou cartes perfurados para uso no censo americano tecnologia levou criao da International Business Machines (IBM) at hoje dizemos que no nal do ms os empregados recebem o holerite como sinnimo de contracheque

2.1. HISTRIA DA COMPUTAO E ARQUITETURA DO COMPUTADOR Avanos nas calculadoras de mesa Em 1890, as mquinas permitiam: acumular resultados parciais armazenamento e reentrada automtica de resultados passados (memria) imprimir resultados em papel MARK 1, criada em 1937 por Howard Aiken, professor de Matemtica Aplicada de Harvard calculadora eletromecnica com motor eltrico pesava 5 toneladas, usava toneladas de gelo para refrigerao multiplicava dois nmeros de 23 dgitos em 3 segundos John Vincent Atanasoff, Universidade Estadual de Iowa construiu o que considerado o primeiro computador digital entre 1937 e 1942 calculadora com vlvulas a vcuo (240 vlvulas) resolvia equaes lineares, diferenciais e de balstica manipulava nmeros binrios Rumo programabilidade Alan Turing,

9

Trabalhou para o exrcito ingls ajudando a quebrar o cdigo criptogrco da mquina Enigma criada pelos alemes Realizou importantes contribuies prticas e tericas Cincia da Computao 1912: nasce em Londres 1935: Ganha bolsa para realizar pesquisas no Kings College, Cambridge 1936: Elabora Mquina de Turing, pesquisas em computabilidade 1936-38: Princeton University. Ph.D. Lgica, lgebra, Teoria dos Nmeros 1938-39: Cambridge. apresentado mquina Enigma dos alemes 1939-40: The Bombe, mquina para decodicao do Enigma criada em Bletchley Park 1939-42: quebra Enigma do U-boat, aliados vencem batalha do Atlntico 1943-45: Consultor-chefe anglo-americano para criptologia 1947-48: Programao, redes neurais e inteligncia articial 1948: Manchester University 1949: Pesquisas sobre usos do computador em clculos matemticos avanados 1950: Prope Teste de Turing para inteligncia de mquinas 1952: Preso por homossexualidade, perde privilgios militares 1953-54: Trabalho no nalizado em Biologia e Fsica; tem sua reputao e vida destrudas pelos militares ingleses

10

CAPTULO 2. HISTRIA DA COMPUTAO

Figura 2.1: Arquitetura do ENIAC

1954: Suicida-se em Wilmslow, Cheshire Livro interessante sobre sua vida e obra: Alan Turing: the Enigma de Andrew Hodges, 2000 Stio sobre a vida de Turing mantido pelo autor deste livro: http://www.turing.org.uk/turing ENIAC (Electronic Numerical Integrator and Computer), 1945 por alguns, considerado o primeiro computador eletrnico nmeros de 10 dgitos decimais 300 multiplicaes ou 5000 somas por segundo 17486 vlvulas, a queima de vlvulas era quase que diria 6000 comutadores manuais e centenas de cabos usados na programao programao era muito difcil Arquitetura do ENIAC (ver Figura 2.1) programa especicado manualmente em "hardware" com conexes semelhantes quelas que as velhas telefonistas utilizavam memria de dados separada do controle e separada do programa o controle formado por circuitos eletroeletrnicos John Von Neumann, matemtico, 1945 estudo abstrato de modelos de computao levou arquitetura do computador moderno o programa deve ser guardado no mesmo lugar que os dados: na memria Arquitetura de Von Neumann (ver Figura 2.2) hoje em dia, h vrios tipos de memria ROM, RAM, ash RAM, etc.) o controlador em memria, levou idia de sistema operacional que temos hoje Nunca diga nunca...

2.1. HISTRIA DA COMPUTAO E ARQUITETURA DO COMPUTADOR

11

Figura 2.2: Arquitetura de Von Neumann

Aiken declarou em 1947 que nunca haveria necessidade de mais de um ou dois computadores programveis e que os projetos neste sentido deveriam ser abandonados Bill Gates declarou na dcada de 1980 que a Microsoft nunca desenvolveria um sistema operacional de 32 bits Anos 50 1953: IBM vende 15 mquinas baseadas no modelo de Neumann transistores memria magntica ("magnetic core memory") Anos 60 circuitos impressos / circuitos integrados (chips) crescimento segundo lei de Moore, que diz que o nmero de transistores em circuitos integrados duplica a cada 18 meses. Esta lei continua valendo at hoje computao limitada a poucos computadores de grande porte Anos 70 indo contra o modelo centralizador da IBM, gerao sexo, drogas e rock-and-roll da California exige a democratizao da informtica revista esquerdista da Universidade da Califrnia em Berkeley Peoples Computer Company defende a criao de computadores pessoais e de cooperativas de informao Steve Jobs cria a Apple em garagem em ~1975 e investe lucros do Apple II em shows de Rock (82) nasce a Microsoft governo da Califrnia apia microinformtica

12 Anos 80 IBM lana PC (1981) Apple lana MacIntosh (1984)

CAPTULO 2. HISTRIA DA COMPUTAO

Xerox inventa e Apple comercializa interface baseada em janelas ("Windows") Microsoft cresce comercializando o sistema operacional simplista MS-DOS para IBM-PCs (o DOS era uma verso simplicada do CPM que, por sua vez, era uma verso simplicada do UNIX) algumas empresas comeam a esconder cdigo-fonte do software (antes era sempre aberto) comea o movimento do software livre e software aberto Anos 90 Microsoft pega carona na exploso de vendas de PCs, utiliza tcnicas de marketing agressivas (consideradas por alguns como moralmente questionveis) para controlar o mercado de software, estabelecendo quase um monoplio em certas reas popularizao da Internet e criao da Web intensica-se o movimento do software livre nasce o Linux e uma nova forma de desenvolvimento de software baseada em comunidades distribudas atravs da Internet no nal da dcada, o governo americano percebe o perigo que a Microsoft representa e inicia batalha judicial contra a empresa (em 2002, aps a vitria dos conservadores na eleio nos EUA, o governo termina um processo judicial que havia iniciado; as sanes empresa so mnimas) Sculo XXI computadores de mo, telefones celulares, iPod sistemas embutidos computao ubqua e pervasiva grande crescimento da empresa Google atravs de servios inovadores na Web

2.2

Evoluo das Linguagens de Programao

Paralelamente evoluo do hardware dos computadores eletrnicos, ocorreu tambm a evoluo do software e das linguagens de programao utilizadas para desenvolv-lo. Inicialmente, as linguagens estavam bem prximas do funcionamento dos circuitos do hardware; paulatinamente, as linguagens foram se aproximando da linguagem natural utilizada pelos humanos em seu dia-a-dia. A mquina de Babbage s poderia ser programada com a troca fsica de engrenagens 1945, no ENIAC, a programao era feita mudando chaves e trocando a posio de cabos

2.2. EVOLUO DAS LINGUAGENS DE PROGRAMAO

13

1949-50, primeira linguagem binria, a programao era feita mudando os comandos de zero a um, e vice-versa 1951, Grace Hooper cria o primeiro compilador, A0, programa que transforma comandos em 0s e 1s 1957, primeira linguagem de programao de alto nvel: FORTRAN (FORmula TRANslating) (John Backus da IBM) 1958, criao de um padro universal de linguagem: ALGOL 58 (ALGOritmic Language) (origem da maioria das linguagens modernas). Primeira linguagem estruturada 1958, John McCarthy do MIT cria o LISP (LISt Processing), inicialmente projetada para uso em inteligncia articial. Nela tudo se baseia em listas. Ainda usada hoje em dia 1959, FORTRAN era ecaz para manipulao de nmeros, mas no para entrada e sada: foi criada COBOL (COmmon Bussines Oriented Language) 1964, criao do BASIC (Beginners All-purpose Symbolic Instruction Code) 1965, criao de uma linguagem especca para simulao (SIMULA I) por Ole-Johan Dahl and Kristen Nygaard da Universidade de Oslo. considerada a base das linguagens orientadas a objetos 1966, criao da linguagem Logo para desenhos grcos (a linguagem da tartaruga) 1967, Simula 67, uma linguagem de uso geral incluindo todos os conceitos fundamentais de orientao a objetos 1968, criao da linguagem PASCAL por Niklaus Wirth. Principal interesse: linguagem para o ensino. Combinou as melhores caractersticas de Cobol, Fortran e Algol, foi uma linguagem bem utilizada 1970, PROLOG, linguagem para programao lgica 1972, criao da linguagem C (Denis Ritchie). Supriu as decincias da linguagem Pascal e teve sucesso quase imediato 1972-1980, linguagem Smalltalk, desenvolvida por Alan Kay, da Xerox, utilizando as melhores caractersticas de LISP, Simula 67, Logo e ambientes grcos como Sketchpad; Orientao a Objetos ganha fora 1983, criadas extenses de C incluindo suporte para OO: C++ e Objective-C 1987, linguagens baseadas em scripts, como Perl, desenvolvida por Larry Wall. Ferramentas de UNIX como sed e awk no eram sucientes 1994, Java lanada pela Sun como a linguagem para a Internet 2000, lanamento do C# pela Microsoft, combinando idias das linguagens Java e C++ 2005, lanamento da verso 1.5 de Java Neste livro, apresentamos, de forma muito sucinta, algumas das principais linguagens de programao. Para referncias mais completas visite www.princeton.edu/~ferguson/adw/programming_languages.shtml e en.wikipedia.org/wiki/Programming_language.

14

CAPTULO 2. HISTRIA DA COMPUTAO

Captulo 3

Conversor de TemperaturasQuais novidades veremos neste captulo? primeiro programa em Java.

3.1

Analogia entre dramatizao da disputa de pnaltis e Programao Orientada a ObjetosTerminologia Teatral personagem (papel) ator envio de mensagem Terminologia de Programao Orientada a Objetos classe (tipo) objeto envio de mensagem, chamada de mtodo ou chamada de funo

Na dramatizao, podamos enviar uma mensagem (dizer alguma coisa) para um ator. Na programao orientada a objetos, podemos enviar uma mensagem para (ou chamar um mtodo de) um objeto. Os cartes de identicao denem os papis dos atores e os scripts especicam o comportamento dos atores no decorrer da pea. A linguagem Java permite que especiquemos a mesma coisa. Um carto de identicao tem 3 partes, essas mesmas 3 partes aparecem na denio de uma classe em Java. Por exemplo, o bandeirinha em Java seria mais ou menos assim:class Bandeirinha { CobranaAutorizada { / / V e r i f i c a s e o g o l e i r o r e a l m e n t e no a v a n a a n t e s de o b a t e d o r . . . } VenceuOTime ( NomeDoTime ) { / / Se NomeDoTime no o nome do t i m e da casa , d i s t a n c i e s e da t o r c i d a . . . } }

15

16

CAPTULO 3. CONVERSOR DE TEMPERATURAS

3.2

Um exemplo real em Java: um conversor de Celsius para Fahrenheit

Sempre o primeiro passo antes de programar analisar o problema. 9 9 F 32 C = F 32 = C F = C + 32 9 5 5 5 Traduzindo esta frmula para Java temos F=9*C/5+32. A seguir iremos criar diversas classes para realizar a converso entre Celsius e Fahrenheit. 1. Primeira tentativa: programa em Java para converter 40 graus Celsius para Fahrenheit.c l a s s Conversor { int celsiusParaFahrenheit () { r e t u r n 9 40 / 5 + 3 2 ; } }

para executar este conversor dentro do DrJava1 , podemos digitar o seguinte na janela do interpretador (chamada de interactions):C o n v e r s o r c1 = new C o n v e r s o r ( ) ; c1 . c e l s i u s P a r a F a h r e n h e i t ( )

o DrJava imprimir o valor devolvido pelo mtodo celsiusParaFahrenheit do objeto c1. limitao: sempre converte a mesma temperatura. 2. Segunda tentativa: conversor genrico de temperaturas Celsius -> Fahrenheit. capaz de converter qualquer temperatura de Fahrenheit para Celsius.c l a s s Conversor2 { int celsiusParaFahrenheit ( int c ) { return 9 c / 5 + 32; } }

para executar este conversor, podemos digitar o seguinte na janela do interpretador:C o n v e r s o r 2 c2 = new C o n v e r s o r 2 ( ) ; c2 . c e l s i u s P a r a F a h r e n h e i t ( 1 0 0 )

o DrJava imprimir o valor devolvido pelo mtodo celsiusParaFahrenheit do objeto c2.1 Para

mais informaes sobre o DrJava consulte o Apndice A.

3.2. UM EXEMPLO REAL EM JAVA: UM CONVERSOR DE CELSIUS PARA FAHRENHEIT

17

limitao: essa classe manipula apenas nmeros inteiros. Mas, em geral, temperaturas so nmeros reais, fracionrios, ento nmeros inteiros no so sucientes. Quando o computador opera com nmeros inteiros, os nmeros so truncados, ou seja, 30.3 se torna 30 e 30.9 tambm se torna 30. Devido a esta limitao, se tivssemos escrito a frmula como 9 C + 32, o clculo seria errado, 5 9 uma vez que 5 = 1 se considerarmos apenas a parte inteira da diviso. Assim, o programa calcularia apenas 1 C + 32. Quando precisamos trabalhar com nmeros reais, usamos nmeros de ponto utuante (oating point numbers). Esse nome se deriva do fato de que internamente os nmeros so representados de forma parecida a potncias de 10 onde, variando o expoente da potncia, movemos (utuamos) o ponto decimal para a esquerda ou para a direita. De oating point vem o tipo float da linguagem Java. Nmeros do tipo float so armazenados em 4 bytes e tem uma preciso de 23 bits (o que equivale a aproximadamente 7 casas decimais). No entanto, quase sempre so utilizados nmeros de ponto utuante com preciso dupla que so chamados de double. Em Java, um double ocupa 8 bytes e tem preciso de 52 bits, o que equivale a aproximadamente 16 casas decimais. Daqui para frente sempre que precisarmos de nmeros fracionrios, vamos utilizar o tipo double. Mas lembre-se de que as variveis do tipo double so apenas uma aproximao do nmero real, como podemos ver no exemplo abaixo: > double x = 1.0 1.0 > x = x / 59049 1.6935087808430286E-5 > x = x * 59049 0.9999999999999999 Aps dividir o nmero 1.0 pelo nmero 310 = 59049 e depois multiplic-lo por este mesmo nmero, obtivemos um valor diferente do inicial. Por este motivo, devemos ter muito cuidado com os erros de arredondamento presentes quando utilizamos nmeros de ponto utuante. 3. Terceira tentativa: conversor genrico usando doublec l a s s Conversor3 { double c e l s i u s P a r a F a h r e n h e i t ( double c ) { return 9.0 c / 5.0 + 3 2 . 0 ; } }

para executar este conversor, podemos digitar o seguinte na janela do interpretador:C o n v e r s o r 3 c3 = new C o n v e r s o r 3 ( ) ; c3 . c e l s i u s P a r a F a h r e n h e i t ( 3 7 . 8 ) ;

limitao: s faz converso em um dos sentidos.

18

CAPTULO 3. CONVERSOR DE TEMPERATURAS 4. Quarta e ltima verso: converso de mo duplac l a s s Conversor4 { double c e l s i u s P a r a F a h r e n h e i t ( double c ) { return 9.0 c / 5.0 + 3 2 . 0 ; } double f a h r e n h e i t P a r a C e l s i u s ( double f ) { return 5.0 ( f 3 2 . 0) / 9 . 0 ; } }

para executar este conversor, podemos digitar o seguinte na janela do interpretador:C o n v e r s o r 4 c4 = new C o n v e r s o r 4 ( ) ; c4 . c e l s i u s P a r a F a h r e n h e i t ( 3 7 . 8 ) ; c4 . F a h r e n h e i t P a r a C e l s i u s ( 2 0 . 3 ) ;

Note que, para que o seu programa que bem legvel e elegante, muito importante o alinhamento dos abre-chaves { com os fecha-chaves } correspondentes. Em programas mais complexos, esse correto alinhamento (indentao) ajuda muito a tornar o programa mais claro para seres humanos.

Exerccios1. Crie uma classe Conversor5 que inclua tambm a escala Kelvin (K). Esta classe deve conter conversores entre as trs escalas de temperatura (Celsius, Fahrenheit e Kelvin), totalizando seis funes. A relao entre as trs escalas dada por: F 32 C K 273 = = 9 5 5 2. Iremos agora construir uma classe que calcula o valor de um nmero ao quadrado e ao cubo. Para tal, crie uma classe que contenha dois mtodos. O primeiro mtodo deve receber um nmero e devolver o seu quadrado e o segundo mtodo deve receber um nmero e devolver o seu valor ao cubo. Escolha nomes para a classe e mtodos que facilitem a compreenso de seu funcionamento. 3. Neste exerccio iremos simular um jogo de tnis. A partida de tnis composta por diversos papis: jogador, juiz de cadeira, juiz de linha, treinador, gandula, torcedor. Para cada um destes papis, descreva as mensagens que os atores de cada papel devem receber, e seu comportamento para cada uma delas. Utilize como modelo a descrio do papel Bandeirinha apresentada no incio deste captulo.

Captulo 4

Testes AutomatizadosQuais novidades veremos neste captulo? comando if e else; comparaes == (igualdade) e != (diferena); denio de variveis inteiras e de ponto utuante; impresso de texto; comentrios.

Desde o incio, a computao sempre esteve sujeita erros. O termo bug, para denotar erro, tem uma origem muito anterior (vem de um inseto que causava problemas de leitura no fongrafo de Thomas Edison em 1889). Vrias outras histrias reais, ou nem tanto, tambm apareceram no incio da informtica. Infelizmente, muito difcil garantir que no existam erros em programas. Uma das formas de se garantir que certos erros no vo ocorrer testando algumas situaes. Apesar da clebre armao de Edsger Dijkstra 1 de que testes podem apenas mostrar a presena de erros e no a sua ausncia, eles podem ser os nossos grandes aliados no desenvolvimento de programas corretos. Intuitivamente, quanto mais testes zermos em um programa e quanto mais abrangentes eles forem, mais conantes podemos car com relao ao seu funcionamento. Por outro lado, podemos usar o prprio computador para nos ajudar, isto , podemos criar testes automatizados. Em vez de fazermos os testes na mo, faremos com que o computador seja capaz de vericar o funcionamento de uma seqncia de testes. Veremos neste captulo como desenvolver testes automatizados, passo a passo, para os conversores de temperatura vistos anteriormente. No incio da computao no havia uma preocupao muito grande com os testes, que eram feitos de forma manual pelos prprios programadores. Os grandes testadores eram os usurios nais. interessante notar que isto acontece com alguns produtos ainda hoje. Com o aparecimento da Engenharia de Software cou clara a necessidade de se efetuarem testes, tanto que em vrias empresas de desenvolvimento de software existe a gura do testador, responsvel por tentar encontrar erros em sistemas. Hoje existe uma tendncia para se1 Um dos mais inuentes membros da gerao dos criadores da Cincia da Computao. A pgina http://www.cs.utexas.edu/ users/EWD contm cpias de vrios de seus manuscritos.

19

20

CAPTULO 4. TESTES AUTOMATIZADOS

considerar que testes automatizados so muito importantes, devendo ser escritos mesmo antes de se escrever o cdigo propriamente dito, tcnica esta chamada de testes a priori. Veremos como testar os diversos conversores de temperatura. Como testar o nosso primeiro programa em Java (Conversor).C o n v e r s o r c1 = new C o n v e r s o r ( ) / / a r e s p o s t a e s p e r a d a o e q u i v a l e n t e a 40C em F i f ( c1 . c e l s i u s P a r a F a h r e n h e i t ( ) == 1 0 4 ) System . o u t . p r i n t l n ( " F u n c i o n a " ) ; else System . o u t . p r i n t l n ( " No f u n c i o n a " ) ;

Note que para fazer o teste utilizamos o comando condicional if else. O formato genrico deste comando o seguinte.i f (CONDIO) COMANDO1; else COMANDO2;

Se a CONDIO verdadeira, o COMANDO-1 executado, caso contrrio, o COMANDO-2 executado. A classe Conversor2 possui um mtodo que aceita um parmetro, veja o teste abaixo:C o n v e r s o r 2 c2 = new C o n v e r s o r 2 ( ) ; / / c r i a duas v a r i v e i s i n t e i r a s int entrada = 40; int r e s p o s t a = 104; / / a r e s p o s t a e s p e r a d a o e q u i v a l e n t e e n t r a d a C em F i f ( c2 . c e l s i u s P a r a F a h r e n h e i t ( e n t r a d a ) == r e s p o s t a ) System . o u t . p r i n t l n ( " F u n c i o n a " ) ; else System . o u t . p r i n t l n ( " No f u n c i o n a " ) ;

Note que, para realizar o teste acima, denimos duas variveis inteiras chamadas de entrada e resposta. A linhaint entrada = 40;

faz na verdade duas coisas. Primeiro, ela declara a criao de uma nova varivel (int entrada;) e, depois, atribui um valor inicial a esta varivel (entrada = 40;). Na linguagem Java, se o valor inicial de uma varivel no atribudo, o sistema atribui o valor 0 varivel automaticamente. Note que isso no necessariamente verdade em outras linguagens como, por exemplo, C e C++. Podemos tambm testar o Conversor2 para outros valores. Por exemplo, para as entradas (e respostas): 20 (68) e 100 (212).e n t r a d a = 2 0 ; / / como a s v a r i v e i s j f o r a m d e c l a r a d a s acima , b a s t a usl a s r e s p o s t a = 68; i f ( c2 . c e l s i u s P a r a F a h r e n h e i t ( e n t r a d a ) == r e s p o s t a ) System . o u t . p r i n t l n ( " F u n c i o n a " ) ; else

21System . o u t . p r i n t l n ( " No f u n c i o n a " ) ; entrada = 100; r e s p o s t a = 212; i f ( c2 . c e l s i u s P a r a F a h r e n h e i t ( e n t r a d a ) == r e s p o s t a ) System . o u t . p r i n t l n ( " F u n c i o n a " ) ; else System . o u t . p r i n t l n ( " No f u n c i o n a " ) ;

No programa acima o texto Funciona ser impresso na tela a cada sucesso, o que poder causar uma poluio visual caso tenhamos dezenas ou centenas de testes. O ideal para um testador que ele que silencioso caso os testes dem certo e chame a ateno caso ocorra algum erro. Podemos ento mudar o programa para:C o n v e r s o r 2 c2 = new C o n v e r s o r 2 ( ) ; int entrada = 40; int r e s p o s t a = 104; i f ( c2 . c e l s i u s P a r a F a h r e n h e i t ( e n t r a d a ) ! = r e s p o s t a ) System . o u t . p r i n t l n ( " No f u n c i o n a p a r a 40 " ) ; entrada = 20; r e s p o s t a = 68; i f ( c2 . c e l s i u s P a r a F a h r e n h e i t ( e n t r a d a ) ! = r e s p o s t a ) System . o u t . p r i n t l n ( " No f u n c i o n a p a r a 20 " ) ; entrada = 100; r e s p o s t a = 212; i f ( c2 . c e l s i u s P a r a F a h r e n h e i t ( e n t r a d a ) ! = r e s p o s t a ) System . o u t . p r i n t l n ( " No f u n c i o n a p a r a 100 " ) ; System . o u t . p r i n t l n ( " Fim d o s t e s t e s " ) ;

Note que o comando if acima foi utilizado sem a parte do else, o que perfeitamente possvel. Adicionamos tambm uma linha nal para informar o trmino dos testes. Ela importante no caso em que todos os testes do certo para que o usurio saiba que a execuo dos testes foi encerrada. Uma forma de simplicar os comandos de impresso usar a prpria entrada como parmetro, o que pode ser feito da seguinte forma:System . o u t . p r i n t l n ( " No f u n c i o n a p a r a " + e n t r a d a ) ;

Criaremos agora os testes para o Conversor4. Mas, agora, devem ser testados os seus dois mtodos. Introduziremos um testador automtico criando uma classe com apenas um mtodo que faz o que vimos.class TestaConversor4 { int testaTudo () { C o n v e r s o r 4 c4 = new C o n v e r s o r 4 ( ) ; double c e l s i u s = 1 0 . 0 ; double f a h r e n h e i t = 5 0 . 0 ; i f ( c4 . c e l s i u s P a r a F a h r e n h e i t ( c e l s i u s ) ! = f a h r e n h e i t ) System . o u t . p r i n t l n ( "C> F no f u n c i o n a p a r a " + c e l s i u s ) ;

22

CAPTULO 4. TESTES AUTOMATIZADOSi f ( c4 . f a h r P a r a C e l s i u s ( f a h r e n h e i t ) ! = c e l s i u s ) System . o u t . p r i n t l n ( " F> C no f u n c i o n a p a r a " + f a h r e n h e i t ) ; celsius = 20.0; fahrenheit = 68.0; i f ( c4 . c e l s i u s P a r a F a h r e n h e i t ( c e l s i u s ) ! = f a h r e n h e i t ) System . o u t . p r i n t l n ( "C> F no f u n c i o n a p a r a " + c e l s i u s ) ; i f ( c4 . f a h r P a r a C e l s i u s ( f a h r e n h e i t ) ! = c e l s i u s ) System . o u t . p r i n t l n ( " F> C no f u n c i o n a p a r a " + f a h r e n h e i t ) ; celsius = 101.0; fahrenheit = 213.8; i f ( c4 . c e l s i u s P a r a F a h r e n h e i t ( c e l s i u s ) ! = f a h r e n h e i t ) System . o u t . p r i n t l n ( "C> F no f u n c i o n a p a r a " + c e l s i u s ) ; i f ( c4 . f a h r P a r a C e l s i u s ( f a h r e n h e i t ) ! = c e l s i u s ) System . o u t . p r i n t l n ( " F> C no f u n c i o n a p a r a " + f a h r e n h e i t ) ; System . o u t . p r i n t l n ( " F i n a l d o s t e s t e s " ) ; return 0; }

}

Comentrios: Voc deve ter notado que, no meio de alguns exemplos de cdigo Java deste captulo, ns introduzimos uns comentrios em portugus. Comentrios deste tipo so possveis em praticamente todas as linguagens de programao e servem para ajudar os leitores do seu cdigo a compreender mais facilmente o que voc escreveu. Comentrios em Java podem ser inseridos de duas formas. O smbolo // faz com que tudo o que aparecer aps este smbolo at o nal da linha seja ignorado pelo compilador Java; este o formato que utilizamos neste captulo e que utilizaremos quase sempre neste livro. A segunda forma atravs dos smbolos /* (que indica o incio de um comentrio) e */ (que indica o nal de um comentrio). Neste caso, um comentrio pode ocupar vrias linhas. Esta tcnica tambm til para desprezarmos temporariamente um pedao do nosso programa. Por exemplo, se queremos testar se uma classe funciona mesmo se removermos um de seus mtodos, no necessrio apagar o cdigo do mtodo. Basta acrescentar um /* na linha anterior ao incio do mtodo, acrescentar um */ logo aps a ltima linha do mtodo e recompilar a classe. Posteriormente, se quisermos reinserir o mtodo, basta remover os smbolos de comentrios. Outro uso para este ltimo tipo de comentrios quando desejamos testar uma verso alternativa de um mtodo. Comentamos a verso antiga do mtodo, inserimos a verso nova e testamos a classe. Podemos a decidir qual verso utilizar e, ento, remover a que no mais ser usada. Agora, vamos treinar o que aprendemos com alguns exerccios. Em particular, os exerccios 3, de refatorao, e 4, que indica quais casos devem ser testados, so muito importantes.

Exerccios1. Escreva uma classe TestaConversor3 para testar a classe Conversor3.

23 2. Importante: Refatore a classe TestaConversor4 de modo a eliminar as partes repetidas do cdigo. Dica: Crie um mtodo que realiza o teste das duas funes. 3. Importante: Podemos criar testes para objetos de uma classe que no sabemos como foi implementada. Para tal, basta conhecermos suas entradas e sadas. Escreva um teste automatizado para a seguinte classe:c l a s s Contas { double c a l c u l a Q u a d r a d o ( double x ) ; double c a l c u l a C u b o ( double x ) ; }

Ao escrever o teste, pense em testar vrios casos com caractersticas diferentes. Em particular, no deixe de testar os casos limtrofes que , geralmente, onde a maioria dos erros tendem a se concentrar. Na classe Contas acima, os casos interessantes para teste seriam, por exemplo: x = 0; x um nmero positivo pequeno; x um nmero negativo pequeno; x um nmero positivo grande; x um nmero negativo grande. Alm disso, seria interessante que, em alguns dos casos acima, x fosse um nmero inteiro e em outros casos, um nmero fracionrio. 4. Programas conveis: Se conhecemos uma implementao e sabemos que a mesma funciona de maneira convel, ela pode servir de base para o teste de outras implementaes. Caso duas implementaes diferentes produzam resultados distintos para os mesmos dados de entrada, podemos dizer que pelo menos uma das duas est errada; Supondo que a classe Contas do exerccio anterior convel, escreva um teste automatizado que utiliza esta classe para testar a classe ContasNoConfiavel dada abaixo:c l a s s ContasNoConfivel { double c a l c u l a Q u a d r a d o ( double x ) ; double c a l c u l a C u b o ( double x ) ; }

Resolues Exerccio 2class TesteConversor4Refatorado { i n t t e s t e P o n t u a l ( double c e l s i u s , double f a h r e n h e i t ) { C o n v e r s o r c4 = new C o n v e r s o r 4 ( ) ;

24

CAPTULO 4. TESTES AUTOMATIZADOS

i f ( c4 . c e l s i u s P a r a F a h r e n h e i t ( c e l s i u s ) ! = f a h r e n h e i t ) System . o u t . p r i n t l n ( "C> F no f u n c i o n a p a r a " + c e l s i u s ) ; i f ( c4 . f a h r P a r a C e l s i u s ( f a h r e n h e i t ) ! = c e l s i u s ) System . o u t . p r i n t l n ( " F> C no f u n c i o n a p a r a " + f a h r e n h e i t ) ; return 0; } int testaTudo () { double c e l s i u s = 1 0 . 0 ; double f a h r e n h e i t = 5 0 . 0 ; testePontual ( celsius , fahrenheit ); celsius = 20.0; fahrenheit = 68.0; testePontual ( celsius , fahrenheit ); celsius = 101.0; fahrenheit = 213.8; testePontual ( celsius , fahrenheit ); System . o u t . p r i n t l n ( " F i n a l d o s t e s t e s " ) ; return 0; } }

Exerccio 3class TesteContas { int teste () { C o n t a s c o n t a s = new C o n t a s ( ) ; double v a l o r = 4 . 0 ; i f ( c o n t a s . c a l c u l a Q u a d r a d o ( v a l o r ) != 1 6 . 0 ) System . o u t . p r i n t l n ( " No f u n c i o n a p a r a c a l c u l a r o q u a d r a d o de 4 " ) ; i f ( c o n t a s . c a l c u l a C u b o ( v a l o r ) != 6 4 . 0 ) System . o u t . p r i n t l n ( " No f u n c i o n a p a r a c a l c u l a r 4 ao cubo " ) ; return 0; } }

Captulo 5

Mtodos com Vrios ParmetrosQuais novidades veremos neste captulo? Mtodos com vrios parmetros; Atributos; Mtodos que devolvem nada (void); Escolha de bons nomes.

No ltimo captulo, vimos um mtodo que recebe vrios parmetros. Apesar de no estarmos apresentando nenhuma novidade conceitual, vamos reforar a possibilidade da passagem de mais de um parmetro. Ao chamarmos um mtodo que recebe mltiplos parmetros, assim como no caso de mtodos de um parmetro, devemos passar valores do mesmo tipo que aqueles que o mtodo est esperando. Por exemplo, se um objeto (ator) tem um mtodo (entende uma mensagem) que tem como parmetro um nmero inteiro, no podemos enviar a este objeto um nmero double. Apesar de ser intuitivo, tambm vale ressaltar que a ordem dos parmetros importante, de modo que na chamada de um mtodo devemos respeitar a ordem que est na sua denio. Vamos comear com o clculo da rea de uma circunferncia, onde necessrio apenas um parmetro, o raio:class Crculo1 { double c a l c u l a r e a ( double r a i o ) { return 3.14159 r a i o r a i o ; } }

25

26

CAPTULO 5. MTODOS COM VRIOS PARMETROS

Nota Lingstica: Em Java, o nome de variveis, classes e mtodos pode conter caracteres acentuados. Muitos programadores evitam o uso de acentuao mesmo ao usar nomes em portugus. Este costume advm de outras linguagens mais antigas, como C, que no permitem o uso de caracteres acentuados. Voc pode usar caracteres acentuados se quiser mas lembre-se que, se voc tiver uma varivel chamada rea, ela ser diferente de outra chamada area (sem acento); ou seja, se voc decidir usar acentos, dever us-los consistentemente sempre. Podemos sosticar o exemplo calculando tambm o permetro, com o seguinte mtodo:double c a l c u l a P e r m e t r o ( double r a i o ) { return 3.14159 2.0 r a i o ; }

O seguinte trecho de cdigo calcula e imprime a rea e o permetro de uma circunferncia de raio 3.0:C r c u l o 1 c = new C r c u l o 1 ( ) ; System . o u t . p r i n t l n ( c . c a l c u l a r e a ( 3 . 0 ) ) ; System . o u t . p r i n t l n ( c . c a l c u l a P e r m e t r o ( 3 . 0 ) ) ;

Vejamos agora uma classe Retngulo que dene mtodos para o clculo do permetro e da rea de um retngulo. Neste caso so necessrios dois parmetros.c l a s s Retngulo1 { i n t c a l c u l a r e a ( i n t lado1 , i n t lado2 ) { return lado1 lado2 ; } i n t c a l c u l a P e r m e t r o ( i n t lado1 , i n t lado2 ) { return 2 ( lado1 + lado2 ) ; } }

As chamadas para os mtodos podem ser da seguinte forma:R e t n g u l o 1 r = new R e t n g u l o 1 ( ) ; System . o u t . p r i n t l n ( r . c a l c u l a r e a ( 2 , 3 ) ) ; System . o u t . p r i n t l n ( r . c a l c u l a P e r m e t r o ( 2 , 3 ) ) ;

5.1

Atributos

Assim como no exemplo do teatrinho dos objetos onde os jogadores tinham como caracterstica o time e o nmero da camisa (atributos), tambm podemos ter algo semelhante para o caso dos retngulos. Podemos fazer com que os dados sobre os lados sejam caractersticas dos objetos. Isto feito da seguinte forma:

5.1. ATRIBUTOS

27

c l a s s Retngulo2 { int lado1 ; int lado2 ; int calcularea () { return lado1 lado2 ; } int calculaPermetro () { return 2 ( lado1 + lado2 ) ; } }

Na classe acima, lado1 e lado2 so atributos que faro parte de todas as instncias da classe Retngulo2. Um atributo, por ser denido fora dos mtodos, pode ser acessados a partir de qualquer mtodo da classe onde ele denido. Atributos so tambm chamados de propriedades ou variveis de instncia. No entanto, no exemplo acima, cou faltando algum mtodo para carregar os valores dos lados nas variveis lado1 e lado2. Poderamos escrever um mtodo para cada atributo ou ento, apenas um mtodo para denir o valor de ambos como no exemplo seguinte:v o i d c a r r e g a L a d o s ( i n t l 1 , i n t l 2 ) / / e s t e mtodo no d e v o l v e nenhum v a l o r { lado1 = l1 ; lado2 = l2 ; }

Nota Lingstica: void em ingls signica vazio, nada ou nulidade. Assim, quando temos um mtodo que no devolve nenhum valor, como, por exemplo, o mtodo carregaLados acima, colocamos a palavra void antes da denio do mtodo para indicar que ele no devolver nada. Neste caso, no necessrio incluir o comando return no corpo do mtodo. Mesmo assim, podemos usar um comando de retorno vazio para provocar o m prematuro da execuo do mtodo, como em: return ; . O uso do return vazio nem sempre recomendado pois, em alguns casos, pode gerar cdigo pouco claro, mas uma opo permitida pela linguagem. O funcionamento de um objeto da classe Retngulo2 pode ser vericado com o cdigo abaixo:R e t n g u l o 2 r = new R e t n g u l o 2 ( ) ; r . carregaLados (3 , 5); System . o u t . p r i n t l n ( r . c a l c u l a r e a ( ) ) ; System . o u t . p r i n t l n ( r . c a l c u l a P e r m e t r o ( ) ) ;

Para no perdermos o hbito, tambm veremos como testar esta classe. Neste caso, temos duas opes: criar diversos objetos do tipo Retngulo2, um para cada teste, ou carregar diversos lados no mesmo objeto. Abaixo, a cada chamada de TestePontual, um novo Retngulo2 criado:

28

CAPTULO 5. MTODOS COM VRIOS PARMETROS

class TestaRetngulo { void t e s t e P o n t u a l ( i n t l1 , i n t l 2 ) { R e t n g u l o 2 r = new R e t n g u l o 2 ( ) ; r . c a r r e g a L a d o s ( l1 , l 2 ) ; i f ( r . c a l c u l a r e a ( ) != l 1 l 2 ) System . o u t . p r i n t l n ( " No f u n c i o n a r e a p a r a l a d o s " + l1 + " e " + l2 ) ; i f ( r . c a l c u l a P e r m e t r o ( ) != 2 ( l 1 + l 2 ) ) System . o u t . p r i n t l n ( " No f u n c i o n a p e r m e t r o p a r a l a d o s " + l1 + " e " + l2 ) ; } void testaTudo ( ) { t e s t e P o n t u a l (10 , 20); testePontual (1 , 2); testePontual (3 , 3); } }

Da mesma forma que os lados foram atributos para a classe Retngulo2, podemos fazer o mesmo para a classe Crculo1.class Crculo2 { double r a i o ; void c a r r e g a R a i o ( double r ) { raio = r ; } double c a l c u l a r e a ( ) { return 3.14159 r a i o r a i o ; } double c a l c u l o P e r m e t r o ( ) { return 3.14159 2.0 r a i o ; } }

Assim como vimos anteriormente podemos tambm utilizar objetos de uma classe sem conhecer a sua implementao. Por exemplo, suponha que temos acesso a uma classe Clculo que possui o seguinte mtodo:int calculaPotncia ( int x , int n );

Para calcular a potncia poderamos ter o seguinte trecho de cdigo:C l c u l o c = new C l c u l o ( ) ; System . o u t . p r i n t l n ( " 2 e l e v a d o a 5 i g u a l a : " + c . c a l c u l a P o t n c i a ( 2 , 5 ) ) ;

5.2. A IMPORTNCIA DA ESCOLHA DE BONS NOMES

29

5.2

A importncia da escolha de bons nomes

A caracterstica mais importante em um programa de computador a clareza do seu cdigo. Quanto mais fcil for para um programa ser entendido por um ser humano que o leia, melhor ser o cdigo. Portanto, fundamental que os nomes das variveis, classes e mtodos sejam escolhidos com muito cuidado e critrio. Programadores inexperientes (e alguns no to inexperientes assim mas descuidados) tendem a no dar importncia a este ponto que essencial para o desenvolvimento de software de boa qualidade. Os nomes das variveis devem indicar claramente o seu signicado, isto , devem explicar o que o contedo que elas guardam. Por exemplo, na classe Crculo1 descrita no incio deste captulo, a escolha do nome raio para a varivel perfeita porque ela no deixa a menor dvida sobre o que a varivel ir guardar. Se ao invs de raio, o programador tivesse escolhido x como nome da varivel, isto seria pssimo pois o nome x no traria informao nenhuma para o leitor do programa sobre o seu signicado. Se o programador tivesse dado o nome r para a varivel, a escolha no chegaria a ser pssima, pois o r traz alguma informao, mesmo que sutil. Mas, mesmo assim, no seria uma soluo to boa quanto nomear como raio, pois este no deixa a menor dvida. Portanto, importante no ter preguia de pensar em bons nomes e de escrever nomes um pouco mais longos. Por exemplo, o nome nmeroDeAlunos muito melhor do que nda e melhor do que numAlun. Quanto menor o esforo mental do leitor para compreender o programa, maior sero os ganhos a mdio e longo prazos. A economia de alguns segundos que obtemos com o uso de nomes abreviados pode facilmente se tornar em horas de dor de cabea no futuro. A escolha dos nomes de classes e mtodos tambm deve ser feita criteriosamente. Normalmente as classes representam tipos de objetos do mundo real ou do mundo virtual que estamos criando dentro do computador. Portanto, o mais comum usarmos substantivos como nome para classes (embora esta no seja uma regra obrigatria). Os nomes das classes tem que explicar muito bem qual o tipo de objeto que ela ir representar. Por exemplo, chamar uma classe de Aluno e depois usar objetos desta classe para guardar as notas de um aluno e calcular sua mdia, no uma boa escolha. Provavelmente, neste caso, NotasDeAluno seria um nome melhor. Os mtodos representam aes que so realizadas, normalmente manipulando os atributos da classe. Portanto, normalmente utiliza-se verbos no imperativo para nomear os mtodos (novamente, esta no uma regra obrigatria). Por exemplo, os mtodos calcularea, calculaPermetro, carregaLados e testaTudo atendem bem a este critrio. Portanto, antes de escrever sua prxima classe, mtodo ou varivel, no se esquea: nomes so importantes!

Exerccios1. Neste exerccio, construiremos uma classe que calcula a mdia aritmtica de 4 notas e diz se o dono das notas foi aprovado, est de recuperao ou foi reprovado. Por exemplo, Entrada: 8.7, 7.2, 9.3, 7.4 5.2, 3.4, 6.5, 2.1 3.4, 5.1, 1.1, 2.0

30 Sada: Mdia: 8.15 -> aprovado. Mdia: 4.3 -> recuperao. Mdia: 2.9 -> reprovado.

CAPTULO 5. MTODOS COM VRIOS PARMETROS

Para isso, crie uma classe Aluno com mtodos que carreguem as 4 notas em variveis p1, p2, p3, p4 e um mtodo responsvel por calcular a mdia aritmtica das notas e dar o veredito. 2. Escreva uma classe Ol com um nico mtodo cumprimenta que, a cada chamada, cumprimenta o usurio de uma entre 3 maneiras diferentes. Dica: use um atributo para, dependendo de seu valor, escolher qual das maneiras ser usada; depois de imprimir a mensagem, altere o valor do atributo. 3. Construa a classe Inteiro que representa um nmero inteiro. Essa classe deve ter os seguintes atributos e mtodos: Classe Inteiro Atributos: int valor Valor do inteiro representado. Mtodos para interao com o usurio da classe: void carregaValor(int v) Muda o valor representado por este objeto. O novo valor deve ser v. int devolveValor() Devolve o valor representado por este objeto. int devolveValorAbsoluto() Devolve o valor absoluto do valor representado por este objeto. void imprime() Imprime algo que representa este objeto. Sugesto: imprima o seu valor. Exemplo de uso no DrJava: > Inteiro i = new Inteiro(); > i.carregaValor(14); > i.devolveValor() 14 > i.carregaValor(-473158); > i.devolveValor() -473158 > i.devolveValorAbsoluto() 473158 > i.imprime();

5.2. A IMPORTNCIA DA ESCOLHA DE BONS NOMES Valor: -473158. 4. Acrescente classe Inteiro algumas operaes matemticas, implementando os seguintes mtodos: Classe Inteiro Mais mtodos para interao com o usurio da classe: int soma(int v) Soma v ao valor deste objeto (valor + v). Este objeto passa a representar o novo valor, que tambm deve ser devolvido pelo mtodo. int subtrai(int v) Subtrai v do valor deste objeto (valor - v). Este objeto passa a representar o novo valor, que tambm deve ser devolvido pelo mtodo. int multiplicaPor(int v) Multiplica o valor deste objeto por v (valor * v). Este objeto passa a representar o novo valor, que tambm deve ser devolvido pelo mtodo. int dividePor(int divisor) Verica se divisor diferente de zero. Se no, imprime uma mensagem de erro e no faz nada (devolve o valor inalterado). Se for, divide o valor deste objeto por v (valor / divisor, diviso inteira). Este objeto passa a representar o novo valor, que tambm deve ser devolvido pelo mtodo. Exemplo de uso no DrJava: > Inteiro i = new Inteiro(); > i.carregaValor(15); > i.subtrai(20) -5 > i.devolveValor() -5

31

Se quiser, voc tambm pode fazer verses desses mtodos que no alteram o valor representado, apenas devolvem o valor da conta. 5. Crie uma classe TestaInteiro que verica o funcionamento correto da classe Inteiro em diversas situaes. Lembre-se de vericar casos como a diviso por diversos valores. Ao escrever os testes, voc notar que a classe Inteiro tem uma limitao importante no mtodo dividePor. 6. Crie uma classe Aluno2 para calcular a mdia aritmtica de 4 notas. Mas no lugar de um mtodo que recebe 4 parmetros, a classe deve conter 4 mtodos recebeNotaX, onde X = 1, 2, 3 ou 4, para receber as notas das provas, de modo que cada mtodo receba apenas uma nota. A classe deve conter ainda um mtodo imprimeMdia que imprime a mdia nal do aluno, dizendo se ele foi aprovado ou reprovado. Em seguida, escreva uma classe TestaAluno2 que verica se a classe Aluno2 calcula as mdias corretamente.

32 Exemplo de utilizao da classe: > Aluno2 aluno = new Aluno2(); > aluno.recebeNota1(5.0); > aluno.recebeNota2(7.0); > aluno.recebeNota3(9.0); > aluno.recebeNota4(7.0); > aluno.imprimeMedia(); Mdia: 7.0 -> aprovado.

CAPTULO 5. MTODOS COM VRIOS PARMETROS

Captulo 6

if else EncaixadosQuais novidades veremos neste captulo? novidade: if else encaixados; exerccio para reforar o que aprendemos at agora.

No Captulo 4, vimos pela primeira vez o conceito de desvio condicional atravs dos comandos if e else. Entretanto, vimos exemplos iniciais onde apenas um comando simples era executado, no caso, comandos de impresso. Na prtica, comandos if e else podem ser encaixados de forma a criar estruturas muito complexas. Para isto, veremos inicialmente como criar blocos de comandos atravs do seguinte exemplo:i f (CONDIO) { / / i n c i o do b l o c o COMANDO1; COMANDO2; ... COMANDO ; n }

Neste trecho de cdigo, caso a CONDIO seja verdadeira, os comandos, de 1 a n, so executados seqencialmente. Veremos a seguir que comum que alguns destes comandos sejam tambm comandos de desvio condicional. Vamos iniciar programando uma classe para representar um tringulo retngulo. Ela contm um mtodo que, dados os comprimentos dos lados do tringulo, verica se o mesmo retngulo ou no.class TrianguloRetngulo { void v e r i f i c a L a d o s ( i n t a , i n t b , i n t c ) { i f ( a b c ! = 0 ) / / nenhum l a d o pode s e r n u l o { i f ( a a == b b + c c ) System . o u t . p r i n t l n ( " T r i n g u l o r e t n g u l o . " ) ; i f ( b b == a a + c c ) System . o u t . p r i n t l n ( " T r i n g u l o r e t n g u l o . " ) ;

33

34i f ( c c == a a + b b ) System . o u t . p r i n t l n ( " T r i n g u l o r e t n g u l o . " ) ; } } }

CAPTULO 6. IF ELSE ENCAIXADOS

O mtodo acima pode ser chamado da seguinte forma:T r i a n g u l o R e t n g u l o r = new T r i a n g u l o R e t n g u l o ( ) ; r . verificaLados (1 , 1 , 1); r . verificaLados (3 , 4 , 5);

Limitaes: 1. mesmo que um if seja verdadeiro, ele executa os outros ifs. Em particular, se tivssemos um tringulo retngulo para o qual vrios desses ifs fossem verdadeiros, ele imprimiria esta mensagem vrias vezes (neste exemplo especco, isto no possvel); 2. este mtodo s imprime uma mensagem se os dados correspondem s medidas de um tringulo retngulo, se no um tringulo retngulo, ele no imprime nada. Atravs do uso do else podemos imprimir mensagens armativas e negativas:class TrianguloRetngulo2 { void v e r i f i c a L a d o s ( i n t a , i n t b , i n t c ) { i f ( a b c ! = 0 ) / / nenhum l a d o pode s e r n u l o { i f ( a a == b b + c c ) System . o u t . p r i n t l n ( " T r i n g u l o r e t n g u l o . " ) ; e l s e i f ( b b == a a + c c ) System . o u t . p r i n t l n ( " T r i n g u l o r e t n g u l o . " ) ; e l s e i f ( c c == a a + b b ) System . o u t . p r i n t l n ( " T r i n g u l o r e t n g u l o . " ) ; else System . o u t . p r i n t l n ( " No t r i n g u l o r e t n g u l o . " ) ; } else System . o u t . p r i n t l n ( " No t r i n g u l o p o i s p o s s u i l a d o de c o m p r i m e n t o n u l o . " ) ; } }

Caso sejam necessrios outros mtodos, como um para o clculo de permetro, interessante colocar os lados como atributos da classe.class TrianguloRetngulo3 { int a , b , c ; void c a r r e g a L a d o s ( i n t l1 , i n t l2 , i n t l 3 ) { a = l1 ; b = l2 ; c = l3 ;

35} int calculaPermetro () { return a + b + c ; } void v e r i f i c a L a d o s ( ) { i f ( a b c ! = 0 ) / / nenhum l a d o pode s e r n u l o { i f ( a a == b b + c c ) System . o u t . p r i n t l n ( " T r i n g u l o r e t n g u l o . " ) ; e l s e i f ( b b == a a + c c ) System . o u t . p r i n t l n ( " T r i n g u l o r e t n g u l o . " ) ; e l s e i f ( c c == a a + b b ) System . o u t . p r i n t l n ( " T r i n g u l o r e t n g u l o . " ) ; else System . o u t . p r i n t l n ( " No t r i n g u l o r e t n g u l o . " ) ; } else System . o u t . p r i n t l n ( " No t r i n g u l o p o i s p o s s u i l a d o de c o m p r i m e n t o n u l o . " ) ; } }

Exerccios1. Voc foi contratado por uma agncia de viagens para escrever uma classe em Java para calcular a converso de reais para dlar de acordo com a taxa de compra e a taxa de venda. Para isso, escreva uma classe ConversorMonetrio que inclua os seguintes mtodos: (a) defineTaxaCompra() e defineTaxaVenda(); (b) imprimeTaxas() que imprime o valor das 2 taxas de converso; (c) vendeDlar() que recebe uma quantia em dlares e devolve o valor correspondente em reais; (d) compraDlar() que recebe uma quantia em dlares e devolve o valor correspondente em reais. Em seguida, escreva uma classe TestaConversorMonetrio que dene diferentes taxas de compra e venda de dlares e, para cada taxa de converso, realiza operaes de compra e venda. 2. Escreva uma classe Baskara que possui 3 atributos do tipo double correspondentes aos coecientes a, b e c de uma equao do segundo grau. Escreva um mtodo para carregar valores nestes atributos e, em seguida, escreva os 4 mtodos seguintes: (a) delta() deve calcular o da frmula de Baskara; (b) nmeroDeRazesReais() deve devolver um inteiro indicando quantas razes reais a equao possui; (c) imprimeRazesReais() deve imprimir as razes reais;

36

CAPTULO 6. IF ELSE ENCAIXADOS (d) imprimeRazesImaginrias() deve imprimir as razes imaginrias. Para calcular a raiz quadrada, voc pode utilizar o mtodo java.lang.Math.sqrt(double x), que recebe um double como parmetro e devolve outro double. Voc pode supor que o primeiro coeciente, a, diferente de 0. 3. Crie uma classe contendo um mtodo que, dado um ponto determinado pelas suas coordenadas x e y, reais, imprime em qual quadrante este ponto est localizado. O primeiro quadrante corresponde aos pontos que possuem x e y positivos, o segundo quadrante a x positivo e y negativo e assim por diante. Para resolver este exerccio, ser necessrio utilizar os operadores < e >. Sua utilizao similar do operador == utilizado at agora. 4. [Desao!] So apresentadas a voc doze esferas de aparncia idntica. Sabe-se que apenas uma delas levemente diferente das demais em massa, mas no se sabe qual e nem se a massa maior ou menor. Sua misso identicar essa esfera diferente e tambm dizer se ela mais ou menos pesada. Para isso voc tem apenas uma balana de prato (que s permite determinar igualdades/desigualdades). Ah, sim, pequeno detalhe: o desao completar a misso em no mais que trs pesagens. Escreva um programa que resolve esse desao. O seu programa deve dar uma resposta correta sempre e tambm informar as trs ou menos pesagens que permitiram concluir a resposta. Como esse problema um tanto complicado, recomendamos que voc implemente o modelo descrito no quadro a seguir. Cada esfera deve ser representada por um inteiro entre 1 e 12. Para representarmos a esfera diferente, usaremos, alm do identicador inteiro, uma varivel booleana que receber o valor true se a esfera for mais pesada ou o valor false se a esfera for mais leve. Importante: note que, para que o problema tenha sentido, o mtodo resolveDesaoDasDozeEsferas no deve de modo algum acessar os atributos esferaDiferente e maisPesada para inferir a resposta. Quem d pistas para este mtodo sobre o valor desses atributos so os mtodos pesa#x#. Lembre-se de que voc tambm pode implementar mtodos adicionais, se achar necessrio ou mais elegante. Ou ainda, se voc j se sente seguro(a), voc pode implementar a(s) sua(s) prpria(s) classe(s). Exemplo de uso no DrJava: > DesafioDasEsferas dde = new DesafioDasEsferas(); > dde.defineEsferaDiferente(4, false); Incio do desafio: esfera 4 mais leve. > dde.resolveDesafioDasDozeEsferas(); Pesagem 1: 1 2 3 4 5 x 6 7 8 9 10. Resultado: (1) lado direito mais pesado. Pesagem 2: 1 2 x 3 4. Resultado: (-1) lado esquerdo mais pesado. Pesagem 3: 1 x 2. Resultado: (0) balana equilibrada. Resposta: esfera 3 mais leve. [Resposta errada!]

37 Note que a resposta est errada! (Alm disso, as pesagens no permitem dar a resposta certa.)

38 Classe DesafioDasEsferas Atributos:

CAPTULO 6. IF ELSE ENCAIXADOS

int esferaDiferente Identicador da esfera com peso diferente. boolean maisPesada Diz se a esfera diferente ou no mais pesada que as demais (isto , true para mais pesada e false para mais leve). int numPesagens Representa o nmero de pesagens realizadas. Mtodos para interao com o usurio: void defineEsferaDiferente(int esfera, boolean pesada) Determina qual a esfera diferente (parmetro esfera), e se ela mais pesada ou no (parmetro pesada). Alm disso, reinicia as pesagens, isto , o nmero de pesagens realizadas volta a ser zero. void resolveDesafioDasDozeEsferas() Resolve o Desao das Doze das Esferas. Este mtodo deve imprimir as 3 (ou menos) pesagens feitas, e no nal a resposta correta. Este mtodo deve se utilizar dos mtodos para uso interno descritos abaixo. Dica: na implementao deste mtodo voc tambm usar uma quantidade grande de ifs e elses encaixados. Mtodos para uso interno da classe: int int int int int int int int int pesa1x1(int pesa2x2(int pesa3x3(int pesa4x4(int d3, int d4) pesa5x5(int d2, int d3, pesa6x6(int d1, int d2, e1, e1, e1, e1, e1, int e1, int int int int int int d4, int d3, d1) e2, int d1, int d2) e2, int e3, int d1, int d2, int d3) e2, int e3, int e4, int d1, int d2, e2, int e2, int int e3, int e4, int e5, int d1, d5) int e3, int e4, int e5, int e6, d4, int d5, int d6)

Os mtodos acima (no formato pesa#x#) funcionam de forma semelhante. Eles representam as possveis pesagens e devolvem o resultado. Os parmetros representam as esferas que so pesadas, os comeados por e (ou seja, e1, e2, ...) representam esferas que vo para o prato esquerdo e os comeados por d (d1, d2, ...) so as do prato direito. Lembrando, cada esfera representada por um inteiro entre 1 e 12. Ento, por exemplo, para comparar as esferas 1, 7 e 3 com as esferas 4, 5 e 6, basta chamar pesa3x3(1,7,3,4,5,6). Os mtodos devem devolver -1 se a balana pender para o lado esquerdo, 0 se os pesos forem iguais ou 1 se a balana pender para o lado direito. Esses mtodos tambm devem incrementar o nmero de pesagens realizadas.

Captulo 7

Programas com Vrios ObjetosQuais novidades veremos neste captulo? Programas com vrios objetos.

At agora, todos os programas que vimos lidavam com apenas um objeto. No entanto, podemos ter programas que lidam com vrios objetos. Estes objetos podem pertencer todos mesma classe ou a classes diferentes. Exemplo: 1. Vrios objetos do mesmo tipoF l o r r o s a = new F l o r ( ) ; F l o r m a r g a r i d a = new F l o r ( ) ; F l o r f l o r D e L a r a n j e i r a = new F l o r ( ) ; rosa . cor ( " vermelha " ) ; r o s a . aroma ( " m u i t o a g r a d v e l " ) ; m a r g a r i d a . aroma ( " s u t i l " ) ; f l o r D e L a r a n j e i r a . aroma ( " d e l i c i o s o " ) ;

2. Vrios objetos de tipos (classes) diferentes:C a c h o r r o f l o q u i n h o = new C a c h o r r o ( ) ; Gato mingau = new Gato ( ) ; R a t o t o p o G i g g i o = new R a t o ( ) ; Vaca mimosa = new Vaca ( ) ; floquinho . lata ( ) ; mingau . mie ( ) ; to poGi ggio . comaQueijo ( ) ; mingau . p e r s i g a ( t o p o G i g g i o ) f l o q u i n h o . p e r s i g a ( mingau ) ; mimosa . p a s s e P o r C i m a ( f l o q u i n h o , mingau , t o p o G i g g i o ) ;

39

40

CAPTULO 7. PROGRAMAS COM VRIOS OBJETOS Vejamos agora um exemplo de utilizao de objetos de 3 tipos diferentes em conjunto. Neste exemplo, teremos 3 classes representando prismas, quadrados e tringulos retngulos e criaremos uma instncia de quadrado, uma de tringulo retngulo e duas de prismas. Note, no exemplo abaixo, que utilizamos um padro diferente para nomear os mtodos que servem para atribuir valores aos atributos. Segundo este padro, muito utilizado por programadores avanados em linguagens como C++ e Smalltalk, o nome do mtodo exatamente o nome do atributo correspondente. Por exemplo, o mtodo void altura(double a) utilizado para denir o valor do atributo altura e assim por diante. Ao escrever seus programas, voc livre para escolher entre qualquer um dos padres existentes, mas importante que voc seja coerente, ou seja, aps escolher o padro de nomeao, aplique-o consistentemente em todo o seu cdigo.c l a s s Prisma { double a l t u r a ; double reaDaBase ; void a l t u r a ( double a ) { altura = a; } void reaDaBase ( double a ) { reaDaBase = a ; } d o u b l e volume ( ) { return reaDaBase a l t u r a ; } } c l a s s Quadrado { double l a d o ; void l a d o ( double l ) { lado = l ; } double r e a ( ) { return lado lado ; } } class TrianguloRetngulo { double c a t e t o 1 ; double c a t e t o 2 ;

41/ / note a indentao supercompacta ! void c a t e t o 1 ( double c ) { c a t e t o 1 = c ; } void c a t e t o 2 ( double c ) { c a t e t o 2 = c ; } double r e a ( ) { return c a t e t o 1 c a t e t o 2 / 2 . 0 ; } }

Agora, utilizando o interpretador, podemos criar objetos destes vrios tipos e utiliz-los em conjunto:Quadrado q = new Quadrado ( ) ; T r i a n g u l o R e t n g u l o t r = new T r i a n g u l o R e t n g u l o ( ) ; P r i s m a p r i s m a B a s e Q u a d r a d a = new P r i s m a ( ) ; P r i s m a p r i s m a B a s e T r i a n g u l a r = new P r i s m a ( ) ; q . lado ( 1 0 . 0 ) ; tr . cateto1 (20.0); tr . cateto2 (30.0); prismaBaseQuadrada . a l t u r a ( 3 . 0 ) ; prismaBaseTriangular . altura ( 1 . 0 ) ; prismaBaseQuadrada . reaDaBase ( q . r e a ( ) ) ; p r i s m a B a s e T r i a n g u l a r . reaDaBase ( t r . r e a ( ) ) ; i f ( p r i s m a B a s e Q u a d r a d a . volume ( ) > p r i s m a B a s e T r i a n g u l a r . volume ( ) ) System . o u t . p r i n t l n ( "O p r i s m a de b a s e q u a d r a d a tem m a i o r volume " ) ; e l s e i f ( p r i s m a B a s e T r i a n g u l a r . volume ( ) > p r i s m a B a s e Q u a d r a d a . volume ( ) ) System . o u t . p r i n t l n ( "O p r i s m a de b a s e t r i a n g u l a r tem m a i o r volume " ) ; else System . o u t . p r i n t l n ( " Ambos o s p r i s m a s tm o mesmo volume " ) ;

Nota sobre o interpretador do DrJava: para conseguir digitar todos os ifs encaixados no interpretador do DrJava sem que ele tente interpretar cada linha em separado, preciso utilizar Shift+Enter em vez de apenas Enter no nal de cada linha dos ifs encaixados. Apenas no nal da ltima linha (a que contm o println nal) que se deve digitar apenas Enter para que o DrJava ento interprete todas as linhas de uma vez.

Exerccios1. Utilizando a classe Conversor5 denida no exerccio 1 do Captulo 3, escreva uma classe contendo trs mtodos, onde cada mtodo recebe uma temperatura x utilizando uma escala de temperaturas e imprime os valores de x nas demais escalas de temperatura. 2. Escreva uma classe Rendimentos que contenha os seguintes mtodos a m de contabilizar o total de rendimentos de uma certa pessoa em um certo ano:

42

CAPTULO 7. PROGRAMAS COM VRIOS OBJETOS rendimentosDePessoaFsica(double); rendimentosDePessoaJurdica(double); rendimentosDeAplicaesFinanceiras(double); rendimentosNoTributveis(double); double totalDeRendimentosTributveis(); Em seguida, escreva uma classe TabelaDeAlquotas que possui: um mtodo alquota() que recebe como parmetro o total de rendimentos tributveis de uma pessoa e devolve um nmero entre 0 e 1.0 correspondente alquota de imposto que a pessoa dever pagar e um mtodo valorADeduzir() que recebe como parmetro o total de rendimentos tributveis de uma pessoa e devolve o valor a deduzir no clculo do imposto. Para escrever esta classe, utilize a tabela do IR 2006 abaixo: Rendimentos Tributveis At R$ 13.968,00 De R$ 13.968,01 a R$ 27.912,00 acima de R$ 27.912,00 Alquota 0.15 0.275 Parcela a deduzir R$ 1.904,40 R$ 5.076,90

Agora escreva uma classe CalculadoraDeImposto que possui um nico mtodo que recebe como parmetro o valor dos rendimentos tributveis de uma pessoa e devolve o valor do imposto a ser pago. Finalmente, escreva um trecho de cdigo (para ser digitado no interpretador) que utiliza Rendimentos para denir os vrios rendimentos de uma pessoa e CalculadoraDeImposto para calcular o imposto a pagar. 3. Suponha que voc tenha as seguintes classes:class A { d o u b l e a ( i n t meses , d o u b l e t a x a ) { r e t u r n Math . pow ( ( t a x a + 1 0 0 ) / 1 0 0 , meses ) 1 ; } } class B { f i n a l d o u b l e TAXA = 1 . 2 ; v o i d b ( d o u b l e v a l o r E m p r e s t a d o , i n t meses ) { A a = new A ( ) ; d o u b l e v a l o r D a D v i d a = v a l o r E m p r e s t a d o + ( a . a ( meses , TAXA) v a l o r E m p r e s t a d o ) ;

43System . o u t . p r i n t l n ( " D v i d a de " + v a l o r D a D v i d a + " r e a l ( i s ) , " + " c a l c u l a d a com t a x a de " + TAXA + "% ao ms . " ) ; } }

(a) O que fazem os mtodos a (da classe A) e b (da classe B)? No precisa entrar em detalhes. Dica: para saber o que Math.pow faz consulte a pgina http://java.sun.com/j2se/1.5.0/docs/ api/java/lang/Math.html; (b) Os nomes a e b (dos mtodos) e A e B (das classes) so pssimos. Por qu? Que nomes voc daria? Sugira, tambm, outro nome para a varivel objeto (criada no interpretador); (c) Acrescente alguns comentrios no cdigo do mtodo b; (d) Seria mais fcil digitar o valor 1.2 quando necessrio, em vez de criar uma constante TAXA e utilizla. Ento, por que isso foi feito? Cite, pelo menos, dois motivos. A palavra chave final faz com que o valor da varivel TAXA, uma vez atribudo, no possa ser alterado.

44

CAPTULO 7. PROGRAMAS COM VRIOS OBJETOS

Captulo 8

Laos e RepetiesQuais novidades veremos neste captulo? A idia de laos em linguagens de programao; O lao while; O operador que calcula o resto da diviso inteira: %.

8.1

Laos em linguagens de programao

Vamos apresentar para vocs um novo conceito fundamental de programao: o lao. Mas o que pode ser isso? Um nome meio estranho, no? Nada melhor do que um exemplo para explicar. Vamos voltar ao nosso velho conversor de temperatura. Imagine que voc ganhou uma passagem para Nova Iorque e que os EUA no esto em guerra com ningum. Voc arruma a mala e se prepara para a viagem. Antes de viajar voc resolve conversar com um amigo que j morou nos EUA. Ele acaba lhe dando uma dica: guarde uma tabelinha de converso de temperaturas de Fahrenheit para Celsius. Ela ser muito til, por exemplo, para entender o noticirio e saber o que vestir no dia seguinte. Voc ento se lembra que j tem um conversor pronto. Basta ento us-lo para montar a tabela. Voc chama ento o DrJava e comea uma nova sesso interativa. Welcome to DrJava. > Conversor4 c = new Conversor4() > c.fahrenheitParaCelsius(0) -17.77777777777778 > c.fahrenheitParaCelsius(10) -12.222222222222221 > c.fahrenheitParaCelsius(20) -6.666666666666667 > c.fahrenheitParaCelsius(30) -1.1111111111111112 45

46 > c.fahrenheitParaCelsius(40) 4.444444444444445 > c.fahrenheitParaCelsius(50) 10.0 > c.fahrenheitParaCelsius(60) 15.555555555555555 > c.fahrenheitParaCelsius(70) 21.11111111111111 > c.fahrenheitParaCelsius(80) 26.666666666666668 > c.fahrenheitParaCelsius(90) 32.22222222222222 > c.fahrenheitParaCelsius(100) 37.77777777777778 > c.fahrenheitParaCelsius(110) 43.333333333333336 >

CAPTULO 8. LAOS E REPETIES

Pronto, agora s copiar as linhas acima para um editor de textos, retirar as chamadas ao mtodo fahrenheitParaCelsius (pois elas confundem) e imprimir a tabela. Ser que existe algo de especial nas diversas chamadas do mtodo fahrenheitParaCelsius acima? Todas elas so muito parecidas e fcil adivinhar a prxima se sabemos qual a passada. Ou seja, a lei de formao das diversas chamadas do mtodo simples e bem conhecida. No seria interessante se fosse possvel escrever um trecho de cdigo compacto que representasse essa idia? Para isso servem os laos: eles permitem a descrio de uma seqncia de operaes repetitivas.

8.2

O lao while

O nosso primeiro lao ser o while, a palavra inglesa para enquanto. Ele permite repetir uma seqncia de operaes enquanto uma condio se mantiver verdadeira. Mais uma vez, um exemplo a melhor explicao. Experimente digitar as seguintes linhas de cdigo no painel de interaes do DrJava (lembre-se que para digitarmos as 5 linhas do comando while abaixo, necessrio usarmos Shift+Enter em vez de apenas Enter no nal das 4 linhas iniciais do while): Welcome to DrJava. > int a = 1; > while (a valor valor valor valor valor valor valor valor valor valor atual atual atual atual atual atual atual atual atual atual de de de de de de de de de de a a a a a a a a a a : : : : : : : : : : 1 2 3 4 5 6 7 8 9 10

47

Vamos olhar com calma o cdigo acima. Primeiro criamos uma varivel inteira chamada a. O seu valor inicial foi denido como 1. A seguir vem a novidade: o lao while. Como dissemos antes, ele faz com que o cdigo que o segue (e est agrupado usando chaves) seja executado enquanto a condio a C e l s i u s . / void i m p r i m e T a b e l a F a h r e n h e i t P a r a C e l s i u s ( double i n i c i o , double fim ) { double f a h r = i n i c i o ; double c e l s i u s ; w h i l e ( f a h r 3 / 2 1 > 3 % 2 1 > 5 / 3 1 > 5 % 3 2 > int div = 7 / 5 > int resto = 7 % 5 > div 1

8.3. NMEROS PRIMOS > resto 2