introdução a ciencia da computação em java universitario

Upload: jhonatan-kalita

Post on 07-Apr-2018

231 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/3/2019 introduo a ciencia da computao em java universitario

    1/157

    UNIVERSIDADE DE SO PAULOINSTITUTO DE MATEMTICA E ESTATSTICA

    Departamento de Cincia da Computao

    Introduo Cincia da Computaocom Java e Orientao a Objetos

    Fabio KonAlfredo Goldman

    Paulo J. Silva e Silva

    Editado e Revisado por:Raphael Y. de Camargo

    So Paulo, 12 de janeiro de 2005

  • 8/3/2019 introduo a ciencia da computao em java universitario

    2/157

    2

  • 8/3/2019 introduo a ciencia da computao em java universitario

    3/157

    i

    Sugestes e Correes

    Se voc encontrar erros ou tiver sugestes para melhorias neste

    livro, favor enviar para o email [email protected].

  • 8/3/2019 introduo a ciencia da computao em java universitario

    4/157

    ii

  • 8/3/2019 introduo a ciencia da computao em java universitario

    5/157

    iii

    Agradecimentos

    Este livro no seria possvel sem a colaborao de inmeros alunos e profes-

    sores 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. A aula dirigida do Dr. Java foi preparada 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 dolivro alm de colaborar com alguns exerccios. O Prof. Joo Eduardo Ferreira,

    nosso colega no ensino da disciplina de introduo, tm nos dado inmeras

    sugestes teis.

    Agradecemos ao Prof. Walter Savitch por ter autorizado o uso de sua classe

    para entrada de dados.

    Finalmente, agradecemos aos alunos de MAC 110 e aos professores que no

    foram citados mas que deram sugestes e nos incentivaram a escrever este

    livro.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    6/157

    iv

  • 8/3/2019 introduo a ciencia da computao em java universitario

    7/157

    Sumrio

    Prefcio xi

    1 Teatro de Objetos 11.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    1.2 Disputa de Pnaltis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    2 Histria da Computao 72.1 Histria da Computao e Arquitetura do Computador . . . . . . . . . . . . . . . . . . . . . 72.2 E a evoluo do software? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

    3 Conversor de Temperaturas 153.1 Analogia entre dramatizao da disputa de pnaltis e Programao Orientada a Objetos . . . . 153.2 Um exemplo real em Java: um conversor de Celsius para Fahrenheit . . . . . . . . . . . . . . 163.3 Exerccios: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

    4 Testes Automatizados 19

    4.1 Testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224.3 Resolues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    5 Mtodos com vrios parmetros 255.1 Mtodos com vrios parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    6 if else encaixados 316.1 if else encaixados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    7 Programas com Vrios Objetos 377.1 Programas com Vrios Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377.2 Exerccio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

    8 Laos e Repeties 418.1 Laos em linguagens de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418.2 O Lao while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    v

  • 8/3/2019 introduo a ciencia da computao em java universitario

    8/157

    vi SUMRIO

    8.3 Nmeros primos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    9 Expresses e Variveis Lgicas 499.1 Condies como expresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499.2 Precedncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529.3 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529.4 Exerccio: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    10 Mergulhando no while 5710.1 Um pouco mais sobre primos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5710.2 Uma biblioteca de funes matemticas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5910.3 do...while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    10.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    11 Caracteres e cadeias de caracteres 6311.1 Um tipo para representar caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6311.2 Cadeias de Caracteres (Strings) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6511.3 Exerccios: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

    12 Manipulando nmeros utilizando diferentes bases 6712.1 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    13 Arrays (vetores) 71

    13.1 Arrays (vetores) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7113.1.1 O atributo length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7313.1.2 Inicializao de arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

    13.2 Criao de Programas Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7313.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

    14 for, leitura do teclado e converso de Strings 7714.1 O comando for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7714.2 Leitura do Teclado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7814.3 Converso de String para nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    14.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    15 Laos Encaixados e Matrizes 8115.1 Laos encaixados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8115.2 Matrizes (arrays multi-dimensionais) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8215.3 Exemplo: LIFE, o jogo da vida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8315.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

  • 8/3/2019 introduo a ciencia da computao em java universitario

    9/157

    SUMRIO vii

    16 Busca e ordenao 8916.1 Busca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8916.2 Pondo ordem na casa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    16.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

    17 Busca binria, fuso e o que so as variveis 9317.1 Busca binria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9317.2 Fuso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9417.3 O que guardam as variveis? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9517.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

    18 Construtores e especificadores de acesso 9718.1 Construtores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9718.2 Especificadores de acesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

    18.3 E xerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

    19 Interfaces 10319.1 O Conceito de Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10319.2 Um primeiro exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10319.3 Implementando mais de uma interface por vez . . . . . . . . . . . . . . . . . . . . . . . . . . 10719.4 Um exemplo mais sofisticado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10819.5 A Importncia de Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11219.6 E xerccios: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

    20 Herana 11720.1 O Conceito de Herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11720.2 Terminologia de herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11720.3 Implementao de herana na linguagem Java . . . . . . . . . . . . . . . . . . . . . . . . . . 11820.4 Hierarquia de Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12020.5 Relacionamento um . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12020.6 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12120.7 E xerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

    21 Javadoc 12321.1 Javadoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

    22 O C que h em Java 12922.1 O C que h em Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12922.2 Detalhes de entrada e sada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13122.3 Declarao de variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13122.4 Parmetros de funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13222.5 Um ltimo exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

  • 8/3/2019 introduo a ciencia da computao em java universitario

    10/157

    viii SUMRIO

    A Utilizando o Dr. Java 135A.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

    A.1.1 Como obter, instalar e executar o DrJava . . . . . . . . . . . . . . . . . . . . . . . . 135

    A.2 Conversor de Temperatura simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136A.3 Tratando erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

  • 8/3/2019 introduo a ciencia da computao em java universitario

    11/157

    Lista de Figuras

    2.1 Arquitetura do ENIAC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.2 Arquitetura de Von Neumann . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    20.1 Diagrama de herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

    20.2 Hierarquia de classes representando os seres vivos . . . . . . . . . . . . . . . . . . . . . . . . 12020.3 Hierarquia errada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

    21.1 Documentao gerada pelo Javadoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

    ix

  • 8/3/2019 introduo a ciencia da computao em java universitario

    12/157

    x LISTA DE FIGURAS

  • 8/3/2019 introduo a ciencia da computao em java universitario

    13/157

    Prefcio

    Caros alunos e alunas de MAC-110,Sejam bem-vindos aos maravilhoso mundo da Cincia da Computao. Neste primeiro semestre do seu

    curso, dentre as inmeras novidades que vocs encontraro, estar a disciplina de Introduo Cincia daComputao onde vocs iro aprender os elementos bsicos da programao de computadores e tero contatocom alguns dos conceitos fundamentais da Cincia da Computao. Pela terceira vez no IME/USP, em 2005a disciplina ser baseada numa das mais modernas e sofisticadas linguagens de programao: Java. Pela se-gunda vez, vamos utilizar esta apostila e esperamos que ela lhes ajude na fascinante empreitada de aprender aprogramar.

    Esperamos melhorar a apostila sempre que possvel. Portanto, se voc achar algum erro ou tiver algumasugesto para melhor-la, no deixe de nos escrever.

    Abraos e um bom 2005!

    So Paulo, janeiro de 2005.

    Alfredo Goldman, Fabio Kon e Paulo J. Silva e Silva

    xi

  • 8/3/2019 introduo a ciencia da computao em java universitario

    14/157

    xii PREFCIO

  • 8/3/2019 introduo a ciencia da computao em java universitario

    15/157

    Captulo 1

    Teatro de Objetos

    1.1 Introduo

    O Teatro de Objetos uma atividade realizada com os alunos de Introduo Cincia da Computao durantea primeira aula da disciplina. O objetivo fazer com que os alunos vivenciem um jogo interativo do qualparticipem vrios "objetos" realizando diferentes formas de aes e comunicaes. Os conceitos de orientaoa objetos empregados no teatro no so explicitamente explicados j na primeira aula mas sero abordados aolongo da disciplina. A primeira metade da primeira aula dedicada a uma conversa informal com os alunosexplicando quais so os objetivos desta disciplina (e do curso inteiro, se for o caso). tambm interessante fazerperguntas sobre contatos prvios que os alunos tiveram com informtica e com programao. bom deixarclaro que a disciplina pode ser acompanhada por uma pessoa que nunca viu um computador na frente em suavida, mas que no uma disciplina fcil, preciso se empenhar. Na segunda metade da aula, dizemos aosalunos que vamos exercitar as suas habilidades dramticas: para ilustrar o funcionamento de um programa de

    computador complexo, ns vamos fazer de conta que somos partes de um programa de computador trabalhandoem conjunto para atingir um certo objetivo. Podemos fazer um certo suspense sobre qual o objetivo (simularuma disputa de pnaltis) e sobre como ele ser alcanado.

    1.2 Disputa de Pnaltis

    A "pea" encenada em 2003 representar uma disputa de pnaltis entre dois times e contar com a participaode cerca de 26 atores desempenhando 8 papis. Os papis so:

    Tcnico (2 atores)

    Juiz (1 ator)

    Bandeirinha (2 atores)

    Gandula (1 ator)

    Jogador. Os jogadores so divididos em dois tipos:

    Goleiro (2 atores desempenham este papel)

    1

  • 8/3/2019 introduo a ciencia da computao em java universitario

    16/157

    2 CAPTULO 1. TEATRO DE OBJETOS

    Batedor de pnalti (10 atores)

    Torcedor. Os torcedores so divididos em dois tipos:

    Torcedor educado (4 atores)

    Torcedor mal-educado (4 atores)

    O professor ser responsvel por escolher os alunos que desempenharo cada papel. Se houver limitaode espao, conveniente que os 8 torcedores fiquem em suas prprias carteiras para no tumultuar muito oambiente. Obviamente, o professor pode tambm aumentar ou diminuir o nmero de torcedores e de batedoresde pnalti. Para desempenhar o papel de torcedores, uma boa dica o professor escolher alunos que pareambem barulhentos e faladores (por exemplo, a turma do fundo). Ao escolher os atores, o professor deverentregar um carto preso com um barbante que ficar pendurado no pescoo do ator e conter informaessobre o papel desempenhado pelo autor. 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 o valor dos atributos dopersonagem devem ser escritos na hora lpis pelo professor. Alguns papis, como o Juiz, no possuemnenhum atributo. Outros papis podem possuir um ou mais atributos, o Jogador, por exemplo pode possuircomo atributos o nome do time ao qual pertence e o nmero da sua camisa. No caso de o jogador ser umGoleiro, o atributo nmero da camisa pode vir escrito caneta como valendo 1.

    Alm deste carto que fica pendurado no pescoo do ator, cada ator recebe um script descrevendo o seucomportamento: para cada mensagem recebida pelo ator, o script descreve quais aes devem ser tomadas peloator.

    O professor no deve se esquecer de trazer uma bola para esta atividade e deve tomar cuidado para quenenhuma janela seja quebrada durante a realizao da atividade. O tempo total estimado para a realizao daatividade de 60 minutos.

    Eis uma descrio detalhada dos dados que devero aparecer nos cartes descritivos e no script (comporta-mento) de cada um dos 26 atores participantes da encenao.

    1. Goleiro

    Carto de Identificao

    Nome do Papel: Goleiro Mensagens que entende: SuaVez, Cobrana Autorizada, VenceuOTimeX Atributos: Time:, Camisa nmero: 1

    Comportamento (Script)

    mensagem: SuaVez ao: posiciona-se na frente do gol e fica esperando pela cobrana dopnalti.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    17/157

    1.2. DISPUTA DE PNALTIS 3

    mensagem: CobranaAutorizada ao: concentra-se na bola que ser chutada pelo ad-versrio e faz de tudo para no deixar que a bola entre no gol. O goleiro no pode se adiantarantes 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 iden-tificao, comemore; caso contrrio, xingue o juiz (polidamente! :-).

    2. Batedor de Pnalti

    Carto de Identificao

    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 fica esperando pela autorizaodo juiz.

    mensagem: CobranaAutorizada ao: chuta a bola tentando marcar um gol. Aps acobrana voltar para junto do seu tcnico para dar lugar prxima cobrana.

    mensagem: VenceuOTimeX ao: se TimeX igual ao atributo Time no seu carto de iden-tificao, comemore; caso contrrio, xingue o juiz (polidamente! :-).

    3. Torcedor Educado

    Carto de Identificao

    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 andamentoda peleja e manifestando o seu apreo e desapreo pelo desenrolar da disputa.

    mensagem: VenceuOTimeX ao: se TimeX igual ao atributo Time no seu carto deidentificao, comemore e faa um comentrio elogioso sobre o seu time; caso contrrio, elogieo adversrio e parabenize o seu time pelo empenho.

    4. Torcedor Mal-Educado

    Carto de Identificao

    Nome do Papel: Torcedor Mal-Educado Mensagens que entende: Ao, VenceuOTimeX

    Atributos: Time:, Camisa nmero: 12

    Comportamento

  • 8/3/2019 introduo a ciencia da computao em java universitario

    18/157

    4 CAPTULO 1. TEATRO DE OBJETOS

    mensagem: Ao ao: assista ao jogo emitindo opinies duvidosas sobre o andamento dapeleja e manifestando a sua raiva ou alegria pelo desenrolar do jogo.

    mensagem: VenceuOTimeX ao: se TimeX igual ao atributo Time no seu carto de identi-

    ficao, xingue o adversrio. Caso contrrio, xingue o adversrio desesperadamente (mas, porfavor, no se esquea que estamos em uma universidade).

    5. Juiz

    Carto de Identificao

    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 ospersonagens estiverem apostos, emita a mensagem CobranaAutorizada. Faa a contagemde gols e quando houver um vencedor, emita a mensagem VenceuOTimeX onde TimeX onomedo time vencedor. A disputa de pnaltis feita alternadamente, 5 cobranas para cada time. Seno houver um ganhador aps as 5 cobranas, so feitas novas cobranas alternadamente atque haja um vencedor.

    mensagem: Irregularidade ao: se a mensagem foi enviada por um Bandeirinha, ignorea cobrana recm-efetuada e ordene que ela seja repetida enviando a mensagem RepitaCobranaao tcnico apropriado.

    6. Gandula

    Carto de Identificao

    Nome do Papel: Gandula Mensagens que entende: CobranaAutorizada

    Comportamento

    mensagem: CobranaAutorizada ao: preste ateno cobrana do pnalti. Aps aconcluso da cobrana, pegue a bola e leve-a de volta marca de pnalti.

    7. Tcnico

    Carto de Identificao

    Nome do Papel: Tcnico Mensagens que entende: SuaVez, RepitaCobrana, VenceuOTimeX Atributos: Time:

    Comportamento

    mensagem: SuaVez ao: escolha um dos seus jogadores para efetuar a cobrana e envie-oa mensagem SuaVez. No repita jogadores nas 5 cobranas iniciais.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    19/157

    1.2. DISPUTA DE PNALTIS 5

    mensagem: RepitaCobrana ao: envie a mensagem SuaVez para o jogador que acaboude efetuar a cobrana.

    mensagem: VenceuOTimeX ao: se TimeX igual ao atributo Time no seu carto de iden-

    tificao, comemore; caso contrrio, diga que o seu time foi prejudicado pela arbitragem e quefutebol uma caixinha de surpresas.

    8. Bandeirinha

    Carto de Identificao

    Nome do Papel: Bandeirinha Mensagens que entende: Cobrana Autorizada, VenceuOTimeX

    Comportamento

    mensagem: CobranaAutorizada ao: verifique se o goleiro realmente no avana antes

    de o batedor chutar a bola. Caso ele avance, envie uma mensagem Irregularidade para oJuiz.

    mensagem: VenceuOTimeX ao: se TimeX no o nome do time da casa, distancie-se datorcida pois voc acaba de se tornar um alvo em potencial.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    20/157

    6 CAPTULO 1. TEATRO DE OBJETOS

  • 8/3/2019 introduo a ciencia da computao em java universitario

    21/157

    Captulo 2

    Histria da Computao

    Quais novidades veremos nesta aula? a histria da computao

    evoluo da arquitetura do computador

    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 (calculadora) digital,

    o capaz de somar

    o entrada atravs de discos giratrios

    o ajudou seu pai, coletor de impostos

    Leibniz (inventou 1671, construu 1694)

    computador capaz de somar e multiplicar criou o mecanismo de engrenagens do "vai-um" usado at hoje

    Avanos nas calculadoras de mesa -> 1890 mquinas podiam:

    acumular resultados parciais

    armazenamento e reentrada automtica de resultados passados (memria)

    7

  • 8/3/2019 introduo a ciencia da computao em java universitario

    22/157

    8 CAPTULO 2. HISTRIA DA COMPUTAO

    imprimir resultados em papel

    Charles Babbage (Prof. 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 financiamento do governo p/ constru-la

    1823: iniciou construo (usaria motor a vapor, seria totalmente automtico, imprimiria o resultadoe teria um programa fixo)

    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 (Jacquard)

    mas ele no consegui constru-lo

    tecnologia mecnica da poca era insuficiente

    pouca gente via a necessidade para tal mquina

    Ada Lovelace (me da programao) escreveu programas para o engenho analtico; inventou apalavra algoritmo em homenagem ao matemtico Al-Khawarizmi (820dC)

    a mquina foi finalmente construda pelo governo ingls nos anos 1990 (e funciona!)

    URL do vdeo do Roy?

    Herman Hollerith, 1890

    criou cartes perfurados para uso no censo americano

    tecnologia levou criao da International Business Machines (IBM)

    MARK 1, criada em 1937 por Howard Aiken, prof. de Matemtica Aplicada de Harvard

    calculadora eletromecnica com motor eltrico

    pesava 5 toneladas, usava toneladas de gelo para refrigerao

    multiplicava dois nmeros de 23 digitos em 3 segundos

    John Atanasoff, 1939

    calculadora com vlvulas a vcuo (240 vlvulas)

    resolvia equaes lineares, diferenciais e de balstica

    manipulava nmeros binrios

    Rumo a programabilidade

  • 8/3/2019 introduo a ciencia da computao em java universitario

    23/157

    2.1. HISTRIA DA COMPUTAO E ARQUITETURA DO COMPUTADOR 9

    Alan Turing,

    Trabalhou para o exrcito ingls ajudando a quebrar o cdigo criptogrfico 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: Elaboora 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 decodificao 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 artificial

    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 finalizado em biologia e fsica; tem sua reputao e vida destrudas pelosmilitares ingleses.

    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.

    Aiken declarou em 1947 que nunca haveria necessidade de mais de um ou dois computadoresprogramveis e que os projetos neste sentido deveriam ser abandonados.

    ENIAC, 1945

    considerado o primeiro computador eletrnico

    nmeros de 10 digitos decimais

    300 multiplicaes ou 5000 somas por segundo

    17486 vlvulas, alguma queimava quase que diariamente

    6000 comutadores manuais e centenas de cabos usados na programao

    programao era muito difcil

    Arquitetura do ENIAC

  • 8/3/2019 introduo a ciencia da computao em java universitario

    24/157

    10 CAPTULO 2. HISTRIA DA COMPUTAO

    Figura 2.1: Arquitetura do ENIAC

    Figura 2.2: Arquitetura de Von Neumann

    programa especificado manualmente em "hardware" com conexes semelhantes quelas que asvelhas telefonistas utilizavam

    memria de dados separada do controle e do programa

    o controle formado por circuitos eletro-eletronicos

    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 (indicar indcio de sistema operacional) (hoje em dia existe memriaROM, RAM, flash RAM...)

    Anos 50

    1953: IBM vende 15 mquinas baseadas no modelo de Neumann

    transistores

    memria magntica ("magnetic core memory")

  • 8/3/2019 introduo a ciencia da computao em java universitario

    25/157

    2.1. HISTRIA DA COMPUTAO E ARQUITETURA DO COMPUTADOR 11

    Anos 60

    circuitos impressos / cirtuitos integrados (chips)

    crescimento segundo lei de Moore at hoje (VLSI) 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 Californiaexige a democratizao da informtica

    Revista esquerdista da Universidade da California em Berkeley Peoples Computer Company de-fende a criao de computadores pessoais e de cooperativas de informao.

    Steve Jobs cria Apple em garagem ~ 1975, investe lucros do Apple II em shows de Rock (82)

    Nasce a Microsoft

    Governo da California apia microinformtica

    Anos 80

    IBM lana PC (1981)

    Apple lana MacIntosh (1984)

    Xerox inventa e Apple comercializa interface baseada em janelas ("Windows")

    Microsoft cresce comercializando o sistema operacional simplista MS-DOS para IBM-PCs (O DOSera uma verso simplificada do CPM que, por sua vez, era uma verso simplificada do UNIX)

    Comea o movimento do software livre

    Anos 90

    Microsoft pega carona na exploso de vendas de PCs, utiliza tcnicas de marketing agressivas(consideradas por alguns estudiosos como moralmente questionveis) para controlar mercado desoftware, estabelecendo quase um monoplio em certas reas.

    Intensifica-se o movimento por software livre

    Nasce o Linux e uma nova forma de desenvolvimento de software baseada em comunidades distri-budas atravs da Internet.

    No final da dcada, governo americano percebe o perigo que a Microsoft representa e inicia batalhajudicial 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

    Sistemas Embutidos

    Computao Ubqua

  • 8/3/2019 introduo a ciencia da computao em java universitario

    26/157

    12 CAPTULO 2. HISTRIA DA COMPUTAO

    2.2 E a evoluo do software?

    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 bemprximas ao funcionamento dos circuitos do hardware; paulatinamente, as linguagens foram se aproximandoda 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;

    1949-50, primeira linguagem binria, a programao era feita mudando os comandos de zero a um, evice-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 Backusda IBM).

    1958, criao de um padro universal de linguagem: ALGOL 58 (algoritmic language) (origem da mai-oria das linguagens modernas). Primeira linguagem estruturada;

    1958, John McCarthy do MIT cria o LISP (List Processing), inicialmente projetada para uso em inteli-gncia artificial. Nela tudo se baseia em listas. Ainda usada hoje em dia;

    1959, FORTRAN era eficaz para manipulao de nmeros, no para entrada e sada: foi criada COBOL(Common Bussines Oriented Langaguage)

    1964, criao do Basic (Beginners All-purpose Symbolic Instruction Code); 1965, criao de uma linguagem especfica para a simulao (SIMULA-1) por Ole-Johan Dahl and Kris-

    ten Nygaard. considerada a base das linguagens orientadas a objetos;

    1966, criao da linguagem Logo para desenhos grficos (a linguagem da tartaruga);

    1967, Simula-67, uma linguagem de uso geral incluindo todos os conceitos fundamentais de orientaoa 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 deficincias da linguagem Pascal, e teve sucessoquase imediato;

    1972, linguagem Smalltalk (desenvolvida por Alan Kay, da Xerox), OO ganha fora;

    1983, criadas extenses de C incluindo suporte para OO: C++ e Objective-C

  • 8/3/2019 introduo a ciencia da computao em java universitario

    27/157

    2.2. E A EVOLUO DO SOFTWARE? 13

    1987, linguagens baseadas em scripts, p.ex. Perl, desenvolvida por Larry Wall. Ferramentas de UNIXcomo sed e awk no eram suficientes;

    1994, Java divulgada como a linguagem para a Internet;

  • 8/3/2019 introduo a ciencia da computao em java universitario

    28/157

    14 CAPTULO 2. HISTRIA DA COMPUTAO

  • 8/3/2019 introduo a ciencia da computao em java universitario

    29/157

    Captulo 3

    Conversor de Temperaturas

    Quais novidades veremos nesta aula?

    primeiro programa em Java

    3.1 Analogia entre dramatizao da disputa de pnaltis e Programao Ori-entada a Objetos

    Terminologia Teatral Terminologia de Programao Orientada a Objetos

    personagem (papel) classe (tipo)

    ator objetoenvio de mensagem envio de mensagem, chamada de mtodo ou chamada de funo

    Na dramatizao, podamos enviar uma mensagem (dizer alguma coisa) para um ator. Na programao orien-tada a objetos, podemos enviar uma mensagem para (ou chamar um mtodo de) um objeto.

    Os cartes de identificao definem os papis dos atores e os scripts especificavam o comportamento dosatores no decorrer da pea. A linguagem Java permite que ns especifiquemos a mesma coisa. Um carto deidentificao tem 3 partes, essas mesmas 3 partes aparecem na definio de uma classe em Java. Por exemplo,o bandeirinha em Java seria mais ou menos assim:

    c l a s s B a n d e i r i n h a{

    C o b r a n a A u t o r i z a d a

    { / / a q u i v em a d e s c r i o do q ue o b a n d e i r in h a f a z q ua nd o r e c eb e e s t a men sagem

    }VenceuOTime ( NomeDoTime){

    / / a q u i vem a d e s c r i o do q ue o b a n d e i r in h a f a z q ua nd o r e c eb e e s t a mensa gem}

    }

    15

  • 8/3/2019 introduo a ciencia da computao em java universitario

    30/157

    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.

    F 329

    =C5

    F 32 =95

    C F=95

    C+ 32

    traduzindo isso para Java temos F=9*C/5+32. A seguir iremos criar diversas classes para realizar a conver-so entre Celsius e Fahrenheit.

    1. Primeira tentativa: programa em Java para converter 40C para Fahrenheit.

    c l a s s C o n v e r s o r{

    i n t c e l s iu s P a r a Fa h r e n h e it ( ){

    return 9 40 / 5 + 3 2;

    }}

    para executar este conversor dentro do DrJava, podemos digitar o seguinte na janela do interpretador(chamada de interactions):

    C on ve rs or g a b r i e l = new C o n v e r s o r ( ) ;g a b r i e l . 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 gabriel.

    limitao: sempre converte a mesma temperatura.

    2. Segunda tentativa: conversor genrico de temperaturas Celsius -> Fahrenheit. capaz de converterqualquer temperatura de Fahrenheit para Celsius.

    c l a s s C o n v e r s o r 2{

    i n t c e l s iu s P a r a Fa h r e n h e it ( i n t c ){

    return 9 c / 5 + 32 ;}

    }

    para executar este conversor dentro do DrJava, podemos digitar o seguinte na janela do interpreta-dor:

    C o nv e rs o r2 d a n i e l = new C o n v e r s o r 2 ( ) ;d a n i e l . 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 daniel.

    limitao: essa classe manipula apenas nmeros inteiros. Mas, em geral, temperaturas so nmerosreais, fracionrios, ento nmeros inteiros no so suficientes. Quando o computador opera comnmeros inteiros, os nmeros so truncados, ou seja 30.3 se torna 30 e 30.9 tambm se torna 30.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    31/157

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

    Note que devido limitao acima, se tivssemos escrito a frmula como 95 C+ 32 o clculo seriaerrado pois 95 = 1 se considerarmos apenas a parte inteira da diviso. Assim, o programa calculariaapenas 1 C+ 32 o que seria errado.

    Para corrigir isso, usamos nmeros de ponto flutuante (floating point numbers). Esse nome se derivado fato de que internamente os nmeros so representados de forma parecida a potncias de 10 onde,variando o expoente da potncia, movemos (flutuamos) o ponto decimal para a esquerda ou para a direita.De floating pointvem o tipo float da linguagem Java. Nmeros do tipo float so armazenados em 4bytes e tem uma preciso 23 bits (o que equivale a aproximadamente ? casas decimais). No entanto, quasesempre so utilizados nmeros de ponto flutuante com preciso dupla que so chamados de double. EmJava, um double ocupa 8 bytes e tem preciso de 52 bits o que equivale a aproximadamente ? casasdecimais. Por comodidade, daqui para frente sempre que precisarmos de nmeros fracionrios, vamosutilizar o tipo double.

    3. Terceira tentativa: conversor genrico usando double

    c l a s s C o n v e r s o r 3{

    double c e l s i u sP a r a F ah r e n h e i t ( double c ){

    return 9 . 0 c / 5 .0 + 3 2 . 0;}

    }

    limitao: s faz converso em um dos sentidos

    4. Quarta e ltima verso: converso de mo dupla

    c l a s s C o n v e r s o r 4{

    double c e l s i u sP a r a F ah 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 dentro do DrJava, podemos digitar o seguinte na janela do interpreta-dor:

    C o nv e rs o r4 a n d e r s = new C o n v e r s o r 4 ( ) ;a n d er s . c e l s i u s P a r a F a h r e n h e i t ( 3 7 . 8 ) ;a n d e r s . 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 fique bem legvel e elegante, muito importante o alinhamento dosabre chaves { com os fecha chaves } correspondentes. Em programas mais complexos, esse corretoalinhamento (indentao) ajuda muito a tornar o programa mais claro para seres humanos.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    32/157

    18 CAPTULO 3. CONVERSOR DE TEMPERATURAS

    3.3 Exerccios:

    1. 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 relaoentre as trs escalas dada por:

    F 329

    =C5

    =K 273

    5

  • 8/3/2019 introduo a ciencia da computao em java universitario

    33/157

    Captulo 4

    Testes Automatizados

    Quais novidades veremos nesta aula?

    comando if e else;

    comparaes == (igualdade) e != (diferena);

    definio de variveis inteiras e de ponto flutuante.

    impresso de texto.

    4.1 Testes

    Desde o incio, a computao sempre esteve sujeita erros. O termo bug, para denotar erro, tem uma origemmuito anterior (vem de um inseto que causava problemas de leitura no fonogrfo de Thomas Edison em 1889).Vrias outras histrias reais, ou nem tanto, tambm apareceram no incio da informtica. Infelizmente, muitodifcil garantir que no existam erros em programas. Uma das formas de se garantir que certos erros no voocorrer testando algumas situaes.

    Apesar da frase clebre de Edsger Dijsktra que testes podem apenas mostrar a presena de erros, e noa sua ausncia, eles podem ser os nossos grandes aliados no desenvolvimento de programas corretos. Logo,intuitivamente, quanto mais testes fizermos em um programa, mais confiantes podemos ficar com relao aoseu funcionamento. Por outro lado, ns podemos usar o prprio computador para nos ajudar, isto , podemoscriar testes automatizados. Ao invs de fazermos os testes na mo, faremos com que o computador sejacapaz de verificar o funcionamento de uma seqncia de testes. Veremos nesta aula como desenvolver testesautomatizados, passo a passo, para os conversores de temperatura vistos anteriormente.

    No incio da computao no havia uma preocupao muito grande com os testes, eles eram feitos de formamanual pelos prprios programadores, os grandes testadores eram os usurios finais. interessante notar queisto ainda acontece com alguns produtos ainda hoje. Com o aparecimento da Engenharia de Software ficouclara a necessidade de se efetuar testes, tanto que em vrias empresas de desenvolvimento de software existea figura do testador, responsvel por tentar encontrar erros em sistemas. Hoje existe uma tendncia em seconsiderar que testes automatizados so muito importantes, devendo ser escritos mesmo antes de se escrever ocdigo propriamente dito, tcnica esta chamada de testes a priori.

    19

  • 8/3/2019 introduo a ciencia da computao em java universitario

    34/157

    20 CAPTULO 4. TESTES AUTOMATIZADOS

    Veremos como testar os diversos conversores de temperatura. Como testar o nosso primeiro programa emJava (Conversor).

    C o n v e rs o r c 1 = new C o n v e r s o r ( )

    / / a r e s p o st a e sp er a da o e q u i v a l e n t e a 40C em F i f ( c 1 . c e l s i u s P a r a F a h r e n h e i t ( ) == 1 0 4)

    Syst em . out . p r i n t l n ( " Funci ona " ) ;e l s e

    Syst em . out . p r i n t l n ( "No fun c i o na " ) ;

    Note que para fazer o teste utilizamos o comando condicional if else. O formato genrico deste comando o seguinte.

    i f (CONDIO)COMANDO1;

    e l s eCOMANDO2;

    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 er s o r 2 c 2 = new Conv erso r2 ( ) ;

    / / c r ia d uas v a r i v ei s i n t e i r a si n t e n t r a d a = 4 0 ;i n t r e s p o s t a = 1 0 4 ;

    / / a r e s p o st a e sp er a da o e q u i v a l e n t e a e n tr a da C em F i f ( c 2 . 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 )

    Syst em . out . p r i n t l n ( " Funci ona " ) ;e l s e

    Syst em . out . p r i n t l n ( "No fun c i o na " ) ;

    Note que, para realizar o teste acima ns definimos duas variveis inteiras chamadas de entrada e resposta.A linha

    i n t e n t r a d a = 4 0 ;

    faz na verdade duas coisas. Primeiro, ela declara a criao de uma nova varivel ( int entrada;) e, depois,atriubui um valor inicial a esta varivel (entrada = 40;). Na linguagem Java, se o valor inicial no atribudo,o sistema atribui valor 0 automaticamente.

    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 or am d e c l a ra d a s a cim a , b a s t a u sl a sr e s p o s t a = 6 8 ;

    i f ( c 2 . 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 )Syst em . out . p r i n t l n ( " Funci ona " ) ;e l s e

    Syst em . out . p r i n t l n ( "No fun c i o na " ) ;

    e n t r a d a = 1 0 0 ;r e s p o s t a = 2 1 2 ;i f ( c 2 . 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 )

    Syst em . out . p r i n t l n ( " Funci ona " ) ;

  • 8/3/2019 introduo a ciencia da computao em java universitario

    35/157

    4.1. TESTES 21

    e l s eSyst em . out . p r i n t l n ( "No fun c i o na " ) ;

    No programa acima o texto Funciona vai ser impresso na tela a cada sucesso, isso poder causar uma

    poluio visual caso tenhamos dezenas ou centenas de testes. O ideal para um testador que ele fique silenciosocaso os testes dem certo e chame a ateno caso ocorra algum erro. Podemos ento mudar o programa para:

    C o n v er s o r 2 c 2 = new Conv erso r2 ( ) ;

    i n t e n t r a d a = 4 0 ;i n t r e s p o s t a = 1 0 4 ;i f ( c 2 . 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 )

    S y st e m . o u t . p r i n t l n ( " No f u n c i o n a p a r a 4 0 " ) ;

    e n t r a d a = 2 0 ;r e s p o s t a = 6 8 ;i f ( c 2 . 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 )

    S y st e m . o u t . p r i n t l n ( " No f u n c i o n a p a r a 2 0 " ) ;

    e n t r a d a = 1 0 0 ;r e s p o s t a = 2 1 2 ;i f ( c 2 . 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 )

    S y st e m . o u t . p r i n t l n ( " No f u n c i o n a p a r a 1 00 " ) ;

    S y st e m . o u t . p r i n t l n ( " F im 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. Adiciona-mos tambm uma linha final para informar o final dos testes. Ela importante no caso em que todos os testesdo certo para que o usurio saiba que j terminamos a execuo de todos os testes.

    Uma forma de simplificar os comandos de impresso usar a prpria entrada como parmetro, isto podeser feito da seguinte forma:

    S ys te m . 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. Intro-duziremos um testador automtico criando uma classe com apenas um mtodo que faz o que vimos.

    c l a s s T e s t a C o n v e r s o r 4{

    i n t t e s t a T u d o ( ){

    C o n v er s o r 4 c 4 = new Conv erso r4 ( ) ;double t c = 1 0 .0 ;double t f = 5 0 . 0 ;

    i f ( c 4 . c e l s i u s P a r a F a h r e n h e i t ( t c ) ! = t f )

    Sys t em . out . pr i n t l n ( "C> F no f u n ci o n a p a ra " + t c ) ;i f ( c 4 . f a h r P a r a C e l s i u s ( t f ) ! = t c )Syst em . out . pr i n t l n ( "F> C n o f u nc io n a p ar a " + t f ) ;

    t c = 2 0 .0 ;t f = 6 8 . 0 ;i f ( c 4 . c e l s i u s P a r a F a h r e n h e i t ( t c ) ! = t f )

    Sys t em . out . pr i n t l n ( "C> F no f u n ci o n a p a ra " + t c ) ;i f ( c 4 . f a h r P a r a C e l s i u s ( t f ) ! = t c )

    Syst em . out . pr i n t l n ( "F> C n o f u nc io n a p ar a " + t f ) ;

  • 8/3/2019 introduo a ciencia da computao em java universitario

    36/157

    22 CAPTULO 4. TESTES AUTOMATIZADOS

    t c = 1 0 1 . 0 ;t f = 2 1 3 . 8 ;i f ( c 4 . c e l s i u s P a r a F a h r e n h e i t ( t c ) ! = t f )

    Sys t em . out . pr i n t l n ( "C> F no f u n ci o n a p a ra " + t c ) ;

    i f ( c 4 . f a h r P a r a C e l s i u s ( t f ) ! = t c )Syst em . out . pr i n t l n ( "F> C n o f u nc io n a p ar a " + t f ) ;

    S ys te m . 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 ;

    }}

    Agora, vamos treinar o que aprendemos com alguns exerccios. Em particular, o exerccio 3 de refatorao muito importante.

    4.2 Exerccios

    1. Escreva uma classe Ol com um nico mtodo cumprimenta que, a cada chamada, cumprimenta ousurio 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.

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

    3. Refatorar a classe TestaConversos4 de modo a eliminar as partes repetidas do cdigo. Dica: Crie ummtodo que realiza o teste das duas funes.

    4. Podemos criar testes para objetos de uma classe que no sabemos como foi implementada. Para tal, bastaconhecermos suas entradas e sadas.

    Escreva um teste automatizado para a seguinte classe:c l a s s C ont as{

    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 ) ;

    }

    5. Programas confiveis: Se conhecemos uma implementao e sabemos que a mesma funciona de maneiraconfivel, ela pode servir de base para o teste de outras implementaes. Caso duas implementaesdiferentes produzam resultados distintos para os mesmos dados de entrada, podemos dizer que pelomenos uma das duas est errada;

    Supondo que a classe Contas do exerccio anterior confivel, escreva um teste automatizado que utilizaesta classe para testar a classe ContasNaoConfiavel dada abaixo:

    c l a s s C o n t a s N a o C o n f i a v e l{

    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 ) ;

    }

  • 8/3/2019 introduo a ciencia da computao em java universitario

    37/157

    4.3. RESOLUES 23

    4.3 Resolues

    3

    i n t t e s t e P o n t u a l ( double t c , double t f ){

    C o n v er s o r c 4 = new Conv erso r4 ( ) ;

    i f ( c 4 . c e l s i u s P a r a F a h r e n h e i t ( t c ) ! = t f )Sys t em . out . p r i n t l n ( "C> F n o f u n ci o n a p a ra " + t c ) ;

    i f ( c 4 . f a h r P a r a C e l s i u s ( t f ) ! = t c )Syst em . out . p r i n t l n ( "F> C n o f u nc io n a p ar a " + t f ) ;

    return 0 ;}

    i n t t e s t a T u d o ( ){

    double t c = 1 0 .0 ;

    double t f = 5 0 . 0 ;t e s t e P o n t u a l ( t c , t f ) ;t c = 2 0 .0 ;t f = 6 8 . 0 ;t e s t e P o n t u a l ( t c , t f ) ;t c = 1 0 1 . 0 ;t f = 2 1 3 . 8 ;t e s t e P o n t u a l ( t c , t f ) ;S ys te m . 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 ;

    }

    4

    C o n t a s a = new Con tas ( ) ;double x = 4 . 0 ;

    i f ( a . c a l c u l a Q u a d r a d o ( x ) ! = 1 6 . 0 )S ys te m . 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 ra d o d e 4 " ) ;

    i f ( a . c a l c u l a Cu b o ( x ) ! = 6 4 . 0 )S ys te m . 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 a o c ub o " ) ;

  • 8/3/2019 introduo a ciencia da computao em java universitario

    38/157

    24 CAPTULO 4. TESTES AUTOMATIZADOS

  • 8/3/2019 introduo a ciencia da computao em java universitario

    39/157

    Captulo 5

    Mtodos com vrios parmetros

    Quais novidades veremos nesta aula? Mtodos que devolvem nada (void);

    Mtodos com vrios parmetros;

    Atributos.

    5.1 Mtodos com vrios parmetrosNa ltima aula ns j vimos um mtodo que recebia vrios parmetros. Apesar de no estarmos apresentandonenhuma novidade conceitual vamos reforar a possibilidade da passagem de mais de um parmetro.

    Assim como na passagem de apenas um parmetro, necessrio que o valor passado seja do mesmo tipodo que o valor que o mtodo est esperando. Por exemplo, se um objeto (ator) tem um mtodo (entende umamensagem) 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, na chamada de ummtodo devemos respeitar a mesma ordem que est na sua definio.

    Vamos comear com o clculo da rea de uma circunferncia, onde necessrio apenas um parmetro, oraio:

    c l a s s C r c u l o 1{

    double c a l c u l a r e a ( double r a i o ){

    return 3 . 1 4 1 5 r a i o r a i o ;}

    }

    25

  • 8/3/2019 introduo a ciencia da computao em java universitario

    40/157

    26 CAPTULO 5. MTODOS COM VRIOS PARMETROS

    Nota Lingustica: Em Java, o nome de variveis, classes e mtodos pode conter caracte-res 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 nopermitem o uso de caracteres acentuados. Voc pode usar caracteres acentuados se qui-ser mas lembre-se que se voc tiver uma varivel chamada rea, ela ser diferente deoutra chamada area (sem acento); ou seja, se voc decidir usar acentos, dever us-losconsistentemente sempre.

    Podemos sofisticar 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 . 1 4 1 5 2 . 0 r a i o ;}

    O seguinte trecho de cdigo calcula e imprime a rea e permetro de uma circunferncia de raio 3.0:C r c u l o 1 c = new C r cul o1 ( ) ;

    System . ou t . p r i n t l n ( c . ca lc ul a re a ( 3 . 0 ) ) ;Sys t em . out . p r i n t l n ( c . ca l c ul aP e r m e t ro ( 3 . 0 ) ) ;

    Vejamos agora uma classe Retngulo que define mtodos para o clculo do permetro e da rea de umretngulo. Neste caso so necessrios dois parmetros.

    c l a s s R e t n g u l o 1{

    i n t c a l c u l a r e a ( i n t l ado1 , i n t l ado2 ){

    return l a d o 1 l ado2 ;}i n t c a l c u l a P e r m e t r o ( i n t l ado1 , i n t l ado2 ){

    return 2 ( l a d o 1 + l a d o 2 ) ;}

    }

    As chamadas para os mtodos podem ser da seguinte forma:

    R e t n g ul o 1 r = new Ret ngu lo1 ( ) ;

    S y st e m . o u t . p r i n t l n ( r . c a l c u l a r e a ( 2 , 3 ) ) ;S ys te m . 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 ) ) ;

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

    c l a s s R e t n g u l o 2{

    i n t l ado1 ;i n t l ado2 ;

  • 8/3/2019 introduo a ciencia da computao em java universitario

    41/157

    5.1. MTODOS COM VRIOS PARMETROS 27

    i n t c a l c u l a r e a ( ){

    return l a d o 1 l ado2 ;}

    i n t c a l c u l a P e r m e t r o ( ){

    return 2 ( l a d o 1 + l a d o 2 ) ;}

    }

    Entretando fica faltando algum mtodo para carregar os valores dos lados nas variveis lado1 e lado2.

    v o id 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 m t od o n o d e v o l ve nenhu m v a l o r {

    l a do 1 = l 1 ;l a do 2 = l 2 ;

    }

    Nota Lingustica: void em ingls significa o vazio, nada, ou nulidade.

    O funcionamento de um objeto da classe Retngulo pode ser verificado com o cdigo abaixo:

    R e t n g ul o 2 r = new Ret ngu lo2 ( ) ;

    r . c a r r e g a L a d o s ( 3 , 5 ) ;Syst em . out . p r i n t l n ( r . c a l c u l a rea ( ) ) ;S y st e m . 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 Retngulo, ou carregar diversos lados. Veja abaixo as duas opes:

    c l a s s T e s t a R e t n g u l o{

    v o id 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 gu l o 2 r = new Ret ngu lo2 ( ) ;

    r . c a r r e g a L a d o s ( l 1 , l 2 ) ;i f ( r . c a l c u l a r e a ( ) ! = l 1 l 2 )

    S ys te m . 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 "+ l 1 + " e " + l 2 ) ;

    i f ( r . c a l c u l a P e r m e t r o ( ) ! = 2 ( l 1 + l 2 ) )S ys te m . 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 "

    + l 1 + " e " + l 2 ) ;

    }

    v o id t e s ta T ud o ( ){

    t e s t e P o n t u a l ( 1 0 , 2 0 ) ;t e s t e P o n t u a l ( 1 , 2 ) ;t e s t e P o n t u a l ( 3 , 3 ) ;

    }}

  • 8/3/2019 introduo a ciencia da computao em java universitario

    42/157

    28 CAPTULO 5. MTODOS COM VRIOS PARMETROS

    Da mesma forma que os lados foram atributos para a classe Retngulo2, podemos fazer o mesmo para aclasse Crculo1.

    c l a s s C r c u l o 2

    { double r a i o ;

    v o id c a r r e g a R a i o ( double r ){

    r a i o = r ;}double c a l c u l a r e a ( ){

    return 3 . 1 4 1 5 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 . 1 4 1 5 2 . 0 r a i o ;

    }}

    Assim como vimos anteriormente podemos tambm utilizar objetos de uma classe sem conhecer a suaimplementao. Por exemplo suponha que temos acesso a uma classe Clculo que possui o seguinte mtodo:

    i n t c a l c u l a P o t n c i a ( i n t x , i n t n ) ;

    Para calcular a potncia poderiamos ter o seguinte trecho de cdigo:

    C l c u l o c = new Cl cu lo ( ) ;

    S ys te m . o u t . p r i n t l n ( " 2 e l e va 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 ExercciosMtodos com vrios parmetros

    1. Calcular a mdia aritmtica de 4 notas e dizer se o dono das notas foi aprovado, est de recuperao oufoi 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

    Sada:Mdia: 8.15 -> aprovado.

    Mdia: 4.3 -> recuperao.

    Mdia: 2.9 -> reprovado.

    Para isso, crie uma classe Aluno com mtodos que carreguem as 4 notas em variveis p1, p2, p3, p4 eum mtodo responsvel por calcular a mdia aritmtica das notas e dar o veredito.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    43/157

    5.2. EXERCCIOS 29

    Atributos

    1. Construa a classe Inteiro que representa um nmero inteiro. Essa classe deve ter os seguintes atributos

    e mtodos:

    Classe Inteiro

    Atributos:

    int valorValor 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 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();

    Valor: -473158.

    2. Acrescente classe Inteiro algumas operaes matemticas, implementando os seguintes mtodos:

  • 8/3/2019 introduo a ciencia da computao em java universitario

    44/157

    30 CAPTULO 5. MTODOS COM VRIOS PARMETROS

    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 representar o novovalor, que tambm deve ser devolvido pelo mtodo.

    int subtrai(int v)Subtrai v do valor deste objeto (valor - v). Este objeto passa representar o novovalor, que tambm deve ser devolvido pelo mtodo.

    int multiplicaPor(int v)Multiplica o valor deste objeto por v (valor * v). Este objeto passa representar onovo valor, que tambm deve ser devolvido pelo mtodo.

    int dividePor(int divisor)Verifica se divisor diferente de zero. Se no, imprime uma mensagem de erro eno faz nada (devolve o valor inalterado). Se for, divide o valor deste objeto porv (valor / divisor, diviso inteira). Este objeto passa 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

    Se quiser, voc tambm pode fazer verses desses mtodos que no alteram o valor representado, apenasdevolvem o valor da conta.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    45/157

    Captulo 6

    if else encaixados

    Quais novidades veremos nesta aula?

    novidade: if else encaixados

    exerccio para reforar o que aprendemos at agora.

    6.1 if else encaixados

    Vamos iniciar programando uma classe para representar um tringulo retngulo. Ela contm um mtodo que,dados os comprimentos dos lados do tringulo, verifica se o mesmo retngulo ou no.

    c l a s s T r i a n g u l o R e t a n g u l o{

    v o id v e r i f i c a La d o s ( i n t a , i n t b , i n t c ){

    i f ( a b c ! = 0 ) / / n en hu m l a d o p od e s e r n u l o{

    i f ( a a = = bb + c c )S y st e m . 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 ( bb = = a a + c c )S y st e m . 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 ( c c = = a a + bb )S y st e m . 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 . " ) ;

    }}

    }

    O mtodo acima pode ser chamado da seguinte forma:

    T r i a n gu l o R e ta n g u l o 1 r = new T r i a n g u l o R e t a n g u l o 1 ( ) ;r . v e r i f i c a L a do s ( 1 , 1 , 1 ) ;r . v e r i f i c a L a do s ( 3 , 4 , 5 ) ;

    Limitaes:

    31

  • 8/3/2019 introduo a ciencia da computao em java universitario

    46/157

    32 CAPTULO 6. IF ELSEENCAIXADOS

    1. mesmo que um if seja verdadeiro, ele executa os outros ifs. Em particular, se tivssemos um tringuloretngulo para o qual vrios desses ifs fossem verdadeiros, ele imprimiria esta mensagem vrias vezes(ser que isso possvel neste caso especfico???);

    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 imprimirmensagens afirmativas e negativas:

    c l a s s T r i a n g u l o R e t a n g u l o 2{

    v o id v e r i f i c a La d o s ( i n t a , i n t b , i n t c ){

    i f ( a b c ! = 0 ) / / n en hu m l a d o p od e s e r n u l o{

    i f ( a a = = bb + c c )S ys te m . 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 ( bb = = a a + c c )S ys te m . 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 + bb )

    S ys te m . 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

    S ys te m . 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 . " ) ;}e l s e S ys te m . 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 d e c o mp r im e nt o n u l o . " ) ;

    }}

    Caso sejam necessrios outros mtodos, como um para o clculo de permetro, interessante colocar oslados como atributos da classe.

    c l a s s T r i a n g u l o R e t a n g u l o 3{i n t a , b , c ;v o id c a r r eg a L a do s ( i n t l 1 , i n t l 2 , i n t l 3 ){

    a = l 1 ;b = l 2 ;c = l 3 ;

    }i n t c a l c u l a P e r im e t r o ( ){

    return a + b + c ;}v o id v e r if i c aL a d o s ( )

    { i f ( a b c ! = 0 ) / / n en hu m l a d o p od e s e r n u l o{

    i f ( a a = = bb + c c )S ys te m . 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 ( bb = = a a + c c )S ys te m . 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 . " ) ;

  • 8/3/2019 introduo a ciencia da computao em java universitario

    47/157

    6.2. EXERCCIOS 33

    e l s e i f ( c c = = a a + bb )S ys te m . 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

    S ys te m . 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 . " ) ;}e l s e

    S ys te m . 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 d e c om pr im en to n u lo . " ) ;

    }}

    6.2 Exerccios

    1. Voc foi contratado por uma agncia de viagens para escrever uma classe em Java para calcular a conver-so de reais para dlar de acordo com a taxa de compra e a taxa de venda. Para isso, escreva uma classeConversorMonetrio 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.

    2. Escreva uma classe Baskara que possui 3 atributos do tipo double correspondentes aos coeficientes a, be c de uma equao do segundo grau. Escreva um mtodo para carregar valores nestes atributos e, emseguida, 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 pos-

    sui.

    (c) razesReais() deve imprimir as razes reais.

    (d) razesImaginrias() deve imprimir as razes imaginrias.

    Para calcular a raiz quadrada, voc pode utilizar o mtodo java.lang.Math.sqrt(double x), querecebe um double como parmetro e devolve outro double. Voc pode supor que o primeiro coeficiente,a, diferente de 0.

    3. [Desafio!] 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 identificar essa esfera diferente, e tambm dizer se ela mais ou menos pesada. Para issovoc tem apenas uma balana de prato (que s permite determinar igualdades/desigualdades). Ah, sim,

    pequeno detalhe: o desafio completar a misso em no mais que trs pesagens.

    Escreva um programa que resolve esse desafio. O seu programa deve dar uma resposta correta sempre etambm informar as trs ou menos pesagens que permitiram concluir a resposta.Como esse problema um tanto complicado, recomendamos que voc implemente o modelo descrito a seguir.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    48/157

    34 CAPTULO 6. IF ELSEENCAIXADOS

    Classe DesafioDasEsferas

    Atributos:

    int esferaDiferenteIdentificador da esfera com peso diferente.

    boolean maisPesadaDiz se a esfera diferente ou no mais pesada que as demais (isto , truepara mais pesada e false para mais leve).

    int numPesagensRepresenta 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 depesagens realizadas volta a ser zero.

    void resolveDesafioDasDozeEsferas()Resolve o Desafio das Doze das Esferas. Este mtodo deve imprimir as 3 (oumenos) pesagens feitas, e no final a resposta correta. Este mtodo deve se utilizardos mtodos para uso interno descritos abaixo. Dica: na implementao destemtodo voc tambm usar uma quantidade grande de ifs e elses encaixados.

    Mtodos para uso interno da classe:

    int pesa1x1(int e1, int d1)

    int pesa2x2(int e1, int e2, int d1, int d2)

    int pesa3x3(int e1, int e2, int e3, int d1, int d2, int d3) int pesa4x4(int e1, int e2, int e3, int e4, int d1, int d2,

    int d3, int d4)

    int pesa5x5(int e1, int e2, int e3, int e4, int e5, int d1,int d2, int d3, int d4, int d5)

    int pesa6x6(int e1, int e2, int e3, int e4, int e5, int e6,int d1, int d2, int d3, int d4, int d5, int d6)

    Os mtodos acima (no formato pesa#x#) funcionam de forma semelhante. Elesrepresentam as possveis pesagens, e devolvem o resultado. Os parmetros re-presentam 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 inteiroentre 1 e 12. Ento, por exemplo, para comparar as esferas 1, 7 e 3 com as esferas4, 5 e 6, basta chamar pesa3x3(1,7,3,4,5,6). Os mtodos devem devolver -1 se abalana pender para o lado esquerdo, 0 se os pesos forem iguais ou 1 se a balanapender para o lado direito. Esses mtodos tambm devem incrementar o nmerode pesagens realizadas.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    49/157

    6.2. EXERCCIOS 35

    Cada esfera deve ser representada por um inteiro entre 1 e 12. Para representarmos a esfera diferente,usaremos, alm do identificador inteiro, uma varivel booleana que receber o valor true se a esfera formais pesada ou o valor false se a esfera for mais leve.

    Importante: note que para que o problema tenha sentido, o mtodo resolveDesafioDasDozeEsferas nodeve de modo algum acessar os atributos esferaDiferente e maisPesada para inferir a resposta. Quem dpistas 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 maiselegante. 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!]

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

  • 8/3/2019 introduo a ciencia da computao em java universitario

    50/157

    36 CAPTULO 6. IF ELSEENCAIXADOS

  • 8/3/2019 introduo a ciencia da computao em java universitario

    51/157

    Captulo 7

    Programas com Vrios Objetos

    Quais novidades veremos nesta aula?

    Programas com vrios objetos

    7.1 Programas com Vrios Objetos

    At agora, todos os programas que vimos lidavam com apenas um objeto. No entanto, podemos ter vriosprogramas que lidam com vrios objetos. Estes objetos podem todos pertencer mesma classe, ou podempertencer a classes diferentes. Exemplo:

    1. Vrios objetos do mesmo tipo

    F lo r r o sa = new Fl or ( ) ;F l o r m a r g ar i d a = new Fl or ( ) ;Fl or l a r a n j e i r a = new Fl or ( ) ;

    ro sa . co r ( " ver melh a " );ros a . a roma ( " mui t o agr a d ve l " ) ;ma rg ar id a . aroma ( " s u t i l " );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 ac h or r o f l o q u i n h o = new Cach orro ( ) ;G a to m in g au = new Gat o ( ) ;

    R at o t o p o G i g g i o = new Rat o ( ) ;Vaca mimosa = new Vac a ( ) ;

    f l o q u i n h o . l a t a ( ) ;min gau . mie ( ) ;top oGi gg io . comaQueijo ( ) ;mi ngau . pe rs i g a ( t opo Gi ggi o )f l o q u i n h o . p e r s i g a ( m i ng a u ) ;mimosa . passePorC i ma ( f l o qui n ho , mi ngau , t opo Gi gg i o ) ;

    37

  • 8/3/2019 introduo a ciencia da computao em java universitario

    52/157

    38 CAPTULO 7. PROGRAMAS COM VRIOS OBJETOS

    Vejamos agora um exemplo de utilizaao de objetos de 3 tipos diferentes em conjunto:

    c l a s s Pri sma{

    double a l t u r a ;double areaDa Base ;

    v o id c a r r e g a A l t u r a ( double a ){

    a l t u r a = a ;}

    v o id ca rregaA re aDaB ase ( double a ){

    a r e a D aB a s e = a ;}

    double volume ()

    {return areaDaB ase a l t u r a ;

    }}

    c l a s s Quadrado{

    double l a do ;

    v o id c a r r e g a L a d o ( double l ){

    l ad o = l ;}

    double a r e a ( ){

    return l a d o l ado ;}

    }

    c l a s s T r i a n g u l o R e t a n g u l o{

    double c a t e t o 1 ;double c a t e t o 2 ;

    / / n o t e a i n d e n t a o s u pe r compacta !v o id c a r r e g a C a t e t o 1 ( double c ) { c a te t o 1 = c ; }v o id c a r r e g a C a t e t o 2 ( double c ) { c a te t o 2 = c ; }

    double a 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:

  • 8/3/2019 introduo a ciencia da computao em java universitario

    53/157

    7.2. EXERCCIO 39

    Q u a d r a d o q = new Quadr ado ( ) ;T r ia n g ul o Re t an g u lo t r = new T r i a n g u l o R e t a n g u l o ( ) ;P r i s m a p r i s m a B a s eQ u a d r a d a = new Pri sma ( ) ;P r is m a p r i s m a B a s eT r i a n g u l a r = new Pri sma ( ) ;

    q . l a d o ( 1 0 ) ;t r . c a t e t o 1 ( 2 0 ) ;t r . c a t e t o 2 ( 3 0 ) ;

    p r i sm a B as e Q ua d r ad a . c a r r e g a A l t u r a ( 3 ) ;p r i s m a B a se T r i a n g u l ar . c a r r e g a A l t u r a ( 1 ) ;

    pr i smaB a seQuad rada . ca rregaAr ea Da B ase (q . a r e a ( ) ) ;pr i sm aB a seT ri a ng ul a r . ca rregaA reaDaB ase ( t r . a rea ( ) ) ;

    i f ( pr i sma B aseQuad rada . vol ume () > pr i sm aB a seT ri a ngu l a r . vol ume ( ) )S y st e m . o u t . p r i n t l n ( " O p r i s m a d e b a s e q u a d r a d a t em m a i o r v o lu m e " ) ;

    e l s e i f ( pr i sm aB a se T ri a ngu l ar . vol ume () > pr i sma B aseQuad rada . vol ume ( ) )S ys te m . o u t . p r i n t l n ( "O p r i s m a d e b a s e t r i a n g u l a r t em m a io r v ol um e " ) ;

    e l s eSyst em . out . p r i n t l n ( "Ambos os pr i smas t em o mesmo vol ume" ) ;

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

    7.2 Exerccio

    1. Escreva uma classe Rendimentos que contenha os seguintes mtodos a fim de contabilizar o total derendimentos de uma certa pessoa em um certo ano:

    rendimentosDePessoaFisica(double);

    rendimentosDePessoaJuridica(double);

    rendimentosDeAplicacoesFinanceiras(double);

    rendimentosNaoTributaveis(double);

    double totalDeRendimentosTributaveis();

    Em seguida, escreva uma classe TabelaDeAliquotas que possui:

    um mtodo aliquota() que, recebe como parmetro o total de rendimentos tributveis de umapessoa e devolve um nmero entre 0 e 1.0 correspondente aliquota de imposto que a pessoadever pagar e

    um mtodo valorADeduzir() que recebe como parmetro o total de rendimentos tributveis deuma pessoa e devolve o valor a deduzir no clculo do imposto.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    54/157

    40 CAPTULO 7. PROGRAMAS COM VRIOS OBJETOS

    Agora escreva uma classe CalculadoraDeImposto que possui um nico mtodo que recebe como par-metro 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 define os vrios rendi-

    mentos de uma pessoa e calcula o imposto a pagar.

    Eis a tabela do IR 2004:

    Rendimentos Tributveis Alquota Parcela a deduzir

    At R$ 12.696De R$ 12.696,01 a R$ 25.380 0.15 R$ 1.904,40

    acima de R$ 25.380 0.275 R$ 5.076,90

    2. Suponha que voc tenha as seguintes classes:

    c l a s s A {

    double a ( i n t meses , double t a x a ) {return ( M ath . p ow ( ( t a x a + 1 0 0 ) / 1 0 0 , m es es ) 1 ) ;

    }}

    c l a s s B {f i n a l d ou bl e TAXA = 1. 2 ;

    v o id b ( double v a l o r E m p r e s t a d o , i n t meses ) {A a = new A ( ) ;double val o rDaD i vi d a = va l o rEmp res t ado + ( a . a ( meses , TAXA) v a l o r E m p r e s t a do ) ;S ys te m . o u t . p r i n t l n ( " D v i d a d e " + v a l o r D a D i v id a + " r e a l ( i s ) , " +

    " c a l c u l a d a com t a x a d e " + TAXA + "% a o m s . " ) ;}

    }

    (a) O que fazem os mtodos a (da classe A) e b (da classe B)? No precisa entrar em detalhes. DICA:consulte a pgina http://java.sun.com/j2se/1.4.1/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 utiliz-la. Ento, por que isso foi feito? Cite, pelo menos, dois motivos. Se voc no sabe o que umaconstante, imagine que um atributo cujo valor no pode ser alterado.

  • 8/3/2019 introduo a ciencia da computao em java universitario

    55/157

    Captulo 8

    Laos e Repeties

    Quais novidades veremos nesta aula? 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 NovaIorque e que os EUA no esto em guerra com ningum. Voc arruma a mala e se prepara para viagem. Antesde viajar voc resolve conversar com um amigo que j morou nos EUA. Ele acaba lhe dando uma dica: guardeuma tabelinha de converso de temperaturas de Fahrenheit para Celsius. Ela ser muito til, por exemplo, paraentender o noticirio e saber o que vestir no dia seguinte. Voc ento se lembra das aulas de MAC-110: voc jtem um conversor pronto. Basta ento us-lo para montar a tabela. Voc chama ento o DrJava e comea umanova seo iterativa.

    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)

    41

  • 8/3/2019 introduo a ciencia da computao em java universitario

    56/157

    42 CAPTULO 8. LAOS E REPETIES

    -1.1111111111111112

    > 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

    >

    Pronto, agora s copiar as linhas acima para um editor de textos, retirar as chamadas ao mtodofahrenheitParaCelsius (pois elas confundem) e imprimir a tabela.

    Ser que existe algo de especial nas diversas chamadas do mtodo fahrenheitParaCelsius acima? Todaselas so muito parecidas e fcil adivinhar a prxima se sabemos qual a passada. Ou seja, a lei de formao dasdiversas chamadas do mtodo simples e bem conhecida. No seria interessante se fosse possvel escrever umtrecho de cdigo compacto que representasse essa idia? Para isso servem os laos: eles permitem a descriode 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 deoperaes 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 digi-tarmos as 5 linhas do comando while abaixo, necessrio usarmos Shift+Enter ao invs de apenas Enter nofinal das 4 linhas iniciais do while):

    Welcome to DrJava.

    > int a = 1;

    > while (a

  • 8/3/2019 introduo a ciencia da computao em java universitario

    57/157

    8.2. O LAOWHILE 43

    O valor atual de a : 1

    O valor atual de a : 2

    O valor atual de a : 3

    O valor atual de a : 4O valor atual de a : 5

    O valor atual de a : 6

    O valor atual de a : 7

    O valor atual de a : 8

    O valor atual de a : 9

    O valor atual de a : 10

    >

    Vamos olhar com calma o cdigo acima. Primeiro criamos uma varivel inteira chamada a. O seu valorinicial foi definido como 1. A seguir vem a novidade: o lao while. Como dissemos antes, ele faz comque o cdigo que o segue (e est agrupado usando chaves) seja executado enquanto a condio a

  • 8/3/2019 introduo a ciencia da computao em java universitario

    58/157

    44 CAPTULO 8. LAOS E REPETIES

    {return ( f a h r 3 2 . 0 ) 5 .0 / 9 . 0;

    }

    / I m pr im e u ma t a b e l a d e c o n v e r s o F a r a n h e i t => C e l s i u s ./

    v o id 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 hr = i n i c i o ;double c e l s i u s ;

    w h i le ( 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/2019 introduo a ciencia da computao em java universitario

    59/157

    8.4. EXERCCIOS 45

    > resto

    2

    > div*5 + resto

    7>

    Deu para pegar a idia, no?

    Agora vamos escrever uma classe contendo um mtodo que verifica se um inteiro primo ou no, impri-mindo a resposta na tela. O nome que daremos nossa classe GeradorDePrimos. A razo para esse nomeficar clara na prxima aula.

    c l a s s GeradorDePri mos{

    / I mp ri me na t e l a s e um n mero i n t e i r o p o s i t i v o p ri mo ou no ./

    v o id v e r i f i c a P r i m a l i d a d e ( i n t x ){

    / / T od os o s n m er os i n t e i r o s p o s i t i v o s s o d i v i s v e i s p o r 1 .i n t n u m e r o D e D i v i s o r e s = 1 ;/ / O p r i m e ir o c a n d i da t o a d i v i s o r n o t r i v i a l o 2 .i n t c a n d i d a t o A D i v i s o r = 2 ;

    / / T e s t a a d i v i s o p or t o d o s o s n m er os m en or es o u i g u a i s a x .w h i le ( c a n d i d a t o A D i v i s o r

  • 8/3/2019 introduo a ciencia da computao em java universitario

    60/157

    46 CAPTULO 8. LAOS E REPETIES

    (a) Crie o mtodo imprimeTabelaCelsiusParaFahrenheit, que converte no sentido oposto do m-todo imprimeTabelaFahrenheitParaCelsius.

    (b) Adicione um parmetro aos mtodos acima que permita a impresso de uma tabela com passos

    diferentes de 10.0. Ou seja, o passo entre a temperatura atual e a prxima ser dado por esse novoparmetro.

    4. Escreva uma classe Fibonacci, com um mtodo imprimeFibonacciAte50, que imprime os 50 primeirosnmeros da seqncia de Fibonacci. Seqncia de Fibonacci:

    F1 = 1;

    F2 = 1;

    Fn = F(n-1) + F(n-2), para todo n > 2, n inteiro.

    O mtodo deve ento imprimir F1, F2, F3, ..., F49, F50.5. Abaixo, apresentamos uma pequena variao do mtodo verificaPrimalidade. Ela no funciona cor-

    retamente em alguns casos. Voc deve procurar um exemplo no qual esta verso no funciona e explicaro defeito usando suas prprias palavras. Note que a falha sutil, o que serve como alerta: programar uma tarefa difcil, na qual pequenos erros podem gerar resultados desastrosos. Toda ateno pouca!

    / I mp ri me na t e l a s e um n mero i n t e i r o p o s i t i v o p ri mo ou no ./

    v o id v e r i f i c a P r i m a l i d a d e ( i n t x ){

    / / T od o s o s n me ro s i n t e i r o s p o s i t i v o s s o d i v i s v e i s p o r 1 .i n t n u m e r o D e D i v i s o r e s = 1 ;/ / O p r i m e i ro c a n d i da t o a d i v i s o r n o t r i v i a l o 2 .i n t c a n d i d a t o A D i v i s o r = 2 ;

    / / T e s ta a d i v i s o p or t o d o s o s n m er os m en or es ou i g u a i s a x .w h i