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 z3
 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
j1
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.
UW.
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: Tx, 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: Tx, 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 θ  
TuTv
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 uC  uB , onde uC é a matriz coluna nx1 das
coordenadas de um vetor u qualquer em relação à base C, e uB 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 uB  (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 uC  MB,C
1

2

1
~

0

uC
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
TuC  TC,C uC
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
4t
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 ) 
8t 2
 pT ( t )  t 2  13t  36
2 5t
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
TC,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
Download

GUIA DE ESTUDOS - Universidade Metodista de São Paulo