Tecnólogo em Análise e Desenvolvimento de Sistemas Organizador André Luiz Perin 1o semestre de 2015 - 1a edição www.metodista.br Análise e desenvolvimento de sistemas de informação Universidade Metodista de São Paulo Diretor Geral Wilson Roberto Zuccherato Conselho Diretor Titulares: Paulo Borges Campos Jr. (Presidente); Aires Ademir Leal Clavel (Vice-Presidente); Oscar Francisco Alves Jr. (Secretário); Afranio Gonçalves Castro; Augusto Campos de Rezende; Esther Lopes; Jonas Adolfo Sala; Marcos Gomes Tôrres; Ronilson Carassini; Valdecir Barreros Suplentes: Nelson Custódio Fér; Robson Ramos de Aguiar Reitor: Marcio de Moraes Pró-Reitoria de Graduação: Vera Lúcia Gouvêa Stivaletti Pró-Reitoria de Pós-Graduação e Pesquisa: Fábio Botelho Josgrilberg Direção da Faculdade de Exatas e Tecnologia: Carlos Eduardo Santi Diretor de EAD: Luciano Sathler Coordenação do NEAD: Adriana Barroso de Azevedo Coordenador do Curso de Tecnologia em Análise e Desenvolvimento de Sistemas André Luiz Perin Coordenação Editorial André Luiz Perin Editoração Eletrônica Editora Metodista Organizador André Luiz Perin Professores Autores Cristiano Camilo dos Santos de Almeida Rafael Guimarães Sakurai Ricardo Crepalde Silvia Aparecida Brunini Silvio Pereira da Silva Valter Espíndola Thomáz Wesley Adriano Martins Dourado Assessoria Pedagógica Adriana Barroso de Azevedo Celeste Yanela Millaray Pánik Castro Eliana Vieira dos Santos Thais Helena Santinelli Produção de Materiais Didático-Pedagógicos EAD Bruno Tonhetti Galasse Projeto Gráfico Cristiano Leão Revisão Carlos Alberto Coelho Victor Hugo Lima Alves Data desta edição 1o semestre de 2015 expediente Dados Internacionais de Catalogação na Publicação (CIP) (Biblioteca Central da Universidade Metodista de São Paulo) Universidade Metodista de São Paulo Un3a Análise e desenvolvimento de sistemas de informação / Universidade Metodista de São Paulo. Organização de André Luiz Perin. São Bernardo do Campo : Ed. do Autor, 2015. 243 p. (Cadernos didáticos Metodista - Campus EAD) Bibliografia ISBN 978-85-7814-239-1 1. Análise de sistemas 2. Processamento eletrônico de dados I. Perin, André Luiz II. Título. CDD 004.21 Rua do Sacramento, 230 - Rudge Ramos 09640-000 São Bernardo do Campo - SP Tel.: 0800 889 2222 - www.metodista.br/ead É permitido copiar, distribuir, exibir e executar a obra para uso não comercial, desde que dado crédito ao autor original e à Universidade Metodista de São Paulo. É vedada a criação de obras derivadas. Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença desta obra. Tecnólogo em Análise e Desenvolvimento de Sistemas Organizador André Luiz Perin umesp 1o semestre de 2015 - 1a edição www.metodista.br Análise e desenvolvimento de sistemas de informação Palavra do Reitor Caro(a) aluno(a) do Campus EAD Metodista, É com muita alegria que acolhemos você na Universidade Metodista de São Paulo. Você está recebendo o Guia de Estudos digital que é parte da nossa preocupação com a educação superior de qualidade da Metodista. Este material foi elaborado pelos professores do seu curso e será utilizado durante o semestre nas suas atividades de estudos. Aproveite ao máximo o conteúdo aqui disponibilizado, explorando todas as possibilidades para aprofundamento dos temas tratados. O Guia de Estudos é uma parte dos esforços que têm marcado as atividades dos cursos EAD Metodista. Ao longo dos anos, buscamos intensamente o cumprimento do nosso compromisso em propiciar interação professor-aluno, formação continuada da equipe de docentes e técnicos que atuam na modalidade, qualidade das atividades propostas e estímulo para a construção de conhecimento. Temos trabalhado no aperfeiçoamento das diferentes estratégias de ensino e aprendizagem na modalidade EAD e o caminho até aqui trilhado sinaliza que temos acertado. No ano de 2014, concentramos nossos esforços para ampliar nosso portfólio de cursos de Graduação e Pós-Graduação EAD para que você, aluno Metodista, possa continuar a receber uma formação de excelência. Em 2015, o desafio continua: ampliar a atuação da EAD da Metodista e torna-la cada vez mais sinônimo de qualidade nacional e internacional. O melhor de tudo isso é saber que você está conosco e, como nós, acredita na Metodista. Bons estudos e um ótimo semestre! Prof. Dr. Marcio de Moraes Reitor Logística Módulo: Epistemologia e processos de aprendizagem 9 Diante de nós a cidadania e a filosofia: e o que mais? Wesley Adriano Martins Dourado 15 Mecanismos de estudo e estilos de aprendizagem Ricardo Crepalde 27 Aprendendo de forma visual e memorização Ricardo Crepalde 45 Leitura otimizada e criatividade Ricardo Crepalde 57 Administração do tempo, epistemologia e processos de aprendizagem Ricardo Crepalde 67 O texto narrativo / a construção de parágrafos Silvio Pereira da Silva 71 Conceitos e noções gerais de dissertação Silvio Pereira da Silva 75 Espaços vetoriais Valter Espíndola Thomáz 93 Transformações lineares Valter Espíndola Thomáz 103 Vetores Valter Espíndola Thomáz 117 Lógica e dedução Silvia Aparecida Brunini sumário Módulo: Lógica de Programação 125 Introdução ao desenvolvimento guiado por testes Rafael Guimarães Sakurai 141 O impacto do TDD no design da aplicação Rafael Guimarães Sakurai Módulo: Programação Orientada a Objetos 161 Introdução a programação com Java Cristiano Camilo dos Santos de Almeida 189 Estrutura de controle e repetição Cristiano Camilo dos Santos de Almeida 201 Introdução a orientação a objetos (Classe e objeto) Cristiano Camilo dos Santos de Almeida 219 Interface, herança, classe abstrata e polimorfismo Rafael Guimarães Sakurai 233 Tratamentos de exceções e trabalhando com arquivos textos Rafael Guimarães Sakurai Epistemologia e Processos de Aprendizagem Diante de nós a cidadania e a filosofia: e o que mais? Prof. Me. Wesley Adriano Martins Dourado Objetivo: Trata-se de uma reflexão que apresenta a crítica ao conhecimento e o exercício de construir conhecimento no enfrentamento, na decifração do nosso lugar como a contribuição da filosofia para a construção de outras maneiras de viver em comunidade. A crítica dirigida ao conhecimento – ao filosófico inclusive – quer indicar a necessidade de compreender e produzir o conhecimento para além da formação profissional e do desenvolvimento tecnológico: é preciso (re)aprender que o conhecimento deve servir aos viventes. Palavras-chave: www.metodista.br/ead Módulo Para início da prosa. Dois aspectos da reflexão estão postos explicitamente: a filosofia e a cidadania. A pergunta o que é filosofia suscitou muitas e diferentes respostas no interior da tradição filosófica. Gilles Deleuze e Felix Guattari (2000, p. 10) dirão que “(...) a filosofia é a arte de formar, de inventar, de fabricar conceitos”. Não se trataria de um processo mecânico, mas, à semelhança do artista, o exercício poético, ensaísta, talvez, de tracejar novos conceitos, novas ideias sobre o mundo. Tais conceitos se constituem na dependência da “vizinhança”, ou seja, na convivência de outros conceitos. Estes habitam “(...) o plano de imanência” (p.119) . Dito de outro modo, o conceito se constitui na proximidade de outros conceitos que, caducos, saturados, abrem o caminho para a criação de outros conceitos. E isto se dá na realidade, na concretude da vida e não numa representação que quer fugir do “mundo”. Assim, a filosofia é a criação de conceitos no contexto das muitas experiências humanas, dentro dela os conceitos já existentes. Não é o distanciamento do mundo, mas a conexão do pensar com a realidade, com a concretude da vida. A fenomenologia, tal como a concebe o filósofo francês Maurice Merleau-Ponty, defende que a tarefa do filósofo implica num permanente recomeço. “O filósofo, dizem ainda os inéditos, é alguém que perpetuamente começa. Isso significa que ele não considera como adquirido nada do que os homens ou os cientistas acreditam saber.” (1999, p. 11). Isto se explica à partir do reconhecimento de que não sabemos tudo do mundo e, ainda, que a nossa permanente ligação com o mundo e os outros corpos permite, sempre, que descubramos novos sentidos e atribuamos outros significados ao conhecimento e as relações humanas. Por isso, dirá o filósofo francês, “(...) a filosofia não deve considerar-se a si mesma como adquirida naquilo que ela pode dizer de verdadeiro, que ela é uma experiência renovada de seu próprio começo, que toda ela consiste em descrever este começo (...)” (p.11). Assim, a filosofia seria este permanente debruçar sobre o mundo, sobre as relações, sobre os hábitos e o próprio conhecimento reconhecendo que nada está dito ou pronto de modo absoluto havendo sempre a possibilidade de ser e fazer de outros modos, de entender o que somos e desejamos em outros rumos. A filosofia nunca estaria pronta; o inacabamento seria a sua marca, posto que também os homens e mulheres, podendo reinventar-se a todo instante, desafiariam a filosofia e qualquer outra forma de conhecimento a reconhecer-se caduca diante dos novos sentidos existenciais. A lista de resposta à pergunta apresentada de início pode ser maior. O elemento a destacar nestas duas e em todas as outras1 é que a filosofia está ligada a um mundo, a um contexto histórico, a uma concepção de realidade que pode ser repensada. Neste sentido, a filosofia volta-se sobre o conhecimento para desafiá-lo a responder a seguinte pergunta: em que medida respondes os ou se liga aos problemas e demandas deste momento existencial? Não se trata de defender que o valor do conhecimento está na sua utilidade, mas em ser o registro, a interpretação dos significados, dos sentidos que os homens e mulheres dão ao seu mundo. Não é o “para que serve”, tão valorizado na sociedade da ciência e da tecnologia, que aqui se defende, mas o sentido humano, existencial que deu origem a este conhecimento e se ele ainda corresponde aos sentidos, às percepções que temos do nosso instante, no lugar em que estamos. 1 De algum modo, mesmo quando determinado filósofo defende a universalidade da filosofia ou que ela trataria de elementos essenciais, ainda assim é preciso reconhecer que o pensamento filosófico se apresenta situado. 10 Universidade Metodista de São Paulo O conhecimento é instrumento: sobre a cidadania Posto deste modo, a filosofia, enquanto conjunto de conhecimento, e todas as outras formas de conhecimento, não podem ser mais do que uma tradução humana da sua compreensão da realidade, do seu entendimento do mundo e, de algum modo, do que o registro do desejo de organizar a vida de certa maneira. Neste sentido, a filosofia pergunta a si e aos demais conhecimentos: a quem serves? Em que medida este conhecimento colabora para reinventar o modo de viver para que se amenize a injustiça, o desrespeito, o sofrimento das desigualdades, entre outros? É nesta direção que o conhecimento é instrumento do viver dos homens e mulheres. O conhecimento, expressão das relações dos homens e mulheres com o mundo e os outros corpos, não pode ser mais importante que os seus criadores. O conhecimento não pode, porque obra dos corpos, ser utilizado para separar, explorar, destruir a vida e os próprios corpos. Assim, a filosofia nos convida a olhar criticamente os conhecimentos já produzidos, mas também nos desafia a apreciar o nosso mundo, o nosso instante, o modo como vivemos para criar novos conhecimentos nos quais a vida não seja secundarizada. Trata-se de nos ajudar a pensar de outro modo tendo a vida, o corpo, o respeito como elementos inalienáveis. Mais do que isto, trata-se de reconhecer que o conhecimento - obra dos corpos – deve seguir os corpos e que ele fenece todas as vezes que os corpos movimentam-se em outras direções, quando rascunham outros modos de viver. O conhecimento deve ser visto como criação dos homens e mulheres e instrumento dos corpos para a tradução dos seus desejos, de modo organizado, e a transformação destes em modo de viver concreto. E toda vez que os corpos precisam mudar o modo de viver para continuar garantindo a justiça, o respeito, a dignidade é preciso que os conhecimentos caducos sejam guardados e, em pura poesia, nos coloquemos a inventar outro entendimento do mundo, da sociedade. Primeiro os corpos O poeta brasileiro Jorge de Lima2, em sua obra, articula a religiosidade e o sentimento fraterno em relação aos oprimidos, bem como, manifesta o seu desejo de superar as misérias do mundo ascendendo até Deus. _________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ Cf. breve biografia deste poeta e escritor em <http://educacao.uol.com.br/biografias/jorge-de-lima.jhtm>. Último acesso: 22 de outubro de 2011. 2 11 www.metodista.br/ead A poesia “A divisão do Cristo” expressa bem a percepção do poeta sobre o sofrimento historicamente resistente. “Dividamos o mundo em duas partes iguais: uma para portugueses, outra para espanhóis: Vêm quinhentos mil escravos no bojo das naus: a metade morreu na viagem do oceano. Dividamos o mundo entre as pátrias. Vêm quinhentos mil escravos no bojo das guerras: a metade morreu nos campos de batalha. Dividamos o mundo entre as máquinas: Vêm quinhentos mil escravos no bojo das fábricas, a metade morreu na escuridão, sem ar. Não dividamos o mundo. Dividamos Cristo: todos ressuscitarão iguais.” (LIMA, 1958, p. 399) O que interessa destacar aqui é percepção do poeta sobre o que desencadeou as decisões humanas. A referência às máquinas, as fábricas recorda de como o desenvolvimento da ciência e da tecnologia suscitou, também, sofrimento aos homens e mulheres. Foi neste contexto que criou-se a divisão do trabalho como estratégia de acelerar o ritmo do trabalho e aumentar a produção explorando ao máximo a força produtiva dos trabalhadores. Conhecimento construído contra muitos corpos em benefício de alguns... Foi a partir deste momento que a ciência e a tecnologia, em nome do bem estar humano, criaram objetos que substituíram o trabalho humano jogando os homens e mulheres para o “conforto” das sarjetas, do empobrecimento, da exclusão de uma sociedade da qual só se pode participar quando se produz. Não se quer “demonizar” o conhecimento e a tecnologia. Não se quer que deixemos de dizer algo sobre o mundo, que não utilizemos a nossa inteligência para criar outras formas de viver. O que se quer é que todo conhecimento tenha como ponto de partida o respeito aos corpos e à vida de um modo geral. Diante de nós a tarefa de pensar desde os corpos O desafio que a reflexão filosófica que se volta permanentemente para o mundo e para os corpos nos traz é este: produzir conhecimento desde os corpos. As teorias, os conceitos, os conhecimentos não podem dilacerar os corpos, dividi-los arbitrariamente em modos de viver que favorecem a poucos. Por isso, 12 Universidade Metodista de São Paulo [...] temos que encarar os conhecimentos, as tecnologias, as estruturas, as instituições, por vezes, construídas para manter e/ou reproduzir a cidadania do capitalismo com o desafio de pensá-los, alterá-los, usá-los para a semeadura de novos hábitos que permitam a organização da vida, de modo tal que todos vivam no conforto da dignidade, do respeito, da partilha. (DOURADO, 2010, p. 96). Se, como diz o poeta, nas decisões do passado acorrentamos ao desrespeito milhares de homens e mulheres jogando-os no mar3, matando-os nos campos de batalha, na escuridão das fábricas, hoje temos diante de nós a possibilidade de reinventar a nossa própria história tomando como critério para o julgamento e construção do conhecimento o respeito ao corpo e à vida. Para tanto será preciso reaprender a ver o mundo, pensar desde a imanência dos corpos, meditar sobre a tecnologia desde os corpos secundarizando o que hoje é feito elemento fundamental: a reprodução do valor. Eis o que temos diante de nós... Referências DELEUZE, Gilles; GUATTARI, Félix. O que é a filosofia. São Paulo: Editora 34, 2000. DOURADO, Wesley Adriano Martins. Corpos transcendentes: sobra a cidadania. In: Cidadania, que coisa é essa? A formação cidadã na Universidade. São Bernardo do Campo: Editora Metodista, 2010. LIMA, Jorge de M. Obra Incompleta. Rio de Janeiro: Aguilar, 1958. MERLEAU-PONTY, Maurice. Fenomenologia da Percepção. São Paulo: Martins Fontes, 1999. A apreciação do filme “Amistad” serve de ilustração para o que o poeta Jorge Lima diz de modo conciso em seu poema. Cf. informações gerais sobre o filme em <http://www.adorocinema.com/filmes/amistad/>. Último acesso: 22 de outubro de 2011. 3 13 www.metodista.br/ead _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ __________________________________________ __________________________________________ 14 Universidade Metodista de São Paulo Epistemologia e Processos de Aprendizagem Mecanismos de estudo e estilos de aprendizagem Prof. Me. Ricardo Crepalde Objetivos: Abordar os principais estilos de aprendizagem apresentando suas diferenças após análise das dimensões e a importância dos diversos tipos de inteligência procurando desenvolver as habilidades para o mercado de trabalho. Palavras chave: Aprendizagem; análise de dimensões; perfil profissional. www.metodista.br/ead Módulo O Conjunto das habilidades humanas Todos nós somos dotados de um espectro de diferentes capacidades. Veja quais são elas: Fonte: Nova Escola On-Line (Disponível em: http://www.ensino.net:80/novaescola/105_set97/html/pedagogia.htm Qual a sua inteligência?!? Lógico-Matemática?!? 1. Possui facilidade em fazer cálculos? 2. Gosta de matemática? 3. Tem facilidade no aprendizado da matemática? 4. Tem facilidade em fazer “contas de cabeça”? 5. Tem facilidade em descobrir erros em contas? 6. Faz uso da intuição? 7. Faz bom uso da lógica, principalmente em situações SE-ENTÃO? 8. Gosta de filmes ou jogos nos quais é necessário investigação? 9. Em filmes de detetives/investigação ou advogados, busca a resolução dos problemas apresentados? 16 Universidade Metodista de São Paulo Banco de imagens Qual a sua inteligência?!? Linguística?!? Banco de imagens 1. Possui facilidade em se comunicar com as pessoas? 2. Sente-se a vontade em apresentar-se em público? 3. Gosta de ler? 4. Gosta de escrever/redigir? 5. Tem facilidade em escrever/redigir (cartas, textos escolares, memorandos de trabalho, etc.)? 6. Gosta do estudo de idiomas, mesmo o português? Banco de imagens Qual a sua inteligência?!? Musical?!? 1. Gosta de ouvir música? 2. Toca algum instrumento? Qual? 3. Gosta de cantar? 4. Possui facilidade em cantar? 5. É cantor(a) de karaokê? 6. Possui facilidade no aprendizado de algum instrumento? 7. Possui facilidade no aprendizado de partituras? Banco de imagens Qual a sua inteligência?!? Espacial?!? 1. Gosta de desenhar? 2. Tem facilidade em desenhar? 3. Gosta de pintar? 4. Tem facilidade em pintar? 5. Gosta de decoração? 6. Tem afinidade com atividades de decoração? 7. Gosta de projetos de imóveis (análise de plantas, maquetes, etc.) 8. Tem facilidade em analisar e entender mapas/guias de ruas? 9. Tem facilidade no entendimento de direções (norte, sul, leste, oeste)? 10.Tem facilidade em memorizar caminhos? 11.Joga xadrez? 12.Consegue lidar com ou visualizar aproximadamente medidas sem régua ou outro instrumento de medida? 17 www.metodista.br/ead Qual a sua inteligência?!? Corporal-Cinestésica?!? Banco de imagens 1. Gosta de atividades manuais, como artesanato, costura ou mesmo manutenção e reparos domésticos? 2. Tem facilidade na execução de atividades manuais? 3. Pratica algum esporte? 4. Considera que apresenta bom desempenho no esporte que pratica? Ou na prática de atividades físicas, de uma forma geral? Qual a sua inteligência?!? Intrapessoal?!? Banco de imagens 1. Costuma avaliar seus atos no dia a dia? 2. Você poderia dizer, com extrema certeza, a frase: “eu me conheço bem!”? 3. Procura automotivar-se (motivar a si próprio)? 4. Você sabe quais são suas fraquezas (deficiências)? 5. E suas virtudes? 18 Universidade Metodista de São Paulo Estilos de aprendizagem Um Estilo de Aprendizagem é caracterizado pela forma mais eficaz, pessoal, que um indivíduo usa para aprender. É o “jeito” que uma pessoa aprende melhor. Apresentamos, a seguir, os estilos de aprendizagem a partir das inteligências múltiplas Banco de imagens • Físico • Interpessoal • Intrapessoal • Linguístico • Matemático • Musical • Visual Questionário Momentos de Aprendizagem Abaixo destacamos nove linhas (numeradas de 1 a 9), com quatro palavras escritas em cada linha. Comece com a primeira linha e escolha a palavra que melhor caracteriza seu estilo de aprendizagem. Coloque o número 4 (quatro) na palavra. Continue na mesma linha, numerando a palavra em terceira ordem de importância (número 3), a segunda (número 2) e a palavra que menos caracteriza seu estilo de aprendizagem (número 1). Faça a mesma ordenação em cada uma das linhas seguintes, lembrando que o número 4 corresponde ao que você mais aprecia como estilo de aprendizagem, decrescendo até o número 1, o estilo de aprendizagem que você menos aprecia. Enumere as palavras: COLUNA A COLUNA B COLUNA C COLUNA D 1 distinguindo tentando envolvendo praticando 2 receptivo relevante analítico imparcial 3 sentindo observando pensando fazendo 4 aceitador arriscador avaliador alerta 5 intuitivo produtivo lógico questionador 6 abstrato observador concreto ativo 7 orientado p/ presente reflexivo orientado p/ futuro pragmático 8 experiência observação conceitualização experimentação 9 intenso reservado racional responsável Fonte: Modelo de Aprendizado, segundo David Kolb, denominado “Aprendizagem Vivencial”. Comece com a primeira linha e escolha a palavra que melhor caracteriza seu estilo de aprendizagem. Coloque o número 4 (quatro) na palavra. Continue na mesma linha, numerando a palavra em terceira ordem de importância (número 3), a segunda (número 2) e a palavra que menos caracteriza seu estilo de aprendizagem (número 1). Faça a mesma ordenação em cada uma das 19 www.metodista.br/ead linhas seguintes, lembrando que o número 4 corresponde ao que você mais aprecia como estilo de aprendizagem, decrescendo até o número 1, o estilo de aprendizagem que você menos aprecia. Soma dos pontos Para cada coluna some apenas os pontos correspondentes às linhas indicadas: COLUNA A: (linhas Nº 2, 3, 4, 5, 7 e 8). TOTAL DE PONTOS: ______ COLUNA B: (linhas Nº 1, 3, 6, 7, 8 e 9) . TOTAL DE PONTOS: ______ COLUNA C: (linhas Nº 2, 3, 4, 5, 8 e 9). TOTAL DE PONTOS: ______ COLUNA D: (linhas Nº 1, 3, 6, 7, 8 e 9). TOTAL DE PONTOS: ______ 20 Universidade Metodista de São Paulo Unindo os quatro totais, você obteve uma figura com quatro pontas. A ponta mais comprida corresponde ao seu estilo preferido (em uma dimensão), e a ponta mais curta ao seu estilo menos preferido de aprendizagem. Se houver empates, desempate a seu critério. Não existe resultado melhor ou pior. Apenas cada um de nós tem suas maneiras de aprender. Todas são igualmente válidas. Chamaremos essas colunas de “dimensões” e as explicaremos para você. Análise de cada dimensão: A A dimensão “A” refere-se ao verbo “sentir” e denomina-se “EXPERIÊNCIA CONCRETA”. Quanto maior o número de pontos, nesta dimensão, tanto mais “concreto” você é. Há a necessidade de contato com a realidade externa para você estar aprendendo, Você precisa estar sentindo as coisas acontecendo. Este é o semieixo dos “vivenciadores”. As pessoas deste estilo de aprendizagem valorizam o envolvimento em situações reais, sentem-se confortáveis em realidades únicas e complexas e decidem intuitivamente. Banco de imagens Análise de cada dimensão: C A dimensão “C”, oposta à “A”, refere-se ao verbo “pensar” e denomina-se “CONCEITUALIZAÇÃO ABSTRATA”. Quanto mais pontos neste semieixo, tanto mais “abstrato” você é. O que mais importa para você é o seu pensamento. Este é o eixo dos que “compreendem”, daqueles que “pensam”. As pessoas deste estilo valorizam o planejamento sistemático, a manipulação abstrata de símbolos, sentem-se confortáveis pelo rigor e disciplina da análise de ideias e conceitos. Constroem esquemas, modelos e teorias. São tomadores de decisão que operam em grande grau de previsão e precisão dos resultados. Banco de imagens 21 www.metodista.br/ead Análise de cada dimensão: B A dimensão “B” refere-se ao verbo “observar” e denomina-se “OBSERVAÇÃO REFLEXIVA”. Enquanto em “A” você participava das coisas, aqui você apenas as observa. O que mais importa para você é “refletir” sobre o que observa. Este é o semieixo dos “observadores”. As pessoas deste estilo são pacientes, valorizam a imparcialidade, buscam o significado das ideias e das situações. Percebem as implicações das decisões, sob diferentes perspectivas. Banco de imagens Análise de cada dimensão: D A dimensão “D”, oposta à “B”, refere-se ao verbo “agir” e denomina-se “EXPERIMENTAÇÃO ATIVA”. Enquanto em “B” você refletia sobre o que observava, aqui você toma a iniciativa de experimentar para ver como as coisas funcionam. Este é o semieixo dos “fazedores”. As pessoas deste estilo são impacientes, gostam de influenciar pessoas e mudar situações. Valorizam o que funciona, sem se preocuparem com o “porquê”. São tomadores de decisão que gostam de ver o resultado, assumindo para isto alguns riscos. Banco de imagens Análise concomitante de duas dimensões Some os pontos: COLUNA A+C (Percepção) =________ COLUNA B+D (Transformação) =________ COLUNA A+B (Imaginação) =________ COLUNA B+C (Teoria) =________ COLUNA C+D (Bom Senso) =________ COLUNA D+A (Prática) =________ 22 Universidade Metodista de São Paulo Qual palavra teve mais pontos? A + C: Percepção A informação é obtida concretamente, porém a reflexão é voltada não para o entendimento da informação ou experiência, mas para o como nós as entendemos, ou seja, quais os mecanismos do indivíduo empregados para o entendimento e aprendizagem daquilo. B + D: Transformação É o estilo da mudança no qual o aprendizado é o resultado da transformação da realidade anterior, refletindo sobre o que observamos da experiência direta empreendida. Valoriza-se aqui, a habilidade de processar experiências e informações. Aqui as pessoas aprendem pela transformação da realidade através da reflexão interna sobre fatos novos experimentados, intencionalmente. 23 www.metodista.br/ead A + B: Imaginação Banco de imagens A informação é obtida de forma concreta e processada, reflexivamente. A realidade é absorvida e transformada de maneira a fazer sentido para a pessoa. Valorizam neste estilo, o trabalho e as discussões em grupo cooperativo. As pessoas deste estilo são autênticas, envolvem-se e comprometem-se com todo o trabalho de que participam. A pergunta preferida é “por quê?”. B + C: Teoria Banco de imagens A informação é captada abstratamente e processada reflexivamente. São privilegiados os processos mentais intrínsecos à pessoa. Os conceitos e as ideias são transformados através da coleta, crítica e re-exame de processos e teorias existentes. Valoriza-se o aprendizado tradicional através da transmissão, em que há apresentação sistemática do conteúdo de conhecimentos dominantes. A pergunta preferida é “o que?”. C + D: Bom Senso Banco de imagens A informação é recebida abstratamente e transformada externamente. As ideias e conceitos, na forma de teorias mais ou menos estruturadas, são colocados em prática para ver se funcionam. Valoriza-se o pragmatismo e a competência. As pessoas deste estilo podem ser inflexíveis e autossuficientes. A pergunta preferida é “como funciona”. D + A: Prática Banco de imagens A informação é captada concretamente e transformada externamente. São privilegiados os processos mentais de interação da pessoa com o meio ambiente. Valoriza-se o aprendizado prático, por tentativa e erro. As pessoas deste estilo entusiasmam-se com coisas novas, são flexíveis e gostam de exercer influência. A pergunta preferida é “e se”. 24 Universidade Metodista de São Paulo Fonte: http://www.businessballs.com/kolblearningstyles.htm “Versões Resumidas” dos EA: Quadrantes - Ativista Ativista - Acomodador Aprendem melhor a partir de tarefas relativamente curtas, tipo “aqui e agora”. Podem ser atividades gerenciais no trabalho ou em cursos: coisas como simulações de cases e tarefas competitivas feitas por equipes de trabalho (O Aprendiz). Têm mais dificuldade de aprender a partir de situações envolvendo um papel passivo, como ouvir palestras ou leitura. Ênfase em realizar coisas, executar planos e experimentos e em se envolver em novas experiências. Tendência em se arriscar mais, ousar mais. Capacidade de sobressair e acomodar ou adaptar a circunstâncias imediatas específicas. Ênfase em fatos, podendo descartar teorias ou planos que não se encaixam nos fatos. “Versões Resumidas” dos EA: Quadrantes - Reflexivo Reflexivo - Divergente Aprendem melhor a partir de atividades em que possam ficar recuados, ouvindo e observando. Gostam de colher informações e que lhes seja dado o tempo de pensar sobre elas. Têm mais dificuldade de aprender quando atirados sobre as atividades, sem o tempo necessário, para planejar. 25 www.metodista.br/ead A capacidade de imaginação é forte. Conseguem ver situações concretas a partir de variadas perspectivas. O desempenho é melhor em situações que exigem a geração de ideias. Demonstram interesses culturais amplos e por artes. “Versões Resumidas” dos EA: Quadrantes - Teórico Teórico – Assimilador Aprendem melhor quando podem reavaliar as coisas, como: um sistema, um conceito, um modelo ou uma teoria. Interessam-se em absorver ideias, ainda que possam estar distantes da realidade atual. Apresentam capacidade para criar modelos teóricos e sobressaem-se no raciocínio indutivo, em assimilar observações desencontradas e transformá-las numa explicação integrada. Comumente se preocupam com conceitos abstratos, ao invés do uso prático das teorias. Demonstram mais interesse nas ciências básicas do que nas ciências aplicadas. “Versões Resumidas” dos EA: Quadrantes - Pragmático Pragmático - Convergente Aprendem melhor quando há uma clara ligação entre a visão do sujeito e o problema ou a oportunidade no trabalho. Gostam de confrontos com a técnica e com processos que podem ser aplicados em circunstâncias imediatas. Têm mais dificuldade de aprender a partir de acontecimentos distantes, que não têm aplicação direta e imediata a sua própria realidade. Normalmente, saem-se melhor em situações nas quais existe uma única resposta Referências KOLB, David A . Experiential Learning. New Jersey: O’Dougherty, 1984. KOLB, David. A gestão e o processo de aprendizagem.In: SSTARKEY,Ken. (Org.) Como as organizações aprendem : relatos do sucesso das grandes empresas. São Paulo: Futura, 1997. p. 321-340. BERNDT, Alexandre; IGARI, Camila. O docente em Administração: perfil e estilo de aprendizagem. Trabalho apresentado no XIV Enangrad, 2003. Disponível em www.angrad. org.br. Acesso em: jan. 2008. FREITAS, Leonildo Silveira de. Questionário Momentos de Aprendizagem. Nota de aula. Mestrado em Administração, Universidade Metodista de São Paulo, 1997. SILVA, Heloísa Helena Rovery da. Apostila de Metodologia Científica. Centro Universitário Salesiano Auxilium, 2006. Disponível em www.salesianolins.br. Acesso em Janeiro de 1998. 26 Universidade Metodista de São Paulo Epistemologia e Processos de Aprendizagem Aprendendo de forma visual e memorização Prof. Me. Ricardo Crepalde Objetivos: Abordar os diferentes tipos de representações gráficas, mapas mentais e modelos e entender a construção do conhecimento abordando a importância das fases do processo de memorização. Palavras chave: representações gráficas; mapas mentais; modelos; informação; aprender; conhecimento; memorização. www.metodista.br/ead Módulo Representações gráficas • Aprender / entender / memorizar algo de forma visual banco de imagens • Registrar / fazer anotações também de forma visual • Planejar / especificar / apresentar / transmitir ideias e conteúdos de forma visual Representação gráfica Uma representação gráfica é a amostra de fenômenos físicos, econômicos, sociais, ou outros, de forma ordenada e escrita. Pode também ser uma representação de uma função ou funções através de gráficos, curvas ou superfícies. Também são sistemas de coordenadas que podem ser representadas por um conjunto finito de pontos e de segmentos de linhas que unem a pontos distintos. Banco de imagens Banco de imagens Mapas mentais O termo Mapa Mental vem do inglês (Mind Map) e indica uma forma de apresentação de dados de maneira visualmente organizada para melhor utilização das capacidades mentais de memória e criatividade. É um recurso muito eficaz para organização do pensamento e conhecimento de uma pessoa, principalmente no aprendizado de algo. Os Mapas Mentais foram criados pelo pesquisador do funcionamento do cérebro Tony Buzan. Tony escreveu livros com os seguintes títulos: “Use os dois lados do seu cérebro” e “Como utilizar ao máximo as capacidades da mente”. 28 Universidade Metodista de São Paulo Sucesso profissional como consequência da formação acadêmica constituída de fatores críticos de resultados positivos como estudante Características dos mapas mentais Banco de imagens • Não linear. Possibilidade de visualização do todo (conteúdo) ao mesmo tempo. • Ferramenta eficaz na organização visual de informações. • Representação de conteúdos por meio de imagens, símbolos e palavras, valendo-se de características como cor e tamanho visando influenciar o resultado “gráfico” de forma positiva para o entendimento. Vantagens do Mapa Mental Banco de imagens • Aproxima a atividade do pensar à de escrever, usando símbolos, cores e palavras para representar o fluxo do pensamento. • Organiza o pensamento, hierarquizando ideias, criando links de ideias e sintetizando conceitos. • É uma atividade estimulante, porque é criativa. • Tem um visual agradável e chama a atenção para pontos importantes de um contexto. • É uma forma objetiva e criativa de planejamento. • Auxilia na memorização de fatos e dados. 29 www.metodista.br/ead Outras vantagens... Banco de imagens • Estimula a criatividade. • Aprofunda a capacidade de síntese e análise. • É flexível. • Economiza tempo, papel e dinheiro. • Ajuda a gerar ideias e organizar melhor essas ideias. • Possibilita visão global dos assuntos e, por isso, facilita a tomada de decisões. Criando um Mapa Mental É simples: Banco de imagens 1) Comece com uma imagem do tema central no meio de um espaço em branco (folha de papel, slide de apresentação etc.) É importante que seja uma imagem (concreta ou abstrata) que traduza a ideia mais importante do tema. Como exemplo, consideremos o projeto de um curso de extensão. Veja que a imagem central deve ser uma síntese da ideia geral do tema. Deve proporcionar a chance de compreender o tema visualmente, diretamente. Em seguida, crie ramificações saindo dessa imagem central, com os tópicos principais derivados daquele. Por exemplo: Banco de imagens Fonte: do autor Veja que as ramificações apontam para temas que serão tratados na palestra. Você pode criar quantas ramificações quiser. As ramificações podem ser representadas por outros desenhos e imagens. Você pode também utilizar cores e tipos de letras diferentes. O importante é que você consiga lembrar, apenas vendo a imagem, de tudo que a palavra ou imagem representa. 30 Universidade Metodista de São Paulo A partir das ramificações você pode criar outros subtópicos, cada um com sua própria ramificação: Você dever formar as ramificações de modo a tornar claro seu pensamento. Lembre-se de usar as cores: vermelho, por exemplo, para tópicos mais importantes, etc. Cada vez que você mudar de tópico, crie uma ramificação a mais. E lembre-se: • Use uma imagem central. • Registre imagens no mapa todo (As imagens ajudam a sintetizar ideias). • Registre as ideias em destaque em volta da imagem central. • Use poucas palavras, com letras de cores e dimensões variadas. • Procure ser simétrico. No mapa acima, o autor utiliza as cores e os traços (mais grossos e mais finos) para hierarquizar as ideias. Imagens que reforçam o entendimento junto às palavras-chave. Tudo isso o auxilia a ver todo o conteúdo a ser tratado, de uma só vez, de modo global. 31 www.metodista.br/ead Mapa Conceitual Fonte: Do autor Modelos Top Models Banco de imagens: Stock.XCHNG, Luká Patka?211;ID da Imagem 1146070 Banco de imagens: Stock.XCHNG, busywear –ID da Imagem 976359 As “top models” vestem roupas, que é o que se pretende mostrar ou vender. A ideia é que uma pessoa imagine-se vestindo aquela roupa. 32 Universidade Metodista de São Paulo E para atender o público feminino... Banco de imagens: Stock.XCHNG, Hidden–ID da Imagem 1348196 Banco de imagens: Stock.XCHNG, Leandro Cavinatto–ID da Imagem 1113801 A ideia é que de alguma forma a realidade possa ser representada. Você vê um(a) modelo e imagina-se como ele(a), visualizando aquilo como uma possibilidade para você. Algo como: vestindo aquela roupa posso ficar tão bonito(a) quanto o(a) modelo. Moldagens, modelos e próteses Um dentista, para a produção de uma prótese, precisa gerar um modelo da arcada dentária de uma pessoa, usando massa e gesso. 33 www.metodista.br/ead Modelo é a Abstração ou representação da realidade. Usos comuns a todos os modelos (Audy; Andrade; Cidral, 2005) Ajudar na elaboração do raciocínio, uma vez que sua representação requer uma organização de seus elementos de forma clara e objetiva; Ajudar a visualizar o sistema que está em estudo ou que será desenvolvido, tanto do ponto de vista funcional, estrutural ou comportamental; Ajudar na construção de sistemas; Ajudar na documentação de um sistema, bem como no registro da decisão tomada; Auxiliar na comunicação, pois a linguagem natural é ambígua e a representação construída pode ser feita de forma a ter uma única descrição; Apoiar atividades de formação e treinamento, pois, em muitos casos, o risco ao usar o modelo é muito menor do que trabalhar diretamente com o sistema; Realizar previsões, pois podem ser usados em estudos antecipados de situações; e Viabilizar a realização de experimentos com custos mais baixos. Todas imagens daqui até modelos computacionais são meramente ilustrativas. Modelos e abordagem sistêmica Modelo é um sistema; Modelo de um sistema de software é a representação de uma realidade complexa; Modelos de sistemas de softwares são REPRESENTAÇÕES GRÁFICAS. 34 Universidade Metodista de São Paulo Modelos icônicos ou físicos Maquetes Protótipos Modelos simbólicos 1 • Planta baixa • Planta elétrica • Fluxograma 35 www.metodista.br/ead Modelos simbólicos 2 • Diagrama de Fluxo de Dados • Casos de uso 36 Universidade Metodista de São Paulo Modelos matemáticos Fórmulas matemáticas, p.ex. 37 www.metodista.br/ead Modelos computacionais • Procedimentos lógicos • Algoritmos MEMORIZAÇÃO Informação não é conhecimento... • Obter informação é fácil, mas o que fazer com ela? • Podemos saber uma data e um fato histórico relacionado a essa data. Mas, mais importante que isso, é saber o que esse fato significou para a história de um povo ou da própria humanidade. • Saber quais são as etapas do processo de desenvolvimento de software não significa saber usá-las de fato, não é mesmo? • É necessário saber por que um conteúdo deve ser memorizado. Porque deve ser fixado. Por isso, o aluno de sucesso deverá aprender a usar o conteúdo que ele aprende. Mais do Banco de imagens que simplesmente memorizar, o aluno deve apreender o conteúdo e aprender como utilizá-lo. Fixar conhecimentos, portanto, não é apenas memorizar dados, uma vez que, se os organizarmos bem, sempre teremos acesso a eles. O importante é aprender procedimentos, habilidades, ações, relações lógicas. Ou seja, precisamos aprender a usar os dados, os conteúdos, a matéria ensinada pelo professor. Você deve consultar seu professor sobre isso: como aqueles conhecimentos podem servir para o seu crescimento; o que você deve aprender a fazer com aqueles dados, com aquele conteúdo. 38 Universidade Metodista de São Paulo Aprender a usar o conteúdo que se aprende • Mais do que simplesmente memorizar, o aluno deve apreender o conteúdo e aprender como utilizá-lo. • Fixar conhecimentos, portanto, não é apenas memorizar dados, uma vez que, se os organizarmos bem, sempre teremos acesso a eles. O importante é aprender procedimentos, habilidades, ações, relações lógicas. É preciso “dar uso” ao conteúdo que se obtém. • Pergunte sempre aos seus professores: como o conteúdo das aulas pode servir para seu crescimento; o que você deve aprender a fazer com esse conteúdo. Segundo o dicionário Aurélio: Apreender: apropriar-se; segurar, agarrar; assimilar mentalmente. • Apreender é saber usar os conteúdos a seu serviço, assimilados de forma a tê-los disponíveis sempre que necessitar. • Apreender é saber como, quando e por que você vai utilizar determinado conteúdo. Vocês já devem ter percebido a capacidade de retenção de informações que várias pessoas possuem, incluindo profissionais da área e professores. Isso não significa que sejam todos gênios, mas sim que praticam constantemente os mecanismos de apreensão da engenharia de software, o que causa efeito de conhecimento irrestrito. Memorização x “Decoreba” Imagine uma garota (uma vez que os garotos dificilmente admitiriam isso...), que acabou de terminar um relacionamento afetivo. Esta garota “na fossa” ouve uma música no rádio que trata dessa mesma situação de término de relacionamento. A garota vai se identificar de imediato com a canção, uma vez que parece que a letra da música fala justamente daquilo que ela sente. Se for um estilo de música que a garota aprecia, maior ainda a identificação. A garota ouvirá a canção repetidas vezes, gravando-a no seu MP3 player. Quando se der conta, estará cantando a música sozinha, a todo o momento, como se o refrão da música não saísse da sua cabeça. O despertar de emoções mais a repetição fizeram com que a letra da música fosse decorada ou memorizada pela garota?!?!? Banco de imagens 1. A garota não se preocupou em decorar a letra, que foi se incorporando a sua memória à medida que a música era cada vez mais ouvida, mas o fator principal foi realmente a identificação pessoal com aquela canção. 39 www.metodista.br/ead 2. É preciso sempre memorizar ao invés de decorar. Fazemos isso incorporando uma informação a nossa vida, estabelecendo relações (identificação), procurando reaproveitar (ouvir / cantar repetidas vezes) essa informação o tempo todo. Banco de imagens 3. Memorização pressupõe incorporação de aprendizado, ao passo que decorar tem ‘prazo de validade’ curto. Por que memorizamos a “tabuada”?!? Porque fazemos contas o tempo todo. 4. O conhecimento adquirido na faculdade deve ser incorporado e levado conosco a todos os lugares, principalmente no que diz respeito ao exercício profissional e cidadão. Fases do processo de memorização A memorização é um processo metódico, ainda que o pratiquemos de maneira intuitiva muitas vezes, como no caso da memorização de uma letra de música. Continuemos com esse exemplo para perceber as fases que compreendem o processo de memorização: Captação: A garota ouve a canção por meio de seu sentido auditivo. Ela presta atenção na letra da canção, pois o que ela ouve lhe interessa. Fixação: A letra da canção ficará fixada na memória da garota, uma vez que a informação será marcada pelo interesse que ela apresenta por aquilo que está ouvindo. Manutenção: A garota passará a trazer à sua memória a letra da canção, uma vez que a ajuda a assimilar melhor o momento difícil pelo qual vem passando com o fim do namoro. Recuperação: Se, depois de algum tempo, essa garota arrumar um novo namorado e o namoro terminar novamente, ao sentir-se triste, relembrará a letra da música que armazenou em sua memória, ao ativar novamente o sentimento de frustração amorosa. Transmissão: uma vez estando a letra da canção bem guardada, a garota será capaz de transmiti-la para outras pessoas, quer seja cantarolando a canção ou expressando o sentimento que a letra transmite a ela. Pronto, a canção está registrada em sua memória. 40 Universidade Metodista de São Paulo Ponha em prática o processo 1. Procure prestar atenção ao que precisa aprender. 2. Procure um interesse para isso. 3. Procure assimilar o conteúdo e recuperá-la quando surgirem fatos aos quais o assunto se aplica. 4. Procure explicar aos outros o que aprendeu. Explicar aos outros o que aprendeu é uma excelente maneira de constatar a efetiva incorporação de conceitos, pois se sabemos explicar é porque conseguimos memorizar os pontos mais importantes do conteúdo. Daí a importância dos estudos e discussões em grupo. De repente é de sua explicação que um colega precisa para entender de fato a matéria. E não deixe de: • Para memorizar determinado tema é essencial o estabelecimento de associações. • Relacione tudo o que você aprender com conhecimentos já consolidados em sua mente e a matéria entre si. 41 www.metodista.br/ead Você pode usar um esquema como esses para organizar os dados recolhidos da leitura de um texto. Cada item corresponde a um parágrafo, sua ideia principal e suas ideias secundárias. Pode também se valer desta técnica a partir de conteúdos visuais, como uma apresentação de slides, ou mesmo pela fala e anotações em quadro do professor. Lembrem-se da aula de representações gráficas e modelos... 42 Universidade Metodista de São Paulo Obs.: você pode criar o seu próprio modelo (representação gráfica) para registro (anotação) de algo. De preferência algo simples e que realmente o ajude a entender e fixar (memorizar) aquele conteúdo. Condições para melhorar a memorização 1. Conhecer a utilidade daquilo que está aprendendo; 2. Diferenciar o que é importante do que é secundário; 3. Organizar os conteúdos aprendidos. Valem as dicas: • Procure identificar o que é mais importante no conteúdo global (seleção). • Sintetize os conteúdos mais importantes em poucas palavras. • Trabalhe um conceito de cada vez, evitando trabalhar com conceitos muito parecidos de uma única vez. • Mantenha-se tranquilo, porém concentrado. • Selecione, organize e sintetize. Referências AUDY, Jorge Luiz Nicolas; ANDRADE, Gilberto Keller; CIDRAL, Alexandre. Fundamentos de Sistemas de Informação. Porto Alegre: Bookman, 2005. RODRIGUEZ, Concepcion Fernandez. Aprender a Estudar: Como Superar as Dificuldades nos Estudos. São Paulo: Scipione, 2001. WIKIPEDIA. Fluxograma. 22 de agosto de 2011. Disponível em http://pt.wikipedia.org/wiki/ Fluxograma. Acesso em Dez/11. 43 www.metodista.br/ead _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ __________________________________________ __________________________________________ 44 Universidade Metodista de São Paulo Epistemologia e Processos de Aprendizagem Leitura otimizada e criatividade Prof. Me. Ricardo Crepalde Objetivos: Abordar a necessidade e compreensão dos diversos tipos de leituras e compreender o processo de criatividade desafiando ideias estabelecidas e os procedimentos habituais. Palavras chave: Leitura, falar bem, compreensão do texto, criatividade, lógica, tempo, criatividade. www.metodista.br/ead Módulo Ler, para aprender Ler, para apreender Banco de imagens • A leitura enriquece nossos conhecimentos, nos faz descobrir coisas novas. • A leitura nos mantém atualizados. • A leitura nos faz pensar. • A leitura nos faz apreender. Ler bem, escrever e falar bem também • 15 minutos por dia é uma boa média para o contato com livros e outros materiais de leitura, como jornais e páginas de sites. • Não se tem dúvidas que a leitura melhora o vocabulário, a escrita e a fala de quem lê. Eu nunca tive nenhum problema que uma hora de leitura não pudesse amenizar (MONTESQUIEU). Que tipo de leitura? Dependendo da relação que estabelecemos com o texto, podemos usar a leitura para fins meramente informativos, para nosso lazer e para nossos estudos. Banco de imagens É bom praticar, pelo menos, dois tipos de leitura: • Leitura diária individual de ESTUDO; • Leitura escolhida por prazer. Por exemplo, quando lemos um jornal, não o estamos estudando, certo? Sendo assim, nesse caso, embora atenta, nossa leitura pode ser mais despreocupada, apenas fixando certos elementos do que lemos, para debates cotidianos. No mais, o importante é você tentar ler com o mesmo interesse e entusiasmo os textos de lazer (como o best seller de ficção que você pode estar lendo) e os textos de estudo. Às vezes o aluno adorou ler “Fortaleza Digital” de Dan Brown (autor de “O Código Da Vinci) e conhece o livro em detalhes e, ao ler em um livro de Segurança da Informação, que fala de algoritmos e outros aspectos computacionais, não se interessa pelo tema. Ora, o livro de Dan Brown, ainda que ficcional, trata justamente de assuntos do profissional de computação. AH! Você não gosta de ler nada, seja para se informar, seja por lazer, seja para estudar? CUIDADO, pois se mantiver essa postura, certamente não ‘aguentará’ o ritmo do Curso. Comece a se interessar enquanto há tempo! 46 Universidade Metodista de São Paulo Banco de imagens Leitura concentrada: preparação • A leitura concentrada, ou seja, para estudo, é diferente da leitura comum, para diversão ou lazer. Como dissemos, estamos o tempo todo recebendo estímulos para serem lidos: lemos o tempo todo. • Entretanto, quando desejamos fazer uma leitura mais aprofundada, devemos nos preparar. Compreensão do contexto • Antes de ler um texto, procure compreender tudo o que está “ao redor” dele. • O autor do texto transmite sua mensagem de várias formas (gráficas p.ex.) e você deve ficar atento a elas. • Preste atenção ao título do texto (ou do livro, p. ex). Procure compreender o que o título significa. Veja se há trechos introdutórios em destaque. Uma notícia, por exemplo, traz sempre um pequeno resumo introdutório. Um livro traz informações nas capas e nas folhas internas. • É útil informar-se sobre o autor também. Não é a toa que usamos Sommerville ou Pressman, é?!? • Mantenha em relação ao texto uma postura investigativa, pesquisando mais sobre o autor e assunto. Isso com certeza lhe ajudará a compreender o contexto. Sumário de livro • Nunca “pule” o sumário de um livro. • O sumário apresenta muitas informações úteis, como os assuntos de cada capítulo/tópico e o desenvolvimento do assunto (a partir de temas/tópicos). • Consulte, quando houver, o índice remissivo. Trata-se de um índice que indica trechos e assuntos importantes tratados no livro. Por ele, você localiza com mais facilidade assuntos de seu interesse dentro do texto. • Ler os índices e o sumário é ponto de partida para compreender o conteúdo de um livro. • Um bom projeto de conteúdo de um TCC começa pelo projeto do sumário, ou seja da estrutura em capítulos/tópicos dos conteúdos que o trabalho pretende abordar. 47 www.metodista.br/ead Questionamento a partir da leitura • Elabore questões sobre o texto, como se conversasse com o autor. • Questione os sentidos, os trechos que não ficaram claros, as definições, enfim, tudo o que achar importante. • Anote essas questões e leve-as para a sala de aula ou para o fórum do SIGA. • Questione o professor. Tome uma posição • Todo esse processo de leitura não valerá nada se você não se posicionar a respeito do texto, do autor e de suas ideias. Não encare todo e qualquer texto cuja leitura lhe é solicitada como afirmações de algo que deve ser seguido, sem discutir. • Você não é obrigado a concordar com o texto. Mas também não deve discordar simplesmente: discuta, busque outros pontos de vista, leia outros autores que afirmam o contrário. • Normalmente, posicionar-se é mais interessante do que ler passivamente. Relacione • Todo texto é redigido num contexto. • Por isso, ele se relaciona, ele se conecta com outros textos, com outras ideias, com outros autores. • O texto indicado pelo professor de uma disciplina qualquer, pode, muito bem, auxiliá-lo a compreender outras disciplinas. • Desenvolva um pensamento em rede, criando conexões e abrindo “links” mentais entre o texto lido e outros conteúdos, inclusive de áreas do conhecimento distintas. Ampliação • A identificação das relações entre conteúdos na leitura pode levá-lo a novos conhecimentos que jamais você havia imaginado ter alguma relação com o assunto lido. • Isso permite uma compreensão maior da realidade. Uma ampliação. • Faça com que a leitura deixe de ser um “peso” e passe a ser efetivamente um instrumento para seu desenvolvimento pessoal e profissional. Amplie! Não basta ler por mera obrigação • A leitura otimizada deve ser atenta. • Se a compreensão não foi completa em uma primeira leitura, releia o texto e busque sanar as dúvidas que porventura permaneçam. 48 Universidade Metodista de São Paulo Não adianta nada ler apenas por obrigação. Por exemplo, o aluno tem uma prova no dia seguinte e vai ao livro e descobre que tem 60 páginas para ler, fica desesperado e passa a ler como um velocista corre em uma corrida de 100 metros rasos. Não vai dar certo. Para a leitura acrescentar algo em nossa vida, é preciso que seja uma leitura atenta. Devemos buscar qual a informação que o autor pretende nos transmitir e fixarmos nossa atenção nesse ponto. Uma sugestão é começar com uma leitura mais abrangente e proceder a uma segunda leitura mais cuidadosa, prestando atenção nos detalhes, sublinhando o texto e, preferencialmente, esboçando um resumo aliado ao lecionado em sala de aula. A concentração e a eficiência na leitura • Não adianta ler 500 páginas se não as leu com a devida concentração. Se estavas disperso no momento em que deveria esquecer todo o resto para se entregar ao texto, não terá aprendido nada. • A dica é: mergulhe no texto! Abaixo, palavras do Professor Ricardo Soares (in Douglas & Soares, 2006), que trata de leitura dinâmica: Em grande parte o tempo efetivamente gasto com a leitura é desperdiçado com divagações. Algumas são sugeridas pelo próprio material, outras resultantes de simples distrações ou em função do ambiente onde é realizada. Esta dificuldade em manter a atenção é causa de grandes problemas. É necessário que se desenvolva a concentração pelo emprego de meios capazes de fixar a atenção. Podemos dirigir facilmente a atenção para determinado assunto, porém só o interesse é capaz de mantê-la (...) Apreender Segundo o dicionário Aurélio: Apreender: apropriar-se; segurar, agarrar; assimilar mentalmente. • Apreender é saber usar os conteúdos a seu serviço, assimilados de forma a tê-los disponíveis sempre que necessitar. • Apreender é saber como, quando e por que você vai utilizar determinado conteúdo. Vocês já devem ter percebido a capacidade de retenção de informações que várias pessoas possuem, incluindo profissionais da área e professores. Isso não significa que sejam todos gênios, mas que praticam constantemente os mecanismos de apreensão da engenharia de software, o que causa efeito de conhecimento irrestrito. DESENVOLVENDO A CRIATIVIDADE Compreensão da criatividade Criatividade é o processo de desafiar as ideias estabelecidas e os procedimentos habituais a fim de encontrar soluções novas (BOULDEN, 2002). Uma pessoa criativa consegue ver as ideias ou questões em um contexto diferente, seja por identificar as potenciais possibilidades que existem em novas soluções, seja por conectar ideias dispersas para criar algo completamente novo. Todas as pessoas podem ser criativas, mas temos a tendência cultural a reproduzir o mesmo modo de fazer as coisas. 49 www.metodista.br/ead Raciocínio lógico e pensamento criativo • Lógica: pensamento convergente. • Comparação de situações com fatos similares anteriores. • Dificuldade: pouca experiência, poucas soluções potenciais para o problema ou a situação exige uma solução totalmente nova. Comportamento condicionado: a maioria das pessoas costuma ser criativa na vida pessoal, mas ousa menos no aspecto profissional. Fonte: Boulden (2002). 50 Universidade Metodista de São Paulo Identificando bloqueios Somos ensinados a agir de acordo com padrões de comportamento considerados “certos” ou “errados”. Esse condicionamento restringe o pensamento e impede o encontro de respostas novas. Os condicionamentos nos levam a pensar de modo predefinido e limitam nosso potencial. Para pensar de maneira criativa, é preciso abandonar os preconceitos e não aceitar os procedimentos consolidados só porque “sempre foram assim”. Fonte: Boulden (2002). Bloqueios mentais (VON OECH (1988) 1. “A resposta certa” 2. “Isso não tem lógica” 3. “Siga as normas” 4. “Seja prático” 5. “Evite ambiguidades” 6. “É proibido errar” 7. “Brincar é falta de seriedade” 8. “Isso não é da minha área” 9. “Não seja bobo” 10.“Eu não sou criativo” 51 www.metodista.br/ead Banco de imagens Identificando padrões • Para ser mais criativos, precisamos ter consciência de como costumamos reagir a situações ou problemas. • Não é fácil identificar um padrão geral para os processos de pensamento das pessoas, pois cada um tende a reagir de maneira diferente aos desafios. • Um executivo que se considera um profissional organizado, por exemplo, pode ser bastante bagunçado na vida pessoal. • Observe sua reação diante de cenários diversos para poder começar a mudar seu modo de pensar. • Tente identificar os fatores que obstruem seus impulsos criativos e verifique se sua rotina permite reservar tempo para pensar de maneira criativa. • Aprenda a superar seus processos habituais de pensamento e a tendência a se ater às soluções consagradas para poder encontrar saídas novas. • Pense numa solução tradicional para uma situação difícil e parta para uma abordagem diferente. • Entenda seus processos de pensamento para poder adaptá-los. Fonte: Boulden (2002) 52 Universidade Metodista de São Paulo A parte esquerda do cérebro processa a informação de maneira lógica, enquanto a direita se concentra em aspectos mais intuitivos e criativos. A maioria das pessoas tende a ter mais influência de um dos hemisférios e a adotar um estilo de pensamento específico, mas há quem combine os dois modos. A predominância do lado direito geralmente resulta em uma maior criatividade, o que não significa que quem tem o lado esquerdo mais atuante não possa ser criativo. Criatividade e o tempo • Um grande obstáculo para o pensamento criativo é a tendência a procurar a solução mais rápida. Apesar de útil no momento, a tática não funciona a longo prazo. Avalie o modo como aproveita seu tempo e reserve espaço para a criatividade. Acreditar na mudança • O “fora do comum em relação ao padrão estabelecido” muitas vezes guarda uma solução criativa. • Coragem para mostrar suas ideias e propor coisas novas. • Mas também saiba ouvir as ideias dos outros com a mente aberta. Como estimular o pensamento criativo • Atividades físicas • Representação • Linguagem corporal “Brincar é falta de seriedade”: o momento da concepção Em que tipo de atividade e situação surge suas ideias? • “Quando me defronto com um problema”. • “Quando as coisas se quebram e eu tenho de consertá-las”. • “Quando há uma necessidade que precisa ser satisfeita”. • “Quando o prazo está se esgotando... Essa é a inspiração final”. 53 www.metodista.br/ead Mas... Tem pessoas que respondem com frases do tipo: • “Quando só estou me distraindo”. • “Quando estou fazendo alguma coisa não relacionada ao problema”. • “Quando estou brincando com o problema”. • “Quando não estou me levando muito a sério”. • “Depois da segunda cerveja”. Portanto, a necessidade pode ser a mãe da invenção, mas o divertimento é certamente o pai dela. Muito provavelmente, você produz quase todas as suas ideias quando está brincando em seu playground mental. Brincar é falta de seriedade?!?!? • Um arquiteto de computadores, amigo de Von Oech, diz: “Brincar é o que faço para ganhar a vida; o trabalho só entra quando preciso organizar os resultados da brincadeira”. Ele sabe que existem dois lados no processo criativo. O lado divertido possibilita que ele experimente várias abordagens (algumas tradicionais, algumas fantasiosas e outras loucas, talvez) para saber o que funciona e o que não funciona e usar esse conhecimento para gerar novas ideias. O lado do trabalho permite que ele se aproprie do que aprendeu, avalie, fundamente suas descobertas com os conhecimentos existentes e dê a elas uma forma utilizável (apreender). • O presidente de uma empresa de microprocessadores disse a Von Oech que a disposição para brincar é uma de suas chaves para o sucesso. “Quando contratamos alguém, não atentamos só para a inteligência ou a eficiência da pessoa. Para nós, as características importantes são o espiríto brincalhão e o pique. Com tais características, as pessoas são entusiásticas – e são essas que produzem novas ideias”. • E Von Oech acrescenta: a palavra “entusiasmo” vem do grego enthousiasmos, que significa “o deus dentro de você”. Pessoas entusiásticas parecem ter acesso a um espírito que serve de fonte de inspiração para elas. • E eu, Creps, acrescento que pessoas entusiásticas têm o humor como seu companheiro no dia a dia. “Isso não é da minha área” Uma técnica de laboratório que trabalha com energia solar está com problemas. O laboratório onde ela trabalha vem testando um novo material para células solares – o arseniato de gálio. Esse material é que é o problema, pois, na fase de produção da célula, precisa ser cortado em fatias finas. A tarefa da moça é fazer cortes absolutamente precisos no material com uma serra especial de alta rotação. Sempre que ela corta, o material se rompe. Ela tenta de novo, mudando a posição da serra. O material continua se quebrando. Ela fica frustrada. Em casa, naquele fim de semana, ela fica na oficina vendo o marido construir um armário. Observa que, quando ele quer fazer cortes precisos em certos tipos de madeira, reduz (em vez de aumentar) a velocidade de corte da serra. A ideia lhe surge imediatamente: por que não fazer a mesma coisa com o arseniato de gálio? Ela experimenta – e funciona. Um artigo abordava um dispositivo anticoncepcional desenvolvido por um ginecologista em colaboração com um dentista. Combinação inusitada! A presença do ginecologista é natural – afinal, 54 Universidade Metodista de São Paulo quem é mais especializado em anatomia feminina? Mas e o dentista? Acontece que o dentista trabalha o tempo todo com formas, contornos e moldes. Só que, normalmente, esse tipo de conhecimento é mantido longe dos ginecologistas (VON OECH, 1988). Seja um caçador de ideias • Faça cursos de arte, incluindo música. • Viaje para lugares novos e diferentes. • Estude história. • Leia. Principalmente ficção e quadrinhos, além de revistas como “Superinteressante” e “Veja”. • Estude assuntos diversos em “nível primário” (“para dummies”). • Assista a programas de TV como “Globo Ciência”, “Globo Ecologia” e os canais “Discovery”. • Pratique esportes ou atividades físicas. • Conviva com pessoas de culturas, valores e religiões diferentes. Observe o que é importante para os outros. Isso nos dá a perspectiva do que importante para nós. • E no trabalho, procure aprender um pouco sobre todas as áreas da empresa. Afinal, qualquer uma delas pode ser sua cliente (usuária). “Eu não sou criativo” Há alguns anos, uma importante companhia de petróleo estava preocupada com a falta de produtividade criativa de alguns funcionários do Departamento de Pesquisa e Desenvolvimento. Para enfrentar o problema, a direção da empresa contratou uma equipe de psicólogos, que ficou encarregada de descobrir o que distinguia o pessoal criativo dos outros, menos criativos. Esperavase que as descobertas pudessem ser úteis no sentido de estimular o pessoal menos criativo. Os psicólogos submeteram os cientistas-pesquisadores a diversas baterias de perguntas, que iam de seus antecedentes escolares ao lugar onde tinham sido criados ou à cor de que mais gostavam. Depois de três meses de estudos, descobriram que a principal diferença entre os dois grupos era: As pessoas criativas se achavam criativas, enquanto as do grupo menos criativo achavam que não eram criativas. Consequentemente, quem se achava criativo, se sentia livre para entrar em estado germinativo e brincar com seus conhecimentos. Já o pessoal que dizia “eu não sou criativo”, ou era prático demais ou tinha um pensamento excessivamente rotinizado (VON OECH, 1988). • Gente que diz “eu não sou criativo, se reprime, porque pensa que criatividade é algo exclusivo de figuras como Beethoven, Einstein e Shakespeare. • Mas a verdade é que eles não tiveram suas grandes ideias sem mais nem menos. Pelo contrário, a maioria das grandes ideias deles veio da atenção que deram a ideias medianamente importantes e o fato de terem jogado com elas, fazendo com que se tornassem grandes ideias. • Uma importante diferença entre pessoas criativas e menos criativas é que as primeiras prestam atenção às suas menores ideias. Essas pessoas sabem que uma pequena ideia pode resultar em uma grande descoberta e acreditam que são capazes de fazer isso acontecer. 55 www.metodista.br/ead Para finalizar... • Para Von Oech (1988), o pensamento criativo supõe uma atitude, uma perspectiva, que leva a procurar ideias, a manipular o conhecimento e a experiência. • Ainda segundo Von Oech, se quiser ser mais criativo, acredite no valor de suas ideias e tenha persistência para continuar construindo a partir delas, embora você vá correr mais riscos e eventualmente violar algumas normas . • Ser criativo é tentar novas formas de fazer alguma coisa. Não importa se são ideias que inicialmente se apresentem malucas, desde que tenham sobre si o peso da diferença e da inovação. • Acredite-se criativo. Use seu senso de humor, brinque. • Jamais pense ou diga “eu não sou criativo”. Referências BOULDEN, George P. Como desenvolver a criatividade. São Paulo: Publifolha, 2007. VON OECH, Roger. Um Toc na Cuca. São Paulo: Livraria Cultura Editora, 1988. DOUGLAS, William; SOARES, Ricardo. Leitura Dinâmica: como multiplicar a velocidade, a compreensão e a retenção da leitura. Rio de Janeiro: Campus, 2006. 56 Universidade Metodista de São Paulo Epistemologia e Processos de Aprendizagem Administração do tempo, epistemologia e processos de aprendizagem Prof. Me. Ricardo Crepalde Objetivos: Entender as vantagens da organização do tempo e como planejá-lo de forma a ajudá-lo nas suas atividades diárias com as horas necessárias para o estudo no semestre. Capacitar os alunos no entendimento e uso de mecanismos para a efetiva compreensão de conhecimentos adquiridos. Palavras chave: Tempo; planejamento; aprendizagem; sucesso profissional. www.metodista.br/ead Módulo Tempo... tempo... Banco de imagens Como aproveitar o tempo, que nos parece sempre pouco e corrido? Vantagens em organizar o tempo Há muitas vantagens em organizar seu tempo antes de começar a estudar. Veja algumas: • Com o tempo organizado, você se concentra mais na sua atividade: saber o que vai fazer num determinado espaço de tempo ajuda-nos a não desviar a atenção. Banco de imagens • Se você organizar sempre seu tempo de estudo, vai acabar criando um hábito: criar hábitos é uma forma de tornar o trabalho mais rentável e ajuda a aproveitar ainda mais o tempo. • Ao organizar nosso tempo, priorizamos as atividades a serem feitas: com isso, ganhamos mais tempo, pois fazemos primeiro as atividades mais urgentes e deixamos as demais para um momento mais apropriado. • Criando uma agenda, tornamo-nos mais disciplinados: a disciplina nos torna mais confiantes, pois nos sentimos agentes do processo, ou seja, sabemos que somos capazes de fazer aquilo que nos propusemos a fazer. • Organizando nosso tempo, evitamos desperdício de esforço: muitas vezes, desperdiçamos energia em tarefas que poderiam muito bem serem feitas em outros momentos e de outras Dificuldades e obstáculos... Temperamento: Algumas pessoas não gostam de controles sobre seu trabalho... Sentem-se tolhidos em sua liberdade, na sua forma de atuar. Gostam de realizar suas tarefas apenas quando têm vontade... Outras, apesar de tentarem se organizar, não conseguem. Tudo isso varia de acordo com seu temperamento. Mas é necessário tentar... Comece a organizarse aos poucos e tente manter-se fiel ao seu planejamento. Você verá que, apesar de difícil, esse esforço lhe trará muitas vantagens! Desvalorização da rotina: no nosso tempo, a rotina é considerada um problema. Todos dizem “Saia da rotina”. E eu estou propondo exatamente que você crie uma rotina... Mas, perceba que o fato de não ter rotina nos deixa cansados, com a sensação de improdutividade (começamos muitas coisas, mas não concluímos nada...), estressados por ter que dar conta de tantas coisas por fazer... Criar uma rotina nos auxilia a sentir que estamos, mesmo que aos poucos, resolvendo cada um dos problemas... 58 Universidade Metodista de São Paulo Indisciplina: Sejamos sinceros: é difícil manter a disciplina! Afinal, há tantos estímulos: baladas, encontros, passeios, compras, cinema, TV, esportes... Organizar uma agenda de estudo no meio disso tudo é muito complicado... Mas reflita: “Disciplina é liberdade... Ter vontade é ter coragem...” (Trechos da música Há tempos do Legião Urbana – na verdade, são citações de religiões orientais). Muitos de nós estamos acostumados a compreender a disciplina como controle externo sobre nós. Veja a disciplina como instrumento para liberdade: através da disciplina pessoal atingimos nossas metas. Pessoas disciplinadas são mais donas de sua própria vontade do que as que não têm disciplina nenhuma. Força de vontade... Estabeleça metas e lute por elas... Use seu temperamento a seu favor. Esforce-se para montar a organização temporal para seus estudos, que iremos propor a seguir. O que será proposto pode parecer difícil! Mas procure adaptar às suas possibilidades e necessidades! Planejamento... Faculdade é plano de longo prazo, que exige planejamento de longo prazo. Este planejamento se constitui de objetivos e metas (subobjetivos temporais). Como você usa o seu tempo? Antes de planejar seu tempo de estudo, faça um levantamento sobre seu tempo em geral. Como você distribui seu tempo? Faça uma lista de todos os seus afazeres durante o dia: que hora você acorda? Quanto tempo tem para o café? Quanto tempo gasta em transporte? Como é seu dia fora de casa? Quanto tempo tem de almoço? De jantar? O que faz à noite? Que hora se diverte? Que hora namora? Que hora vai dormir? Acrescente nessa lista todos os afazeres que, de alguma forma, tomam uma parte do seu tempo. Mesmo que sejam apenas minutos. Distribuição do tempo Faça uma lista como a do modelo abaixo: 7:00 – Acordar 13:00 – Voltar do almoço 7:15 – Banho 17:30 – Sair do trabalho 7:30 – Café 17:35 – Tomar o ônibus 7:45 – Sair de casa 18:00 – Chegar na Universidade 7:50 – Tomar o ônibus 18:15 – Tomar um lanche 8:30 – Chegar no trabalho 12:00 – Almoçar 18:45 – Ler e-mails, navegar na internet ou encontrar os colegas 19:30 – Início das aulas, etc. Em quantos anos... você pretende concluir 59 www.metodista.br/ead seu curso superior? Comece seu planejamento por aí: a) Quantos anos têm seu curso? b) É um curso semestral? c) Quantos semestres faltam? d) Se você tem estágios a fazer, em que semestre vai começar? e) Você fará um Trabalho de Conclusão de Curso? Em que semestre você poderá iniciá-lo? Quanto tempo... você vai disponibilizar para seu curso? Se você pensou bem sobre as perguntas do slide anterior, já percebeu algo muito importante: Banco de imagens Fazer um curso superior não é apenas frequentar as aulas! Muito mais tempo, além das aulas, será necessário para dar conta das atividades propostas pelo curso. Planejamento a longo prazo Para fazer um curso superior, você deverá fazer um planejamento a longo prazo. É muito importante que você encontre tempo na sua rotina diária para fazer esse curso. Analise a lista de suas atividades, veja como seu tempo está distribuído e determine o tempo que você vai dispor para seu curso. Os planos que apresentamos a seguir indicam – aproximadamente – de quanto tempo você vai precisar... Analise-os com calma. 60 Universidade Metodista de São Paulo Como usar o plano global Veja que o plano sugerido apresenta horas em totais semanais. Com exceção das aulas – cujo horário é determinado pela faculdade – as demais atividades, inclusive as aulas virtuais, de disciplinas e módulos semipresenciais, podem ser distribuídas por você mesmo, ao longo da semana. Nesse caso, você pode “alocar” essas aulas nas horas de estudo semanal. Dessa maneira, você deve agora juntar as suas atividades diárias com as horas necessárias para estudo no seu semestre. E o domingo?!? Lógico que esta tabela é só um exemplo, uma sugestão de como você pode aproveitar melhor seu tempo, inclusive com momentos de estudo e pesquisa. Você pode distribuir da forma que quiser ou lhe for mais conveniente. O importante é que você encontre tempo para distribuir todas as horas necessárias. Mesmo que, eventualmente, tenha que usar o domingo. Ou acordar mais cedo. Ou dormir mais tarde... Mas tente descansar no domingo. O corpo e a mente. Agenda ajuda... • Acostume-se a usar uma agenda. • Anote na agenda todos os seus afazeres. As leituras necessárias, os trabalhos e as avaliações. • Depois, de acordo com seu planejamento anterior, agende os horários em que você cumprirá seus compromissos de estudo. • Habitue-se a utilizar a agenda como planejamento, não apenas como memória: agende os compromissos de acordo com sua disponibilidade. 61 www.metodista.br/ead É preciso esforçar-se... • Com certeza não é fácil... • Mas é preciso organizar o tempo não apenas para estudar, mas para ter tempo para você. Para hobbies e projetos pessoais, bem como diversão e descanso. • Se não sabe por onde começar, faça listas de tarefas que deve realizar: profissionais, acadêmicas e até mesmo pessoais, como ligar para um amigo. Dê prazos (quando vai fazer) para essas tarefas. Planeje-as no seu dia a dia. EPISTEMOLOGIA E PROCESSO DE APRENDIZAGEM Por quê? • Capacitar os alunos no entendimento e uso de mecanismos para a efetiva compreensão de conhecimentos adquiridos. • Facilitar a incorporação de conceitos diversos, otimizando a obtenção de resultados satisfatórios no processo de aprendizagem, para as vidas acadêmica, profissional e cidadã. • Fornecer as ferramentas necessárias para compreenderem as ciências que pretendem estudar, para que possam se dedicar a elas e delas tirar o maior proveito possível. • Não basta apenas estudar, tem que saber o quê estudar e como tirar maior proveito dos estudos. Se “der branco” em alguma prova, reflita se você realmente pôs em prática as nossas aulas. Epistemologia é o estudo do grau de certeza do conhecimento científico em seus diversos ramos, especialmente para apreciar seu valor para o espírito humano (Dicionário Escolar da Língua Portuguesa, de Francisco da Silveira Bueno). Portanto, temos que epistemologia é o estudo sobre o conhecimento científico, ou seja, o estudo dos mecanismos que permitem o conhecimento de determinada ciência. • Filosofia: o que é o conhecimento? • Teoria do conhecimento: O que é conhecer? O que podemos conhecer? Como podemos conhecer? O que nos motiva a conhecer? • Teoria das ciências • Espisteme, em grego, quer dizer ciência. SUCESSO E FELICIDADE 62 Universidade Metodista de São Paulo Uma reflexão sobre nossas vidas e conquistas. Buscas... • Busca do sucesso ou busca da felicidade? • Como desfrutar o sucesso. • Como utilizar o sucesso para se tornar um agente transformador da sociedade. Busca do sucesso ou busca da felicidade? De acordo com Sócrates, é apenas por engano que as pessoas pensam que está nos bens materiais a chave do sucesso; a felicidade é um estado de alma, que nem sempre se relaciona a sucesso profissional. Sucesso profissional = felicidade?!? São comuns as pessoas que apresentam um enorme êxito profissional (e financeiro...), mas que vivem estressadas e mal humoradas. Muitas vezes, infelizes de fato... O que falta a essas pessoas?!? Para o alto e avante! Banco de imagens 1. Vocação inteligências múltiplas. 2. Quando começamos em uma profissão há o fator novidade, que nos traz estímulo... 3. Mas a ‘novidade’ logo se torna ‘notícia velha’ e é nesse momento que você tem que reunir condições psicológicas que te permitam seguir adiante em seu propósito. 63 www.metodista.br/ead Ouro de tolo Raul Seixas Eu devia estar contente Porque eu tenho um emprego Sou um dito cidadão respeitável E ganho quatro mil cruzeiros por mês Eu devia agradecer ao Senhor Por ter tido sucesso na vida como artista Eu devia estar feliz Porque consegui comprar um Corcel 73 Eu devia estar alegre e satisfeito Por morar em Ipanema Depois de ter passado fome por dois anos Aqui na Cidade Maravilhosa Ah! Eu devia estar sorrindo e orgulhoso Por ter finalmente vencido na vida Mas eu acho isso uma grande piada E um tanto quanto perigosa Eu devia estar contente Por ter conseguido tudo o que eu quis Mas confesso abestalhado Que eu estou decepcionado Porque foi tão fácil conseguir E agora eu me pergunto “e daí?” Eu tenho uma porção de coisas grandes Pra conquistar, e eu não posso ficar aí parado Eu devia estar feliz pelo Senhor Ter me concedido o domingo Pra ir com a família ao Jardim Zoológico Dar pipoca aos macacos Ah! Mas que sujeito chato sou eu Que não acha nada engraçado Macaco, praia, carro, jornal, tobogã Eu acho tudo isso um saco É você olhar no espelho Se sentir um grandessíssimo idiota Saber que é humano, ridículo, limitado Que só usa dez por cento de sua cabeça animal 64 Universidade Metodista de São Paulo E você ainda acredita que é um doutor, padre ou policial Que está contribuindo com sua parte Para o nosso belo quadro social Eu que não me sento No trono de um apartamento Com a boca escancarada cheia de dentes Esperando a morte chegar Porque longe das cercas embandeiradas que separam quintais No cume calmo do meu olho que vê Assenta a sombra sonora de um disco voador Ah! Eu que não me sento No trono de um apartamento Com a boca escancarada cheia de dentes Esperando a morte chegar Porque longe das cercas embandeiradas que separam quintais No cume calmo do meu olho que vê Assenta a sombra sonora de um disco voador O que está faltando para a personagem dessa música? • Aptidão para desfrutar do sucesso material que conquistou, pois não é feliz. • Tome a letra da canção como exemplo de como você não deve agir: seu objetivo só é bom se te deixar ‘para cima’, feliz com o que faz. Banco de imagens Caminho longo: até o fim da vida • Busque a felicidade na família e na vida em sociedade. • Não viva apenas de glórias passadas. O mundo é dinâmico demais para ficarmos presos ao passado. Sempre haverá algo, mesmo na mais avançada velhice, por mais simples que seja, que os fará felizes. O sucesso pode vir indiretamente, por poucas palavras, ensinamentos ou experiências que você passou a alguém, levando esse alguém a alguma conquista. Torne-se um agente transformador Banco de imagens • Palavra-chave: cidadania. • Seus conhecimentos, sua formação, seus talentos e principalmente sua disposição e fé em um mundo melhor a serviço da sociedade. • Exemplo: docência. Sucesso, tempo e felicidade Dica: assista o filme abaixo! Banco de imagens 65 www.metodista.br/ead _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ __________________________________________ __________________________________________ 66 Universidade Metodista de São Paulo Epistemologia e Processos de Aprendizagem O texto narrativo / a construção de parágrafos Prof. Me. Silvio Pereira da Silva Objetivos: Estudar a estrutura do parágrafo e o modo adequado de construí-lo. Compreender o conceito de narrativa e os seus elementos estruturais. Palavras-chave: narrativa; teorias; elementos estruturais; parágrafo; organização textual www.metodista.br/ead Módulo Teorizando a narrativa De acordo com Carlos Ceia, o termo narrar tem sua origem em duas expressões do Sânscrito gnärus (saber, ter conhecimento de algo) e narro (contar, relatar) e que chegou até as línguas modernas, vindo do Latim. De modo que se pode concluir que narrar é recriar com palavras as experiências da vida, inventar e reinventar a existência; utilizar-se da palavra para relatar fatos e aspectos de um acontecimento, de um encontro, de uma reunião etc. A narrativa surge da imbricação de dois componentes: uma história e o discurso. A história será o conteúdo do ato narrativo, ou seja, o seu significado, enquanto o discurso será o seu significante, sua representação que é realizada através da linguagem, é o que possibilita a história ser conhecida. A narrativa é, pois, desse modo, junção entre a história e o discurso narrativo. O ser humano vivencia inúmeros acontecimentos e a tendência do Homem é reviver esses acontecimentos através da linguagem e do ato de narrar. São fundamentais alguns elementos estruturais para a construção de uma narrativa: o enredo ou a trama - fatos que ocorrem durante a narrativa, que são distribuídos em introdução, na qual o autor apresenta a ideia principal, os personagens e o cenário; desenvolvimento, que pode se subdividido em complicação (início dos conflitos entre os personagens) e clímax (ponto culminante), por último há o um desfecho ou conclusão. tempo e espaço - toda história se desenvolve em um local determinado, um ambiente, e durante certo tempo, que pode ser cronológico, marcado pelo relógio, ou psicológico quando se refere à vivência dos personagens, ao seu mundo interior. Os personagens - são os seres que vivenciam ou tem relação direta com os fatos que formam o enredo da história. Na maior parte das narrativas, os personagens são pessoas, mas animais, seres inanimados, criaturas fantásticas e imaginárias também são personificados. o narrador – é o responsável por contar a história, é ele quem relata os fatos presentes no enredo. O narrador pode assumir duas posições: narrador em terceira pessoa, quando quem narra não participa da história, assume uma postura de observação ou onisciência em relação aos personagens e aos fatos narrados; ou narrador em primeira pessoa, quando quem conta a história é um personagem, este tipo de narrador apresenta uma posição mais limitada e parcial dos fatos narrados. Em uma narrativa, tanto pode se narrar fatos reais, que é o relato de ações praticadas pelos seres humanos, estão nos jornais, nos livros de História etc, como se pode narrar fatos fictícios. Neste último caso, o fato pode ser totalmente inventado, sem relação direta com acontecimentos reais, ou até baseado na realidade, porém enriquecido pela imaginação de quem relata. Um exemplo de narrativa é o trecho do livro, O Homem que calculava, de Malba Tahan: Encontramos, perto de um antigo abrigo de caravanas meio abandonado, três homens que discutiam acaloradamente ao pé de um lote de camelos. (...) O inteligente Beremiz procurou informar-se do que se tratava. Somos irmãos – esclareceu o mais velho – e recebemos, como herança, esses 35 camelos. Segundo a vontade expressa de meu pai, devo receber a metade, o meu irmão Hamed Namir 68 Universidade Metodista de São Paulo uma terça parte e ao Harim, o mais moço, deve tocar apenas a nona parte. Não sabemos, porém, como dividir dessa forma 35 camelos, e a cada partilha proposta segue-se a recusa dos outros dois, pois a metade de 35 é 17 e meio. Como fazer a partilha, se a terça parte e a nona parte de 35 também não são exatas? – É muito simples - atalhou o Homem que Calculava. – Encarrego-me de fazer, com justiça, essa divisão, se permitirem que eu junte aos 35 camelos da herança este belo animal que, em boa hora, aqui nos trouxe! (...) – Deverias receber, meu amigo, a metade de 35, isto é 17 e meio. Receberás a metade de 36 e, portanto, 18. Nada tens a reclamar, pois é claro que saíste lucrando com esta divisão! E, dirigindo-se ao segundo herdeiro, continuou: – E tu, Hamed Namir, deverias receber um terço de 35, isto é, 11 e pouco. Vais receber um terço de 36, isto é, 12. Não poderás protestar, pois tu saístes com visível lucro na transação. E disse, por fim, ao mais moço: – E tu, Harim Namir, segundo a vontade de teu pai, deverias receber uma nona parte de 35, isto é, 3 e tanto. Vais receber uma nona parte de 36, isto é 4. O teu lucro foi igualmente notável. Só tens a agradecer-me pelo resultado. E concluiu com a maior segurança e serenidade: – Pela vantajosa divisão feita entre os irmãos Namir, partilha em que todos os três saíram lucrando, couberam 18 camelos ao primeiro, 12 ao segundo e 4 ao terceiro, o que dá um resultado de 34 camelos. Dos 36 camelos, sobram, portanto, 2. Um pertence, como sabem, ao Bagdali, meu amigo e companheiro, outro toca por direito a mim, por ter resolvido, a contento de todos, o complicado problema da herança. – Sois inteligente, ó estrangeiro! - exclamou o mais velho dos três irmãos. Aceitamos a vossa partilha na certeza de que foi feita com justiça! (TAHAN, 1997, p.11) A construção o parágrafo Geralmente, os textos em prosa são estruturados em unidades menores às quais se dá o nome de parágrafos. Por isso, considera-se o parágrafo uma unidade de composição fundamental no processo de estruturação de um texto. Tanto varia a sua estrutura como a sua extensão, pois esses apresentam tamanho variado, há parágrafos com poucas linhas e outros que pegam quase uma página. Não é o senso de proporção que deve servir de critério para a divisão de um parágrafo, na verdade, o que vai determinar sua extensão é a ideia central, que serve de núcleo de organização, já que cada ideia exposta no texto deve corresponder a um parágrafo. Veja a definição de parágrafo fornecida por Othon M. Garcia: O parágrafo é uma unidade de composição, constituída por um ou mais de um período em que se desenvolve determinada ideia central, ou nuclear, a que se agregam outras, secundárias, intimamente relacionadas pelo sentido e logicamente decorrentes dela. (GARCIA, 2006, p. 203). O professor Othon define o parágrafo-padrão, em virtude de essa estrutura ser frequente em diversos textos, principalmente, os de natureza dissertativa. De modo que pode ser considerado um modelo a ser seguido, facilitando o processo de construção textual. Cabe salientar que como há muitos processos de encadeamento de ideias, há também outras possibilidades de construção de parágrafos. 69 www.metodista.br/ead O parágrafo-padrão apresenta uma introdução, denominada tópico frasal, formada por um ou dois períodos curtos, que expressam, de maneira breve, a ideia nuclear do parágrafo, definindo seu objetivo. Depois, tem-se o desenvolvimento, no qual ocorre a explanação das ideias apresentadas no tópico frasal. Há diversos processos e recursos para ampliar a ideia central, como, por exemplo, a enumeração, comparações, definições, testemunhos etc. Por último, em alguns parágrafos, há a conclusão, com a retomada da ideia central, relacionada ao que foi exposto no desenvolvimento. O parágrafo facilita a seleção e a organização adequada das ideias no momento de construção de um texto. Na organização de um texto, é fundamental saber construir bem as frases, os períodos e os parágrafos, interligando adequadamente os assuntos, pensando sempre nas qualidades principais que o texto deve apresentar: correção, clareza, concisão e coerência. Referências AMARAL, Emília; SEVERINO, António; PATROCÍNIO, Mauro Ferreira do. Novo Manual da Nova Cultural-Redação, Gramática, Literatura e Interpretação de texto. São Paulo: Nova Cultural, 1991. BECHARA, Evanildo. Moderna gramática portuguesa. 37 ed. Rio de Janeiro: Lucerna, 2004. CALANZANI, José João. Manual prático de língua portuguesa. 2 ed. Belo horizonte: Del Rey, 2003. CEIA, Carlos. Dicionário de termos literários. Disponível em <http://www.edtl.com.pt/> Acesso em 12/12/2011. FIORIN, José Luiz, SAVIOLLI, Francisco Platão. Lições de texto: leitura e redação. São Paulo: Ática, 1997. GARCIA, Othon M. Comunicação em prosa moderna. 26 ed. Rio de janeiro: Fundação Getúlio Vargas, 2006. KOCH, Ingedore G. Villaça. Coesão textual. 21 ed. São Paulo: Contexto, 2008. TAHAN. M. O Homem que calculava. 45ª ed. Rio de Janeiro: Record, 1997. 70 Universidade Metodista de São Paulo Epistemologia e Processos de Aprendizagem Conceitos e Noções Gerais de Dissertação Prof. Me. Silvio Pereira da Silva Objetivos: Estudar as noções básicas de dissertação e seus tipos; Compreender o modo correto de se produzir uma dissertação argumentativa. Palavras-chave: dissertação; teorias; argumentação; ponto de vista; construção textual. www.metodista.br/ead Módulo Dissertação: Teorias e definições De modo geral, costuma-se definir a dissertação como um texto de cunho reflexivoteórico, que apresenta uma ordem clara e coerente de ideias sobre um determinado tema. Dissertar é debater, discutir e questionar sobre determinado assunto, expressando um ponto de vista e apresentando argumentos que fundamentem a posição do autor. Há mais de uma possibilidade de construção de um texto dissertativo. Pode-se escrever um texto mais expositivo ou mais argumentativo, com um ponto de vista mais pessoal ou impessoal. Na dissertação expositiva, apresenta-se uma ideia e expõe o que se pensa sobre o tema ou assunto. Geralmente, faz-se a amplificação da ideia central, demonstrando sua natureza, antecedentes, causas e consequências. Na dissertação expositiva, podemos explanar sem combater ideias de que discordamos. Na dissertação argumentativa, busca-se provar a veracidade ou falsidade de ideias, procurando convencer o leitor ou ouvinte, através de argumentos, de provas evidentes, de testemunhas etc. Na dissertação argumentativa, além disso, tenta-se, explicitamente, formar a opinião do leitor ou ouvinte, procurando persuadi-lo a mudar de ideia. A dissertação argumentativa começa com a proposição clara e sucinta da ideia que irá ser comprovada, a tese. A segunda parte visa à apresentação dos argumentos que comprovem a tese, ou seja, a prova. É costume estruturar a argumentação em ordem crescente de importância, a fim de prender cada vez mais a atenção do leitor às razões apresentadas. Essas razões baseiam-se em provas demonstráveis através de fatos, exemplos, dados estatísticos e testemunhos. De acordo com a postura do autor, um texto pode ser objetivo, quando o tratamento dado ao texto é impessoal, com exposição ou argumentação lógica; ou subjetivo se apresentar uma postura mais pessoal, dirigindo-se não só à inteligência, mas também aos sentimentos de quem se pretende convencer. Para melhor compreender o que é uma dissertação argumentativa, é fundamental entender o conceito de argumento. Esse é uma linha de raciocínio utilizada em um debate para defesa de um ponto de vista. O argumento é o elemento básico para a fundamentação de uma teoria. Muitas vezes, o argumento exprime com frequência o conceito geral de prova, assumindo ainda o sentido de meio em que reside toda a força da defesa de uma ideia ou teoria. Para a argumentação ser eficaz, os argumentos devem ter consistência de raciocínio e de provas. O raciocínio consistente é aquele que se apoia nos princípios da lógica, que não se perde em especulações vãs, na discussão estéril. As provas, por sua vez, servem para reforçar os argumentos. Como fazer uma dissertação argumentativa Como fazer uma dissertação? Como expor com clareza um ponto de vista? Como argumentar coerentemente e validamente? Como organizar a estrutura lógica de um texto, com introdução, desenvolvimento e conclusão? Alguns passos podem ser seguidos para a elaboração de uma dissertação argumentativa: transforme o tema em uma pergunta; procure responder essa pergunta, de um modo simples e claro, concordando ou discordando. Essa resposta é o seu ponto de vista; pergunte a você mesmo, o porquê de sua resposta, uma causa, um motivo, uma razão para justificar sua posição; aí estará o seu argumento principal; procure descobrir outros motivos que ajudem a defender o seu ponto de vista, a fundamentar sua posição. Esses serão argumentos auxiliares; 72 Universidade Metodista de São Paulo encontre algum fato que sirva de exemplo para reforçar a sua posição. Este fato-exemplo pode vir de sua memória visual, das coisas que você ouviu, do que você leu. Pode ser um fato da vida política, econômica, social. Pode ser um fato histórico. Ele precisa ser bastante expressivo e coerente com o seu ponto de vista. O fato-exemplo, geralmente, dá força e clareza à nossa argumentação, também esclarece a nossa opinião e fortalece os nossos argumentos; a partir desses elementos, procure juntá-los em um texto, que é o rascunho de sua redação. O autor de um texto dissertativo-argumentativo deve, inicialmente, apresentar o tema que irá desenvolver ao mesmo tempo em que faz sua delimitação; depois, deve fazer a exposição dos argumentos, das provas, dos julgamentos, enfim, o exame crítico do tema abordado. É a parte mais importante e consistente do texto. Na parte final, o produtor deve retomar as ideias genéricas sobre o tema desenvolvido, assumindo uma posição diante de um problema e apresentando possíveis soluções. Exemplo de um texto dissertativo. Leia o texto: Aquilo por que vivi Três paixões, simples, mas irresistivelmente fortes, governaram-me a vida: o anseio de amor, a busca do conhecimento e a dolorosa piedade pelo sofrimento da humanidade. Tais paixões, como grandes vendavais, impeliram-me para aqui e acolá, em curso, instável, por sobre o profundo oceano de angústia, chegando às raias do desespero. Busquei, primeiro, o amor, porque ele produz êxtase – um êxtase tão grande que, não raro, eu sacrificava todo o resto da minha vida por umas poucas horas dessa alegria. Ambicionava-o, ainda, porque o amor nos liberta da solidão – essa solidão terrível através da qual nossa trêmula percepção observa, além dos limites do mundo, esse abismo frio e exânime. Busquei-o, finalmente, porque vi na união do amor, em uma miniatura mística, algo que prefigurava a visão que os santos e os poetas imaginavam. Eis o que busquei e, embora isso possa parecer demasiado bom para a vida humana, foi isso que – afinal – encontrei. Com paixão igual, busquei o conhecimento. Eu queria compreender o coração dos homens. Gostaria de saber por que cintilam as estrelas. E procurei apreender a força pitagórica pela qual o número permanece acima do fluxo dos acontecimentos. Um pouco disto, mas não muito, eu o consegui. Amor e conhecimento, até ao ponto em que são possíveis, conduzem para o alto, rumo ao céu. Mas a piedade sempre me trazia de volta à terra. Ecos de gritos de dor ecoavam em meu coração. Crianças famintas, vítimas torturadas por opressores, velhos desvalidos a construir um fardo para seus filhos, e todo o mundo de solidão, pobreza e sofrimentos, convertem em uma irrisão o que deveria ser a vida humana. Anseio por avaliar o mal, mas não posso, e também sofro. Eis o que tem sido a minha vida. Tenho-a considerado digna de ser vivida e, de bom grado, tornaria a vivê-la, se me fosse dada tal oportunidade. (Bertrand Russel, Autobiografia. Rio de Janeiro, Civilização Brasileira, 1967.) 73 www.metodista.br/ead Referências AMARAL, Emília; SEVERINO, António; PATROCÍNIO, Mauro Ferreira do. Novo Manual da Nova Cultural-Redação, Gramática, Literatura e Interpretação de texto. São Paulo: Nova Cultural, 1991. BECHARA, Evanildo. Moderna gramática portuguesa. 37 ed. Rio de Janeiro: Lucerna, 2004. FIORIN, José Luiz. Linguagem e ideologia. São Paulo: Ática, 1988. FIORIN, José Luiz; SAVIOLLI, Francisco Platão. Lições de texto: leitura e redação. São Paulo: Ática, 1997. KOCH, Ingedore G. Villaça. Coesão textual. 21 ed. São Paulo: Contexto, 2008. VALENÇA, Ana. Roteiro de redação; lendo e argumentando. São Paulo: Scipione, 1998. 74 Universidade Metodista de São Paulo Lógica de programação Espaços vetoriais Prof. Me. Valter Espíndola Thomáz Objetivos: Estender o conceito de vetor a objetos de variadas naturezas, tais como matrizes e polinômios. Apresentar uma abordagem básica sobre matrizes e determinantes e suas aplicações na resolução de sistemas lineares e inversão de matrizes. Fornecer uma abordagem introdutória aos espaços vetoriais, apresentando a estrutura geral de um espaço vetorial sobre o corpo dos números reais, e suas principais propriedades. Definir dependência linear, base e dimensão. Definir subespaço e introduzir as operações de intersecção e soma de subespaços, com os principais teoremas. Palavras-chave: espaços vetoriais; matrizes e determinantes; sistemas lineares; subespaços vetoriais. www.metodista.br/ead Módulo Espaços vetoriais No capítulo 01 introduzimos o conceito de vetor. Naquele momento, a imagem de um vetor era a de um segmento orientado que representa uma grandeza vetorial. Aqui, veremos que o conceito de vetor pode ser estendido a uma ampla variedade de objetos, que vai desde segmentos orientados a objetos tão diversos como matrizes e polinômios. O conceito básico agora é o de espaço vetorial. Mas antes, faremos uma revisão básica sobre matrizes e determinantes, o suficiente para essa abordagem introdutória. Matrizes Uma matriz mxn é basicamente uma tabela de elementos arranjados em m linhas e n colunas, de forma que toda linha tem n elementos e toda coluna tem m elementos. Em geral, as matrizes são representadas por letras maiúsculas do alfabeto latino, e seus elementos são dispostos no interior de um par de parênteses ou colchetes. Exemplos: 1 2 3 A 3 1 2 , 1 B 2 3 , C 1 2 3 , 1 2 D 3 4 A matriz A é uma matriz retangular 2x3, a matriz B é uma matriz 3x1 (matriz coluna), a matriz C é uma matriz 1x3 (matriz linha), e a matriz D é uma matriz quadrada 2x2 (matriz quadrada de ordem 2). Vamos denotar por Mmxn (R ) o conjunto das matrizes mxn cujos elementos são números reais. Se as matrizes forem quadradas de ordem n, usaremos a notação M n (R ) . Dada uma matriz A, utilizamos a notação a ij para indicar o elemento da i-ésima linha e 1 2 3 , temos: j-ésima coluna. Por exemplo, na matriz A 3 1 2 elementos da primeira linha: a11 1, a12 2, a13 3 elementos da segunda linha: a 21 3, a 22 1, a 23 2 Algumas vezes usamos também a notação A (aij ) para indicar que a ij se refere a um elemento genérico da matriz A. 76 Universidade Metodista de São Paulo Operações com matrizes Adição de matrizes Dadas duas matrizes A e B de mesma ordem (mesmo número de linhas e mesmo número de colunas), definimos a matriz C=A+B, da mesma ordem de A e B, por: c ij a ij b ij . Exemplo: 1 2 2 3 1 2 2 3 3 5 , B A B A 2 3 1 4 2 1 3 4 3 7 Multiplicação de uma matriz por um número real Dada uma matriz A e um número real k, definimos a matriz C=kA, da mesma ordem de A, por: c ij ka ij . Exemplo: 1 2 2 .1 2 .2 2 4 2A A 2 3 2 . 2 2 .3 4 6 Multiplicação de matrizes Dadas uma matriz mxn A e uma matriz nxp B, definimos a matriz mxp C=AB, por: c ij a i1 b1j a i2 b 2 j ..... a inb nj , 1 i m , 1 j p . Exemplo: 1.2 2.1 1.3 2.4 4 11 1 2 2 3 AB 2.2 3.1 2.3 3.4 7 18 A 2 3 , B 1 4 2.2 1.1 2.3 1.4 5 10 2 1 Algumas definições Matriz nula: 77 www.metodista.br/ead Qualquer matriz em que todos os elementos são nulos. É o elemento neutro da adição de matrizes de mesma ordem. Matriz oposta: A oposta de uma A é a matriz A ( 1) A . Exemplo: 1 2 1 2 A A 3 4 3 4 Note que A ( A ) é a matriz nula de mesma ordem. Matriz identidade de ordem n: Matriz quadrada de ordem n em que os elementos da diagonal principal são iguais a 1 e os demais são iguais a 0. 1 0 1 0 0 1 0 0 1 , I 3 0 1 0 , I 4 Exemplos: I 2 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 Matriz transposta: Dada uma matriz A, mxn, a matriz transposta de A, é uma matriz B, nxm, cujas colunas ordenadas são as linhas ordenadas de A, e vice-versa; isto é: b ij a ji , 1 i n e 1 j m . Notação: B A t . Exemplo: 1 3 1 2 3 t A 2 1 A 3 1 2 3 2 Propriedades: A t t A, ( A B) t A t B t e ( AB) t B t .A t . Desde que cada operação intermediária seja válida. Matriz simétrica: Uma matriz quadrada A é simétrica se A A t . Nesse caso, a ij a ji , e os elementos são simétricos em relação à diagonal principal. 78 Universidade Metodista de São Paulo 1 2 3 Exemplo: A 2 1 2 3 2 3 Matriz antissimétrica: Uma matriz quadrada A é antissimétrica se A A t . Nesse caso a ij a ji , e os elementos são antissimétricos (um é o oposto do outro) em relação à diagonal principal. Os elementos da diagonal principal são nulos. 2 0 0 Exemplo: A 2 3 2 3 2 0 Operações elementares sobre matrizes Dada uma matriz A, chamamos de operação elementar sobre A as seguintes operações: a) Permutar duas linhas. Notação: L i L j b) Multiplicar uma linha por um número real não nulo. Notação: L i k L i c) Somar, a uma linha, outra linha previamente multiplicada por um número real. Notação: L i L i k L i Definições análogas são válidas para as colunas. Dizemos que uma matriz B é equivalente por linhas a uma matriz A, se ela puder ser obtida de A por uma sequência finita de operações elementares. Em particular, se B estiver numa forma tal que cada linha, a partir da segunda, tem pelo menos um zero inicial a mais do que a linha anterior, dizemos que B está na forma escalonada. Um algoritmo simples para reduzir por linhas uma matriz à forma escalonada é o seguinte: a) Suponha que a coluna j é a primeira que contenha um elemento não nulo. Permute as linhas da matriz até que esse elemento apareça na primeira linha. b) Para cada linha i > 1, repita a operação L i a ij L1 a1jL i Ao final, todos os elementos da coluna j, exceto o primeiro, serão iguais a zero. Repita o processo com a submatriz formada por todas as linhas, exceto a primeira, e assim por diante até obter a forma escalonada. 79 www.metodista.br/ead Exemplo: 1 2 3 1 2 3 1 2 2 3 1 ~ 0 1 5 ~ 0 1 3 5 2 0 1 7 0 0 3 5 2 A segunda matriz foi obtida da primeira com as seguintes operações: L 2 2 L1 L 2 e L 3 3 L1 L 3 A terceira matriz foi obtida da segunda com a seguinte operação: L3 L2 L3 Definição: Definimos posto de uma matriz como sendo o número de linhas não nulas da sua equivalente por linhas na forma escalonada, entendendo por linha nula aquela que contém todos os elementos nulos. No exemplo anterior, a matriz tem posto igual a 3. Sistemas lineares Utilizaremos aqui o método do escalonamento para resolver um sistema linear. Considere um sistema linear de m equações lineares e n incógnitas: a11x1 a12 x 2 ..... a1n xn b1 a21x1 a22 x 2 ..... a2n xn b2 , . . . am1x1 am2 x 2 ..... amn xn bm que, na forma matricial, pode ser escrito como: AX B , onde: X é a matriz coluna nx1 das incógnitas e B é a matriz coluna mx1 dos termos independentes. Para resolvermos o sistema, usamos o seguinte procedimento: construímos a matriz completa M = (AB) e escalonamos M. Seja rC o posto da matriz completa e rA o posto da matriz dos coeficientes, temos três casos a considerar: a) rA rC n : sistema possível e determinado (uma única solução). b) rA rC n : sistema possível e indeterminado (infinitas soluções). c) rA rC : sistema impossível. 80 Universidade Metodista de São Paulo No caso b, temos n-m variáveis livres. Atribuindo valores a essas variáveis, as demais ficam determinadas. Exemplos: 1) Resolva o sistema linear abaixo por escalonamento. x 2y z 2 2x 3 y 2z 0 3 x y 4z 5 Solução: 1 2 1 2 1 2 1 2 1 2 1 2 2 3 2 0 ~ 0 7 0 4 ~ 0 7 0 4 3 1 4 5 0 7 1 1 0 0 1 3 Das três primeiras colunas: rA 3 Da matriz completa: rC 3 Como rA rC n , temos um sistema possível e determinado. Reescrevendo o sistema a partir da última matriz: x 2y z 2 15 4 x ,y e z3 7 y 4 7 7 z 3 2) Dizemos que uma matriz A quadrada de ordem n é inversível, se existe uma matriz quadrada de ordem n, que denotaremos por A 1 , tal que A A 1 A 1 A I n . A matriz A 1 é chamada matriz inversa de A. Um algoritmo simples para obter a matriz inversa utilizando escalonamento consiste em construirmos a matriz M A I n , escalonarmos M e depois aplicarmos as operações elementares necessárias para transformarmos a matriz A em I n . As mesmas operações elementares que transformam a matriz A em I n transformam a matriz I n em A 1 . Exemplo: 1 2 A 3 4 81 www.metodista.br/ead 2 1 2 1 0 1 ~ 3 4 0 1 0 2 1 2 0 ~ 3 1 0 1 1 1 0 1 0 2 1 3 1 ~ 3 1 0 1 2 2 2 2 A terceira matriz foi obtida da segunda usando a operação: L 2 1 L2 2 A quarta matriz foi obtida da terceira usando a operação: L 1 2 L 2 L 1 Logo: A 1 1 2 3 1 2 2 Determinantes O determinante é uma função que associa a cada matriz quadrada A um número real. Notação: det A ou a matriz A, substituindo os parênteses por um par de barras verticais. Pode-se defini-la por recorrência da seguinte forma: a) Se n = 1, temos A a 11 : det A a 11 a11 a12 a a : det A 11 12 a 11a 22 a 12 a 21 b) Se n = 2, temos A a 21 a 22 a 21 a 22 1 2 1 2 det A Exemplo: A 1.4 2.3 det A 2 3 4 3 4 c) Para n 3 , vamos definir primeiro menor de ordem ij e cofator. Dada uma matriz A: I – O menor de ordem ij é a matriz que se obtém de A, suprimindo a i-ésima linha e a jésima coluna. Notação: M ij . II – O cofator do elemento a ij , notação: A ij , é dado pela relação: A ij 1 det Mij . i j Os cofatores dos elementos da primeira linha, por exemplo, são respectivamente: A 11 det M11, A 12 det M12 , A 13 det M13 , A 14 det M14 ,... Escolhendo uma linha i qualquer, ou uma coluna j qualquer, o determinante é obtido por uma das relações: 82 Universidade Metodista de São Paulo n n j1 i 1 det A a ij A ij ou det A a ij A ij Dizemos que o determinante foi desenvolvido pela linha i ou pela coluna j. Exemplo: 1 A 3 4 2 1 1 3 2 1 Desenvolvendo pela primeira linha: 1 2 3 1 3 1 2 3 2 3 2 1. 2. 3. 1 1 4 1 4 4 1 1 1 1 1. 3 2. 11 3. 1 16 Desenvolvendo pela segunda coluna: 1 2 3 1 3 3 2 1 3 1 3 2 2. 1. 1. 2. 11 1. 13 1. 7 16 4 1 4 1 3 2 4 1 1 Exercício: Calcule o determinante da matriz: A 1 0 2 4 2 1 0 2 3 0 0 0 4 2 3 2 83 www.metodista.br/ead Espaço vetorial Por se tratar de uma abordagem introdutória, nos limitaremos aos espaços vetoriais sobre os números reais, embora seja perfeitamente possível construir espaços vetoriais sobre outros conjuntos (corpos) com estruturas semelhantes à dos números reais, como, por exemplo, o conjunto dos números complexos. Definição: Um Espaço espaço vetorial sobre os números reais é basicamente uma terna formada por um conjunto não vazio V e duas operações: a Adição, que para cada par de elementos u e v de V, associa um elemento w1 = u+v de V, chamado soma de u com v, e que goza das propriedades: A1. u , v V : u v v u . (Propriedade Comutativa) A2. u , v , w V : u v w u v w . (Propriedade Associativa) A3. 0 V tal que : u 0 0 u u, u V . Existência de um elemento neutro. A4. u V, - u V tal que : u u u u 0 . Existência do elemento oposto. e a multiplicação por escalar (número real), que para cada elemento u de V e para cada número real α, associa um elemento w2 = α u de V, chamado produto de α por u, que goza das propriedades: M1. α, β R e u V : α (β u) (α β) u . M2. α, β R e u V : (α β) u αu βu . M3. α R e u, v V : α ( u v) αu αv . M4. u V : 1.u u . Cada elemento de um espaço vetorial é chamado vetor. Partindo das propriedades A1 a M4, muitas outras podem ser derivadas. Por exemplo, que o elemento neutro da adição é único, que para cada vetor existe um único vetor oposto, que se αu 0 , então α 0 ou u 0 , etc. Embora normalmente seja trabalhoso, não é difícil verificar se uma terna dada é ou não um espaço vetorial sobre R. No primeiro capítulo já vimos um caso de espaço vetorial sobre R, o espaço dos segmentos orientados. Vejamos outros exemplos: a) A terna formada pelo conjunto R 2 RxR (x, y)| x, y R , dos pontos do plano, e as operações de adição e multiplicação por um número real usuais: (x 1 , y 1 ) (x 2 , y 2 ) (x 1 x 2 , y 1 y 2 ) 84 Universidade Metodista de São Paulo Dependência linear Combinação linear e dependência linear Seja V um espaço vetorial sobre R e u 1 , u 2 ,..., u n , v , n+1 vetores de V. Dizemos que v é uma combinação linear dos vetores u 1 , u 2 ,... , u n , se existirem n escalares α 1 , α 2 ,..., α n que satisfazem a relação: v α 1 u 1 α 2 u 2 ... α n u n . Por exemplo, se V = R3, o vetor v 1,2,3 é uma combinação linear dos vetores u 1 0,1,0 e u 2 1,0,3 , pois v 2 u 1 u 2 , porém não é uma combinação linear dos vetores w 1 1,2,0 e w 2 2,4,0 , pois se v fosse uma combinação linear de w1 e w2, então deveriam existir escalares α 1 e α 2 tal que v α 1 w 1 α 2 w 2 , o que significa que o sistema: 1 2 2 1 2 1 4 2 2 0 0 3 2 1 deveria ter solução. Porém, como a última equação do sistema não tem solução, o sistema também não tem solução. Outro conceito fundamental é o de dependência linear. Dizemos que um subconjunto B u 1 , u 2 ,..., u n , não vazio, de um espaço vetorial V, é linearmente independente (LI) se a única combinação linear dos vetores de B que resulta no vetor nulo é: 0 u 1 0 u 2 ... 0 u n 0 ; ou seja, aquela em que todos os coeficientes escalares α 1 , α 2 ,..., α n são nulos. O zero no segundo membro se refere ao vetor 0; no caso do R 2 , por exemplo, é o vetor 0 , 0 . Se B é um subconjunto não vazio, e não LI de V, então dizemos que B é linearmente dependente (LD). Por exemplo, se V = R2 e u 1 1,0, u 2 0,1 e u 3 2,0 são vetores de V, então o conjunto B u 1 , u 2 é LI, uma vez que α 1 u 1 α 2 u 2 0 implica α 1 α 2 0 e o conjunto C u1 , u 3 é LD, uma vez que podemos escrever, por exemplo, - 2 u 1 u 3 0 . Por abuso de linguagem, é comum dizermos que os vetores u 1 , u 2 ,..., u n são LI ou LD, quando na verdade quem é LI ou LD é o conjunto B u 1 , u 2 ,..., u n . Por definição, consideramos o conjunto vazio como sendo LI. Base e dimensão Dizemos que um espaço vetorial V 0 sobre R é finitamente gerado, se existir um subconjunto B finito de V, tal que todo vetor de V pode ser escrito como combinação linear de B; nesse caso, dizemos que B gera V, ou que B é um gerador de V. Se além de gerar V, B for LI, então dizemos que B é uma base de V. Duas propriedades fundamentais das bases são as seguintes: 85 www.metodista.br/ead a) Se B u 1 , u 2 ,..., u n é uma base de V, então todo vetor v de V pode ser escrito de maneira única como combinação linear de B. Se v α 1 u 1 α 2 u 2 ... α n u n , os coeficientes α 1 , α 2 ,..., α n são as coordenadas de v na base B, e indicamos esse fato com a notação v α 1 , α 2 ,..., α n B . Quando a base considerada está implícita no contexto, o índice B pode ser omitido. b) Todas as bases de um mesmo espaço vetorial V sobre R, finitamente gerado, possuem o mesmo número de vetores. Esse número, chamado dimensão de V, é indicado por dim V. Por convenção, definimos que para V 0, a dimensão é 0, de forma que nesse caso a base de V é o conjunto vazio. Exemplos: a) Determine uma base e a dimensão do espaço vetorial R3 sobre R. Solução: A base mais natural (canônica) para o R3 é a base B u1 , u 2 , u 3 em que u 1 1,0,0 , u 2 0,1,0 e u 3 0,0,1 . Para verificar que B gera R3, basta verificar que todo vetor v x, y, z de R3 pode ser escrito na forma: v x u 1 y u 2 z u 3 . E como B é LI, pois α1 u 1 α 2 u 2 α 3 u 3 0 , implica α1 α 2 α 3 0 , B de fato é uma base de R3. Além disso, como B tem 3 vetores, dim R3 = 3. Procedendo de forma análoga, pode-se construir uma base canônica para cada espaço vetorial Rn. Tal base tem n vetores ui, nos quais a i-ésima coordenada é igual a 1 e as demais são iguais a zero. A dimensão do Rn portanto é igual a n. b) Determine uma base para o espaço vetorial R3 sobre R, que contenha os vetores u 1 1,2,3 e u 2 2,3,1 . Dado: dim R3 = 3. Solução: Como dim R3=3, toda base de R3 tem 3 vetores LI. Portanto, precisamos encontrar um vetor u3 de R3, tal que B u1 , u 2 , u 3 seja LI. Se u 3 a, b, c , para que B seja LI devemos ter que α1 u 1 α 2 u 2 α 3 u 3 0 implique α1 α 2 α 3 0 ; isto é, que o sistema: α 1 2 α 2 a α 3 0 2 α1 3 α 2 b α 3 0 3 α α c α 0 2 3 1 seja possível e determinado. Para isso, o determinante da matriz dos coeficientes do sistema deve ser diferente de zero: 86 Universidade Metodista de São Paulo a) Se B u 1 , u 2 ,..., u n é uma base de V, então todo vetor v de V pode ser escrito de maneira única como combinação linear de B. Se v α 1 u 1 α 2 u 2 ... α n u n , os coeficientes α 1 , α 2 ,..., α n são as coordenadas de v na base B, e indicamos esse fato com a notação v α 1 , α 2 ,..., α n B . Quando a base considerada está implícita no contexto, o índice B pode ser omitido. b) Todas as bases de um mesmo espaço vetorial V sobre R, finitamente gerado, possuem o mesmo número de vetores. Esse número, chamado dimensão de V, é indicado por dim V. Por convenção, definimos que para V 0, a dimensão é 0, de forma que nesse caso a base de V é o conjunto vazio. Exemplos: a) Determine uma base e a dimensão do espaço vetorial R3 sobre R. Solução: A base mais natural (canônica) para o R3 é a base B u1 , u 2 , u 3 em que u 1 1,0,0 , u 2 0,1,0 e u 3 0,0,1 . Para verificar que B gera R3, basta verificar que todo vetor v x, y, z de R3 pode ser escrito na forma: v x u 1 y u 2 z u 3 . E como B é LI, pois α1 u 1 α 2 u 2 α 3 u 3 0 , implica α1 α 2 α 3 0 , B de fato é uma base de R3. Além disso, como B tem 3 vetores, dim R3 = 3. Procedendo de forma análoga, pode-se construir uma base canônica para cada espaço vetorial Rn. Tal base tem n vetores ui, nos quais a i-ésima coordenada é igual a 1 e as demais são iguais a zero. A dimensão do Rn portanto é igual a n. b) Determine uma base para o espaço vetorial R3 sobre R, que contenha os vetores u 1 1,2,3 e u 2 2,3,1 . Dado: dim R3 = 3. Solução: Como dim R3=3, toda base de R3 tem 3 vetores LI. Portanto, precisamos encontrar um vetor u3 de R3, tal que B u1 , u 2 , u 3 seja LI. Se u 3 a, b, c , para que B seja LI devemos ter que α1 u 1 α 2 u 2 α 3 u 3 0 implique α1 α 2 α 3 0 ; isto é, que o sistema: α 1 2 α 2 a α 3 0 2 α1 3 α 2 b α 3 0 3 α α c α 0 2 3 1 seja possível e determinado. Para isso, o determinante da matriz dos coeficientes do sistema deve ser diferente de zero: 87 www.metodista.br/ead 1 2 a 2 3 b 7a 5b c 0 3 1 c Tomando, por exemplo, a=b=0 e c=1 o determinante é diferente de zero. Portanto o vetor u 3 0,0,1 serve para tornar B LI. Claro que inúmeros outros vetores podem ser obtidos atribuindo valores convenientes às coordenadas a, b e c. Outra maneira de se obter um vetor u3 é escalonar a matriz em que as linhas são os vetores u1, u2 e u3, e ajustar as coordenadas de u3, de forma que a matriz tenha posto igual a 3, isto é, que a sua equivalente por linhas na forma escalonada tenha as três linhas não nulas. Neste caso garantimos que B seja LI. Partindo da matriz: 1 2 3 2 3 1 a b c substituímos a segunda linha pela soma da mesma com a primeira linha multiplicada por -2, obtendo: 1 0 a 2 1 3 5 b c Se tomarmos, por exemplo, a=b=0 e c=1 obtemos uma matriz com posto 3, já que a matriz escalonada apresenta 3 linhas não nulas. Exercícios: 1 0 0 1 0 0 0 0 1) Mostre que o conjunto B , , , é uma base do espaço 0 0 0 0 1 0 0 1 vetorial sobre R, M 2 (R) , das matrizes quadradas de ordem 2, cujos elementos são números reais. 2) Mostre que o conjunto B 1, x, x 2 é uma base do espaço vetorial sobre R, P2 (R) , dos polinômios de graus menores ou iguais a 2 e o polinômio nulo, com coeficientes reais. Subespaços vetoriais Definição: Um subespaço W de um espaço vetorial V sobre R é um subconjunto não vazio de V que satisfaz as seguintes propriedades: 88 Universidade Metodista de São Paulo a) 0 W . b) Se u, v W , então u v W . c) Se u W e α R , então α u W . Na verdade, sendo W não vazio, o fato do elemento 0 pertencer a W decorre das duas últimas propriedades, uma vez que, se u W , então, pela propriedade c, ( 1) u -u W , e pela propriedade b, u ( u) 0 W . Observações: a) O subconjunto 0 e o próprio V são subespaços de V sobre R, chamados subespaços triviais. b) Se W é um subespaço de um espaço vetorial V sobre R, então W também é um espaço vetorial sobre R. Exemplo: Mostre que o conjunto W x, y,0 x, y R é um subespaço de R3, e determine uma base e a dimensão de W. Solução: i) fazendo x=y=0, verificamos que 0,0,0 W . ii) Se u x 1 , y1 ,0 e v x 2 , y 2 ,0 são dois vetores quaisquer de W, então: u v x 1 x 2 , y1 y 2 ,0 0 x 1 x 2 , y1 y 2 ,0 Como x 1 x 2 e y 1 y 2 são números reais, concluímos que u v W . iii) Se u x, y,0 é um vetor qualquer de W e α é um número real, então: α u α x, α y, α 0 α x, α y,0 Como α x e α y são números reais, concluímos que α u W . Para determinar uma base de W, observemos que todo vetor u x, y,0 de W pode ser escrito na forma: u x 1,0,0 y 0,1,0 . Logo o conjunto B 1,0,0 , 0,1,0 gera W, e como B é LI (prove isso!), B é uma base de W e dim W = 2. Exercícios propostos: Verifique em cada caso se W é um subespaço de V e, se for, determine também uma base e a dimensão de W. 89 www.metodista.br/ead a) W x, y, x y x, y R , V R 3 . b) W x, y,1 x, y R, V R 3 . c) W a bx a, b R, V P2 R . a b a, b, c R , V M 2 R . d) W c a Intersecção de subespaços Dado um espaço vetorial V sobre R e dois subespaços V1 e V2 de V, definimos a intersecção de V1 e V2 como sendo o conjunto: V1 V2 v V | v V1 e v V2 . Pode-se mostrar que V1 V2 também é um subespaço de V. Exemplo: Considere os subespaços V1 x, y, z R 3 | x, y, z R e y x e V2 x, y, z R 3 | x, y, z R e z y, determine o subespaço V1 V2 e também uma base e a dimensão de V1 V2 . Solução: y x Se v (x, y, z) V1 V2 , então x y z. z y Logo, V1 V2 x, x, x R 3 | x R é uma reta que passa pela origem do sistema Oxyz. Além disso, todo vetor v V1 V2 pode ser escrito na forma v x (1,1,1) , onde x é um número real. Portanto B 1,1,1 gera V1 V2 . E como B também é LI, B é uma base de V1 V2 e dim V1 V2 =1. Exercício proposto: Considere os subespaços: V1 x, y, z R 3 | x, y, z R e y 2x e V2 x, y, z R | x, y, z R e z 2y, determine o subespaço V1 V2 e também 3 uma base e a dimensão de V1 V2 . Soma de subespaços Dado um espaço vetorial V sobre R e dois subespaços U e W de V, definimos a soma de U e W como sendo o conjunto: U W u w V | u U e w W . Pode-se mostrar que U W também é um subespaço de V. 90 Universidade Metodista de São Paulo Exemplo: Dados os subespaços U x, y, z R 3 | x y z 0 e W x, y, z R 3 | x y 0 determine o subespaço U W . Solução: Se v (x, y, z) U W , então existem dois vetores u (u 1 , u 2 ,-u 1 - u 2 ) U , w (0,0, w 3 ) W tais que u w (u1 , u 2 ,-u1 u 2 w 3 ) v . Reescrevendo o vetor v na forma: v u 1 (1,0,-1) u 2 (0,1,-1) w 3 (0,0,1) , verificamos que o conjunto B 1,0,1, 0,1, 1, 0,0,1 gera U W . A dimensão de U W é igual ao posto da matriz cujas linhas são os vetores de B: 1 0 1 0 1 1 0 0 1 que já está na forma escalonada. Como o posto dessa matriz é 3, já que as três linhas são não nulas, a dimensão de U W é 3. Logo, U W R 3 , já que todo vetor v (x, y, z) R 3 pode ser escrito na forma: v (x, y, z) (x, y,-x - y) (0,0, x y z) com u (x, y,-x - y) U e w (0,0, x y z) W . Quando U W 0, dizemos que o subespaço U W é uma soma direta de U e W . Uma das consequências disso é que todo vetor de U W pode ser escrito de maneira única como soma de um vetor de U e um vetor de W . Para indicar que a soma é direta, vamos utilizar a notação: U W . Voltando ao exemplo: U x, y, z R 3 | x y z 0 e W x, y, z R 3 | x y 0 Se v (x, y, z) U W , então devemos ter: x y z 0 x y z 0 U W 0 x y 0 e a soma de U e W é direta. Se tomarmos, por exemplo, o vetor v (1,2,3) U W , a única maneira de escrevê-lo como soma de um vetor de U e um vetor de W é dada por: v 1,2,3 0,0,6 (Verifique!). Teorema: Se U e W são dois subespaços de dimensão finita de um espaço vetorial V , então U W tem dimensão finita e: dim ( U W ) dim U dim W dim ( U W ) . Um exemplo simples é que se U é o plano xy e W é o plano yz em R 3 ; isto é, se U (x, y,0) | x, y R e W (0, y, z) | y, z R : U W R 3 , dim(U W) 3 , dim U 2 e dim W 2 . Logo, pelo teorema acima, concluímos que dim ( U W ) 1 . De fato, a intersecção de U e W é o eixo y, que é um subespaço de dimensão 1. 91 www.metodista.br/ead Exercício proposto: x y x x, y, z R e W Sejam U y z - x determine: a) b) c) d) e) f) x x, y R subespaços de V= M 2 (R ) , y Uma base e a dimensão de U. Uma base e a dimensão de W. UW. Uma base e a dimensão de U W . U W. Uma base e a dimensão de U W . Referências BIRKHOFF, G.; MACLANE, S. A survey of Modern Algebra. New York: The Macmillan Co., 1941. CAROLI, Alésio João de; CALLIOLI, Carlos Alberto; FEITOSA, Miguel Oliva. Matrizes, Vetores, Geometria Analítica: teoria e exercícios. 17. ed. São Paulo: Nobel, 1985. COELHO, Flavio Ulhoa; LOURENÇO, Mary Lilian. Um Curso de Álgebra Linear. São Paulo: Edusp, 2001. HOFFMANN, K.; Kunze, R.. Álgebra Linear. Rio de Janeiro: Livros Técnicos e Científicos, 1979. LIMA, Elon Lages. Coordenadas no Espaço. Rio de Janeiro: SBM, 1993. (Coleção do Professor de Matemática). LIMA, Elon Lages. Coordenadas no Plano. Colaboração de Paulo Cezar Pinto Carvalho. Rio de Janeiro: SBM, 2011. (Coleção do Professor de Matemática). LIPSCHUTZ, Seymour. Álgebra Linear. Rio de Janeiro: MacGraw-Hill do Brasil, 1971. 92 Universidade Metodista de São Paulo Lógica de programação Transformações lineares Prof. Me. Valter Espíndola Thomáz Objetivos: Introduzir os conceitos de transformação linear e operador linear, temas que ocupam grande parte da chamada álgebra linear, tendo em vista a grande gama de aplicações que vai desde o cálculo matricial até a resolução de equações diferenciais. Apresentar os conceitos de núcleo e imagem e o teorema do núcleo e da imagem. Obter a matriz de uma transformação linear e operar com as transformações lineares na forma matricial. Efetuar mudanças de base. Determinar os autovalores e os autovetores de um operador linear. Palavras-chave: transformações lineares; operadores lineares; núcleo e imagem; autovalores e autovetores. www.metodista.br/ead Módulo Transformações lineares O estudo das transformações lineares é bastante amplo e envolve variados níveis de dificuldade. Aqui nos limitaremos a alguns aspectos mais importantes que, de uma forma ou outra, podem auxiliar na compreensão de cálculos variados: rotações, cisalhamentos, resolução de sistemas lineares, equações diferenciais, pesquisas operacionais, etc. Definição: Sejam U e V espaços vetoriais sobre R. Uma função T : U V é uma transformação linear se: a) u, v U, T(u v) Tu Tv b) u U e R , T( u) Tu Exemplos: 1) A função T : R 2 R 3 definida por: Tx, y x,2y, x y é linear, pois: i. Se u u 1 , u 2 e v v1 , v 2 são vetores do R 2 , então: u v u 1 v1 , u 2 v 2 T u v u 1 v1 , 2 u 2 v 2 , u 1 v1 u 2 v 2 u 1 , 2 u 2 , u 1 u 2 v1 , 2 v 2 , v1 v 2 T u T v ii. Se u u 1 , u 2 R 2 e λ R , então: λ u λ u 1 , λ u 2 Tλ u λ u 1 , 2 λ u 2 , λ u 1 λ u 2 λ u 1 , 2 u 2 , u 1 u 2 λ T u 2) Seja T : R 2 R 2 a função: Tx, y x cos θ y sin θ , x sin θ y cos θ a função que associa a cada ponto do R 2 o ponto obtido girando-o de um ângulo θ no sentido anti-horário. Mostre que T é uma transformação linear. 94 Universidade Metodista de São Paulo Solução: i. Se u u 1 , u 2 e v v1 , v 2 são vetores de R 2 , então: u v u 1 v1 , u 2 v 2 T u v u 1 v1 cos θ - u 2 v 2 sin θ , u 1 v1 sin θ u 2 v 2 cos θ u 1 cos θ - u 2 sin θ , u 1 sin θ u 2 cos θ v1 cos θ - v 2 sin θ , v1 sin θ v 2 cos θ TuTv ii. Se u u 1 , u 2 R 2 e λ R , então: λ u λ u 1 , λ u 2 Tλ u λ u 1 cos θ - λ u 2 sin θ , λ u 1 sin θ λ u 2 cos θ λ u 1 cos θ - u 2 sin θ , u 1 sin θ u 2 cos θ λ T u 3) Se U e V são dois espaços vetoriais sobre R, T : U V é uma transformação linear, 01 é o vetor nulo de U e 0 2 é o vetor nulo de V, então T(01 ) 0 2 . Em particular, se U=V, 01 0 2 0 e T(0) 0 . Solução: T(01 ) T(01 01 ) T(01 ) T(01 ) Como T(01 ) V : T(01 ) - T(01 ) 0 2 Somando - T(01 ) a ambos os membros: T(01 ) 0 2 Em particular, se U=V, então: T(0) 0 . Exercícios propostos: 1) Verifique se as funções de R 2 em R 3 são transformações lineares. a) T(x, y) (y , x , 2x y) b) T(x, y) (x y , x , y 1) 2) Se T : R 2 R 2 é uma transformação linear, T(1, 0) (1, 2) e T(0 ,1) (2 ,1) , determine T( x, y ) para todo vetor v ( x, y ) R 2 . Dica: ( x, y ) x (1, 0 ) y (0 ,1) . 1 2 . Escrevendo os vetores do R 2 como matrizes colunas 3) Considere a matriz A 3 1 2x1, mostre que a função T : R 2 R 2 , definida por Tv Av é uma transformação linear. 95 www.metodista.br/ead Núcleo e imagem de uma transformação linear Definição: Sejam U e V dois espaços vetoriais sobre R , e T : U V uma transformação linear: a) O conjunto Ker T u U | T u 0é chamado Núcleo de T , algumas vezes chamado de Kernel de T . b) O conjunto Im T v V | u U com T u vé chamado Imagem de T. Pode-se mostrar que esses dois conjuntos são subespaços de U. Exemplo: Dada a transformação linear T : R 2 R 2 , definida por T( x, y ) ( x y , 0 ) , determine: a) O núcleo de T e uma base para o núcleo de T. b) A imagem de T e uma base para a imagem de T. Solução: a) Fazendo T( x, y ) ( x y, 0 ) (0 , 0 ) : x y 0 x y Logo: Ker T ( x , x ) | x R Todo vetor de Ker T é da forma v ( x, x ) x(1,1) , portanto o conjunto B (1,1) gera Ker T , e como B é LI, B é uma base de Ker T . b) Como T( x, y ) ( x y, 0 ) ( x y ) (1, 0 ) , o conjunto B (1, 0 ) gera Im T , e como B é LI, B é uma base de Im T e Im T ( x,0)| x R . Teorema do núcleo e da imagem: Sejam U e V dois espaços vetoriais sobre R e T : U V uma transformação linear. Se U tem dimensão finita, então vale a relação: dim U dim Ker T dim Im T . No exemplo anterior: dim Ker T dim Im T 1 1 2 dim U . Pode-se mostrar que se dim Ker T 0 e B u1, u 2 ,...,un for uma base de U , então o conjunto C T u1, T u 2 ,..., T un é uma base de Im T . Matriz de uma transformação linear Sejam U e V dois espaços vetoriais sobre R , ambos de dimensão finita, e T : U V uma transformação linear. Se B u1, u2 ,..., un é uma base de U e C v1, v 2 ,..., v m , uma base de V , então podemos escrever T ui como combinação linear dos vetores de C: 96 Universidade Metodista de São Paulo T u1 a11 v 1 a 21 v 2 .... a m1 v m T u 2 a12 v 1 a 22 v 2 .... a m 2 v m . .. . .. T u n a1n v 1 a 2n v 2 .... a mn v m As colunas da matriz A (a ij ) , chamada matriz de T em relação às bases B e C, são formadas pelas coordenadas de Tu j na base C. Utilizaremos a notação A T B,C . Se escrevermos u U como uma matriz coluna nx1, Tu é a matriz mx1 que se obtém calculando Au . Exemplo: Determine a matriz da transformação linear T : R 2 R 3 definida por: T( x, y ) ( x y , 2x y , x 2y ) em relação às bases canônicas do R 2 e do R 3 . Solução: As bases canônicas do R 2 e do R 3 são respectivamente: B (1, 0), (0 ,1) e C (1, 0 , 0), (0 ,1, 0), (0 , 0 ,1) Em relação à base C: T(1, 0 ) (1, 2 ,1) e T(0 ,1) ( 1,1, 2) Logo, a matriz de T em relação às bases canônicas B e C é a matriz: 1 1 T B,C 2 1 1 2 Mudança de base Muitas vezes conhecemos as coordenadas de um vetor em relação a uma base B e queremos determinar as coordenadas do mesmo em relação a uma segunda base C. Esse processo pode ser feito prontamente se conhecermos a matriz de mudança da base B para a base C. Se B u1, u 2 ,...,un e C v 1, v 2 ,..., v n , definimos a matriz MB,C de mudança da base B para a base C pela relação MB,C uC uB , onde uC é a matriz coluna nx1 das coordenadas de um vetor u qualquer em relação à base C, e uB a matriz coluna nx1 das coordenadas do mesmo vetor em relação à base B. Pode-se verificar que as colunas de MB,C são as coordenadas de v 1, v 2 ,..., v n em relação à base B. Pode-se mostrar ainda que toda matriz de mudança de base é inversível, e se MB,C é a matriz de mudança da base B para a base C, então a matriz de mudança da base C para a 1 base B é dada por MC,B MB,C . 97 www.metodista.br/ead Exemplo: Seja B a base canônica do R 2 e C v1, v 2 , onde v 1 (1 , 2) e v 2 (2 , 1) , outra base do R 2 . Se T : R 2 R 2 é uma transformação linear cuja matriz em relação à base C é dada por: 5 4 T C,C 4 5 Determine T(2 , 3) . Solução: Como a matriz de T está em relação a C, devemos escrever uB (2 , 3) na base C. A matriz de mudança da base B para a base C é dada por: 1 2 MB,C 2 1 onde as colunas são as coordenadas de v1 e v2. Como uC MB,C 1 2 1 ~ 0 uC 2 |1 1 |0 u B , precisamos determinar MB,C 1 : 0 1 2 | 1 ~ 1 0 3 | 2 1 3 2 3 0 | 1 | 1 3 2 3 1 2 1 3 MB,C 1 3 2 4 2 3 3 1 3 1 3 3 1 2 0 ~ 1 0 1 2 1 3 3 2 1 3 3 | 1 | 2 3 0 1 ~ 3 TuC TC,C uC 4 5 4 3 8 4 5 1 7 3 T(2 , 3) 8v 1 7v 2 8 (1, 2) 7 (2,1) T(2 , 3) (22, 23) Autovalores e autovetores Um tipo particular de transformação linear que surge com frequência em diversas aplicações é aquela em que o domínio e o contradomínio são iguais. Essas transformações lineares são chamadas operadores lineares. Em geral, os cálculos envolvendo operadores lineares são feitos na forma matricial, substituindo a forma algébrica do operador pela sua matriz em relação a uma base conveniente. Para alguns 98 Universidade Metodista de São Paulo operadores é possível encontrar uma base, em relação a qual sua matriz é diagonal; isto é, todos os termos fora da diagonal principal são nulos, o que facilita sobremaneira os cálculos. Nesse contexto é que aparecem os autovalores e os autovetores. Definição: Seja U um espaço vetorial sobre R e T : U U um operador linear. Um vetor v U , não nulo, é um autovetor, ou vetor próprio, de T, se existe um número real tal que T v v . Dizemos que v é o autovetor de T associado ao autovalor, ou valor próprio, . Por exemplo, para o operador T : R 2 R 2 definido por T( x, y ) ( x, y ) : T(1, 0 ) 1.(1, 0 ) e T(0 ,1) ( 1).(0 ,1) Logo (1,0) é um autovetor de T associado ao autovalor 1, e (0,1) é um autovetor de T associado ao autovalor -1. Para cada número real , definimos ainda o conjunto V v U | T v v, que é não vazio, já que se v 0 , v 0 . Agora, se V 0 , então é um autovalor de T e V é chamado subespaço próprio associado a . Definição: Seja A uma matriz quadrada de ordem n, chamamos de polinômio característico de A ao polinômio de grau n p A (t) det ( A t I ) , onde I é a matriz identidade de ordem n. Exemplo: 1 2 . Determine o polinômio característico da matriz: A 3 4 Solução: p A det A t I 1 t 2 p A (1 t ).( 4 t ) 6 p A t 2 5t 2 3 4t Pode-se mostrar que se R é um autovalor de um operador linear T, então é raiz do polinômio característico da matriz de T, e ainda, que todas as matrizes de T, em relação a qualquer base, possuem o mesmo polinômio característico. Exemplo: Determine os autovalores e os autovetores do operador T : R 2 R 2 cuja matriz em relação à base canônica é dada por: 8 2 2 5 T 99 www.metodista.br/ead Solução: pT ( t ) 8t 2 pT ( t ) t 2 13t 36 2 5t Raízes: t 2 13 t 36 0 t 1 4 e t 2 9 Logo temos dois autovalores: 1 4 e 2 9 Autovetores associados a 4 : 8 4 2 x 0 4 x 2 y 0 2 x y 0 y 2 x 2 5 4 y 0 2x y 0 V( 4) x 1,2 | x R Logo, os autovetores associados a 4 são os múltiplos não nulos do vetor (1, 2) . Autovetores associados a 9 : 8 9 2 x 0 x 2 y 0 x 2y 0 x 2y 2 5 9 y 0 2x 4 y 0 V(9) y 2, 1 | y R Logo, os autovetores associados a 9 são os múltiplos não nulos do vetor ( 2 ,1) . Note que os autovetores u=(1,-2) e v=(2,1) formam um conjunto LI, e como a dimensão do R 2 é igual a 2, o conjunto B u, v é uma base do R 2 . Vamos obter a matriz de T em relação a B: T(1, 2) 4.(1, 2) 4 , 0 B T(2 ,1) 9.(2 ,1) (0 , 9)B 4 T B 0 0 9 Portanto encontramos uma matriz diagonal para T. Exercícios propostos: 1) Determine a matriz da transformação linear T : R 2 R 3 definida por: T( x, y ) ( 2x y, x, x 2 y ) , em relação às bases: a) Canônicas. b) B (1, 2), (2, 3) e C (1,1, 0),(0 ,1, 2), (0 , 0 ,1 100 Universidade Metodista de São Paulo 2) Seja B a base canônica do R 2 e C v1, v 2 , onde v 1 (1 , 2) e v 2 (3 , 4) , outra base do R 2 . Se T : R 2 R 2 é um operador linear cuja matriz em relação à base C é dada por: 13 5 2 TC,C 2 3 5 2 2 Determine T( 2 , 3 ) . 3) Determine os autovalores e autovetores do operador linear T : R 2 R 2 definido por: T(x, y) (x 2y,3x 6y) . Referências BIRKHOFF, G.; MACLANE, S. A survey of Modern Algebra. New York: The Macmillan Co., 1941. CAROLI, Alésio João de; CALLIOLI, Carlos Alberto; FEITOSA, Miguel Oliva. Matrizes, Vetores, Geometria Analítica: teoria e exercícios. 17. ed. São Paulo: Nobel, 1985. COELHO, Flavio Ulhoa; LOURENÇO, Mary Lilian. Um Curso de Álgebra Linear. São Paulo: Edusp, 2001. HOFFMANN, K.; Kunze, R.. Álgebra Linear. Rio de Janeiro: Livros Técnicos e Científicos, 1979. LIMA, Elon Lages. Coordenadas no Espaço. Rio de Janeiro: SBM, 1993. (Coleção do Professor de Matemática). LIMA, Elon Lages. Coordenadas no Plano. Colaboração de Paulo Cezar Pinto Carvalho. Rio de Janeiro: SBM, 2011. (Coleção do Professor de Matemática). LIPSCHUTZ, Seymour. Álgebra Linear. Rio de Janeiro: MacGraw-Hill do Brasil, 1971. 101 www.metodista.br/ead _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ __________________________________________ __________________________________________ 102 Universidade Metodista de São Paulo Lógica de programação Vetores Prof. Me. Valter Espíndola Thomáz Objetivos: Introduzir o conceito de vetor como ferramenta para o tratamento de grandezas vetoriais. Apresentar as principais operações com vetores, possibilitando o uso do cálculo vetorial nas ciências exatas em geral, e em diversas outras situações do dia a dia. Palavras-chave: Segmentos orientados; vetores; adição; multiplicação por escalar; produto escalar; produto vetorial. www.metodista.br/ead Módulo Introdução O primeiro contato com as chamadas grandezas vetoriais nas escolas brasileiras ocorre normalmente no nono ano do ensino fundamental, junto com química, em ciências; ou, no mais tardar, no primeiro ano do ensino médio. Tipicamente, as primeiras aulas versam sobre mecânica: cinemática, dinâmica e estática. Já em cinemática, aparecem algumas grandezas que, para serem bem determinadas, exigem o conhecimento, não apenas de sua intensidade, que é representada por um número e uma unidade de medida, mas também da direção e do sentido em que atuam. Podemos citar, por exemplo, a velocidade de um móvel. Quando dizemos que um móvel se desloca com velocidade de 100 km/h, essa informação é incompleta; precisamos dizer ainda em que direção e em que sentido dessa direção – toda direção admite dois sentidos – o móvel se desloca. Grandezas como essas são chamadas grandezas vetoriais. Outros exemplos são: força, campo elétrico, campo magnético, etc. Vetores Vetor é um ente matemático utilizado para representar uma grandeza vetorial. Na física, por exemplo, utilizamos um segmento orientado (uma flecha) para representarmos uma força. O comprimento da flecha indica a intensidade (ou módulo) da força, enquanto a reta suporte e a extremidade da flecha indicam, respectivamente, em que direção e em que sentido ela atua. Em alguns casos, como no caso do estudo de corpos rígidos, além do módulo, direção e sentido, o ponto de aplicação da força também é importante. Temos então um vetor ligado. No que segue, nos referiremos sempre a vetores livres, no sentido de que qualquer segmento orientado de mesmo módulo, direção e sentido representa o mesmo vetor. Para o módulo de um vetor representado por um segmento orientado AB, utilizaremos a notação AB encimado por uma flecha, de A para B, entre barras. Na figura anterior, como os segmentos orientados AB e CD representam o mesmo vetor: AB CD Isto é, módulo de AB é igual ao módulo de CD, e, portanto, igual ao módulo do vetor que representam. Segmentos orientados de mesmo módulo, direção e sentido são chamados equipolentes, e representam o mesmo vetor. Por isso, é comum representá-los com uma mesma letra, minúscula, encimada por uma flecha: 104 Universidade Metodista de São Paulo Cabe ainda ressaltar a existência do vetor nulo. Se a extremidade da flecha coincide com a origem, temos um ponto, e nesse caso não se define direção nem sentido. Apesar disso, esse segmento é chamado segmento orientado nulo e representa um vetor chamado vetor nulo, que é representado pelo símbolo 0 . Todos os pontos do espaço são representantes do vetor nulo. Operações com vetores Multiplicação por escalar No que segue, utilizaremos a palavra escalar para qualquer número real. Se α é um escalar não nulo e u é um vetor não nulo, definimos um vetor α u cujo módulo é igual ao produto do módulo de α pelo módulo de u ; a direção é a mesma de u e o sentido é o mesmo de u , se α é positivo, e oposto ao de u , se α é negativo. Se α 0 ou u 0 , então α u 0 . Adição de vetores Como dissemos anteriormente, representamos um vetor por um segmento orientado, que, portanto, possui uma origem e uma extremidade. O segmento orientado AB, por exemplo, possui origem A e extremidade B. Se o segmento orientado AB representa o vetor u , é comum utilizarmos a notação u B A , e também definirmos uma adição de ponto e vetor na forma B A u , que pode ser útil algumas vezes. Considere dois vetores u e v não nulos e dois segmentos orientados: AB representante de u , e BC, representante de v . Definimos o vetor soma ou resultante dos vetores u e v , como sendo o vetor R u v C - A , representado pelo segmento orientado AC. 105 www.metodista.br/ead Tal vetor representa o deslocamento em linha reta do ponto A ao ponto C, equivalente aos deslocamentos sucessivos: do ponto A ao ponto B, através do vetor u , e do ponto B ao ponto C, através do vetor v . Se um dos vetores for nulo, digamos v 0 , então u v u 0 u. É fácil verificar que são válidas as seguintes propriedades para quaisquer vetores u, v e w e quaisquer números reais α e β : a. u v v u : propriedade comutativa. b. u v w u v w : propriedade associativa. c. αu v αu αv d. α β u αu βu Como exemplo, vejamos uma representação gráfica da propriedade associativa: Para cada vetor u não nulo, definimos ainda um vetor oposto, que é um vetor que possui o mesmo módulo, a mesma direção e sentido oposto ao de u . Representamos esse vetor por - u . Claro que se um segmento orientado AB representa u , então o segmento orientado BA representa - u . Logo: u u A A 0 . Definindo o oposto do vetor nulo como sendo o próprio vetor nulo, a relação u u 0 permanece válida para todo vetor u . 106 Universidade Metodista de São Paulo Para obter a resultante, soma vetorial de dois ou mais vetores, normalmente usamos um dos métodos: Método da Poligonal, Regra do Paralelogramo ou o Método da Decomposição. Para facilitar a notação, vamos usar a letra sem a flecha para indicar o módulo do vetor. Método da Poligonal Para obter a resultante de n vetores u 1 , u 2 , ..., u n , partimos de um ponto inicial A 0 e obtemos A 1 A 0 u 1 , A 2 A1 u 2 ,...., A n A n -1 u n . O vetor resultante é o vetor: R An A0 . Exemplo: Determinar a resultante dos vetores: u, v e w . A grade da figura é composta de quadrados de lado 1. Módulo: R 2 2 2 12 R 5 Direção: No caso de vetores no plano xy, podemos indicar a direção através do ângulo agudo que o segmento orientado que representa R forma com a direção horizontal: tg θ 1 θ 27 0 2 Sentido: ascendente. Regra do Paralelogramo Para obtermos a resultante de dois vetores u e v , não nulos e não paralelos, traçamos os dois vetores a partir de uma origem comum A. Com origem na extremidade de u , traçamos um segmento orientado representante de v . Com origem na extremidade de v , traçamos um segmento orientado representante de u . As extremidades desses dois 107 www.metodista.br/ead segmentos orientados coincidem num ponto B. A resultante é o vetor R u v B-A . O módulo da resultante, conhecidos os módulos de u e v e o ângulo θ entre eles, 0 0 θ 180 0 , é dado por: R 2 u 2 v 2 2 u v cos θ . A determinação da direção e do sentido já não é tão simples. Em geral, envolve aplicação de relações trigonométricas a triângulos convenientes. Exemplo: Determinar a resultante dos vetores u e v , sabendo que u 2, v 4, o ângulo entre u e v é 60 0 e o ângulo entre v e o eixo x é 30 0 . Solução: R 2 u 2 v 2 2 u v cos θ R 2 2 2 4 2 2 . 2 . 4 cos 60 0 28 R 2 7 Para determinar a direção e o sentido de R , podemos aplicar a Lei dos Cossenos ao triângulo: Se o ângulo entre R e v é α : u 2 R 2 v 2 2 R v cos 108 Universidade Metodista de São Paulo 4 28 16 2 . 2 7 . 4 . cos α cos α 40 16 7 α 19 0 Logo, o ângulo entre a resultante e o eixo x é aproximadamente 30 0 19 0 110 . Resumindo, as características do vetor resultante são: Módulo: R 2 7 . Direção: a direção de uma reta inclinada para a esquerda que forma um ângulo de 110 com o eixo x. Sentido: descendente. Método da Decomposição Sejam i e j dois versores, vetores de módulo 1, sendo que o primeiro é paralelo ao eixo x, com sentido da esquerda para a direita, e o segundo é paralelo ao eixo y, com sentido de baixo para cima. Todo vetor u do plano xy pode ser escrito, de maneira única, como soma de um múltiplo u x u x i do versor i com um múltiplo u y u y j do versor j . De forma que o vetor u pode ser escrito como: u u x u y u x i u y j . Os vetores u x e u y são chamados componentes vetoriais de u , e u x e u y são as componentes escalares de u , que também são chamadas de coordenadas de u na base B i , j . Se as formas vetoriais de u e v são conhecidas, o vetor resultante pode ser determinado de forma bastante simples, somando diretamente as componentes vetoriais: R u v u x v x i u y u y j R x u x v x e R y u y v y . Além disso, se R x , R y e R formam um 2 2 triângulo retângulo, o módulo de R é dado por: R 2 R x R y e o ângulo agudo ou seja, Ry formado por R e R x , por: tg θ . Rx Exemplos: 1) Determine a resultante dos vetores u e v da figura. Cada quadradinho da figura tem lado 1. 109 www.metodista.br/ead Solução: tg θ Ry Rx 1 θ 18 0 3 Módulo: R 2 3 2 12 10 R 10 Direção: a de uma reta inclinada para a direita que forma um ângulo de 18 0 com a direção horizontal. Sentido: ascendente. 2) Determine a força resultante das forças F1 e F2 , ambas de módulos iguais a 100N, aplicadas a uma partícula P: Solução: 110 Universidade Metodista de São Paulo F1x 0 F1y F1 100 N F2x F2 cos 60 0 100 cos 60 0 50 N F2y F2 sin 60 0 100 sin 60 0 50 3 N F3x F3 cos 30 0 100 cos 30 0 50 3 N F3y F3 sin 30 0 100 sin 30 0 50 N Logo: R x F1x F2x F3x 36,6 N R y F1y F2y F3y 63,4 N R 2 R x R y 36,6 63,4 R 73,2 N 2 tg θ Ry Rx 2 2 2 63,4 θ 60 0 36,6 Resumindo: Módulo: R 73,2 N Direção: pelos sinais de R x e R y , a direção de R é a de uma reta inclinada para a direita, e que forma um ângulo de 60 0 com o eixo x. Sentido: descendente. Nos problemas envolvendo vetores no espaço, o mais fácil é escrevê-los na forma vetorial e procedermos como no método da decomposição. Antes é necessário acrescentar um versor ortogonal a i e j , que representamos por k , e construirmos uma base B i , j , k , em relação a qual cada vetor pode ser escrito de maneira única como soma de um múltiplo de i , um múltiplo de j e um múltiplo de k . 111 www.metodista.br/ead O versor k é obtido pela chamada Regra da Mão Direita, de tal forma que quando os dedos da mão direita girem de i para j , o polegar indica o sentido de k . Se expressarmos cada vetor na forma vetorial, como soma de suas componentes vetoriais, podemos obter a resultante somando diretamente suas componentes vetoriais. O módulo de qualquer vetor u u x i u y j u z k , por ter componentes vetoriais ortogonais, é 2 2 2 dado pela relação: u 2 u x u y u z . Em particular, o módulo do vetor resultante é 2 2 2 obtido pela relação: R 2 R x R y R z . Exemplo: Determine a resultante dos vetores u i 2 j - 3k e v 2 i j 4k na forma vetorial, bem como o módulo da resultante. Solução: R u v 3i j k R 2 32 12 12 R 11 Produto escalar Dados dois vetores u e v , o produto escalar de u u x i u y j u z k v v x i v y j v z k é definido pela relação: u . v u x v x u y v y u z v z . Exemplo: Se u i 2 j 3 k e v 2 i 2 j k u . v 1.2 2 .2 3 .1 u . v 9 112 Universidade Metodista de São Paulo e Note que o produto escalar de dois vetores resulta num número (escalar) e não num vetor. Pode-se provar que se u e v forem dois vetores não nulos, tomados com a mesma origem, e θ , 0 0 θ 180 0 , for o ângulo entre eles, então: u . v u v cos θ . Exemplo: Determine o ângulo formado pelos vetores u i 2 j 2k e v 2 i j k . Solução: u 2 12 2 2 2 2 u 3 v 2 2 2 (1) 2 12 v 6 u . v 1.2 2.(1) 2.1 2 2 cos θ θ 74 0 3 6 Note que o produto escalar é comutativo; isto é: u . v v . u , e que não tem sentido expressões do tipo u . v . w , já que o produto escalar é definido apenas entre dois vetores. Produto vetorial Dados dois vetores u e v , o produto vetorial de v v x i v y j v z k é um vetor definido pelo determinante: i ux j uy vx vy u ux i u y j uzk e k uy uz ux uz ux uy uz i j k vy vz vx vz vx vy vz Notação: u v . Que se lê: u vetor v . 113 www.metodista.br/ead O vetor u v é nulo se e somente se um dos vetores u ou v for nulo, ou se u e v forem paralelos. Se u v não for nulo, então ele é ortogonal ao plano determinado pelos vetores u e v , e seu sentido é determinado pela Regra da Mão Direita; isto é, girando os dedos da mão direita de u para v , o polegar indica o sentido de u v . Exemplo: Dados os vetores u i 2 j k e v 2 i j k , determine os vetores w 1 u v e w2 v u . Solução: i w1 u v 1 2 j k 2 1 2 1 i (1 2) j (1 4) k i j 3 k 1 1 i w2 v u 2 j 1 k 1 1 2 i (2 1) j (4 1) k i j 3 k 1 2 1 Nesse exemplo, verifique que w 2 w 1 . De fato, o produto vetorial não é comutativo. Pode-se mostrar que v u - u v para quaisquer vetores u e v . Propriedade: Dados dois vetores u e v não nulos e não paralelos, o módulo do vetor u v é numericamente igual à área do paralelogramo determinado por eles: e, portanto, também é igual ao dobro da área do triângulo determinado por u e v , o que conduz à relação: u v u v sin θ , 00 θ 1800 onde θ é o ângulo entre os dois vetores. Essa relação permanece válida nos casos em que os vetores são paralelos. Se u e v possuem o mesmo sentido, θ 0 0 , se possuem sentidos opostos, θ 18 0 0 . 114 Universidade Metodista de São Paulo Exemplo: Determine a área do paralelogramo determinado pelos vetores u i j k e v i 2j 3k . i j k u v 1 1 1 3 2 i (3 1) j (2 1) k i 2 j k 1 2 3 2 A u v 12 2 12 A 6 Ao contrário do que ocorre com o produto escalar, expressões envolvendo 3 vetores, do tipo u v w existem e resultam num vetor. Pode-se mostrar que: u v w u . w v v . w u . Exercícios propostos: 1) Assinale V ou F a) Se o módulo de um vetor é igual à soma dos módulos de outros dois vetores, então os três vetores são paralelos ( ). b) Se dois vetores, não nulos, possuem a mesma direção e o mesmo sentido, então o módulo do vetor resultante é igual à soma dos módulos dos dois vetores ( ). c) O módulo do vetor resultante de dois vetores, cujos módulos são, respectivamente, 10 e 14, pode ser igual a 3 ( ). d) O módulo do vetor resultante de dois vetores, cujos módulos são, respectivamente, 10 e 14, pode ser igual a 22 ( ). e) Se a resultante de três vetores não nulos é o vetor nulo, então esses três vetores são coplanares ( ). 2) Determine os ângulos internos e a área de um triângulo cujos vértices são os pontos A=(1,2), B=(3,5) e C=(5,1). 3) Determine a força resultante das forças: F1 2 i 3 j k (N) e F2 2 i 2 j 2k (N) que atuam sobre uma partícula. 115 www.metodista.br/ead Referências BOULOS, Paulo; CAMARGO, Ivan de. Geometria Analítica: Um tratamento Vetorial. São Paulo: MacGraw Hill, 1987. CAROLI, Alésio João de; CALLIOLI, Carlos Alberto; FEITOSA, Miguel Oliva. Matrizes, Vetores, Geometria Analítica: teoria e exercícios. 17 ed. São Paulo: Nobel, 1985. LIMA, Elon Lages. Coordenadas no Espaço. Rio de Janeiro: SBM, 1993. (Coleção do Professor de Matemática). LIMA, Elon Lages. Coordenadas no Plano. Colaboração de Paulo Cezar Pinto Carvalho. Rio de Janeiro: SBM, 2011. (Coleção do Professor de Matemática). LIPSCHUTZ, Seymour. Álgebra Linear. Rio de Janeiro: MacGraw-Hill do Brasil, 1971. WINTERLE, Paulo. Vetores e Geometria Analítica. São Paulo: Pearson Education do Brasil, 2000. _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ 116 Universidade Metodista de São Paulo Lógica de programação Lógica e Dedução Profa. Dra. Silvia Aparecida Brunini Objetivos: Ao final deste módulo, você deverá estar preparado para: • entender um problema através do uso da lógica, inferência e dedução; • representar diagramaticamente uma provável solução para um problema. Palavras-chave: Lógica; dedução; inferência; descrição diagramática. www.metodista.br/ead Módulo Lógica "Elementar, meu caro Watson". Esta frase, marca registrada de Sherlock Holmes, o grande detetive ficcional da obra de Arthur Conan Doyle, é a frase que todo investigador sonha em dizer. A frase (que por sinal nunca foi escrita pelo criador do personagem) significa "É óbvio" e geralmente é dita após longas reflexões na solução de um problema. Alguns clichês típicos, envolvendo solução de problemas, são: resolver problemas é muito chato, pois, envolve matemática; lógica, dedução, inferência implicam em pensamento, logo, deve estar voltado à chatice da filosofia. Os clichês acima estão errados num único ponto: são tudo, menos chatos. Afinal quem nunca se deparou com passatempos do tipo "A César o que é de César", onde se preenche uma tabela seguindo dicas: O espanhol mora diretamente à direita do homem que mora na casa vermelha. O alemão mora na casa azul. O italiano mora na segunda casa. Casa 1 Casa 2 Casa 3 Cor Nacionalidade Uma receita infalível para resolver o problema acima é: 1. Comece pelas dicas simples como, por exemplo, "O Italiano mora na segunda casa". 2. A partir das dicas óbvias, é possível ir deduzindo as outras logicamente. 3. Tenha calma e, se achar necessário, use um lápis e papel para tomar nota de suas observações. Aposto que você deve estar feliz por ter encontrado a resposta do passatempo acima, então tente o seguinte passatempo: Teste de QI de Einstein Regras básicas para resolver o teste: 1. Há 5 casas de diferentes cores. 2. Em cada casa mora uma pessoa de uma diferente nacionalidade. 118 Universidade Metodista de São Paulo 3. Esses 5 proprietários bebem diferentes bebidas, fumam diferentes tipos de cigarros e têm um certo animal de estimação. 4. Nenhum deles tem o mesmo animal, fumam o mesmo cigarro ou bebem a mesma bebida. Dicas: O norueguês vive na primeira casa. O inglês vive na casa vermelha. O sueco tem cachorros como animais de estimação. O dinamarquês bebe chá. A casa verde fica do lado esquerdo da casa branca. O homem que vive na casa verde bebe café. O homem que fuma Pall Mall cria pássaros. O homem que vive na casa amarela fuma Dunhill. O homem que vive na casa do meio bebe Leite. O homem que fuma Blends vive ao lado do que tem gatos. O homem que cria cavalos vive ao lado do que fuma Dunhill. O homem que fuma BlueMaster bebe cerveja. O alemão fuma Prince. O norueguês vive ao lado da casa azul. O homem que fuma Blends é vizinho do que bebe água. 1ª Casa 2ª Casa 3ª Casa 4ª Casa 5ª Casa Cor Nacionalidade Bebida Cigarro Animal Ao lidar com este tipo de passatempo você estará criando hipóteses, articulando informações, fazendo inferências, interpretando. Tudo apoiado num raciocínio lógicodedutivo, relacionando possibilidades, impossibilidades, exclusões. Essa é a ciência da lógica que une filosofia, matemática, física, biologia, enfim, todas as ciências. A ciência da lógica se apoia em cálculos proposicionais (proposições ou sentenças, operações lógicas, tabelas verdade, equivalências e implicações), regras de inferências, métodos de dedução de argumentos (com provas diretas ou indiretas) e cálculos de predicados (relações, predicados, interpretações). O conhecimento desta ciência o ajudará a estruturar declarações e elaborar argumentos na construção de fórmulas (em computação, também, chamado de algoritmos) que serão codificados compondo a solução de um problema, ou seja, o ajudará a criar o sistema. 119 www.metodista.br/ead Representação diagramática A receita para construir a solução do passatempo, inclui (na linha 3) "tome nota de suas observações". Essa regra é necessária, pois, aumentando a complexidade do problema irá gerar mais observações e consequentemente estas notas serão mais complexas. A receita dada para resolver o passatempo ainda é válida, principalmente se a regra de ouro da solução de problemas for aplicada: "Dividir para conquistar". Um problema do mundo real consiste de várias coleções de entidades interagindo um com o outro e com o meio ambiente. Para resolver o sistema é necessário encontrar uma representação simplificada do problema e construir a solução desta representação. Esta representação é chamada de modelo do problema. Um modelo é composto de objetos, cada um representando uma entidade do mundo real. O modelo deve incluir descrições dos objetos e suas interações. Quer um exemplo simples? Então, imagine um jogo de bola. Vamos começar a dividir nosso problema: um jogo de bola implica na existência de pessoas e bolas. Pronto, temos aqui duas entidades distintas do mundo real: de um lado, temos pessoas e, do outro, bolas. O próximo passo é descrever cada objeto e suas interações. Começaremos por pessoa: pessoa tem nome, altura, idade, peso, cor, cheiro, etc.; pessoa come, respira, se movimenta, chora, fala, joga, compra, vende, etc., etc.. Preste atenção nos etc. usados acima. Temos aqui que aplicar o conceito de abstração. O conceito de abstração é aplicado na descrição de objetos de um problema. Este envolve eliminar as características desnecessárias para a solução do problema. Um modelo deve incluir apenas aspectos relevantes do objeto no mundo real pertinentes ao problema que se deseja resolver. Consideremos então que pessoa terá um nome, idade, poderá jogar ou parar. Bola terá uma massa e poderá se mover ou parar. Conforme for aumentando a complexidade de nossos objetos, visualizar anotações ficará complicado e difícil. Por isso adotaremos diagramas na representação de objetos. O primeiro deles é chamado de diagrama de classe e se compõe de três partes: a identidade da classe, o estado da classe e o comportamento da classe. Sendo simplista podemos dizer que identidade é o nome da coleção, estado representa quantidades visíveis 120 Universidade Metodista de São Paulo de cada elemento da coleção e comportamento indica quais interações são possíveis para cada elemento da coleção. Assim teremos no nosso jogo de bola: E, num particular jogo entre pai e filho, teríamos: Os diagramas acima têm como base a prescrição da Unified Modeling Language (UML). São conhecidos como diagramas de objeto e é um diagrama que mostra uma vista parcial ou completa de uma estrutura do sistema modelada em um momento específico. O jogo se realizará através da troca de mensagens entre os objetos: José, João e a bola. Por exemplo, suponha que João tenha conseguido chutar a bola (jogar()) isso implica que a bola irá rolar para algum lugar (mover()). Os comportamentos jogar() e mover() são as mensagens enviadas por cada objeto, e isso envolve interação entre os objetos e os objetos e o meio ambiente. Neste momento, você deve estar imaginando: "Ufa! Construir sistemas não envolve tanta matemática quanto eu imaginava". Às vezes esta consideração é verdadeira, enquanto que em outros momentos não dá para escapar. Para simplificar, vamos supor que a bola estivesse parada. João, ao jogar, tenta chutar a bola. Se conseguir acertar, transmite parte de sua velocidade para a bola que se movimenta no piso até parar novamente. Bem, pode ser que seu sistema deva calcular quantos metros a bola se moveu até parar. Aí, após uma exaustiva pesquisa entre fórmulas e mais fórmulas, você encontra: 121 www.metodista.br/ead Um pouco de manipulação algébrica leva você a concluir que: onde é a velocidade inicial da bola, é o coeficiente de atrito da bola com o chão e éa aceleração da gravidade. Descrever em palavras as ações que seu programa terá que fazer é muito mais dispendioso que representar graficamente. Usaremos agora uma representação de fluxogramas ou diagrama de blocos. Olhando o fluxograma acima você percebe que a fórmula, antes bonita, escrita no Word ficou feia: virou vi*vi enquanto que ficou (2*u*g). Essa será uma de suas primeiras dificuldades, lembrar que compiladores não se importam com a estética e, sim, com comandos claros. Falando em comandos o que será que quer dizer o fluxograma acima? Dicionário dos símbolos: Símbolo Significado terminação, representa início ou final; decisão, cujo resultado pode ser verdadeiro ou falso processamento, geralmente, envolvendo armazenamento e expressões algébricas conector de fluxo indicação de direção a ser seguida 122 Universidade Metodista de São Paulo Agora fica claro a compreensão do comportamento mover() da classe Bola: a bola interage com a Pessoa João recebendo seu chute (ou não) e certa velocidade inicial ( ); a bola também interage com o meio ambiente e este valor é passado pelo coeficiente de atrito ( ). Se João acertou a bola, haverá um deslocamento de alguns metros (d = vi*vi/(2*u*g)), por outro lado, se ele não acertou, então, o deslocamento é zero (d=0). De qualquer forma, o deslocamento d irá retornar para o sistema. As representações diagramáticas descritas acima envolvem armazenamento de informações conhecidas como atributos, no caso dos diagramas de classe (nome, idade, massa), ou recebe o nome de variáveis, no caso de fluxogramas (vi, u, g, d). Tudo que envolve armazenamento deve ser bem especificado; afinal, você não despacharia um belo cristal numa caixa de calçados (tamanho 45) nem o par de calçados (tamanho 45) em um finíssimo porta-joias, pois o cristal se espatifaria e, talvez, nem os cadarços caberiam na caixinha. Na construção de sistemas, o mesmo ocorre. Com o avanço das soluções, você descobrirá que há valores reais (massa, valores monetários, distância, litros), valores inteiros (quantidade de pessoas, quantidade de carros, idade), valores do tipo String (nomes, marcas, cores), valores do tipo caracteres ('1', '&', 'a'), valores booleanos (true, false). Haverá a possibilidade de lidar com variáveis compostas de mesmo tipo (vetores, matrizes) e variáveis compostas misturando diversos tipos primitivos (como os descritos acima) ou compostos heterogêneos como os objetos. Vamos, então, aplicar estes conceitos de tipos de variáveis em nossos diagramas Pessoa e Bola. Pronto! A parte inicial do trabalho de construir um sistema está quase acabando. Agora é necessário construir testes que validem o raciocínio; especificar o hardware onde será implementado o sistema (inclusive definir se este sistema fará ou não parte de uma rede), codificar e criar o arquivo (que pode ser compilado ou interpretado) de maneira que o computador entenda; verificar se o comportamento do sistema atende completamente a solução encontrada, validar o sistema junto ao cliente, corrigir falhas encontradas no meio do caminho, etc., etc. Resumindo, vimos nesta introdução como se constrói um sistema. O primeiro passo é entender o que o cliente deseja e precisa. O segundo passo é usar regras de lógica e dedução nas informações de maneira a obter uma dentre muitas respostas possíveis. O terceiro, na realidade, é realizado em paralelo com o segundo passo, pois envolve anotar em forma diagramática as respostas parciais do grande problema chamado sistema. 123 www.metodista.br/ead Referências EVARISTO, Pedro. Raciocínio Lógico. São Paulo: Método, 2010. FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lógica de Programação. São Paulo: Pearson, 2005. GARRIDO, J. M. Object-Oriented Programming: From Problem Solving to Java. Hingham, Massachusetts - EUA: Charles River Media, 2003. MANZANO, J. A. N. G.; Oliveira, J. F. Algoritmos: Lógica para Desenvolvimento de Programação de Computadores. São Paulo: Érica, 2010. MORGADO, A. C.; CESAR, B. Raciocínio Lógico-Quantitativo. Rio de Janeiro: Elsevier, 2010. SALIBA, W. L. C. Técnicas de programação: Uma abordagem Estruturada. São Paulo: Pearson, 1992. 124 Universidade Metodista de São Paulo Lógica de programação Introdução ao desenvolvimento guiado por testes Prof. Rafael Guimarães Sakurai Objetivo: Apresentar uma introdução ao desenvolvimento guiado por testes (TDD), exemplificando como funciona o ciclo de desenvolvimento (red - green - refactor) utilizando o jUnit framework e demonstrar algumas técnicas de refatoração para melhorar a qualidade do código. Palavras-chave: TDD; JUnit framework; refatoração. www.metodista.br/ead Módulo “Desenvolvimento guiado por testes é um conjunto de técnicas que qualquer engenheiro de software pode seguir, que encoraja projetos simples e conjuntos de testes que inspiram confiança.” (BECK, 2010, p. 19). Utilizando as técnicas do desenvolvimento guiado por testes (TDD) você precisará dedicar um tempo pensando no que deve ser testado antes que possa realmente colocar a mão na massa e sair implementando um monte de códigos. Ele guiará você a desenvolver um código limpo evitando diversos problemas que nós, programadores, temos no dia a dia. Três leis do TDD Existem três leis no TDD, definidas por Martin (2011), que servem como guias durante o processo de desenvolvimento: Você não pode escrever código de produção a menos que ele tenha um teste de unidade que falha. Você não pode escrever mais teste de unidade que o suficiente para falhar; e erros de compilação são falhas. Você não pode escrever mais que o suficiente, para o código de produção passar em um teste de unidade. Durante o desenvolvimento, usando TDD, deve-se ter em mente que essas três leis serão seguidas, porque desta forma você será obrigado a testar sempre se a aplicação está funcionando e caso ocorra alguma falha saberá que nas poucas linhas de código que foram alteradas encontrase o problema que causou uma falha nos testes. Ciclo do desenvolvimento com TDD O ciclo fundamental do TDD adaptado de Freeman e Pryce (2009, p. 6). 126 Universidade Metodista de São Paulo O TDD segue um ciclo de desenvolvimento onde o desenvolvedor deve criar um teste unitário que irá falhar, logo em seguida deverá implementar o mínimo necessário para que este teste unitário funcione e, por último, deve ser feito uma refatoração na implementação para remover qualquer código duplicado. Escrever um teste unitário que falha permitirá ao desenvolvedor ter um objetivo rápido: fazer o teste funcionar implementando seu código. Fazer o teste funcionar implementando o mínimo necessário irá mostrar para o desenvolvedor que ele tem que implementar apenas o suficiente para o teste funcionar, sem ficar perdendo tempo em implementar algo que possa ocorrer no futuro. Refatorar irá melhorar a qualidade do código, pois algumas vezes a implementação mínima para fazer o teste funcionar possui muitos códigos duplicados ou não utilizou da melhor forma possível os conceitos da orientação a objetos. O objetivo final deste ciclo é que a aplicação possa ser implementada com um código limpo, com boas utilizações do conceito de orientação a objetos e permitindo uma fácil manutenção e expansão da aplicação. O que é teste unitário? Teste unitário é um teste de uma pequena parte da aplicação. Normalmente é testado se um método (às vezes pode ser mais que um método) está funcionando corretamente. Garantindo que cada pequena parte da aplicação está funcionando como deveria, podemos ter um controle melhor das alterações que estão sendo feitas dentro da aplicação. Após uma alteração na aplicação, podemos executar todos os testes unitários criados, verificando se não houve alteração em nenhuma outra parte da aplicação, pois, caso algum outro teste unitário da aplicação falhe, sabemos que foi causado pela alteração atual. Os testes podem ser utilizados como documentação do sistema. Dado que podemos definir nomes informativos para cada teste, eles também podem dar mais confiança durante o desenvolvimento, já que, se algum erro acontecer ou impactar outra funcionalidade do sistema, algum teste pode falhar. Exemplo de desenvolvimento guiado por testes Dado o chassi de um veículo, como, por exemplo, 9BP17164GA0000001, será necessário identificar qual o ano de fabricação deste veículo. Todo chassi possui um caractere alfa numérico (letra ou número) que possui esta informação. Neste exemplo de chassi, o caractere “A” na 10º posição informa que o veículo é do ano 2010. A tabela abaixo possui alguns valores e os anos que eles representam: Valor Ano A 2010 B 2011 C 2012 Antes de começar essa funcionalidade, precisamos pensar quais testes gostaríamos de fazer para que essa funcionalidade seja executada da melhor forma possível? 127 www.metodista.br/ead Poderíamos testar, por exemplo: • Testar se o chassi com o valor A retorna o ano 2010. • Testar se o chassi com o valor B retorna o ano 2011. • Testar se o chassi com o valor C retorna o ano 2012. • Testar se um chassi pode ser escrito com caracteres em maiúsculo ou minúsculo. • Testar se um chassi incompleto retorna um erro de informação inválida. Durante a implementação dos testes, novas dúvidas podem surgir e nada impede que adicionemos mais testes a essa lista inicial de testes. Primeiro será necessário criar um teste de algo que ainda não foi implementado. Mas o que testar, se nada existe? Dado o problema, sabemos que, ao informar o chassi 9BP17164GA0000001 e a posição 10, é esperado que a aplicação informe que o ano desse chassi é 2010. Portanto podemos criar uma classe contendo um teste que espera que isso aconteça. Observação: uma classe de teste unitário é uma classe Java comum que, no NetBeans, criamos dentro da pasta “Pacotes de testes”. Para criar uma classe de teste no NetBeans, clique com o botão direito sobre o projeto; em seguida, selecione a opção Novo -> Outro -> Selecione a categoria JUnit e o tipo de arquivo Testes JUnit e clique em Próximo. Informe qual o nome da classe ChassiUtilTest, informe o pacote tdd.chassi.util e desmarque as marcações nos itens Inicializador de testes, Finalizador de testes e Sugestões de código-fonte, clique em Próximo para continuar. Na primeira vez que um teste é criado dentro do NetBeans, será necessário informar qual a versão do JUnit será usado. Informe a versão JUnit 4.x e clique em Selecionar. A classe ChassiUtilTest foi criado, deixe-a como a seguinte classe: package br.metodista.ads1.guia.tdd; import org.junit.Test; import static org.junit.Assert.*; public class ChassiUtilTest { @Test public void testarAnoAChassi() { ChassiUtil util = new ChassiUtil(); assertEquals(2010, util.obterAno(“9BP17164GA0000001”, 10)); } } 128 Universidade Metodista de São Paulo Foi criada uma classe chamada ChassiUtilTest para realizar todos os testes. Nela criamos um método chamado testarAnoAChassi() que será utilizado para testar. Se o valor da posição do ano no chassi for A será informado que o ano do chassi é 2010. Na linguagem de programação Java, podemos utilizar um framework de testes chamado JUnit para auxiliar na criação dos testes, neste momento utilizamos a anotação @Test que serve para informar que este método testarAnoAChassi() deve ser executado como um teste do JUnit. Também foi utilizado o método assertEquals(valor1, valor2) que compara se os dois valores são iguais. Observação: o JUnit possui várias formas de testar condições afirmando valores, como, por exemplo: assertArrayEquals, assertEquals, assertFalse, assertNotNull, assertNotSame, assertThat e assertTrue. Neste primeiro momento, a classe ChassiUtilTest não irá nem compilar, porque a classe ChassiUtil não existe; portanto, ao executar os testes dessa classe, teremos a seguinte saída do JUnit: Para executar um teste no NetBeans, clique com o botão direito do mouse sobre a classe e selecione a opção “Testar arquivo”. Agora precisamos implementar apenas o suficiente para que o teste funcione. Crie a classe ChassiUtil que irá implementar o método obterAno(String chassi, int posicaoAno) retornando apenas o valor 2010. package br.metodista.ads1.guia.tdd; public class ChassiUtil { public int obterAno(String chassi, int posicaoAno) { return 2010; } } Foi criada uma implementação com o suficiente para que o teste funcione. Agora, ao executar o teste, teremos a seguinte saída do JUnit: Note que normalmente utilizamos o mesmo pacote para colocar a classe Java na implementação e na classe de teste. Como a implementação ainda é bem simples, podemos agora refatorar este método para implementa-lo de uma maneira melhor, como, por exemplo, verificar se o caractere na posição recebida como parâmetro tem o valor igual a “A”: 129 www.metodista.br/ead package br.metodista.ads1.guia.tdd; public class ChassiUtil { public int obterAno(String chassi, int posicaoAno) { /* Como os caracteres começam na posição zero, é necessário subtrair 1 da posição do ano informada. */ if(chassi.charAt(posicaoAno - 1) == ‘A’) return 2010; return 0; } } Agora que foi alterada a implementação, é necessário testar novamente para verificar se a alteração não irá causar a falha dos testes. Agora que o teste está funcionando e implementamos o mínimo necessário para ele funcionar, precisamos pensar em o que mais pode ser testado, como, por exemplo: se o chassi for informado com os caracteres em minúsculo 9bp17164ga0000001, será que ele irá funcionar? Adicione mais um teste na classe ChassiUtilTest, chamado testarAnoAMinusculoChassi() para testar se um chassi que possui os caracteres em minúsculo também irá retornar o ano corretamente. Observação: note que definimos os nomes dos testes bem informativos e específicos com o que será testado. package br.metodista.ads1.guia.tdd; import org.junit.Test; import static org.junit.Assert.*; public class ChassiUtilTest { @Test public void testarAnoAChassi() { ChassiUtil util = new ChassiUtil(); assertEquals(2010, util.obterAno(“9BP17164GA0000001”, 10)); } @Test public void testarAnoAMinusculoChassi() { ChassiUtil util = new ChassiUtil(); assertEquals(2010, util.obterAno(“9bp17164ga0000001”, 10)); } } 130 Universidade Metodista de São Paulo Vamos executar novamente os testes da classe ChassiUtilTeste: Ao executar os testes da classe ChassiUtilTest agora temos um erro no teste testarAnoAMinusculoChassi. Já havíamos refatorado a classe ChassiUtil e, mesmo assim, porque os testes não funcionam? A implementação do que está sendo testado cobre apenas o necessário para que os testes existentes funcionem, mas, conforme novos testes vão sendo adicionados, pode ocorrer que a implementação atual não trate uma determinada situação. Vamos refatorar novamente a classe ChassiUtil para que os dois testes atuais funcionem. Para isso, podemos apenas sempre converter o texto do chassi para maiúsculo antes de verificar o valor do caractere. package br.metodista.ads1.guia.tdd; public class ChassiUtil { public int obterAno(String chassi, int posicaoAno) { /* Como os caracteres começam na posição zero, é necessário subtrair 1 da posição do ano informada. */ if(chassi.toUpperCase().charAt(posicaoAno - 1) == ‘A’) return 2010; return 0; } } Vamos executar novamente os testes para verificar: Agora continuando os testes, precisamos testar se o chassi que possui o caractere ‘B’ tem o ano 2011. Então, vamos criar mais um teste: 131 www.metodista.br/ead package br.metodista.ads1.guia.tdd; import org.junit.Test; import static org.junit.Assert.*; public class ChassiUtilTest { @Test public void testarAnoAChassi() { ChassiUtil util = new ChassiUtil(); assertEquals(2010, util.obterAno(“9BP17164GA0000001”, 10)); } @Test public void testarAnoAMinusculoChassi() { ChassiUtil util = new ChassiUtil(); assertEquals(2010, util.obterAno(“9bp17164ga0000001”, 10)); } @Test public void testarAnoBChassi() { ChassiUtil util = new ChassiUtil(); assertEquals(2011, util.obterAno(“9BP17164GB0000001”, 10)); } } O método chamado testarAnoBChassi() foi utilizado para testar se o valor da posição do ano no chassi 9BP17164GB0000001 será informado que o ano do chassi é 2011. Ao testar novamente esta classe teremos a seguinte saída: O teste falhou porque ainda não foi implementado, portanto vamos implementar uma condição que quando o caractere da posição informada for igual a ‘B’ deve retornar o ano 2011. 132 Universidade Metodista de São Paulo package br.metodista.ads1.guia.tdd; public class ChassiUtil { public int obterAno(String chassi, int posicaoAno) { /* Como os caracteres começam na posição zero, é necessário subtrair 1 da posição do ano informada. */ if(chassi.toUpperCase().charAt(posicaoAno - 1) == ‘A’) return 2010; else if(chassi.toUpperCase().charAt(posicaoAno - 1) == ‘B’) return 2011; return 0; } } Agora que criamos uma implementação podemos testar novamente para verificar se todos os testes ainda estão funcionando. Ao criar cada teste e executá-lo, temos um retorno rápido informando se o que foi implementado irá funcionar, desta maneira podemos verificar se as novas alterações não irão causar a falha de algum e caso isso ocorra sabemos que foi a última alteração realizada na implementação que causou a falha dos testes. Continuando a implementação, precisamos testar se o chassi que possui o caractere ‘C’ tem o ano 2012. Então, vamos criar mais um teste: package br.metodista.ads1.guia.tdd; import org.junit.Test; import static org.junit.Assert.*; public class ChassiUtilTest { @Test public void testarAnoAChassi() { ChassiUtil util = new ChassiUtil(); assertEquals(2010, util.obterAno(“9BP17164GA0000001”, 10)); } 133 www.metodista.br/ead @Test public void testarAnoAMinusculoChassi() { ChassiUtil util = new ChassiUtil(); assertEquals(2010, util.obterAno(“9bp17164ga0000001”, 10)); } @Test public void testarAnoBChassi() { ChassiUtil util = new ChassiUtil(); assertEquals(2011, util.obterAno(“9BP17164GB0000001”, 10)); } @Test public void testarAnoCChassi() { ChassiUtil util = new ChassiUtil(); assertEquals(2012, util.obterAno(“9BP17164GC0000001”, 10)); } } O método chamado testarAnoCChassi() foi utilizado para testar se o valor da posição do ano no chassi 9BP17164GC0000001 será informado que o ano do chassi é 2012. Note que em todos os métodos criamos um objeto da classe ChassiUtil chamado util, para poder testar os métodos que ele possui. O JUnit possui uma anotação chamada @Before que é adicionado a um método para ser executado antes que comece a execução dos testes e uma anotação chamada @After que é adicionado a um método para ser executado após a execução de todos os métodos. Então, podemos alterar a classe de teste para criar o objeto da classe ChassiUtil antes de iniciar os testes, ao invés de ficar criando um objeto em cada teste. package br.metodista.ads1.guia.tdd; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; public class ChassiUtilTest { private ChassiUtil util = null; 134 Universidade Metodista de São Paulo @Before public void inicializar() { util = new ChassiUtil(); } @Test public void testarAnoAChassi() { assertEquals(2010, util.obterAno(“9BP17164GA0000001”, 10)); } @Test public void testarAnoAMinusculoChassi() { assertEquals(2010, util.obterAno(“9bp17164ga0000001”, 10)); } @Test public void testarAnoBChassi() { assertEquals(2011, util.obterAno(“9BP17164GB0000001”, 10)); } @Test public void testarAnoCChassi() { assertEquals(2012, util.obterAno(“9BP17164GC0000001”, 10)); } } Ao testar novamente esta classe, teremos a seguinte saída: O teste falhou porque ainda não foi implementado, portanto vamos implementar uma condição que quando o caractere da posição informada for igual a ‘C’ deve retornar o ano 2012. package br.metodista.ads1.guia.tdd; 135 www.metodista.br/ead public class ChassiUtil { public int obterAno(String chassi, int posicaoAno) { /* Como os caracteres começam na posição zero, é necessário subtrair 1 da posição do ano informada. */ if(chassi.toUpperCase().charAt(posicaoAno - 1) == ‘A’) return 2010; else if(chassi.toUpperCase().charAt(posicaoAno - 1) == ‘B’) return 2011; else if(chassi.toUpperCase().charAt(posicaoAno - 1) == ‘C’) return 2012; return 0; } } Vamos executar novamente os testes para verificar se agora o teste vai funcionar: Note que as últimas implementações foram uma cópia da implementação do primeiro teste, apenas alterando o valor do caractere e o retorno. Vamos refatorar esta classe, Ao invés de utilizarmos diversos testes, vamos calcular o ano baseado no caractere. package br.metodista.ads1.guia.tdd; public class ChassiUtil { public int obterAno(String chassi, int posicaoAno) { /* Como os caracteres começam na posição zero, é necessário subtrair 1 da posição do ano informada. */ char caractere = chassi.toUpperCase().charAt(posicaoAno - 1); return (caractere - ‘A’) + 2010; } } 136 Universidade Metodista de São Paulo O caractere ‘A’ equivale ao número 65, o caractere ‘B’ equivale ao número 66 e assim por diante; portanto, ao subtrair o caractere do chassi por ‘A’, teremos o valor que deve ser adicionado com 2010 para encontrar o ano informado. Vamos testar novamente para verificar se após estas alterações os testes continuarão a funcionar: Vamos adicionar mais um teste que espera obter uma exceção quando um chassi inválido for informado. package br.metodista.ads1.guia.tdd; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; public class ChassiUtilTest { private ChassiUtil util = null; @Before public void inicializar() { util = new ChassiUtil(); } @Test public void testarAnoAChassi() { assertEquals(2010, util.obterAno(“9BP17164GA0000001”, 10)); } @Test public void testarAnoAMinusculoChassi() { assertEquals(2010, util.obterAno(“9bp17164ga0000001”, 10)); } 137 www.metodista.br/ead @Test public void testarAnoBChassi() { assertEquals(2011, util.obterAno(“9BP17164GB0000001”, 10)); } @Test public void testarAnoCChassi() { assertEquals(2012, util.obterAno(“9BP17164GC0000001”, 10)); } @Test(expected=IllegalArgumentException.class) public void testarExcecaoDeChassiInvalido() { util.obterAno(“teste”, 10); } } O método testarExcecaoDeChassiInvalido() testa se o método obterAno recebendo um chassi inválido como por exemplo o valor “teste” lança uma exceção do tipo IllegalArgumentException (exceção de argumento inválido ou ilegal), para tratar que espera esta exceção adicionamos na anotação @Teste a propriedade expected que recebe como parâmetro a classe da exceção que será lançada. [REVER: está confusa a ideia do autor. Atenção na pontuação!!!] Execute os testes novamente para verificar a saída do JUnit: O teste mostra que era esperada a exceção IllegalArgumentException, mas o método lançou o erro StringIndexOutOfBoundException, porque não tratamos na implementação os textos de chassi inválidos. Vamos alterar a implementação para validar se o chassi possui um tamanho mínimo de 17 caracteres: 138 Universidade Metodista de São Paulo package br.metodista.ads1.guia.tdd; public class ChassiUtil { public int obterAno(String chassi, int posicaoAno) { if(chassi == null || chassi.trim().length() < 17) { throw new IllegalArgumentException(“O chassi informado é inválido!”); } /* Como os caracteres começam na posição zero, é necessário subtrair 1 da posição do ano informada. */ char caractere = chassi.toUpperCase().charAt(posicaoAno - 1); return (caractere - ‘A’) + 2010; } } Agora que validamos se o chassi informado é nulo ou possui um tamanho menor que 17 caracteres será lançada uma exceção IllegalArgumentException, para informar que o chassi é inválido. Vamos executar novamente os testes: Cobrimos diversos testes para tentar garantir que o método obterAno retorne a data correta baseado em um código de chassi e posição do ano no chassi. Pode ser que existam mais testes para serem realizados, mas para a solicitação inicial acredito que a quantidade de testes que fizemos irá cobrir grande parte dos problemas que poderiam ocorrer. Conclusão Com o TDD, é necessário pensar antes de sair escrevendo a implementação. Como sempre temos a fase da refatoração, é possível melhorar a qualidade do código a cada ciclo, evitando códigos duplicados e, durante o desenvolvimento, podemos ter maior segurança de que, durante uma alteração na implementação, os outros testes continuarão funcionando e, caso parem de funcionar, sabemos que a última alteração causou tais erros nos testes. 139 www.metodista.br/ead Referências BECK, Kent. TDD: Desenvolvimento Guiado por Testes. Porto Alegre: Bookman, 2010. 240 p. FOWLER, Martin. Refatoração: Aperfeiçoando o Projeto de Código Existente. Porto Alegre: Bookman, 2004. 365 p. FREEMAN, Steve; PRYCE, Nat. Growing Object-Oriented Software, Guided by Tests. Boston: Addison-wesley, 2009. 384 p. MARTIN, Robert C. The Three Laws of TDD. Disponível em: <http://butunclebob.com/ ArticleS.UncleBob.TheThreeRulesOfTdd>. Acesso em: 07 out. 2011. MASSOL, Vincent; HUSTED, Ted. JUnit em ação. Rio de Janeiro: Ciência Moderna, 2005. 432 p. _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ ____________________________________ 140 Universidade Metodista de São Paulo Lógica de programação O impacto do TDD no design da aplicação Prof. Rafael Guimarães Sakurai Objetivo: Apresentar os princípios SOLID (princípio de responsabilidade única, princípio do aberto fechado, princípio da substituição de Liskov, princípio da inversão de dependência e o princípio da segregação de interface) e como o TDD influencia um bom design da aplicação. Palavras-chave: TDD; design; SOLID; padrões de projeto. www.metodista.br/ead Módulo Durante o desenvolvimento guiado por testes (TDD) aprendemos a criar métodos e classes que possuem objetivos específicos, porque quando temos uma classe ou método com diversas responsabilidades, os testes começam a ficar complexos ou muito difíceis de serem feitos. Segundo Martin (2011), os princípios SOLID são boas práticas de desenvolvimento orientado a objetos que, ao serem seguidos, diminuem muito a dependência entre as classes, pois quanto maior a quantidade de dependências, mais difícil será testar as classes, os cinco primeiros princípios SOLID são: • O princípio da responsabilidade única: onde uma classe deve ter uma e apenas uma razão para ser alterada. • O princípio do aberto fechado: onde uma classe deve ser aberta para extensão e fechada para modificação. • O princípio da substituição de Liskov: classes derivadas devem ser substituídas por classes base. • O princípio da inversão de dependência: dependa de abstrações, não de classes concretas. • O princípio da segregação de interface: crie interfaces com boa granularidade para clientes específicos. Para apresentar alguns dos princípios SOLID, vamos criar uma funcionalidade para validar se a placa de um veículo pode circular durante o rodízio de veículos. A tabela a seguir apresenta os dias e o finais das placas que não podem circular: Dia Final da placa Segunda 1e2 Terça 3e4 Quarta 5e6 Quinta 7e8 Sexta 9e0 Então, por onde começamos a implementar o código? Criar uma classe valida as placas? Criar uma classe para representar os dias da semana? Nada disso, precisamos começar pensando o que precisamos testar e criar o primeiro teste que falhe. Inicialmente, vamos ter os seguintes testes: • Precisamos testar se as placas de final 1 e 2 não podem circular na segunda, mas podem circular na terça, quarta, quinta e sexta. • Precisamos testar se as placas de final 3 e 4 não podem circular na terça, mas podem circular na segunda, quarta, quinta e sexta. • Precisamos testar se as placas de final 5 e 6 não podem circular na quarta, mas podem circular na segunda, terça, quinta e sexta. • Precisamos testar se as placas de final 7 e 8 não podem circular na quinta, mas podem circular na segunda, terça, quarta e sexta. • Precisamos testar se as placas de final 9 e 0 não podem circular na sexta, mas podem circular na segunda, terça, quarta e quinta. 142 Universidade Metodista de São Paulo Vamos começar criando a classe de teste para testar se as placas de final 1 ou 2 não podem circular na segunda, mas podem circular na terça, quarta, quinta e sexta. package br.metodista.ads1.guia.tdd; import org.junit.Test; import static org.junit.Assert.*; public class PlacaUtilTest { @Test public void testarPlacaFinal1e2() { String placa = “AAA-1111”; assertFalse(PlacaUtil.podeCircularNoRodizio(placa, “Segunda”)); placa = “AAA-1112”; assertFalse(PlacaUtil.podeCircularNoRodizio(placa, “Segunda”)); } } Criamos a classe PlacaUtilTest para executar os testes usando o JUnit. Nele criamos o método testarPlacaFinal1e2() que verifica se as placas com final 1 ou 2 não podem circular na segunda-feira. Ao executar o teste, o JUnit já informa que não existe a classe PlacaUtil: Então, precisamos criar o mínimo necessário para fazer este teste funcionar: package br.metodista.ads1.guia.tdd; public class PlacaUtil { public static boolean podeCircularNoRodizio(String placa, String diaSemana) { return false; } } 143 www.metodista.br/ead Agora, se testarmos novamente, vamos ter um teste funcionando: Agora que o teste está funcionando, precisamos refatorar porque a implementação está funcionando, mas não está implementado corretamente, pois podemos utilizar os parâmetros recebidos para verificar se as placas podem circular no dia da semana. package br.metodista.ads1.guia.tdd; public class PlacaUtil { public static boolean podeCircularNoRodizio(String placa, String diaSemana) { if(“Segunda”.equals(diaSemana)) { return !(placa.endsWith(“1”) || placa.endsWith(“2”)); } return true; } } Agora estamos validando: se o dia da semana for “Segunda”, as placas não podem terminar com final 1 ou 2. Vamos executar o teste novamente para verificar se ainda está funcionando: Acredito que podemos melhorar nossos testes, validando se as placas com final 1 ou 2 podem circular na terça, quarta, quinta e sexta: package br.metodista.ads1.guia.tdd; import org.junit.Test; import static org.junit.Assert.*; public class PlacaUtilTest { @Test public void testarPlacaFinal1e2() { 144 Universidade Metodista de São Paulo String placa = “AAA-1111”; assertFalse(PlacaUtil.podeCircularNoRodizio(placa, “Segunda”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Terca”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quarta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quinta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Sexta”)); placa = “AAA-1112”; assertFalse(PlacaUtil.podeCircularNoRodizio(placa, “Segunda”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Terca”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quarta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quinta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Sexta”)); } } Vamos executar os testes para verificar: Como os testes estão funcionando e fizemos uma implementação que, baseada nos parâmetros, consegue verificar se as placas com final 1 ou 2 não podem circular apenas na segunda, vamos continuar e criar mais um teste para verificar se as placas com final 3 ou 4 não podem circular na terça. package br.metodista.ads1.guia.tdd; import org.junit.Test; import static org.junit.Assert.*; public class PlacaUtilTest { @Test public void testarPlacaFinal1e2() { String placa = “AAA-1111”; assertFalse(PlacaUtil.podeCircularNoRodizio(placa, “Segunda”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Terca”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quarta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quinta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Sexta”)); 145 www.metodista.br/ead placa = “AAA-1112”; assertFalse(PlacaUtil.podeCircularNoRodizio(placa, “Segunda”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Terca”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quarta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quinta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Sexta”)); } @Test public void testarPlacaFinal3e4() { String placa = “AAA-1113”; assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Segunda”)); assertFalse(PlacaUtil.podeCircularNoRodizio(placa, “Terca”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quarta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quinta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Sexta”)); placa = “AAA-1114”; assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Segunda”)); assertFalse(PlacaUtil.podeCircularNoRodizio(placa, “Terca”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quarta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Quinta”)); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, “Sexta”)); } } Vamos testar novamente para verificar se o teste irá funcionar: Opa! Está faltando a implementação para verificar se as placas com final 3 ou 4 não podem circular na terça. Então, vamos implementá-lo. Já fizemos o código para a segunda, o código da terça é bem parecido: 146 Universidade Metodista de São Paulo package br.metodista.ads1.guia.tdd; public class PlacaUtil { public static boolean podeCircularNoRodizio(String placa, String diaSemana) { if(“Segunda”.equals(diaSemana)) { return !(placa.endsWith(“1”) || placa.endsWith(“2”)); } else if(“Terca”.equals(diaSemana)) { return !(placa.endsWith(“3”) || placa.endsWith(“4”)); } return true; } } Então adicionamos mais um if para verificar se na “Terca” as placas com final 3 ou 4 não podem circular. Vamos testar novamente para ver o resultado: Mais um teste funcionando, agora vamos para a refatoração. O que fizemos agora para funcionar foi aumentar a complexidade deste código, porque se continuar assim vamos ter uma sequência de pelo menos 5 ifs. Olha o caos chegando! Como podemos refatorar este código para evitar esse monte de ifs? E se criarmos uma interface chamada Dia que possui um método podeCircular(String placa) que verifica se uma determinada placa pode circular em uma classe que implementa essa interface Dia? Teríamos algo como a figura abaixo: 147 www.metodista.br/ead A interface Dia possui uma classe para cada dia da semana que tem rodízio e cada uma delas será responsável por verificar se nesse dia uma determinada placa pode circular. Vamos criar a interface Dia e a classe Segunda que irá validar se a placa podeCircular. Opa! Calma aí, estamos esquecendo algo? Seguindo o TDD, primeiro vamos testar se isso funciona. Então a primeira coisa a se fazer é criar outra classe de Teste. Observação: às vezes, quando estamos refatorando e encontramos uma solução, queremos sair implementando o código, mas precisamos lembrar que estamos seguindo as boas práticas do TDD, por isso temos sempre que testar antes de começar a escrever alguma implementação. package br.metodista.ads1.guia.tdd; import org.junit.Test; import static org.junit.Assert.*; public class DiaTest { @Test public void podeCircularSegundaFinal1e2() { Dia dia = new Segunda(); assertFalse(dia.podeCircular(“AAA-1111”)); assertFalse(dia.podeCircular(“AAA-1112”)); } } Criamos a classe DiaTest que terá os métodos de teste dos dias. Nela criamos o método podeCircularSegundaFinal1e2() para verificar se na Segunda não pode circular as placas de final 1 ou 2. Vamos executar o teste para ver a saída do JUnit: Como ainda não criamos a interface Dia e a classe Segunda, o código do teste nem compila; então, agora vamos implementar o mínimo necessário para fazer este teste passar. A interface Dia tem apenas a assinatura do método podeCircular(String placa): package br.metodista.ads1.guia.tdd; public interface Dia { public boolean podeCircular(String placa); } E na classe Segunda implementamos a interface Dia e implementamos o método podeCircular(String placa): 148 Universidade Metodista de São Paulo package br.metodista.ads1.guia.tdd; public class Segunda implements Dia { @Override public boolean podeCircular(String placa) { return false; } } Vamos testar agora a classe DiaTest e verificar a saída do JUnit: Implementamos o mínimo necessário. Agora, vamos refatorar a classe Segunda para implementar se a placa recebida como parâmetro pode circular: package br.metodista.ads1.guia.tdd; public class Segunda implements Dia { @Override public boolean podeCircular(String placa) { return !(placa.endsWith(“1”) || placa.endsWith(“2”)); } } Vamos testar novamente para verificar se o teste ainda está funcionando, depois da refatoração: Agora precisamos testar os outros dias da semana. Para não prolongar muito o texto, vou criar agora todos os testes dos dias da semana (o correto é ir fazendo passo a passo cada teste), a classe DiaTest vai ficar com os seguintes testes: package br.metodista.ads1.guia.tdd; import org.junit.Test; import static org.junit.Assert.*; 149 www.metodista.br/ead public class DiaTest { @Test public void podeCircularSegundaFinal1e2() { Dia dia = new Segunda(); assertFalse(dia.podeCircular(“AAA-1111”)); assertFalse(dia.podeCircular(“AAA-1112”)); } @Test public void podeCircularTercaFinal3e4() { Dia dia = new Terca(); assertFalse(dia.podeCircular(“AAA-1113”)); assertFalse(dia.podeCircular(“AAA-1114”)); } @Test public void podeCircularQuartaFinal5e6() { Dia dia = new Quarta(); assertFalse(dia.podeCircular(“AAA-1115”)); assertFalse(dia.podeCircular(“AAA-1116”)); } @Test public void podeCircularQuintaFinal7e8() { Dia dia = new Quinta(); assertFalse(dia.podeCircular(“AAA-1117”)); assertFalse(dia.podeCircular(“AAA-1118”)); } @Test public void podeCircularSextaFinal9e0() { Dia dia = new Sexta(); assertFalse(dia.podeCircular(“AAA-1119”)); assertFalse(dia.podeCircular(“AAA-1110”)); } } 150 Universidade Metodista de São Paulo Agora, ao executar os testes, teremos vários erros, porque não existem as classes Terca, Quarta, Quinta e Sexta. Agora vamos implementar as classes. Na classe Terca, verificamos que as placas com final 3 e 4 não podem circular: package br.metodista.ads1.guia.tdd; public class Terca implements Dia { @Override public boolean podeCircular(String placa) { return !(placa.endsWith(“3”) || placa.endsWith(“4”)); } } Na classe Quarta, verificamos que as placas com final 5 e 6 não podem circular: package br.metodista.ads1.guia.tdd; public class Quarta implements Dia { @Override public boolean podeCircular(String placa) { return !(placa.endsWith(“5”) || placa.endsWith(“6”)); } } Na classe Quinta, verificamos que as placas com final 7 e 8 não podem circular: package br.metodista.ads1.guia.tdd; public class Quinta implements Dia { @Override 151 www.metodista.br/ead public boolean podeCircular(String placa) { return !(placa.endsWith(“7”) || placa.endsWith(“8”)); } } Na classe Sexta, verificamos que as placas com final 9 e 0 não podem circular: package br.metodista.ads1.guia.tdd; public class Sexta implements Dia { @Override public boolean podeCircular(String placa) { return !(placa.endsWith(“9”) || placa.endsWith(“0”)); } } Agora vamos testar novamente: Os testes estão funcionando para todos os dias. Agora queremos usar as classes que implementam o Dia para verificar as placas. Então, vamos alterar o teste inicial: package br.metodista.ads1.guia.tdd; import org.junit.Test; import static org.junit.Assert.*; public class PlacaUtilTest { @Test public void testarPlacaFinal1e2() { String placa = “AAA-1111”; assertFalse(PlacaUtil.podeCircularNoRodizio(placa, new Segunda())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Terca())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quarta())); 152 Universidade Metodista de São Paulo assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quinta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Sexta())); placa = “AAA-1112”; assertFalse(PlacaUtil.podeCircularNoRodizio(placa, new Segunda())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Terca())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quarta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quinta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Sexta())); } @Test public void testarPlacaFinal3e4() { String placa = “AAA-1113”; assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Segunda())); assertFalse(PlacaUtil.podeCircularNoRodizio(placa, new Terca())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quarta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quinta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Sexta())); placa = “AAA-1114”; assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Segunda())); assertFalse(PlacaUtil.podeCircularNoRodizio(placa, new Terca())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quarta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quinta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Sexta())); } } Outra vantagem que ganhamos ao utilizar as classes é que não precisamos ficar escrevendo os dias da semana como String, basta utilizar a referência das classes. Então, vamos testá-lo: Os testes falharam, porque o método podeCircularNoRodizio não recebe um Dia como parâmetro. Ele está esperando receber uma String. Se tivéssemos seguido o raciocínio inicial, teríamos esse monte de ifs aninhados: 153 www.metodista.br/ead public class PlacaUtil { public static boolean podeCircularNoRodizio(String placa, String diaSemana) { if(“Segunda”.equals(diaSemana)) { return !(placa.endsWith(“1”) || placa.endsWith(“2”)); } else if(“Terca”.equals(diaSemana)) { return !(placa.endsWith(“3”) || placa.endsWith(“4”)); } else if(“Quarta”.equals(diaSemana)) { return !(placa.endsWith(“5”) || placa.endsWith(“6”)); } else if(“Quinta”.equals(diaSemana)) { return !(placa.endsWith(“7”) || placa.endsWith(“8”)); } else if(“Sexta”.equals(diaSemana)) { return !(placa.endsWith(“9”) || placa.endsWith(“0”)); } return true; } } Mas como criamos as classes para representar os Dias, podemos alterar este método para receber como parâmetro uma classe que implementa a interface Dia e deixar esta classe fazer a verificação da placa. Então, a classe fica assim: package br.metodista.ads1.guia.tdd; public class PlacaUtil { public static boolean podeCircularNoRodizio(String placa, Dia dia){ return dia.podeCircular(placa); } } Note que a orientação a objetos permitiu melhorar o código. Ele ficou mais limpo e menos complexo. Vamos executar novamente para verificar se os testes vão funcionar: 154 Universidade Metodista de São Paulo Agora vamos pensar como seria usar este método na prática. Digamos que queremos validar a placa no dia de hoje, mas que dia é hoje? Como obter o dia atual? Como fazer um teste que funcione em qualquer dia da semana que tenha rodízio? Vamos criar mais uma classe de teste. Primeiro, vamos criar um teste para obter um dia de rodízio a partir de um número: package br.metodista.ads1.guia.tdd; import org.junit.Test; import static org.junit.Assert.*; public class DiaUtilTest { @Test public void testarCriacaoDeDia() { assertTrue(DiaUtil.getDia(2) instanceof Segunda); assertTrue(DiaUtil.getDia(3) instanceof Terca); assertTrue(DiaUtil.getDia(4) instanceof Quarta); assertTrue(DiaUtil.getDia(5) instanceof Quinta); assertTrue(DiaUtil.getDia(6) instanceof Sexta); } } Vamos testar a classe para ver a saída do JUnit: Falhou porque ainda não existe a classe DiaUtil e nem o método getDia(int dia). Portanto vamos criar o mínimo necessário para fazer o teste funcionar. package br.metodista.ads1.guia.tdd; public class DiaUtil { public static Dia getDia(int dia) { if(dia == 2) { return new Segunda(); } else if(dia == 3) { return new Terca(); 155 www.metodista.br/ead } else if(dia == 4) { return new Quarta(); } else if(dia == 5) { return new Quinta(); } else if(dia == 6) { return new Sexta(); } return null; } } Criamos uma implementação que, de acordo com o dia em inteiro, ele retorna um objeto que representa o dia da semana. Vamos executar o teste para verificar se ele vai funcionar: O teste está funcionando, mas a implementação que foi feita é cheia de ifs. Acredito que agora na fase da refatoração podemos melhorar este código. O que podemos fazer para acabar com esses ifs? Pense um pouco em algumas soluções que podem ser feitas para melhorar este código antes de prosseguir. Uma forma para melhorar este código seria criarmos um mapa que contém objetos que representam o dia da semana e a chave seria o número inteiro que representa o dia. Então, vamos refatorar a classe DiaUtil. package br.metodista.ads1.guia.tdd; import java.util.HashMap; import java.util.Map; public class DiaUtil { private static final Map<Integer, Dia> dias = new HashMap<Integer, Dia>(); static { dias.put(2, new Segunda()); dias.put(3, new Terca()); dias.put(4, new Quarta()); dias.put(5, new Quinta()); dias.put(6, new Sexta()); 156 Universidade Metodista de São Paulo } public static Dia getDia(int dia) { return dias.get(dia); } } Agora para obter um objeto dia, basta apenas pegá-lo no mapa. Esta estratégia funciona bem porque não guardamos valores de instância dentro do objeto; portanto os objetos podem ficar previamente criados. Se houver a necessidade de guardar valores de instância dentro do objeto, precisaríamos criá-lo sempre que for necessário. Neste caso, poderíamos usar, por exemplo, uma Enum que conhece o tipo da classe e pode criar o objeto baseado no dia. Pense nisso e depois tente criar uma implementação. Vamos testar novamente para verificar se ainda funciona depois da refatoração. Vamos adicionar mais um teste agora na classe PlacaUtil, onde iremos validar se um veículo pode circular no dia de hoje. package br.metodista.ads1.guia.tdd; import java.util.Calendar; import org.junit.Test; import static org.junit.Assert.*; public class PlacaUtilTest { @Test public void testarPlacaFinal1e2() { String placa = “AAA-1111”; assertFalse(PlacaUtil.podeCircularNoRodizio(placa, new Segunda())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Terca())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quarta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quinta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Sexta())); 157 www.metodista.br/ead placa = “AAA-1112”; assertFalse(PlacaUtil.podeCircularNoRodizio(placa, new Segunda())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Terca())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quarta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quinta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Sexta())); } @Test public void testarPlacaFinal3e4() { String placa = “AAA-1113”; assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Segunda())); assertFalse(PlacaUtil.podeCircularNoRodizio(placa, new Terca())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quarta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quinta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Sexta())); placa = “AAA-1114”; assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Segunda())); assertFalse(PlacaUtil.podeCircularNoRodizio(placa, new Terca())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quarta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Quinta())); assertTrue(PlacaUtil.podeCircularNoRodizio(placa, new Sexta())); } @Test public void testarPlacaHoje() { int dia = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); if(dia == 2) { // Segunda-feira testDia(“1”, “2”, “3”); } else if(dia == 3) { // Terça-feira testDia(“3”, “4”, “1”); } else if(dia == 4) { // Quarta-feira testDia(“5”, “6”, “1”); } else if(dia == 5) { // Quinta-feira testDia(“7”, “8”, “1”); } else if(dia == 6) { // Sexta-feira 158 Universidade Metodista de São Paulo testDia(“9”, “0”, “1”); } } private void testDia(String ... args) { String placa = “AAA-111”; assertFalse(PlacaUtil.podeCircularHoje(placa + args[0])); assertFalse(PlacaUtil.podeCircularHoje(placa + args[1])); assertTrue(PlacaUtil.podeCircularHoje(placa + args[2])); } } Através da classe java.util.Calendar podemos pegar o dia da semana e, de acordo com o número do dia da semana, é passado um conjunto diferente de valores para testar. Assim podemos testar todos os dias que tem rodízio e passamos apenas o número da placa para o método podeCircularHoje(String placa). Vamos testar para ver a saída do JUnit: O JUnit já informa que o método podeCircularHoje(String hoje) não existe. Então, vamos implementar o mínimo para ele funcionar. package br.metodista.ads1.guia.tdd; import java.util.Calendar; public class PlacaUtil { public static boolean podeCircularNoRodizio(String placa, Dia dia){ return dia.podeCircular(placa); } public static boolean podeCircularHoje(String placa) { Dia dia = DiaUtil.getDia(Calendar.getInstance().get(Calendar.DAY_OF_WEEK)); return dia.podeCircular(placa); } } 159 www.metodista.br/ead Vamos testar novamente para ver se funciona: Ficamos com as seguintes classes: Conclusão Desenvolvendo com as boas práticas do TDD precisamos pensar antes de começar a desenvolver e depois precisamos pensar também para poder refatorar. Desta forma, podemos ter um código com uma qualidade melhor, com um design que facilitará futuras manutenções no código. Referências BECK, Kent. TDD: Desenvolvimento Guiado por Testes. Porto Alegre: Bookman, 2010. 240 p. FREEMAN, Eric; FREEMAN, Elisabeth. Use a Cabeça! Padrões de Projetos. 2. ed. Rio de Janeiro: Alta Books, 2007. 496 p. GAMMA, Erich et al. Padrões de Projeto: Soluções Reutilizáveis de Software Orientado a Objetos. Porto Alegre: Bookman, 2007. 350 p. MARTIN, Robert C. The Principles of OOD. Disponível em: <http://butunclebob.com/ ArticleS. UncleBob.PrinciplesOfOod>. Acesso em: 07 out. 2011. 160 Universidade Metodista de São Paulo Programação orientada a objetos Módulo Introdução à programação com Java Prof. Cristiano Camilo dos Santos de Almeida Objetivo: Apresentar a plataforma de desenvolvimento Java, uma introdução a tipos primitivos, operadores e entrada de dados via console. Palavras-chave: Java; Java Virtual Machine; Tipos Primitivos; Operadores; java.util.Scanner www.metodista.br/ead Introdução à linguagem de programação Java A linguagem Java A Linguagem JAVA surgiu a partir de uma pesquisa financiada pela Sun Microsystems em 1991, iniciada sob o codinome de projeto Green. Com o intuito de se tornar uma linguagem para dispositivos inteligentes destinados ao usuário final e com a premissa de ser uma linguagem próxima às linguagens C e C++ e que pudesse ser executado em diversos hardwares. A princípio, o projeto não teve bons resultados devido à lentidão do crescimento da área de dispositivos eletrônicos inteligentes, porém com a grande revolução da World Wide Web em 1993, logo se notou o potencial da linguagem para geração de conteúdo dinâmico, o que deu nova força ao projeto. Inicialmente, Java foi batizada de Oak por seu criador (James Gosling). Tempos mais tarde, descobriu-se que já existia uma linguagem de programação chamada Oak. Com isso, em uma visita da equipe de desenvolvimento a uma cafeteria local, o nome Java surgiu (nome do café) e logo foi denominada a linguagem. Em março de 1995, foi anunciado no evento SunWorld a tecnologia Java 1.0. Inicialmente, o foco principal da tecnologia, utilizado para divulgação, foram os Applets, pequenas aplicações que poderiam ser executadas via web através de um browser. Em 1998, foi lançada a versão 1.2 (codinome “Playground”) da linguagem Java. Esta nova versão trouxe uma quantidade muito grande de novas funcionalidades. Tal alteração foi tão grande que a pessoa do marketing começou a chamá-la de Java 2. As versões 1.3 (codinome “Kestrel”), lançada em 2000, e 1.4 (codinome “Merlin”), lançada em 2002, continuaram sendo chamadas de Java 2, pois houveram alterações e melhorias na linguagem, mas não tão grandes como na versão 1.2. Na versão 1.5, lançada em 2004, a empresa proprietária da tecnologia optou por mudar novamente a nomenclatura da linguagem, passando a chamá-la de Java 5 (codinome “Tiger”), a partir desta versão foi padronizado as novas atualizações. Em 2006, o Java 6 (codinome “Mustang”) foi lançado e, por fim, a versão 7, de codinome “Dolphin”, foi lançada em 2011. Java também é uma linguagem Open Source e não possui um único dono. Todas as novas atualizações da linguagem são feitas através da JCP (Java Community Process), formada por um conjunto de empresas. Plataforma Java Atualmente, possuímos na linguagem Java os mais diferentes segmentos, desde o desenvolvimento de aplicações console, desktop, até aplicações Web e, por fim, os dispositivos portáteis, tais como celulares e pagers. 162 Universidade Metodista de São Paulo Visão geral do Java Standard Edition Figura 1: APIs disponíveis dentro da plataforma Java SE Fonte: http://www.oracle.com/technetwork/java/javase/tech/index.html Há dois principais produtos dentro da plataforma Java SE: Java Runtime Environment (JRE) e Java Development Kit (JDK). O JRE fornece a Java Virtual Machine, bibliotecas e outros componentes para executar aplicações escritas em Java. O JDK contém tudo o que tem na JRE, mais ferramentas adicionais para desenvolver (compilar e debugar) aplicações feitas em Java. Java Virtual Machine A Java Virtual Machine é uma máquina imaginária que é implementada através da emulação em software. Existe uma JVM diferente para cada Sistema Operacional (SO) e uma vez que sua aplicação é criada, a mesma pode ser executada em diversos SO através da JVM sem ter que ser recompilado. O código que é executado pela JVM são os bytecodes. Quando um arquivo .java é criado, o mesmo precisa ser compilado para .class. Essa compilação converte os códigos Java para bytecodes e a JVM se encarrega de executar os bytecodes e fazer a integração com o SO. 163 www.metodista.br/ead Fases da programação Java: Figura 2: Fases da programação Java. Compilando um código em linha de comando Durante o desenvolvimento de aplicações utilizando a linguagem Java, precisamos criar arquivos com a extensão .java. Vamos utilizar o seguinte exemplo, pertencente a um arquivo chamado PrimeiraClasse.java: /** * Exemplo de uma classe em Java. */ public class PrimeiraClasse { public static void main(String[] args) { System.out.println(“ Hello World !!!”); } } Depois de criado este arquivo, acessando a linha de comando, executaremos o seguinte comando para compilar a classe PrimeiraClasse.java: javac PrimeiraClasse.java A aplicação javac é responsável por compilar o arquivo .java gerando o arquivo .class de bytecode. Após a execução deste comando, um arquivo com bytecode Java será criado em disco, com o seguinte nome: PrimeiraClasse.class. Um ponto importante da linguagem é que ele é case sensitive, ou seja, a letra ‘a’ em minúsculo é diferente da letra ‘A’ em maiúsculo. Caso escrevamos o código Java, como, por exemplo, “Public” com ‘P’ maiúsculo ou “string” com o ‘s’ minúsculo, teremos um erro de compilação. Para os iniciantes na linguagem este é um dos maiores problemas encontrados durante a compilação. Agora, para executarmos nosso novo arquivo compilado Java, basta submetê-lo a máquina virtual Java, através do seguinte comando: java PrimeiraClasse 164 Universidade Metodista de São Paulo Note que, apesar de não estarmos utilizando a extensão, o arquivo submetido foi o arquivo .class. A aplicação java (utilizada na linha de comando), compõe tanto o pacote da JDK como da JRE. C:\>javac PrimeiraClasse.java C:\>java PrimeiraClasse Hello World!!! Quando executamos java PrimeiraClasse, o Java começa a executar os códigos do nosso programa. Nesse caso, o método public static void main(String[] args) é chamado. O método main é o início de tudo, a partir da main você pode iniciar seu programa, se preciso pode chamar outras classes, outros métodos, etc. Comentários em Java Durante o desenvolvimento de um software é muito importante escrever comentários explicando os códigos fontes, pois facilita tanto o desenvolvimento do código como sua manutenção. A linguagem Java fornece três formas diferentes de escrever comentários: // -> Comentário de uma única linha /* Comentário longo com mais de uma linha */ /** * Javadoc * Mais informações sobre o Javadoc no apêndice B. */ Exemplo: /** * Classe utilizada para demonstrar o uso de comentários. * * Depois que uma classe Java é compilada, os comentários não vão * para os códigos compilados .class, dessa forma os comentários * não interferem no tamanho final do projeto. */ public class ExemploComentario { public static void main(String[] args) { //Imprime uma mensagem para o usuario. System.out.println(“Demonstrando o uso dos comentários.”); /* Podemos utilizar esta forma quando queremos escrever um comentário mais longo para exemplicar o código. */ } } 165 www.metodista.br/ead Na primeira linha estamos criando um comentário do tipo javadoc. Este tipo de linha de comentário inicia-se por uma barra e dois asteriscos e se estende por sete linhas. Já na décima linha, temos um exemplo de um comentário simples de uma linha. Por fim, ao final do código da classe, usamos o comentário longo que pode ser utilizado por várias linhas. Variáveis Uma variável é um objeto normalmente localizado na memória utilizado para representar valores. Quando declaramos uma variável estamos associando seu nome (identificador) ao local da memória onde está armazenada sua informação. As variáveis em Java podem ser do tipo primitivo ou objeto: • Variáveis primitivas: podem ser do tipo byte, short, int, long, float, double, char ou boolean. • Variáveis de referência: usada para referenciar um objeto. Quando usamos uma variável de referência definimos qual o tipo do objeto ou um subtipo do tipo do objeto (veremos isso mais a frente). Quando declaramos uma variável primitiva, estamos associando-a a um espaço na memória que vai guardar o seu valor. No caso da variável de referência, podemos tê-la apontando para algum lugar vazio (null) ou para algum espaço da memória que guarda os dados de um objeto. As variáveis primitivas e de referência são guardadas em locais diferentes da memória. Variáveis primitivas ficam em um local chamado stack e as variáveis de referência ficam em um local chamado heap. _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ____________________________________ ____________________________________ 166 Universidade Metodista de São Paulo Tipos primitivos A linguagem Java não é totalmente Orientada a Objetos, e isto se deve principalmente aos atributos do tipo primitivo, pois são tipos de dados que não representam classes, mas sim valores básicos. Os tipos primitivos, assim como em várias outras linguagens tais como o C, existem para representar os tipos mais simples de dados, sendo eles dados numérico, booleano e caractere. Os tipos primitivos da linguagem Java são: TTipos PPrimitivo MMenor valor possível MMaior valor possível TTamanho IInteiro bbyte --128 1127 88 bits sshort --32768 332767 116 bits iint --2.147.483.648 22.147.483.647 332 bits int ex3 = 1; 664 bits long ex4 = 1l; 332 bits float ex5 = 5.50f; llong PPonto Flutuante --9.223.372.036.854.770.000 99.223.372.036.854.770.000 ffloat --1,4024E-37 33.40282347E + 38 ddouble --4,94E-307 11.79769313486231570E + 308 664 bits CCaractere cchar 00 665535 116 bits BBooleano bboolean ffalse ttrue 11 bit Exemplo byte ex1 = (byte)1; short ex2 = (short)1; double ex6 = 10.20d; ou double ex6 = 10.20; char ex7 = 194; ou char ex8 = 'a'; boolean ex9 = true; Tabela 1: Tipos primitivos do Java. É importante lembrar que na linguagem Java, os Arrays e Strings são Classes (veremos isso mais adiante). Tipos inteiros (byte, short, int ou long) Tipos inteiros trabalham apenas com números inteiros, positivos ou negativos. Os valores podem ser representados nas bases octal, decimal e hexadecimal. Inteiro em octal Qualquer valor escrito utilizando números de 0 a 7 começando com 0 é um valor na base octal, por exemplo: byte a = 011; short s = 010; int i = 025; // Equivale ao valor 9 em decimal. // Equivale ao valor 8 em decimal. // Equivale ao valor 21 em decimal. 167 www.metodista.br/ead Inteiro em decimal Qualquer valor escrito utilizando números de 0 a 9 é um valor decimal .Este é o tipo de representação mais comum uma vez que é utilizada no dia a dia, por exemplo: int i = 9; long b = 9871342132; Inteiro em hexadecimal Qualquer valor escrito utilizando números de 0 a 9 e A a F, começando com 0x ou 0X é um valor hexadecimal, exemplo: long a = 0xCAFE; int b = 0X14a3; // Equivale ao valor 51966 em decimal // Equivale ao valor 5283 em decimal Quando um número precisa ser especificado como um long, ele pode vir acompanhado por l ou L depois do seu valor, por exemplo: long a = 0Xcafel; long b = 0752L; long c = 987654321L; Tipos de ponto flutuante (float ou double) Tipos de ponto flutuante servem para representar números com casas decimais, tanto negativos quanto positivos. Todos os números com ponto flutuante são por padrão do tipo double, mas é possível especificar o tipo do valor durante a criação Para float utilize f ou F e, se quiser, pode especificar para double usando d ou D, por exemplo: float a = 10.99f; double b = 10.3D; floaf c = 1.99; // Erro de compilação, pois o padrão do valor é double. Tipo caractere O tipo caractere, como o próprio nome já diz, serve para representar um valor deste tipo. Sua inicialização permite 2 modelos: char a = ‘a’; char b = 97; //Equivale a letra ‘a’ 168 Universidade Metodista de São Paulo Os caracteres podem ser representados por números e possuem o mesmo tamanho que um atributo do tipo short, dessa forma, podemos representar a tabela Unicode, por exemplo: char u = ‘\u0025’; //Equivale ao caracter ‘%’ OBS: O Unicode é no formato hexadecimal, portanto o exemplo anterior ‘0025’ equivale a 37 na base decimal. Tipo booleano Tipo que representa valores lógicos true (verdadeiro) ou false (falso), por exemplo: boolean a = true; boolean b = false; As palavras true, false e null representam valores básicos e não podem ser utilizados na declaração de atributos, métodos ou classes. Conversão de tipos primitivos Na linguagem Java, é possível atribuir o valor de um tipo de variável a outro tipo de variável, porém, para tal, é necessário que esta operação seja apontada ao compilador. A este apontamento damos o nome de casting. É possível fazer conversões de tipos de ponto flutuante para inteiros, e inclusive entre o tipo caractere, porém estas conversões podem ocasionar a perda de valores, quando se molda um tipo de maior tamanho, como um double dentro de um int. O tipo de dado boolean é o único tipo primitivo que não suporta casting. Segue, abaixo, uma tabela com todos os tipos de casting possíveis: Tabela 2: Casting implícito dos tipos primitivos do Java. 169 www.metodista.br/ead Para fazer um casting, basta sinalizar o tipo para o qual se deseja converter entre parênteses, da seguinte forma: float a = (float) 5.0; Conversão do double 5.0 para float. int b = (int) 5.1987; Conversão de double para int. float c = 100; Conversão de int para float é implícito, não precisa de casting. int d = ‘d’; Conversão de char para int é implícito, não precisa de casting. O casting ocorre implicitamente quando adiciona uma variável de um tipo menor que o tipo que receberá esse valor. /** * Exemplo de conversão de tipos primitivos utilizando casting. */ public class ExemploCasting { public static void main(String[] args) { /* Casting feito implicitamente, pois o valor possui um tamanho menor que o tipo da variavel que irá recebe-lo. */ char a = ‘a’; int b = ‘b’; float c = 100; System.out.println(a); // Imprime a System.out.println(b); // Imprime 98 System.out.println(c); // Imprime 100.0 /* Casting feito explicitamente, pois o valor possui um tamanho maior que o tipo da variavel que irá recebe-lo. */ int d = (int) 5.1987; float e = (float) 5.0; int f = (char) (a + 5); char g = (char) 110.5; System.out.println(d); // Imprime 5 System.out.println(e); // Imprime 5.0 System.out.println(f); // Imprime 102 System.out.println(g); // Imprime n } } 170 Universidade Metodista de São Paulo Quando executamos a classe ExemploCasting, temos a seguinte saída no console: C:\>javac ExemploCasting.java C:\>java ExemploCasting a 98 100.0 5 5.0 102 n Constantes Assim como outras linguagens de programação, em Java também é possível se trabalhar com constantes. Para tanto, basta utilizar o modificador de acesso final. Dependendo do escopo e da utilização desta sua variável, é possível combiná-la com outros modificadores de acesso, por exemplo. Uma vez que a variável foi declarada como uma constante, é obrigatória a atribuição de um valor inicial para a mesma. Observe, no exemplo abaixo, que tanto um atributo quanto uma variável interna a um método podem ser declarados como constantes. /** * Classe utilizada para demonstrar o uso de variaveis do * tipo contante. */ public class ExemploConstantes { private final long NUMERO_ATRIBUTO_CONSTANTE = 547L; public final double OUTRO_NUMERO_ATRIBUTO_CONSTANTE = 365.22; public static void main(String[] args) { final char VARIAVEL_CONSTANTE = ‘A’; } } Tendo em vista que tais variáveis foram declaradas como constantes, seu valor não pode ser alterado após a sua declaração. Observe que a tentativa de atribuir um valor a qualquer uma destas variáveis irá gerar um erro de compilação. /** * Classe utilizada para demonstrar o uso de variaveis do * tipo contante. */ public class ExemploConstantes2 { private final long NUMERO_ATRIBUTO_CONSTANTE = 547L; public final double OUTRO_NUMERO_ATRIBUTO_CONSTANTE = 365.22; 171 www.metodista.br/ead public static void main(String[] args) { final char VARIAVEL_CONSTANTE = ‘A’; ExemploConstante exemplo = new ExemploConstante(); exemplo.NUMERO_ATRIBUTO_CONSTANTE = 10001010L; exemplo.OUTRO_NUMERO_ATRIBUTO_CONSTANTE - 201015.06; VARIAVEL_CONSTANTE = ‘B’; } } Operadores No Java, existem diversos tipos de operadores além dos que conhecemos da matemática, e estes operadores podem enquadrados nos seguintes tipos: Unário (Utiliza um operando) Binário (Utilizam dois operandos) Ternário (Utilizam três operandos) Os operadores são utilizados a todo o momento, por exemplo, quando queremos fazer algum cálculo, verificar alguma situação valores, atribuir um valor a uma variável, etc. OBS: O operando pode ser representado por um valor ou por uma variável. Operadores aritméticos Símbolo + é chamado de adição, utilizado para somar o valor de dois operandos. <operando1> + <operando2> Exemplo: /** * Classe para demonstrar o operador de adição ( + ). */ public class OperadorAdicao { public static void main(String[] args) { System.out.println(3 + 7); //ou int a = 3; int b = 7; System.out.println(a + b); } } 172 Universidade Metodista de São Paulo Neste caso, será impresso o valor 10 que é o resultado da soma de 3 + 7, ou da soma da variável a + variável b. Símbolo - é chamado de subtração, utilizado para subtrair o valor de dois operandos. <operando1> - <operando2> Exemplo: /** * Classe para demonstrar o operador de subtração ( - ). */ public class OperadorSubtracao { public static void main(String[] args) { System.out.println(5 - 2); //ou int a = 5; int b = 2; System.out.println(a - b); } } Símbolo * é chamado de multiplicação, utilizado para multiplicar o valor de dois operandos. <operando1> * <operando2> Exemplo: /** * Classe para demonstrar o operador de multiplicação ( * ). */ public class OperadorMultiplicacao { public static void main(String[] args) { System.out.println(3 * 2); //ou int a = 3; int b = 2; System.out.println(a * b); } } 173 www.metodista.br/ead Símbolo / é chamado de divisão, utilizado para dividir o valor de dois operandos. <operando1> / <operando2> O resultado da divisão de dois operandos inteiros retorna um valor inteiro, e a divisão que tem pelo menos um operando com casas decimais retorna um valor com casas decimais. Exemplo: /** * Classe para demonstrar o operador de divisão ( / ). */ public class OperadorDivisao { public static void main(String[] args) { System.out.println(3.0 / 2); //ou int a = 3; int b = 2; System.out.println(a / b); } } Símbolo % é chamado de módulo, utilizado para saber qual o resto da divisão de dois operandos. <operando1> % <operando2> O resto da divisão de dois operandos inteiros retorna um valor inteiro, e o resto da divisão que tem pelo menos um operando com casas decimais retorna um valor com casas decimais. Exemplo: /** * Classe para demonstrar o operador de modulo ( % ). */ public class OperadorModulo { public static void main(String[] args) { System.out.println(4.5 % 2); //ou int a = 5; int b = 3; System.out.println(a % b); } } 174 Universidade Metodista de São Paulo Operadores de atribuição Símbolo = é chamado de atribuição, utilizado para atribuir o valor de um operando a uma variável: <variável> = <operando> Exemplo: /** * Classe para demonstrar o operador de atribuição ( = ). */ public class OperadorAtribuicao { public static void main(String[] args) { int x; x = 25; System.out.println(x); } } A operação de atribuição também pode receber como operando o resultado de outra operação, exemplo: /** * Classe para demonstrar o operador de atribuição ( = ). */ public class OperadorAtribuicao2 { public static void main(String[] args) { int x; x = 4 % 2; System.out.println(x); } } Símbolo += é utilizado para atribuir a uma variável o valor desta variável somada ao valor de um operando. <variável> += <operando> 175 www.metodista.br/ead Exemplo: /** * Classe utilizada para demonstrar o uso do operador de atribuição * junto com o operador de adição ( += ). */ public class OperadorAtribuicaoAdicao { public static void main(String[] args) { int x = 4; x += 2; System.out.println(x); } } Símbolo -= é utilizado para atribuir a uma variável o valor desta variável subtraindo o valor de um operando. <variável> - = <operando> Exemplo: /** * Classe utilizada para demonstrar o uso do operador de atribuição * junto com o operador de subtração ( -= ). */ public class OperadorAtribuicaoSubtracao { public static void main(String[] args) { int x = 4; x -= 2; System.out.println(x); } } Símbolo *= é utilizado para atribuir a uma variável o valor desta variável multiplicado o valor de um operando. <variável> *= <operando> Exemplo: /** * Classe utilizada para demonstrar o uso do operador de atribuição * junto com o operador de multiplicação ( *= ). */ public class OperadorAtribuicaoMultiplicacao { public static void main(String[] args) { int x = 3; x *= 5; System.out.println(x); } } 176 Universidade Metodista de São Paulo Símbolo /= é utilizado para atribuir a uma variável o valor desta variável dividido pelo valor de um operando. <variável> /= <operando> Exemplo: /** * Classe utilizada para demonstrar o uso do operador de atribuição * junto com o operador de divisão ( /= ). */ public class OperadorAtribuicaoDivisao { public static void main(String[] args) { int x = 4; x /= 3; System.out.println(x); } } Quando usamos o operador /= utilizando uma variável inteira e um operando de casa decimal, então a divisão retorna um valor inteiro. Caso utilize uma variável de ponto flutuante, então a divisão retorna um valor com casa decimal, por exemplo: /** * Classe utilizada para demonstrar o uso do operador de atribuição * junto com o operador de divisão ( /= ). */ public class OperadorAtribuicaoDivisao2 { public static void main(String[] args) { int x = 4; x /= 3.0; System.out.println(x); float y = 4; y /= 3.0; System.out.println(y); } } 177 www.metodista.br/ead Símbolo %= é utilizado para atribuir a uma variável, o valor do resto da divisão desta variável por um operando. <variável> %= <operando> Exemplo: /** * Classe utilizada para demonstrar o uso do operador de atribuição * junto com o operador de modulo ( %= ). */ public class OperadorAtribuicaoModulo { public static void main(String[] args) { int x = 4; x %= 3; System.out.println(x); } } Quando usamos o operador %= utilizando uma variável inteira e um operando de casa decimal, então o resto da divisão retorna um valor inteiro. Caso utilize uma variável de ponto flutuante, então o resto da divisão retorna um valor com casa decimal, por exemplo: /** * Classe utilizada para demonstrar o uso do operador de atribuição * junto com o operador de modulo ( %= ). */ public class OperadorAtribuicaoModulo2 { public static void main(String[] args) { int x = 4; x %= 3.0; System.out.println(x); float y = 4; y %= 3.33; System.out.println(y); } } 178 Universidade Metodista de São Paulo Operadores unários Símbolo ++ é utilizado para incrementar em 1 o valor de uma variável, podendo ser feita das seguintes formas: ++ <variável> Primeiro incrementa a variável depois devolve seu valor. <variável> ++ Primeiro devolve o valor da variável depois incrementa seu valor. Exemplo: /** * Classe utilizada para demonstrar o uso do operador de * incremento ( ++ ). */ public class OperadorIncremento { public static void main(String[] args) { int a = 1; int b = 1; System.out.println(++a); System.out.println(b++); System.out.println(a); System.out.println(b); } } Símbolo -- é utilizado para decrementar em 1 o valor de uma variável, podendo ser feita das seguintes formas: -- <variável> Primeiro decrementa o valor da variável, depois devolve seu valor. <variável> -Primeiro devolve o valor da variável, depois ela é decrementada. Exemplo: /** * Classe utilizada para demonstrar o uso do operador de * decremento ( -- ). */ public class OperadorDecremento { public static void main(String[] args) { 179 www.metodista.br/ead int a = 1; int b = 1; System.out.println(--a); System.out.println(b--); System.out.println(a); System.out.println(b); } } Operadores lógicos Os operadores lógicos aceitam apenas operando do tipo boolean. Símbolo && é chamado de E. Este operador retorna true somente se os dois operandos forem true. <operando1> && <operando2> Se o valor do operando1 for false, então o operador && não verifica o valor do operador2, pois sabe que o resultado já é false. Exemplo: /** * Classe para demonstrar o uso do operador logico E ( && ). */ public class OperadorLogicoE { public static void main(String[] args) { boolean a = true; boolean b = false; boolean c = true; System.out.println(a && b); System.out.println(a && c); } } Símbolo || é chamado de OU. Este operando retorna true caso tenha pelo menos um operando com o valor true. <operando1> || <operando2> 180 Universidade Metodista de São Paulo Se o valor do operando1 for true, então o operador || não verifica o valor do operando2, pois já sabe que o resultado é true. Exemplo: /** * Classe para demonstrar o uso do operador logico OU ( || ). */ public class OperadorLogicoOU { public static void main(String[] args) { boolean a = true; boolean b = false; boolean c = false; System.out.println(a || b); System.out.println(b || c); } } Símbolo ! é chamado de negação. Este operador retorna true se o operando tem o valor false, e retorna false se o operando o valor true. ! <operando> Exemplo: /** * Classe para demonstrar o uso do operador logico negação ( ! ). */ public class OperadorLogicoNegacao { public static void main(String[] args) { boolean a = true; boolean b = false; boolean c = false; System.out.println(!a); System.out.println(!(b || c)); } } 181 www.metodista.br/ead Operadores relacionais Os resultados dos operadores relacionais são do tipo boolean. Símbolo > é chamado de maior que. <operando1> > <operando2> Retorna true se o valor do operando1 for maior que o valor do operando2, caso contrário retorna false. Exemplo: /** * Classe utilizada para demonstrar o uso do operador * relacional maior que ( > ). */ public class OperadorMaiorQue { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a > b); } } Símbolo < é chamado de menor que. <operando1> < <operando2> Retorna true se o valor do operando1 for menor que o valor do operando2, caso contrário retorna false. Exemplo: /** * Classe utilizada para demonstrar o uso do operador * relacional menor que ( < ). */ public class OperadorMenorQue { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a < b); } } 182 Universidade Metodista de São Paulo Símbolo == é chamado de igualdade. <operando1> == <operando2> Retorna true se o valor do operando1 for igual ao valor do operando2, caso contrário retorna false. Exemplo: /** * Classe utilizada para demonstrar o uso do operador * relacional de igualdade ( == ). */ public class OperadorIgualdade { public static void main(String[] args) { int a = 3; int b = 3; System.out.println(a == b); } } Símbolo >= é chamado de maior ou igual que. <operando1> >= <operando2> Retorna true se o valor do operando1 for maior ou igual que o valor do operando2, caso contrário retorna false. Exemplo: /** * Classe utilizada para demonstrar o uso do operador * relacional maior ou igual que ( >= ). */ public class OperadorMaiorIgualQue { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a >= b); int c = 5; System.out.println(a >= c); } } 183 www.metodista.br/ead Símbolo <= é chamado de menor ou igual que. <operando1> <= <operando2> Retorna true se o valor do operando1 for menor ou igual que o valor do operando2, caso contrário retorna false. Exemplo: /** * Classe utilizada para demonstrar o uso do operador * relacional menor ou igual que ( <= ). */ public class OperadorMenorIgualQue { public static void main(String[] args) { int a = 5; int b = 5; System.out.println(a <= b); } } Símbolo != é chamado de diferente. <operando1> != <operando2> Retorna true se o valor do operando1 for diferente do valor do operando2, caso contrário retorna false. Exemplo: /** * Classe utilizada para demonstrar o uso do operador * relacional diferente ( != ). */ public class OperadorDiferente { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a != b); int c = 3; System.out.println(b != c); } } 184 Universidade Metodista de São Paulo Operador condicional O operador condicional é do tipo ternário, pois envolve três operandos. Símbolo ? : é utilizado para fazer uma condição if / else de forma simplificada. <operando1> ? <operando2> : <operando3> Se o valor do operando1 for true, então o resultado da condicional é o operando2, se o valor do operando1 for false, então o resultado da condicional é o operando3. Exemplo: /** * Classe utilizada para demonstrar o uso do operador * condicional ( condicao ? verdade : falso ). */ public class OperadorCondicional { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a != b ? “diferente” : “igual”); } } Entrada de dados com java.util.Scanner Em Java, temos uma classe chamada java.lang.Scanner que, neste momento, utilizaremos para receber entradas do usuário via console, mas esta classe também pode ser utilizada para outros fins, tais como leitura de arquivos por exemplo. No exemplo abaixo, utilizaremos a classe Scanner para pedir que o usuário digite sua idade, depois imprimiremos qual foi o número lido: import java.util.Scanner; /** * Neste exemplo pedimos para o usuário digitar a idade dele, * depois imprimimos uma frase com a idade lida. */ public class ExemploScanner { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println(“Digite sua idade: “); int idade = s.nextInt(); System.out.println(“Vc tem “ + idade + “ anos.”); } } 185 www.metodista.br/ead Quando executamos a classe ExemploScanner, imprimimos no console a seguinte mensagem: C:\>javac ExemploScanner.java C:\>java ExemploScanner Digite a sua idade: Na linha do comando “int idade = s.nextInt();”, o programa fica esperando o usuário digitar um número inteiro e em seguida apertar a tecla ENTER, para continuar a execução: C:\>javac ExemploScanner.java C:\>java ExemploScanner Digite a sua idade: 25 Vc tem 25 anos. Com o Scanner podemos ler diversos tipos de atributos, por exemplo: import java.util.Scanner; /** * Neste exemplo vamos pedir para o usuário digitar o nome e a altura * dele, depois vamos imprimir os dados lidos. */ public class ExemploScanner2 { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println(“Digite seu nome: “); String nome = s.nextLine(); System.out.println(“\nDigite sua altura: “); double altura = s.nextDouble(); System.out.println(nome + “ tem “ + altura + “ de altura.”); } } Quando executamos a classe ExemploScanner2, temos a seguinte saída no console: C:\>javac ExemploScanner2.java C:\>java ExemploScanner2 Digite seu nome: Rafael Digite sua altura: 1.78 Rafael tem 1.78 de altura. 186 Universidade Metodista de São Paulo Fazendo uma comparação com a linguagem C++, os métodos da classe Scanner nextInt() (Lê um número inteiro), nextDouble() (Lê um número com casa decimal do tipo double), nextLine() (Lê um texto “String”), etc. podem ser comparados a função cin, e o método System.out.println() pode ser comparado a função cout. OBS: Quando queremos ler um número com casa decimal via console, precisamos digitar o número utilizando vírgula ( , ), por exemplo: 10,50. Quando criamos uma variável dentro do programa e definimos seu valor com casa decimal, precisamos utilizar o ponto ( . ) como separador, por exemplo: 10.50. Referências DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8. ed. São Paulo: Pearson, 2010. HORSTMANN, Cay S.. Big Java. 4. ed. Porto Alegre: Bookman, 2006. HORSTMANN, Cay S.; CORNELL, Gary. Core Java: Fundamentos. 8. ed. São Paulo: Pearson, 2009. JAVA SE - ORACLE. Java SE Technologies at a Glace. Disponível em: <http://www.oracle. com/technetwork/java/javase/tech/index.html>. Acesso em 17 out. 2011. SIERRA, Kathy; BATES, Bert. Use a Cabeça! Java. 8. ed. Rio de Janeiro: Alta Books, 2008. _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ____________________________________ ____________________________________ 187 www.metodista.br/ead _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ __________________________________________ __________________________________________ 188 Universidade Metodista de São Paulo Programação orientada a objetos Estrutura de controle e repetição Prof. Cristiano Camilo dos Santos de Almeida Objetivo: Apresentar as estruturas de controle if / else e switch, as estruturas de repetição for, while e do / while, apresentar o conceito de vetor e a classe utilitária java.util.Arrays. Palavras-chave: if / else, switch, for, while, do / while, vetor www.metodista.br/ead Módulo Estruturas de controle - if / else A estrutura de controle if (se), é utilizada para executar alguns comandos apenas se a sua condição for true (verdadeira). O else (senão) pode ou não acompanhar o if, mas o else não pode ser usado sozinho, e é utilizado para executar alguns comandos caso a condição do if for false (falso). Na linguagem Java, esta estrutura pode ser utilizada de diversas maneiras, conforme listadas abaixo. - Com execução de um bloco de instruções, apenas caso a condição seja atendida: if(condição) { // Comandos executados caso a condição verdadeira } - Com execução de um bloco de instruções, caso a condição seja atendida, e com um fluxo alternativo para os casos de condição não atendida: if(condição) { // Comandos executados caso a condição verdadeira. } else { // Comandos executados caso a condição falsa. } - Com múltiplas condições: if(condicao) { // Comandos executados caso a condição verdadeira. } else if (condicao2) { // Comandos executados caso a condição2 for verdadeira. } else if (condicao3) { // Comandos executados caso a condição3 for verdadeira. } else { // Comandos executados caso nenhuma das condições for verdadeira. } 190 Universidade Metodista de São Paulo No exemplo abaixo, verificamos se o valor da variável idade é maior ou igual que 18, caso a condição seja verdadeira então entra no bloco do if, caso contrário entra no bloco do else. /** * Exemplo de estrutura de controle if. */ public class ExemploIf { public static void main(String[] args) { int idade = 15; if(idade >= 18) { System.out.println(“Permissão para dirigir”); } else { System.out.println(“Idade minima para dirigir eh 18 anos”); } } } Quando executarmos a classe ExemploIf, temos a seguinte saída no console: C:\>javac ExemploIf.java C:\>java ExemploIf Idade mínima para dirigir eh 18 anos Dentro de um bloco { } do if / else pode ser utilizado outras variáveis declaradas no método ou declarados dentro do bloco, mas estas variáveis podem apenas ser utilizadas dentro deste próprio bloco. Exemplo: /** * Exemplo de estrutura de controle if. */ public class ExemploIf2 { public static void main(String[] args) { int valor = 10; if(valor > 9) { int xpto = 10; } else { xpto = 11; // erro de compilação } xpto = 12; // erro de compilação } } 191 www.metodista.br/ead Se tentarmos compilar a classe ExemploIf2, teremos os seguintes erros: C:\>javac ExemploIf2.java ExemploIf2.java:8: cannot find symbol symbol : variable xpto location: class ExemploIf2 xpto = 11; // erro de compilaþÒo ^ ExemploIf2.java:11: cannot find symbol symbol : variable xpto location: class ExemploIf2 xpto = 12; // erro de compilaþÒo ^ 2 errors Neste caso, é criado uma variável chamada xpto dentro do bloco do if, então esta variável pode ser utilizada somente dentro do if, não pode ser usada no else e nem fora do bloco. OBS: Este conceito de variáveis criadas dentro de blocos { } funciona para todos os blocos. Estrutura condicional - switch O switch é uma estrutura de seleção semelhante ao if com múltiplas seleções. É uma estrutura muito fácil de utilizar e apresenta uma ótima legibilidade, porém trabalha apenas com valores constantes dos tipos primários byte, short, int e char. Também pode ser utilizado com enumerations (veremos mais adiante). É possível ainda se enumerar n possíveis blocos de instrução. Sua utilização deve ser feita da seguinte maneira: switch( variável ) { case <possível valor da constante> : < instruções> break; case <possível valor da constante> : < instruções> break; default: < instruções> break; } Cada case é um caso no qual os comandos dentro dele são executados se o valor dele for o mesmo que a variável recebida no switch. É importante lembrar que a utilização do comando break é facultativa, porém indispensável caso se queira que apenas aquele bloco seja executado e não todos os demais abaixo dele. O bloco de comandos default representa uma condição geral de execução caso nenhuma das anteriores tenha sido atendida, sendo a sua utilização também opcional. 192 Universidade Metodista de São Paulo Segue um exemplo de utilização do comando switch: /** * Exemplo de estrutura de seleção switch. */ public class ExemploSwitch { public static void main(String[] args) { char nota = ‘D’; switch(nota) { case ‘A’: System.out.println(“Aluno aprovado. Conceito excelente!”); break; case ‘B’: System.out.println(“Aluno aprovado. Conceito bom!”); break; case ‘C’: System.out.println(“Aluno aprovado. Conceito medio!”); break; default: System.out.println(“Aluno reprovado!”); break; } } } Neste caso, será impressa a mensagem “Aluno reprovado !”, pois nenhum dos cases foi atendido, então a estrutura default foi executada. C:\>javac ExemploSwitch.java C:\>java ExemploSwitch Aluno reprovado! Estrutura de repetição for As estruturas de repetição permitem especificar um bloco de instruções que será executado tantas vezes quanto forem especificadas pelo desenvolvedor. A estrutura de repetição for, trabalha da mesma forma da condição while, porém de maneira muito mais prática quando falamos de uma estrutura de repetição gerenciada por contador. O for mostra-se muito mais eficiente neste ponto, pois em uma única linha de instrução é possível se declarar o contador, a condição de execução e a forma de incrementação do contador. 193 www.metodista.br/ead A estrutura for funciona da seguinte maneira: for(<inicialização>; <condição de execução>; <pós-instruções>) { << instruções >> } Utilizamos a área inicialização para criar variáveis ou atribuir valores para variáveis já declaradas, mas todas as variáveis precisam ser do mesmo tipo. Esta área é executada antes de começar a estrutura de repetição do for. Utilizamos a área condição de execução para definir a lógica de parada da estrutura de repetição for. Utilizamos a área pós-instruções para executar alguma ação que deve ocorrer cada vez que as instruções dentro do for forem executadas. Exemplo: /** * Exemplo de estrutura de repetição for. */ public class ExemploFor { public static void main(String[] args) { for(int i = 0; i <= 10; i++ ) { if(i % 2 == 0) { System.out.println(i + “ e um numero par.”); } else { System.out.println(i + “ e um numero impar.”); } } } } Neste caso, será impresso o valor da variável i e informado se este valor é par ou impar. No exemplo abaixo, criaremos as variáveis i e j na área de inicialização e, na área de pós-instrução, vamos incrementar a variável i e decrementar a variável j. /** * Exemplo de estrutura de repetição for. */ public class ExemploFor2 { public static void main(String[] args) { for(int i = 0, j = 10; i <= 10; i++, j--) { if(i == j) { 194 Universidade Metodista de São Paulo System.out.println(“i “ + i + “ eh igual a j “ + j); } } } } Quando executarmos a classe ExemploFor2, teremos a seguinte saída no console: C:\>javac ExemploFor2.java C:\>java ExemploFor2 i 5 eh igual a j 5 Estrutura de repetição while A estrutura while executa um bloco de instruções enquanto uma determinada condição for verdadeira (true). while(condição) { < instruções > } Exemplo: /** * Exemplo de estrutura de repetição while. */ public class ExemploWhile { public static void main(String[] args) { int i = 0; while(i < 10) { System.out.println(++i); } } } Neste caso, serão impressos os valores de 1 a 10, e depois quando a variável i possuir o valor 11 a condição do while será falso (false) e sua estrutura não é mais executada. 195 www.metodista.br/ead C:\>javac ExemploWhile.java C:\>java ExemploWhile 1 2 3 4 5 6 7 8 9 10 Estrutura de repetição do / while A estrutura do/while tem seu bloco de instruções executados pelo menos uma vez, então se a condição ao final das instruções for true, o bloco de instruções é executado novamente. do { < instruções > } while(condição); Exemplo: import java.util.Scanner; /** * Exemplo de estrutura de repetição do / while. */ public class ExemploDoWhile { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); int opcao = 0; do { System.out.println(“Escolha uma opcao:”); System.out.println(“1 - Iniciar jogo”); System.out.println(“2 - Ajuda”); System.out.println(“3 - Sair”); System.out.println(“OPCAO: “); opcao = entrada.nextInt(); } while (opcao != 3); } } 196 Universidade Metodista de São Paulo Neste caso, será pedido ao usuário digitar um número, e enquanto o número digitado for diferente de 3, o bloco será executado novamente. Vetor Segundo a definição mais clássica da informática, um vetor é uma estrutura de dados homogênea, no qual todos os elementos de um vetor são do mesmo tipo. A estrutura básica de um vetor é representada por seu nome e um índice, que deve ser utilizado toda a vez que se deseja acessar um determinado elemento dentro de sua estrutura. É importante ressaltar que todo o vetor possui um tamanho fixo, não é possível redimensionar um vetor ou adicionar a ele mais elementos do que este pode suportar. Em Java, a posição inicial do vetor é definida pelo valor zero. Declaração de vetor Para se declarar um vetor, devemos informar ao menos seu nome e o tipo de dado que este irá armazenar. Em Java, este tipo de dado pode ser representado tanto por um tipo primitivo como por uma classe qualquer. Exemplo: int[] vetorDeInteiros; float[] vetorDeFloat; String[] vetorDeString; long[] vetorDeLong; É importante ressaltar que um vetor em Java torna-se um objeto em memória, mesmo que ele seja um vetor de tipos primitivos. Inicialização de dados do vetor Uma vez que um vetor torna-se um objeto em memória, sua inicialização é muito semelhante à de um objeto normal. Uma vez que um vetor é uma estrutura de tamanho fixo, esta informação é necessária à sua inicialização. int[] vetorDeInteiros = new int[4]; float[] vetorDeFloat = new float[5]; String[] vetorDeString = new String[6]; Assim, como uma variável comum, também é possível inicializar um vetor que já foi declarado anteriormente, conforme exemplo abaixo: /** * Classe utilizada para demonstrar o uso de vetor. */ public class ExemplosVetores { public static void main(String[] args) { int[] vetor; vetor = new int[4]; } } 197 www.metodista.br/ead Assim, como um objeto, um vetor deve ser inicializado antes de ser utilizado. Uma chamada a um índice de um vetor não inicializado gera uma exceção. Existe outra forma de se inicializar vetores já com valores em cada uma de suas posições. Para isto, basta utilizar chaves { } da seguinte maneira: /** * Classe utilizada para demonstrar o uso de vetor. */ public class ExemplosVetores { public static void main(String[] args) { int vetor[] = {2, 5, 4, 8, 5}; } } Note que esta forma de inicialização é bastante prática, porém não deixa clara a quantidade de elementos que há no vetor obrigando, assim, que você conte a quantidade de elementos para saber o tamanho do vetor. Acesso aos elementos do vetor Consideremos o código do exemplo anterior, a representação do seu vetor se daria da seguinte forma: índice = 0 1 2 3 4 vetor = 2 5 4 8 5 Logo, para acessar os valores de cada uma das posições deste vetor você deve utilizar o seu índice correspondente dentro de colchetes, assim como segue: /** * Classe utilizada para demonstrar o uso de vetor. */ public class ExemplosVetores { public static void main(String[] args) { int vetor[] = {2, 5, 4, 8, 5}; System.out.println(“Tamanho do vetor = “ + vetor.length); System.out.println(“Elemento do indice 2 = “ + vetor[2]); System.out.println(“Elemento do indice 4 = “ + vetor[4]); } } 198 Universidade Metodista de São Paulo Com isso, teríamos a seguinte saída em tela: C:\>javac ExemplosVetores.java C:\>java ExemplosVetores Tamanho do vetor = 5 Elemento do índice 2 = 4 Elemento do índice 4 = 5 Lembre-se que o primeiro índice do vetor é sempre zero, logo, seu último elemento é sempre igual ao tamanho do vetor menos um (vetor.length - 1). Um pouco sobre a classe de utilitários java.util.Arrays Dentro do pacote java.util encontramos uma classe chamada Arrays. Esta classe possui uma série de métodos estáticos que nos ajudam a trabalhar mais facilmente com vetores. Dentre seus principais métodos podemos evidenciar os seguintes: binarySearch - Este método recebe sempre 2 parâmetros, sendo um deles o vetor e o outro o elemento que se deseja buscar dentro dele. Para isto, ele utiliza o método da busca binária, que será discutido mais a frente. sort - Realiza a ordenação de um vetor utilizando um algoritmo do tipo Quick Sort. Este tipo de algoritmo também será discutido mais adiante. Por este método, recebe o vetor por parâmetro (lembrando, vetores são objetos), ele o ordena e não retorna valor algum, pois sua ordenação já foi realizada. asList - Coverte o vetor em uma coleção do tipo lista. Coleções serão discutidas mais a frente copyOf - Cria uma cópia de um vetor. Pode-se copiar o vetor completamente ou apenas parte dele. Referências DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8. ed. São Paulo: Pearson, 2010. HORSTMANN, Cay S.. Big Java. 4. ed. Porto Alegre: Bookman, 2006. HORSTMANN, Cay S.; CORNELL, Gary. Core Java: Fundamentos. 8. ed. São Paulo: Pearson, 2009. SIERRA, Kathy; BATES, Bert. Use a Cabeça! Java. 8. ed. Rio de Janeiro: Alta Books, 2008. 199 www.metodista.br/ead _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ __________________________________________ __________________________________________ 200 Universidade Metodista de São Paulo Programação orientada a objetos Introdução à orientação a objetos Prof. Cristiano Camilo dos Santos de Almeida Objetivo: Apresentar e exemplificar os conceitos de orientação a objetos relacionados a classe, métodos e encapsulamento, também será abordado a classe java.lang.String para representação de textos. Palavras-chave: Classe; Objeto; Método; java.lang.String; Encapsulamento www.metodista.br/ead Módulo Classe e objeto Conceito de classe Uma classe representa um modelo ou forma de representar algo do mundo real, que se queira reproduzir no ambiente de desenvolvimento. Pensando desta forma é muito fácil entender e pensar sobre como se projetar um sistema com orientação a objetos. Quando pensamos em desenvolver um sistema voltado a locação de veículos, por exemplo, a primeira classe que vem a tona é uma que possa representar a figura do carro no seu sistema. Daí temos, então, nossa primeira classe. Podemos também representar a Locação, Cliente e outros objetos. Uma classe é composta basicamente de 3 itens: Nome da Classe Item responsável por identificar a classe. Este nome será utilizado toda a vez em que se for utilizar um objeto deste tipo. É importante ressaltar a utilização de letra maiúscula na primeira letra do nome da classe e as demais minúsculas. Isto não é uma obrigatoriedade do JAVA; é apenas uma boa prática de desenvolvimento que visa melhorar a legibilidade do código. Exemplo: Carro, Pessoa, ContaCorrente, CaixaCorreio, etc. Atributos São valores que possam representar as propriedades e/ou estados possíveis que os objetos desta classe podem assumir. Por convenção, costuma-se escrever o atributo com letras minúsculas, a menos que ele seja composto por mais de uma palavra, a primeira palavra é toda em minúsculo e as demais começam com a primeira letra em maiúsculo e o restante da palavra em minúsculo. Exemplo: idade, nome, listaMensagens, notaAlunoTurma, etc. Métodos São blocos de código que possam representar as funcionalidades que a classe apresentará. Assim como os atributos, costuma-se escrever o atributo com letras minúsculas, a menos que ele seja composto por mais de uma palavra. Neste caso, a mesma regra citada nos nomes de Atributos também é válida. Exemplo: getPessoa, consultarDadosAluno, enviarMensagemEmail, etc. 202 Universidade Metodista de São Paulo Na linguagem de programação Java, utilizamos a palavra-chave class para declararmos uma classe. No exemplo abaixo, criamos uma classe em Java chamada NovaClasse: /** * Classe utilizada para demonstrar a estrutura de uma classe. */ public class NovaClasse { /* Declaração dos atributos da classe. */ public int atributo1; public float atributo2; public boolean atributo3; /* Declaração dos métodos da classe. */ public void metodo1() { //Comandos System.out.println(“Chamando o método 1.”); } public void metodo2() { //Comandos System.out.println(“Chamando o método 2.”); } } Note que utilizamos a palavra-chave class seguida do nome da classe NovaClasse. A palavrachave public informa que esta classe pode ser utilizada por qualquer outra classe dentro do projeto. Este trecho de código precisa ser salvo em um arquivo com o nome NovaClasse.java, porque o nome do arquivo .java precisa ter o mesmo nome da classe pública. Logo após a declaração da classe, criamos 3 atributos. Os atributos podem ser criados em qualquer lugar do programa. Também criamos dois métodos para esta classe, mais adiante vamos discutir como funcionam os métodos. Conceito de objeto Um objeto é a representação (instância) de uma classe. A partir de uma classe é possível criar vários objetos com estados diferentes (valor dos atributos). Basta pensarmos na Classe como uma grande forma e no Objeto como algo que passou por essa forma. 203 www.metodista.br/ead Na linguagem Java, para criarmos um novo objeto, basta utilizar a palavra-chave new da seguinte forma: No exemplo abaixo, criamos uma classe nova chamada TesteNovaClasse. Esta classe será utilizada para criar um objeto da classe NovaClasse e chamar os métodos metodo1() e metodo2(). /** * Classe utilizada para testar a classe NovaClasse */ public class TesteNovaClasse { /** * Método principal da classe. */ public static void main(String[] args) { /* Criando um objeto a partir da classe NovaClasse. */ NovaClasse novaClasse = new NovaClasse(); /* Chamando os métodos através da variavel novaClasse. */ novaClasse.metodo1(); novaClasse.metodo2(); } } Na classe acima, criamos uma variável chamada novaClasse e esta variável é do tipo NovaClasse. Depois utilizamos a palavra-chave new seguida de NovaClasse() para construirmos um objeto da classe NovaClasse. Observe que dentro do método main, estamos utilizando a variável novaClasse para invocar os métodos metodo1() e metodo2(). Para chamar um método ou um atributo a partir de um objeto utilizamos o ponto final ( . ) seguido do nome do método que precisamos chamar. Quando executamos a classe TesteNovaClasse, temos a seguinte saída no console: C:\>javac TesteNovaClasse.java C:\>java TesteNovaClasse Chamando o método 1. Chamando o método 2. 204 Universidade Metodista de São Paulo Declaração de atributos No exemplo abaixo, criamos a classe Atributo e dentro dela declaramos três atributos diferentes: /** * Classe utilizada para demonstrar a utilização de * atributos. */ public class Atributo { /* Declaração dos atributos da classe. */ public int atributo1; public float atributo2; public boolean atributo3; } Criamos um atributo para guardar um valor inteiro do tipo int com o nome atributo1. Por enquanto utilize a palavra-chave public na declaração do atributo para informar que ele pode ser acessado a partir de outras classes. Criamos um atributo para guardar um valor com ponto flutuante do tipo float com o nome atributo2. Criamos um atributo para guardar um valor boolean chamado atributo3. No exemplo abaixo, criaremos um objeto da classe Atributo e atribuiremos valores para as variáveis. Depois imprimiremos os seus valores: /** * Classe utilizada para demonstrar o uso * dos atributos de outra classe. */ public class TesteAtributo { /** * Método principal para testar a classe Atributo. */ public static void main(String[] args) { System.out.println(“Cria um objeto da classe Atributo.”); Atributo teste = new Atributo(); teste.atributo1 = 30; teste.atributo2 = 3.5f; teste.atributo3 = false; System.out.println(“Valor do atributo1: “ + teste.atributo1); System.out.println(“Valor do atributo2: “ + teste.atributo2); System.out.println(“Valor do atributo3: “ + teste.atributo3); } } 205 www.metodista.br/ead Quando executamos a classe TesteAtributo, temos a seguinte saída no console: C:\>javac Atributo.java C:\>javac TesteAtributo.java C:\>java TesteAtributo Cria um objeto da classe Atributo. Valor do atributo1: 30 Valor do atributo2: 3.5 Valor do atributo3: false Métodos com retorno de valor Os métodos das classes em Java servem para executar partes específicas de códigos. Utilizando os métodos podemos reaproveitar o código. Uma vez que o método é criado, o mesmo pode ser usado em diversas partes do sistema. Os métodos podem receber variáveis como parâmetros e devolver uma variável como retorno da execução do método. Para que seja possível realizar o retorno do método, primeiramente é necessário declarar qual o tipo de retorno será realizado pelo método. No exemplo abaixo, criamos dois métodos: /** * Classe utilizada para demonstrar o uso de métodos com retorno de valor. */ public class MetodoRetorno { /* Declaração dos atributos da classe. */ public int atributo1; /* Declaração dos métodos da classe. */ /** * Método utilizado para retornar o atributo1. * @return int com o valor do atributo1. */ public int metodo1() { System.out.println(“Chamou o método 1.”); return atributo1; } /** * Método que verificar se o atributo1 é maior ou igual a 0 (zero). * @return boolean informando se o atributo1 é positivo. */ public boolean metodo2() { System.out.println(“Chamou o método 2.”); return atributo1 >= 0; } } 206 Universidade Metodista de São Paulo Note que no ponto em que até há pouco utilizávamos a palavra-chave void (que significa vazio ou sem retorno) no retorno do método, agora utilizamos a palavra-chave int. Essa mudança na declaração significa que pretendemos que este método retorne para quem o chamou um valor do inteiro tipo int. Porém, para que o método realmente retorne algum valor, é necessário identificar qual valor será retornado. Para tal, faremos uso da palavra-chave return, da seguinte forma: return atributo1; Com isso, temos agora o metodo1() que retornará o valor do atributo1, que é do tipo int. É importante lembrar que, uma vez declarado um retorno para o método, é obrigatório que este retorno aconteça. O fato de não se enviar um retorno resulta em um erro de compilação. No metodo2(), verificamos se o atributo1 é maior ou igual a 0 (zero), e retornamos a resposta dessa verificação, ou seja, true (verdadeiro) ou false (falso). No exemplo abaixo, vamos criar um objeto da classe MetodoRetorno e vamos testar a chamada para os métodos metodo1() e metodo2(). /** * Classe utilizada para demonstrar o uso de * métodos com retorno de valor. */ public class TesteMetodoRetorno { /** * Método principal para testar está classe. */ public static void main(String[] args) { System.out.println(“Criando um objeto da classe MetodoRetorno.”); MetodoRetorno teste = new MetodoRetorno(); teste.atributo1 = 30; System.out.println(teste.metodo1()); System.out.println(teste.metodo2()); } } Quando executamos a classe TesteMetodoRetorno, temos a seguinte saída no console: C:\> javac MetodoRetorno.java C:\> javac TesteMetodoRetorno.java C:\> java TesteMetodoRetorno Criando um objeto da classe MetodoRetorno. Chamou o método 1. 30 Chamou o método 2. true 207 www.metodista.br/ead Métodos com recebimento de parâmetro Na linguagem Java, os métodos também são capazes de receber um ou mais parâmetros que são utilizados no processamento do método. No exemplo abaixo, criamos dois métodos que recebem parâmetros e os utilizam no processamento do método: /** * Classe utilizada para demonstrar o uso de métodos * que recebem parâmetros. */ public class MetodoParametro { /* Declaração dos atributos da classe. */ public int atributo1; /* Declaração dos métodos da classe. */ /** * Método utilizado para atribuir o valor do atributo1. */ public void metodo1(int valor) { System.out.println(“Chamando o método 1.”); atributo1 = valor; System.out.println(“O valor do atributo1 é: “ + atributo1); } /** * Método que recebe uma quantidade de parametros variados * e imprime todos os valores recebidos. * Essa possibilidade de receber uma quantidade de parametros * variados é chamado de varargs e foi implementado a partir * da versão 5.0 do java. */ public void metodo2(int... valores) { System.out.println(“Chamando o método 2.”); /* Verifica se recebeu algum argumento. */ if(valores.length > 0) { /* Para cada argumento recebido como parâmetro, imprime seu valor. */ for(int cont = 0; cont < valores.length; cont++) { 208 Universidade Metodista de São Paulo int valor = valores[cont]; System.out.print(valor + “ “); } System.out.println(“\n”); /* Este for faz a mesma coisa que o anterior, este novo tipo de for chamado foreach foi implementado a partir da versão 5.0 do java. */ for(int valor : valores) { System.out.print(valor + “ “); } System.out.println(“\n”); } } } O metodo1(int valor) recebe um parâmetro inteiro do tipo int chamado valor, e dentro do método podemos utilizar este parâmetro valor. Note que a declaração de um parâmetro é igual à declaração de uma variável, informamos seu tipo e identificador. Se necessário, podemos declarar tantos parâmetros quantos forem precisos para execução do método. Se o parâmetro recebido no método for primitivo, então seu valor é recebido por cópia, caso receba um objeto como parâmetro seu valor é recebido por referência. Quando fazemos uma chamada a um método com parâmetros de entrada, um erro na passagem dos tipos dos parâmetros representa um erro de compilação. Quando é necessário passar uma quantidade de parâmetros muito grande ou uma quantidade desconhecida de parâmetros, isso pode ser feito através de um array, ou podemos usar varargs (a quantidade de argumentos pode variar). A sintaxe do varargs é: tipo... identificador O método metodo2(int... valores) recebe uma quantidade variável de valores inteiros do tipo int. 209 www.metodista.br/ead No exemplo abaixo, criaremos um objeto da classe MetodoParametro e vamos utilizar o metodo1(int valor) e metodo2(int... valores). /** * Classe utilizada para demonstrar o uso * da chamada de métodos de outra classe. */ public class TesteMetodoParametro { /** * Método principal para testar a classe MetodoParametro. */ public static void main(String[] args) { System.out.println(“Cria um objeto da classe MetodoParametro.”); MetodoParametro teste = new MetodoParametro(); teste.metodo1(100); /* Chama o método sem passar parâmetro. */ teste.metodo2(); /* Chama o método passando um parâmetro. */ teste.metodo2(10); /* Chama o método passando dez parâmetros. */ teste.metodo2(10, 20, 30, 40, 50, 60, 70, 80, 90, 100); } } Criamos um atributo do tipo MetodoParametro, chamado teste, e depois criamos um objeto da classe MetodoParametro. A partir do objeto teste chamamos o metodo1 passando o valor 100 como parâmetro. Depois, chamamos três vezes o metodo2, passando valores variados para ele. Quando executamos a classe TesteMetodoParametro, temos a seguinte saída no console: C:\>javac MetodoParametro.java C:\>javac TesteMetodoParametro.java C:\>java TesteMetodoParametro Cria um objeto da classe MetodoParametro. Chamando o método 1. O valor do atributo1 é: 100 Chamando o método 2. Chamando o método 2. 10 10 Chamando o método 2. 10 20 30 40 50 60 70 80 90 100 10 20 30 40 50 60 70 80 90 100 210 Universidade Metodista de São Paulo Métodos construtores Sempre quando criamos um novo objeto em Java, utilizamos a sintaxe: Classe objeto = new Classe(); O que ainda não foi comentado sobre este comando é a necessidade de se referenciar o método construtor daquela classe. Um método construtor, como o próprio nome já diz, é responsável pela criação do objeto daquela classe, iniciando com valores seus atributos ou realizando outras funções que possam vir a ser necessárias. Para que um método seja considerado construtor, ele deve possuir o mesmo nome da classe, inclusive com correspondência entre letras maiúsculas e minúsculas e não deve ter retorno. Por padrão, todas as classes possuem um construtor com seu nome seguido de parênteses “()”. Caso você não declare manualmente o construtor, o compilador do Java fará isso por você. Vamos criar um exemplo de construtor padrão que não recebe: /** * Classe utilizada para demonstrar o uso do construtor. */ public class ClasseConstrutor { /** * Construtor padrão. * * Note que o construtor possui o mesmo nome da classe e não * informa o retorno. */ public ClasseConstrutor() { System.out.println(“Criando um objeto da classe ClasseConstrutor.”); } } Neste exemplo, sempre que criarmos um objeto da classe ClasseConstrutor, a frase “Criando um objeto da classe ClasseConstrutor.” será impressa no console. No exemplo abaixo, criaremos um construtor que recebe parâmetros: /** * Classe utilizada para demonstrar o uso do construtor * que inicializa os atributos da classe. */ public class ClasseConstrutor2 { 211 www.metodista.br/ead public int atributo1; public float atributo2; public boolean atributo3; /** * Construtor que recebe os valores para inicializar os atributos. * * @param valor1 - Valor inteiro que será guardado no atributo1. * @param valor2 - Valor float que será guardado no atributo2. * @param valor3 - Valor boolean que será guardado no atributo3. */ public ClasseConstrutor2(int valor1, float valor2, boolean valor3) { System.out.println(“Criando um objeto da classe ClasseConstrutor2.”); System.out.println(“Recebeu os seguintes parametros:\n\t” + valor1); System.out.println(“\t” + valor2); System.out.println(“\t” + valor3); atributo1 = valor1; atributo2 = valor2; atributo3 = valor3; } } Neste exemplo, para construirmos um objeto da classe ClasseConstrutor2, é necessário passar para o construtor três parâmetros: int, float e boolean. Se não passarmos todos os parâmetros ou a ordem deles estiver diferente do esperado não conseguiremos compilar a classe. Quando criamos um construtor que recebe parâmetros, o compilador não cria um construtor padrão public ClasseConstrutor2() { }. No exemplo abaixo, vamos construir um objeto da classe ClasseConstrutor e um objeto da classe ClasseConstrutor2. /** * Classe utilizada para demonstrar o uso do construtor. */ public class TesteConstrutor { /** * Método principal que cria dois objetos. */ 212 Universidade Metodista de São Paulo public static void main(String[] args) { /* Chama o construtor padrão da classe ClasseConstrutor. */ ClasseConstrutor cc = new ClasseConstrutor(); /* Chama o construtor da classe ClasseConstrutor2 passando os valores que serão guardados nos atributos. */ ClasseConstrutor2 cc2 = new ClasseConstrutor2(10, 3.5F, false); } } Criamos um objeto da classe ClasseConstrutor, chamando o construtor sem parâmetros ClasseConstrutor(). Criamos um objeto da classe ClasseConstrutor2, chamando o construtor ClasseConstrutor2(int valor1, float valor2, boolean valor3), passando os três parâmetros para ele. Quando executamos a classe TesteConstrutor, temos a seguinte saída no console: C:\>javac ClasseConstrutor.java C:\>javac ClasseConstrutor2.java C:\>javac TesteConstrutor.java C:\>java TesteConstrutor Criando um objeto da classe ClasseConstrutor. Criando um objeto da classe ClasseConstrutor2. Recebeu os seguintes parametros: 10 3.5 false Encapsulamento Usamos o encapsulamento quando queremos proteger ou esconder algo, como, por exemplo, podemos encapsular os atributos de uma classe para que seu acesso aconteça apenas através de métodos get e set. Podemos encapsular a forma como uma classe é criada para que quem for usála não precise conhecer como foi criada ou se uma subclasse dela é instanciada, etc. Como boa prática de programação sempre devemos encapsular os atributos de uma classe, dado a seguinte classe Livro: public class Livro { public String titulo; public String autor; public int ano; public double preco; } 213 www.metodista.br/ead Para encapsular os atributos, seguimos um padrão, definimos os atributos como privados e criamos métodos get e set, métodos para pegar o valor do atributo e alterar o valor do atributo respectivamente. A classe Livro encapsulada fica da seguinte forma: public class Livro { private String titulo; private String autor; private int ano; private double preco; public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public String getAutor() { return autor; } public void setAutor(String autor) { this.autor = autor; } public int getAno() { return ano; } public void setAno(int ano) { this.ano = ano; } public double getPreco() { return preco; } public void setPreco(doble preco) { this.preco = preco; } } 214 Universidade Metodista de São Paulo Se os atributos são públicos, então eles podem ser usados a partir de qualquer outra classe, assim podemos por meio de um objeto da classe Livro alterar o valor do preço, por exemplo: Livro livro = new Livro(); livro.preco = 19.9; Digamos que esta forma de alterar o valor de preço é usada em umas 20 classes diferentes da sua aplicação e agora queremos validar se o preço não é negativo, portanto teríamos que alterar as 20 classes para colocar uma validação: Livro livro = new Livro(); double preco = -19.9; if(preco < 0) { livro.preco = 0; } else { livro.preco = preco; } Entenda a parte do alterar 20 classes, isso causaria muita manutenção nos códigos e ao esquecer-se de alterar uma das 20 classes seu programa pode ter uma falha. Mas se ao invés de chamar o atributo diretamente e encapsular todos os atributos, portanto chamaríamos os atributos privados e eles não poderão ser chamados diretamente e usamos o método setPreco(double preco) nesses 20 lugares para alterar o valor do preço: Livro livro = new Livro(); livro.setPreco(19.9); Então, agora, queremos validar se o preço não é negativo, quantas classes precisam ser alteradas? 1 única classe precisaria ser alterada, apenas o método setPreco da classe Livro. public void setPreco(double preco) { if(preco < 0) { livro.preco = 0; } else { livro.preco = preco; } } Agora, ficou bem mais fácil fazer a validação e, como todos os locais chamam o método setPreco(double preco), então todos ganham esta validação. 215 www.metodista.br/ead A classe java.lang.String A classe java.lang.String é utilizada para representar textos (sequência de caracteres). O tamanho que uma String aguenta é igual ao tamanho disponível de memória. Para criar uma String podemos utilizar qualquer uma das seguintes formas: String nome = new String(“Rafael”); // ou String sobrenome = “Sakurai”; Para fazer a concatenação de Strings podemos usar o sinal + ou usar o método concat da classe String, por exemplo: String nomeCompleto = nome + “ “ + sobrenome; // ou String nomeCompleto2 = “Cristiano”.concat(“ Camilo”); O valor de uma String é imutável, não se pode alterar seu valor. Quando alteramos o valor de uma String, estamos criando uma nova String. Então, quando fazemos: String novoNome = “Cris” + “tiano”; Estamos criando 3 Strings: Cris tiano Cristiano Alguns caracteres não podem ser simplesmente colocados dentro de uma String, como, por exemplo, as aspas duplas (“). Este símbolo é usado para indicar o início e o fim de uma String. Por este motivo, caso tenhamos: String aspasDuplas = “””; //Erro de compilação. Teremos um erro de compilação, pois estamos deixando uma aspas duplas “ fora do texto. Para os caracteres que não podem ser simplesmente adicionados dentro da String, usamos a barra invertida \ como escape de caracteres. Segue abaixo uma tabela com alguns escapes de caracteres e o que eles representam dentro da String. \t Tabulação horizontal \n Nova linha \" Aspas duplas \' Aspas simples \\ Barra invertida A classe java.lang.String tem alguns métodos para se trabalhar com os textos, exemplo: compareTo – Compara se duas Strings são iguais. Ele retorna um número inteiro sendo 0 apenas caso ambas as String sejam idênticas. 216 Universidade Metodista de São Paulo compareToIgnoreCase – Compara se duas Strings são iguais sem diferenciar letras maiúsculas e minúsculas. equals – Verifica se uma String é igual a outra. Retorna um tipo booleano. replace – Altera um caractere de uma String por outro caractere. replaceAll – Altera cada substring dentro da String com uma nova substring. split – Divide uma String em varias substrings a partir de uma dada expressão regular. Mais métodos da classe String podem ser encontrados em: http://java.sun.com/javase/6/ docs/api/java/lang/String.html. Cuidado ao utilizar os métodos da String, quando não houver uma instância da classe String, no caso null. Invocar um método de uma referência nula gera uma exceção java.lang. NullPointerException, um erro que ocorre em tempo de execução, por exemplo: String abc = null; abc.equals(“teste”); Este código lançará uma NullPointerException, pois a String abc está vazia (null), e está tentando invocar o método equals() de um String null (exceções serão abordadas). Referências DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8. ed. Verificar: Pearson, 2010. HORSTMANN, Cay S.. Big Java. 4. ed. Verificar: Wiley, 2009. . HORSTMANN, Cay S.; CORNELL, Gary. Core Java: Fundamentos. 8. ed. Verificar: Pearson, 2009. . SIERRA, Kathy; BATES, Bert. Use a Cabeça! Java. 8. ed. Rio de Janeiro: Alta Books, 2008. 217 www.metodista.br/ead _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ ________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ________________________________________ ________________________________________ __________________________________________ __________________________________________ 218 Universidade Metodista de São Paulo Programação orientada a objetos Interface, herança, classe abstrata e polimorfismo Prof. Rafael Guimarães Sakurai Objetivo: Apresentar e exemplificar os conceitos de orientação a objetos relacionados a interface, herança, classe abstrata e polimorfismo. Palavras-chave: Interface; Herança; Classe Abstrata; Polimorfismo www.metodista.br/ead Módulo Interface Interface é um recurso da linguagem de programação Java que apresenta inúmeras vantagens no sentido da modelagem e instanciação de objetos, porém deve-se entender claramente os conceitos básicos da orientação a objetos a fim de utilizá-la plenamente. Uma interface é similar a um contrato, através dela podemos especificar quais métodos as classes que implementam esta interface são obrigados a implementar. Para criarmos uma interface em Java, utilizamos a palavra interface antes do seu nome. Vamos criar uma interface chamada Comparavel. Esta interface possui a assinatura de método que todas as classes que desejam ser comparadas precisam implementar. package br.metodista.ads1.guia.interfaces; /** * Interface que deve ser implementada por todas as classes que * devem ser ordenadas. */ public interface Comparavel { /** * Assinatura de método que toda classe que quer permitir * a comparação entre seus objetos precisa implementar. * * @param o - Objeto que será comparado. * @return 0 se os objetos forem iguais. * > 0 se o objeto recebido é menor que o objeto que será * comparado. * < 0 se o objeto recebido é maior que o objeto que será * comparado. */ public abstract int comparar(Object o); } Na interface declaramos os métodos de forma abstrata, tendo apenas sua assinatura e terminando com ponto e vírgula ( ; ) e todos os métodos precisam ser públicos Dentro da interface não podemos: - implementar método - construtor - extender classe 220 Universidade Metodista de São Paulo - implementar outra interface - não pode ter o modificador final Vamos criar uma classe que ordena um array de objetos que são do tipo Comparavel: package br.metodista.ads1.guia.interfaces; /** * Classe utilizada para ordenar qualquer tipo de classe * que implementa a interface Comparavel. */ public class Ordenar { /** * Método que utiliza o algoritmo de bubble sort para * ordenar um vetor de objetos do tipo <code>Comparavel</code>. * * @param objetos - Vetor de objetos que serão ordenados. */ public void ordenar(Comparavel[] objetos) { for(int i = 0; i < objetos.length; i++) { for(int j = i + 1; j < objetos.length; j++) { /* Verifica se os objetos não estão na ordem. */ if(objetos[i].comparar(objetos[j]) > 0) { /* Troca os objetos de lugar no vetor. */ Comparavel temp = objetos[i]; objetos[i] = objetos[j]; objetos[j] = temp; } } } } } Como todos os objetos que são comparáveis implementam a interface Comparavel, então criamos o método ordenar, que recebe um vetor de objetos do tipo Comparavel., e como uma classe implementa os métodos da interface, sabemos que todas as classes comparáveis terão o método comparar, por isso podemos ordenar os objetos usando o método objeto[i]. comparar(objeto[j]). 221 www.metodista.br/ead Agora, vamos criar uma classe que implemente a interface Comparavel. Quando uma classe implementa uma interface, esta classe, obrigatoriamente, precisa implementar todos os métodos declarados na interface. Apenas quando usamos classes abstratas implementando interface é que não precisamos, obrigatoriamente, implementar todos os métodos. package br.metodista.ads1.guia.interfaces; public class Livro implements Comparavel { private String autor; private String titulo; public Livro() { } public Livro(String autor, String titulo) { this.autor = autor; this.titulo = titulo; } public void setAutor(String autor) { this.autor = autor; } public String getAutor() { return autor; } public void setTitulo(String titulo) { this.titulo = titulo; } public String getTitulo() { return titulo; } public int comparar(Object o) { int comparacao = 0; // Verifica se o objeto que vai comparar é do tipo Livro. if(o instanceof Livro) { Livro livro = (Livro) o; 222 Universidade Metodista de São Paulo comparacao = this.getAutor().compareTo(livro.getAutor()); // Se os autores forem iguais, compara o titulo dos livros. if(comparacao == 0) { comparacao = this.getTitulo().compareTo(livro.getTitulo()); } } return comparacao; } } A classe livro implementou o método comparar para fazer a comparação de acordo com o autor e título do livro. Agora, vamos criar uma classe para testar a ordenação de um vetor de Livros. package br.metodista.ads1.guia.interfaces; public class TestarOrdenacao { public static void main(String[] args) { /* Cria um vetor de livros. */ Livro[] livros = new Livro[4]; livros[0] = new Livro(“Sakurai”, “Almoçando com Java”); livros[1] = new Livro(“Cristiano”, “Classes Java em fila indiana.”); livros[2] = new Livro(“Sakurai”, “Java em todo lugar”); livros[3] = new Livro(“Cristiano”, “Viajando no Java”); /* Ordena os livros. */ Ordenar o = new Ordenar(); o.ordenar(livros); /* Imprime os livros ordenados. */ for(int cont = 0; cont < livros.length; cont++) { System.out.println(“Autor: “ + livros[cont].getAutor()); System.out.println(“Titulo: “ + livros[cont].getTitulo()); System.out.println(“\n---------\n”); } } } 223 www.metodista.br/ead Quando chamamos o.ordenar(livros), estamos passando o vetor de objetos livros para ser ordenado. Como Livro implementa Comparavel podemos passar um objeto do tipo Livro em que é esperado um objeto do tipo Comparavel. O método ordenar() irá chamar o método comparar() que foi implementado pela classe Livro, isto é feito em tempo de execução da aplicação, a JVM verifica qual o tipo da classe do objeto e chama o método que foi implementado nele, isto é chamado de Polimorfismo. Quando testamos esta classe, temos a seguinte saída: Autor: Cristiano Titulo: Classes Java em fila indiana. --------Autor: Cristiano Titulo: Viajando no Java --------Autor: Sakurai Titulo: Almoçando com Java --------Autor: Sakurai Titulo: Java em todo lugar --------- Herança Em Java, podemos criar classes que herdem atributos e métodos de outras classes, evitando reescrita de código. Este tipo de relacionamento é chamado de Herança. Para representarmos este tipo de relacionamento na linguagem, devemos utilizar a palavra reservada extends, de forma a apontar para qual classe a nossa nova classe deve herdar seus atributos e métodos. Neste exemplo, demonstraremos a vantagem do reaproveitamento de código utilizando a Herança. Temos as classes Funcionario e Coordenador que possuem o atributo nome e matricula em comum. Classe Funcionario: package br.metodista.ads1.guia.heranca; /** * Classe utilizada para representar um Funcionario. */ public class Funcionario { private String nome; private int matricula; 224 Universidade Metodista de São Paulo private String departamento; public Funcionario(String nome, int matricula, String departamento) { this.nome = nome; this.matricula = matricula; this.departamento = departamento; } public String getDepartamento() { return departamento; } public void setDepartamento(String departamento) { this.departamento = departamento; } public int getMatricula() { return matricula; } public void setMatricula(int matricula) { this.matricula = matricula; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } } Classe Coordenador: package br.metodista.ads1.guia.heranca; /** * Classe utilizada para representar um Coordenador. */ public class Coordenador { private String nome; private int matricula; private String cursoCoordenado; public Coordenador(String nome, int matricula, String cursoCoordenado) { 225 www.metodista.br/ead this.nome = nome; this.matricula = matricula; this.cursoCoordenado = cursoCoordenado; } public String getCursoCoordenado() { return cursoCoordenado; } public void setCursoCoordenado(String cursoCoordenado) { this.cursoCoordenado = cursoCoordenado; } public int getMatricula() { return matricula; } public void setMatricula(int matricula) { this.matricula = matricula; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } } Como esses atributos, nome e matricula, são comuns para ambas as classes, e elas possuem algo a mais em comum, que é seu propósito, ambas são utilizadas para representar Pessoas. Podemos criar uma classe Pessoa que terá os atributos nome e matricula, e por meio da herança aproveitaremos esses atributos nas classes Funcionario e Coordenador. package br.metodista.ads1.guia.heranca; /** * Classe utilizada para representar a Pessoa. */ public class Pessoa { private String nome; private int matricula; public Pessoa(String nome, int matricula) { this.nome = nome; this.matricula = matricula; } public int getMatricula() { return matricula; } 226 Universidade Metodista de São Paulo public void setMatricula(int matricula) { this.matricula = matricula; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } } Agora vamos alterar a classe Funcionario e Coordenador: package br.metodista.ads1.guia.heranca; /** * Classe utilizada para representar um Funcionario que é uma Pessoa. */ public class Funcionario extends Pessoa{ private String departamento; public Funcionario(String nome, int matricula, String departamento) { super(nome, matricula); this.departamento = departamento; } public String getDepartamento() { return departamento; } public void setDepartamento(String departamento) { this.departamento = departamento; } } package br.metodista.ads1.guia.heranca; /** * Classe utilizada para representar um Coordenador que é uma Pessoa. */ 227 www.metodista.br/ead public class Coordenador extends Pessoa { private String cursoCoordenado; public Coordenador(String nome, int matricula, String cursoCoordenado) { super(nome, matricula); this.cursoCoordenado = cursoCoordenado; } public String getCursoCoordenado() { return cursoCoordenado; } public void setCursoCoordenado(String cursoCoordenado) { this.cursoCoordenado = cursoCoordenado; } } Com a declaração acima, temos as classes Funcionario e Coordenador como classes filha ou subclasses da classe pai Pessoa. Com isso, podemos dizer que as subclasses Funcionario e Coordenador herdam todos os atributos e métodos da sua superclasse Pessoa. Por isso, lembre-se, o Funcionario É UMA Pessoa, pois é uma subclasse, logo, apenas possui algumas características a mais do que Pessoa, porém podemos sempre manuseá-lo como uma Pessoa, logo, também é possível se fazer o seguinte tipo de declaração: package br.metodista.ads1.guia.heranca; public class TesteFuncionario { public static void main(String[] args) { /* Podemos criar um objeto Pessoa. */ Pessoa camilo = new Pessoa(“Camilo”, 123); /* Podemos criar um funcionario. */ Funcionario rafael = new Funcionario(“Rafael”, 111, “IT”); /* Como Funcionario É UMA Pessoa, então podemos guardar um objeto do tipo Funcionario dentro de uma varíavel do tipo Pessoa. */ Pessoa rafael2 = rafael; /* Podemos criar um coordenador. */ Coordenador joao = new Coordenador(“Joao”, 222, “Ciências da Computação”); /* Como Coordenador É UMA Pessoa, então podemos guardar um objeto do tipo Coordenador dentro de uma varíavel do tipo Pessoa. */ Pessoa joao2 = joao; } } 228 Universidade Metodista de São Paulo Uma classe pode herdar apenas de uma classe (superclasse). Quando uma classe não define explicitamente que está herdando outra classe, então, esta classe é filha de java.lang.Object, ou seja, a classe Object é a classe pai de todas as classes. Por Object ser pai de todas as classes, todas as classes herdam os seguintes métodos dela: Figura 1: Métodos herdados da classe Object. Quando lidamos com classes que possuem a relação de herança, podemos fazer uso de duas palavras-chave que servem para identificar se estamos utilizando um método e ou atributo da classe atual ou de sua superclasse. Estes comandos são: this Define que o recurso pertence à classe atual. super Define que o recurso pertence à superclasse. Podemos visualizar que a classe Coordenador utiliza ambas as palavras-chaves no seu construtor: public Coordenador(String nome, int matricula, String cursoCoordenado) { // super() chama o construtor da classe pai. super(nome, matricula); // this representa esta própria classe. this.cursoCoordenado = cursoCoordenado; } O construtor de Coordenador recebe o nome, matrícula e curso do coordenador como parâmetros. Note que neste construtor temos a chamada super(nome, matricula), que irá chamar o construtor da classe Pessoa que recebe um String e um inteiro como parâmetro. 229 www.metodista.br/ead Dentro deste mesmo construtor temos a seguinte chamada this.cursoCoordenado = cursoCoordenado. Utilizando a palavra-chave this, referenciamos o atributo cursoCoordenador da própria classe Coordenador. Classe abstrata Em Java, temos um tipo especial de classe chamado classe abstrata. Este tipo de classe possui uma característica muito específica, que é o de não permitir que novos objetos sejam instanciados a partir desta classe. Por este motivo, as classes abstratas possuem o único propósito de servirem como superclasses a outras classes do Java. Uma classe abstrata é desenvolvida para representar entidades e conceitos abstratos, sendo utilizada como uma classe pai, pois não pode ser instanciada. Ela define um modelo (template) para uma funcionalidade e fornece uma implementação incompleta - a parte genérica dessa funcionalidade - que é compartilhada por um grupo de classes derivadas. Cada uma das classes derivadas completa a funcionalidade da classe abstrata adicionando um comportamento específico. Para definir uma classe como abstrata utilizamos a palavra-chave abstract. Uma classe abstrata normalmente possui métodos abstratos. Esses métodos são implementados nas suas classes derivadas concretas com o objetivo de definir o comportamento específico. Neste exemplo, criaremos uma classe abstrata chamada Tela. Nesta classe, implementaremos alguns métodos que devem ser utilizados por todas as telas do computador de bordo de um veículo, como por exemplo, setTitulo() para informar o título da tela e imprimir(), que imprime as informações na tela. Nesta classe, definiremos também a assinatura de um método abstrato chamado obterInformacao(), que deve ser implementado pelas classes filhas. package br.metodista.ads1.guia.classeabstrata; /** * Classe abstrata que possui os métodos básicos para * as telas do computador de bordo de um veiculo. */ public abstract class Tela { private String titulo; public void setTitulo(String titulo) { this.titulo = titulo; } public abstract String obterInformacao(); public void imprimir() { System.out.println(this.titulo); System.out.println(“\t” + obterInformacao()); } } 230 Universidade Metodista de São Paulo Agora, criaremos a classe TelaKilometragem, que será uma subclasse da classe abstrata Tela. Está classe será utilizada para mostrar a km atual percorrida pelo veículo. package br.metodista.ads1.guia.classeabstrata; /** * Tela que mostra a kilometragem percorrida por um veiculo. */ public class TelaKilometragem extends Tela { /* Atributo que guarda o valor da km atual do veiculo. */ int km = 0; /** * Construtor que iniciliza o titulo da tela. */ public TelaKilometragem() { /* Atribui o valor do titulo desta tela. */ super.setTitulo(“Km Atual”); } /** * Implementa o método abstrato da classe Tela, * neste método buscamos a km atual do veiculo. * * @return Texto com a km atual. */ @Override public String obterInformacao() { km += 10; return String.valueOf(km) + “ km”; } } Vamos, agora, criar uma classe para testar a nossa aplicação. Neste teste, criaremos um objeto da classe TelaKilometragem e chamar o método imprimir(), que esta classe herdou da classe Tela. package br.metodista.ads1.guia.classeabstrata; /** * Classe utilizada para testar a Tela Kilometragem. */ public class TesteTelaKm { public static void main(String[] args) { Tela tk = new TelaKilometragem(); tk.imprimir(); System.out.println(“\n------------\n”); tk.imprimir(); } } 231 www.metodista.br/ead Quando definimos Tela tk = new TelaKilometragem(), estamos guardando um objeto do tipo TelaKilometragem dentro de uma variável do tipo Tela. Podemos fazer isso porque toda TelaKilometragem é uma subclasse de Tela. Quando chamamos o método tk.imprimir(), estamos chamando o método que foi implementado na classe abstrata Tela, mas note que o método imprimir() usa o método obterInformacao(), que foi implementado na classe TelaKilometragem. Em tempo de execução, a JVM verifica o tipo do objeto e chama o método que foi implementado nele, isto chama-se Polimorfismo. Temos a seguinte saída no console: Km Atual 10 km -----------Km Atual 20 km Segue abaixo um comparativo entre Interface e Classe Abstrata: Classe Abstrata Interface Pode possuir atributos de instância. Possui apenas constantes. Possui métodos de diversas visibilidades e métodos implementados ou abstratos. Todos os métodos são public e abstract. É estendida por classes (subclasses). É implementada por classes. Uma subclasse só pode estender uma única classe abstrata (regra básica da herança em Java). Uma classe pode implementar mais de uma interface. Hierarquia de herança com outras classes abstratas. Hierarquia de herança com outras interfaces. Tabela 1: Comparativo entre Interface e Classe Abstrata. Referências DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8. ed. São Paulo: Pearson, 2010. HORSTMANN, Cay S.. Big Java. 4. ed. Porto Alegre: Bookman, 2006. HORSTMANN, Cay S.; CORNELL, Gary. Core Java: Fundamentos. 8. ed. São Paulo: Pearson, 2009. SIERRA, Kathy; BATES, Bert. Use a Cabeça! Java. 8. ed. Rio de Janeiro: Alta Books, 2008. 232 Universidade Metodista de São Paulo Programação orientada a objetos Tratamentos de exceções e trabalhando com arquivos textos Prof. Rafael Guimarães Sakurai Objetivo: Descrever os mecanismos que a linguagem de programação Java oferece para tratar exceções que podem ocorrer durante a execução de uma aplicação e também será introduzido o conceito de leitura e gravação de arquivos. Palavras-chave: Exceção; try; catch; finally; leitura de arquivos, gravação de arquivos www.metodista.br/ead Módulo Tratamento de exceções A linguagem de programação Java possui um mecanismo especial para o tratamento de erros (também chamado de exceção) que possam ocorrer durante a execução do programa, em que podemos tratar o erro de uma forma adequada e evitando, assim, a interrupção do programa. Uma característica importante sobre exceções é que, pelo fato delas poderem ocorrer a qualquer momento da execução de um método, estas são literalmente “lançadas” através dos métodos que fazem parte da cadeia de execução. Como a exceção é “lançada” durante a execução de um método, podemos querer “pegar” a exceção para dar-lhe um tratamento adequado. Para isto, é necessário pontuar que um determinado trecho de código que será observado e que uma determinada exceção pode ocorrer neste trecho de código. No exemplo a seguir, criaremos um bloco utilizando a palavra-chave try. Os códigos dentro desse bloco podem lançar uma exceção durante sua execução e para tratar uma exceção criaremos um bloco utilizando a palavra-chave catch. Definiremos que poderá ser tratado apenas exceções que são do tipo java.lang.Exception. package br.metodista.ads1.guia.excecao; import java.util.Scanner; /** * Classe utilizada para demonstrar o bloco try / catch. */ public class ExemploEstruturaExcecao { public static void main(String[] args) { /* Trecho de código onde uma exceção pode ocorrer. */ try { Scanner s = new Scanner(System.in); System.out.println(“Vamos calcular a soma de dois valores inteiros.”); System.out.print(“Digite o primeiro valor inteiro: “); int num1 = s.nextInt(); System.out.print(“Digite o segundo valor inteiro: “); int num2 = s.nextInt(); System.out.println(“A soma de “ + num1 + “ com “ + num2 + “ resulta em “ + (num1 + num2)); } catch (Exception e) { /* Trecho de código onde uma exceção do tipo java.lang.Exception será tratada. */ System.out.println(“ERRO - Ocorreu um erro durante a soma dos dois valores!”); } } } 234 Universidade Metodista de São Paulo Mas neste trecho de código aparentemente simples, que possui apenas uma soma de dois valores inteiros, pode ocorrer algum erro? Lembre-se, como a entrada de dados é feita pelo usuário, às vezes ele pode se enganar e digitar alguma informação que não é esperada, como, por exemplo, digitar um texto onde é esperado um número inteiro. Se executarmos esta classe e informarmos um texto onde é esperado um número inteiro, teremos o seguinte comportamento: C:\> javac br\metodista\ads1\guia\excecao\ExemploEstruturaExcecao.java C:\> java br.metodista.ads1.guia.excecao.ExemploEstruturaExcecao Vamos calcular a soma de dois valores inteiros. Digite o primeiro valor inteiro: teste ERRO - Ocorreu um erro durante a soma dos dois valores! O tratamento dado para a exceção pode não ter sido o mais adequado, pois apenas interrompemos o programa e apresentamos uma mensagem de erro. Que tratamento você poderia fazer para continuar a execução desta soma? Note que, como digitamos o valor errado do primeiro número incorreto, o programa não perguntou pelo segundo valor inteiro. Isto acontece porque quando uma exceção é lançada ela só irá parar quando encontrar um tratamento para o erro, portanto pulou todo o código até chegar ao bloco catch. Se não houver nenhum tratamento, este erro será lançado para o usuário que está usando a aplicação. A princípio, Java possui diversos tipos específicos de exceção, cada um deles diretamente relacionado a uma operação específica. Por este motivo, para que uma classe seja considerada uma exceção, é imprescindível que ela seja de alguma forma filha de java.lang.Exception. As exceções, que são subclasses de java.lang.Exception, são normalmente divididas em duas partes, as Checked e Unchecked, que explicaremos mais adiante. No quadro abaixo, temos um exemplo da hierarquia de algumas subclasses de Exception. Uma das subclasses mais comuns é a java.lang.RuntimeException, sobretudo para os usuários finais, pois como podem acontecer em qualquer parte do código durante sua execução, normalmente, quando não tratadas ocasionam na interrupção do programa. Figura 1: Hierarquia de classes de exceções. Fonte: THE JAVA TUTORIAL (2011) 235 www.metodista.br/ead Checked Exceptions As checked exceptions, são exceções já previstas pelo compilador. Usualmente, são geradas pela palavra chave throw. Como ela é prevista já em tempo de compilação, se faz necessária a utilização do bloco try / catch ou da palavra chave throws. A princípio, todas as classes filhas de java.lang.Exception são do tipo checked, exceto pelas subclasses de java.lang.RuntimeException (exceção em tempo de execução). package br.metodista.ads1.guia.excecao; import java.io.FileWriter; import java.io.IOException; public class ExemploCheckedException { public static void main(String[] args) { escreverArquivo(“C:\\texto.txt”, “Teste gravação de arquivo.”); } public static void escreverArquivo(String caminho, String texto) { try { FileWriter arquivo = new FileWriter(caminho); arquivo.write(texto); arquivo.close(); } catch (IOException e) { System.out.println(“Erro ao escrever o texto no arquivo.”); } } } Neste exemplo, o método escreveArquivo recebe como parâmetro o caminho de um arquivo e o texto que deve ser gravado neste arquivo, mas durante este processo de gravação em arquivo, alguns erros previsíveis podem ocorrer como por exemplo: não conseguir criar o arquivo no caminho informado, não conseguir editar um arquivo já existente, não conseguir gravar o texto no arquivo e outro, como temos alguns erros conhecido que podem ocorrer somos obrigados a tratar a exceção java.io.Exception, que é uma checked exception. Unchecked Exceptions Um dos fatores que tornam a RuntimeException e suas classes filhas tão específicas em relação as demais subclasses de Exception é que elas são exceções não diretamente previstas por acontecer em tempo de execução, ou seja, são unchecked exceptions. Exemplo: package br.metodista.ads1.guia.excecao; public class ExemploUncheckedException { public static void main(String[] args) { /* Lança um java.lang.NullPointerException, pois esta passando null como parâmetro. */ separarNome(null); 236 Universidade Metodista de São Paulo /* Lança um java.lang.ArrayIndexOutOfBoundsException, pois está passando um nome sem sobrenome */ separarNome(“Rafael”); } public static void separarNome(String nomeCompleto) { String[] partes = nomeCompleto.split(“ “); System.out.println(“Primeiro nome: “ + partes[0]); System.out.println(“Sobrenome: “ + partes[1]); } } Observe que no trecho de código acima, temos o método chamado separarNome que recebe como parâmetro uma String representando o nome completo de uma pessoa, mas se passarmos como parâmetro null ou um nome incompleto teremos alguns erros: Se o parâmetro nomeCompleto tiver o valor null, vamos ter a famosa exceção java.lang. NullPointerException. Significa que você está tentando chamar um método de um objeto que ainda não foi criado. No exemplo anterior, essa exceção pode ser lançada no código String[] partes = nomeCompleto.split(“ “);. Se o parâmetro nomeCompleto tiver um valor que não corresponda a um nome com no mínimo a estrutura “Nome Sobrenome”, será criado um vetor de String, chamado partes, com o tamanho menor que 2 e, nesse caso, ao tentar acessar as posições do vetor com partes[0] ou partes[1] podemos acabar tentando obter um valor em um índice do vetor que não existe, assim será lançado uma java.lang.ArrayIndexOutOfBoundsException. Note que, como ambas são exceções unchecked, não há necessidade em tratá-las, o melhor a se fazer é validar as informações antes de utilizá-las. No primeiro exemplo, perguntei como poderíamos tratar as exceções que podem ser lançadas por uma digitação errada. Um exemplo de como tratar este tipo de exceção é verificar valor a valor até que a informação esperada seja digitada. Para isto, podemos tratar uma do tipo java.util.InputMismatchException (exceção de entrada incompatível). Agora, preveremos este erro, utilizando o bloco try / catch: package br.metodista.ads1.guia.excecao; import java.util.InputMismatchException; import java.util.Scanner; public class ExemploEntradaIncorreta { public static void main(String[] args) { int numero = 0; boolean valido = false; while(!valido) { try { Scanner s = new Scanner(System.in); System.out.print(“Digite um numero inteiro: “); numero = s.nextInt(); 237 www.metodista.br/ead valido = true; } catch (InputMismatchException e) { System.out.println(“O valor inserido nao eh um número inteiro!”); } } System.out.println(“O valor inserido foi: “ + numero); } } Desta forma, a digitação incorreta do usuário será tratada e uma mensagem de erro será exibida caso uma exceção aconteça, a variável validada não receberia o valor true. C:\> javac br\metodista\ads1\guia\excecao\ExemploRuntimeException.java C:\> java br.metodista.ads1.guia.excecao.ExemploRuntimeException Digite um numero inteiro: a O valor inserido nao eh um número inteiro! Digite um numero inteiro: abc O valor inserido nao eh um número inteiro! Digite um numero inteiro: 10 O valor inserido foi: 10 Quando uma exceção ocorre todo o código em seguida será pulado até encontrar um tratamento, mas, às vezes, há necessidade de executar um trecho de código mesmo que um erro ocorra. Para isto, podemos criar um bloco utilizando a palavra-chave finally. O bloco finally sempre será executado, mesmo que um erro não ocorra. No exemplo a seguir, utilizaremos o bloco finally para fechar o arquivo uma vez que ele foi criado ou aberto, mesmo que ocorra algum erro, o arquivo será fechado. package br.metodista.ads1.guia.excecao; import java.io.FileWriter; import java.io.IOException; public class ExemploFinally { public static void main(String[] args) { escreverArquivo(“C:\\texto.txt”, “Teste gravação de arquivo.”); } public static void escreverArquivo(String caminho, String texto) { FileWriter arquivo = null; try { arquivo = new FileWriter(caminho); arquivo.write(texto); } catch (IOException e) { System.out.println(“Erro ao escrever o texto no arquivo.”); } finally { //Se o arquivo foi aberto, então fecha ele. if(arquivo != null) { arquivo.close(); } } } } 238 Universidade Metodista de São Paulo Normalmente, utilizamos o bloco finally para liberar algum recurso como, por exemplo, um arquivo, uma conexão com o banco de dados e outros. Trabalhando com arquivos Existem diversos meios de se manipular arquivos na linguagem de programação Java. A classe java.io.File é responsável por representar arquivos e/ou diretórios do seu sistema de arquivos. Esta classe pode fornecer informações úteis assim como criar um novo arquivo, tamanho do arquivo, caminho absoluto, espaço livre em disco ou, ainda, excluí-lo. Leitura de caracteres em um arquivo A classe abstrata java.io.Reader representa um fluxo de entrada de dados tratados como caracteres. Essa classe possui várias subclasses dedicadas a cada fonte de dados específica, tais como a classe java.io.FileReader, que representa a leitura de caracteres de um arquivo. Neste exemplo, leremos um arquivo e imprimiremos seus caracteres no console: package br.metodista.ads1.guia.arquivo; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.util.Scanner; /** * Classe utilizada para demonstrar a leitura de caracteres. */ public class ExemploReader { public static void main(String[] args) { ExemploReader exemplo = new ExemploReader(); Scanner s = new Scanner(System.in); System.out.print(“Digite o caminho do arquivo: “); String caminho = s.nextLine(); exemplo.lerArquivo(caminho); } public void lerArquivo(String caminho) { Reader r = null; try { /* Criamos um objeto do tipo FileReader, seu construtor recebe uma String com o caminho de um arquivo, está classe lê os caracteres do arquivo. */ r = new FileReader(caminho); 239 www.metodista.br/ead /* A variável int c será utilizada para guardar os caracteres lidos do arquivo, lembre-se que todos os caracteres em Java são representados por números inteiro. */ int c; /* Vamos percorrer todos os caracteres do arquivo e vamos fazer um casting de inteiro para caractere, para imprimir o texto do arquivo, note que se o valor lido através do método read() for igual a -1, significa que o arquivo acabou. */ while((c = r.read()) != -1) { System.out.print((char) c); } /* Vamos tratar as exceções que podem ser lançadas durante a leitura de um arquivo. */ } catch (FileNotFoundException ex) { System.out.println(caminho + “ nao existe.”); } catch (IOException ex) { System.out.println(“Erro de leitura de arquivo.”); } finally { try { /* Vamos fechar o arquivo utilizando o método close(). */ if(r != null) { r.close(); } } catch (IOException ex) { System.out.println(“Erro ao fechar o arquivo “ + caminho); } } } } Neste exemplo, criamos um objeto do tipo FileReader, que será utilizado para ler todos os caracteres de um arquivo, no qual para ler cada caractere utilizamos o método read() e quando este método retornar o valor -1 significa que terminamos a leitura do arquivo. Ao executar a classe ExemploReader, teremos a seguinte saída no console: C:\> javac br\metodista\ads1\guia\arquivo\ExemploReader.java C:\> java br.metodista.ads1.guia.arquivo.ExemploReader Digite o caminho do arquivo: C:\ads1\texto.txt Analise e Desenvolvimento de Sistema Disciplina Programação Orientada a Objetos Trabalhando com arquivos 240 Universidade Metodista de São Paulo Gravação de caracteres em um arquivo A classe java.io.Writer é uma classe abstrata que representa um fluxo de saída de dados tratados como caracteres. Essa classe possui várias subclasses dedicadas a cada fonte de dados específica, tais como a classe java.io.FileWriter. Neste exemplo, leremos um arquivo e o copiaremos para outro arquivo: package br.metodista.ads1.guia.arquivo; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.util.Scanner; /** * Classe utilizada para ler um arquivo e copia-lo. */ public class ExemploWriter { public static void main(String[] args) { ExemploWriter exemplo = new ExemploWriter(); Scanner s = new Scanner(System.in); System.out.print(“Digite o caminho do arquivo de entrada: “); String entrada = s.nextLine(); System.out.print(“Digite o caminho do arquivo de saida: “); String saida = s.nextLine(); exemplo.copiarArquivo(entrada, saida); } public void copiarArquivo(String entrada, String saida) { Reader reader = null; Writer writer = null; try { /* Criamos um objeto do tipo FileReader, para ler o arquivo. */ reader = new FileReader(entrada); /* Criamos um objeto do tipo FileWriter, para criar um novo arquivo e escrever nele as 241 www.metodista.br/ead informações do arquivo que será lido. */ writer = new FileWriter(saida); int c; /* Vamos ler os caracteres do arquivo de entrada. */ while((c = reader.read()) != -1) { /* E gravamos cada caractere lido no arquivo de saída. */ writer.write(c); } } catch (FileNotFoundException ex) { System.out.println(entrada + “ ou “ + saida + “ nao existem!”); } catch (IOException ex) { System.out.println(“Erro de leitura de arquivo!”); } finally { try { /* Vamos fechar o arquivo de leitura. */ if(reader != null) { reader.close(); } } catch (IOException ex) { System.out.println(“Erro ao fechar o arquivo “ + entrada); } try { /* Vmos fechar o arquivo de gravação. */ if(writer != null) { writer.close(); } } catch (IOException ex) { System.out.println(“Erro ao fechar o arquivo “ + saida); } } } } Neste exemplo, criamos um objeto do tipo FileReader, que será utilizado para ler todos os caracteres de um arquivo, e, também, foi criado um objeto do tipo FileWriter, em que cada caractere será gravado no arquivo de saída utilizando o método write(). 242 Universidade Metodista de São Paulo Referências DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8. ed. São Paulo: Pearson, 2010. HORSTMANN, Cay S.. Big Java. 4. ed. Porto Alegre: Bookman, 2006. HORSTMANN, Cay S.; CORNELL, Gary. Core Java: Fundamentos. 8. ed. São Paulo: Pearson, 2009. JAVA SE - ORACLE. Java SE Overview - at a Glance. Disponível em: <http://www.oracle.com/ technetwork/java/javase/overview/index.html>. Acesso em: 12 out. 2011. THE JAVA TUTORIAL - How to Throw Exceptions. Disponível em: <http://download.oracle. com/javase/tutorial/essential/exceptions/throwing.html>. Acesso em: 12 out. 2011. SIERRA, Kathy; BATES, Bert. Use a Cabeça! Java. 8. ed. Rio de Janeiro: Alta Books, 2008. _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ____________________________________ ____________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ ____________________________________ ____________________________________ 243 www.metodista.br/ead